verilog实现VGA显示方块屏幕保护


输入和输出

  • 时钟信号 clk
  • 复位信号 reset
  • rgb三颜色输出 [2:0] r,g, [1:0] b
  • 行信号输出 hs
  • 列信号输出 vs

参数设定

设定边界,决定改变方向与否

parameter UP_BOUND = 31;
parameter DOWN_BOUND = 510;
parameter LEFT_BOUND = 144;
parameter RIGHT_BOUND = 783;

状态机决定下一次扫描输出的颜色

parameter S0 = 2'b00, S1 = 2'b01, S2 = 2'b10, S3 = 2'b11;
reg [2:0] state, nextstate;
reg [2:0] nextr, nextg;
reg [1:0] nextb;

程序处理

行信号和列信号的处理

行信号和列信号决定着当前像素是否显示出来。该程序选择的是在25Hz下640 * 480的分辨率显示。具体想改变分辨率的,可以在参考网上的资料。VGA的显示是逐行扫描像素点,除了可见区域,还有不可见区域的像素点,因此可以通过边界控制是否输出。

	wire myclk;
reg [1:0] count;
reg [9:0] hcount, vcount; assign myclk = count[1];
always@(posedge clk)
begin
if(reset)
count <= 0;
else
count <= count + 1'b1;
end assign hs = (hcount < 96) ? 1'b0 : 1'b1;
always@(posedge myclk or posedge reset)
begin
if(reset)
hcount <= 0;
else if(hcount == 799)
hcount <= 0;
else
hcount <= hcount + 1'b1;
end assign vs = (vcount < 2) ? 1'b0 : 1'b1;
always@(posedge myclk or posedge reset)
begin
if(reset)
vcount <= 0;
else if(hcount == 799)
begin
if(vcount == 520)
vcount <= 0;
else
vcount <= vcount + 1'b1;
end
else
vcount <= vcount;
end

颜色持续变换形成彩色轮变

彩色变化,通过状态机实现。每一列像素点对应一个颜色,但是方块区域才通过彩色输出,否则输出黑色,形成了彩色轮转。

	always@(posedge myclk or posedge reset)
begin
if(reset)
begin
r <= 0;
g <= 0;
b <= 0;
end
else begin
if((vcount >= up_pos)
&& (vcount <= down_pos)
&& (hcount >= left_pos)
&& (hcount<=right_pos))
begin
r <= nextr;
g <= nextg;
b <= nextb;
end
else
begin
r <= 3'b000;
g <= 3'b000;
b <= 2'b00;
end
end
end always@(posedge myclk or posedge reset)
begin
if(reset)
state <= S0;
else
state <= nextstate;
end always@(*)
begin
case(state)
S0: nextstate <= S1;
S1: nextstate <= S2;
S2: nextstate <= S3;
S3: nextstate <= S0;
default: nextstate <= S0;
endcase
end always@(*)
begin
case(state)
S0: begin nextr <= 3'b111; nextg <= 3'b000; nextb <= 2'b00; end
S1: begin nextr <= 3'b000; nextg <= 3'b111; nextb <= 2'b00; end
S2: begin nextr <= 3'b000; nextg <= 3'b000; nextb <= 2'b11; end
S3: begin nextr <= 3'b111; nextg <= 3'b111; nextb <= 2'b00; end
default: begin nextr <= 3'b111; nextg <= 3'b000; nextb <= 2'b11; end
endcase
end

信号处理

但列信号由输出变成非输出时触发。在这个情况下,应该处理下一帧的方向和速度。详见代码。

	always@(negedge vs or posedge reset)
begin
if(reset)
begin
h_speed <= 1;
v_speed <= 0;
end
else
begin
if(up_pos == UP_BOUND)
v_speed <= 1;
else if(down_pos == DOWN_BOUND)
v_speed <= 0;
else
v_speed <= v_speed; if (left_pos == LEFT_BOUND)
h_speed <= 1;
else if (right_pos == RIGHT_BOUND)
h_speed <= 0;
else
h_speed <= h_speed;
end
end always@(posedge vs or posedge reset)
begin
if(reset)
begin
up_pos <= 391;
down_pos <= 510;
left_pos <= 384;
right_pos <= 543;
end
else
begin
if(v_speed)
begin
up_pos <= up_pos + 1'b1;
down_pos <= down_pos + 1'b1;
end
else
begin
up_pos <= up_pos - 1'b1;
down_pos <= down_pos - 1'b1;
end if(h_speed)
begin
left_pos <= left_pos + 1'b1;
right_pos <= right_pos + 1'b1;
end
else
begin
left_pos <= left_pos - 1'b1;
right_pos <= right_pos - 1'b1;
end
end
end

完整代码

//main.v
`timescale 1ns / 1ps module VGA(
input clk,
input reset,
output reg [2:0] r,
output reg [2:0] g,
output reg [1:0] b,
output hs,
output vs
); parameter UP_BOUND = 31;
parameter DOWN_BOUND = 510;
parameter LEFT_BOUND = 144;
parameter RIGHT_BOUND = 783; parameter S0 = 2'b00, S1 = 2'b01, S2 = 2'b10, S3 = 2'b11;
reg [2:0] state, nextstate;
reg [2:0] nextr, nextg;
reg [1:0] nextb; reg h_speed, v_speed;
reg [9:0] up_pos, down_pos, left_pos, right_pos; wire myclk;
reg [1:0] count;
reg [9:0] hcount, vcount; assign myclk = count[1];
always@(posedge clk)
begin
if(reset)
count <= 0;
else
count <= count + 1'b1;
end assign hs = (hcount < 96) ? 1'b0 : 1'b1;
always@(posedge myclk or posedge reset)
begin
if(reset)
hcount <= 0;
else if(hcount == 799)
hcount <= 0;
else
hcount <= hcount + 1'b1;
end assign vs = (vcount < 2) ? 1'b0 : 1'b1;
always@(posedge myclk or posedge reset)
begin
if(reset)
vcount <= 0;
else if(hcount == 799)
begin
if(vcount == 520)
vcount <= 0;
else
vcount <= vcount + 1'b1;
end
else
vcount <= vcount;
end always@(posedge myclk or posedge reset)
begin
if(reset)
begin
r <= 0;
g <= 0;
b <= 0;
end
else begin
if((vcount >= up_pos)
&& (vcount <= down_pos)
&& (hcount >= left_pos)
&& (hcount<=right_pos))
begin
r <= nextr;
g <= nextg;
b <= nextb;
end
else
begin
r <= 3'b000;
g <= 3'b000;
b <= 2'b00;
end
end
end always@(posedge myclk or posedge reset)
begin
if(reset)
state <= S0;
else
state <= nextstate;
end always@(*)
begin
case(state)
S0: nextstate <= S1;
S1: nextstate <= S2;
S2: nextstate <= S3;
S3: nextstate <= S0;
default: nextstate <= S0;
endcase
end always@(*)
begin
case(state)
S0: begin nextr <= 3'b111; nextg <= 3'b000; nextb <= 2'b00; end
S1: begin nextr <= 3'b000; nextg <= 3'b111; nextb <= 2'b00; end
S2: begin nextr <= 3'b000; nextg <= 3'b000; nextb <= 2'b11; end
S3: begin nextr <= 3'b111; nextg <= 3'b111; nextb <= 2'b00; end
default: begin nextr <= 3'b111; nextg <= 3'b000; nextb <= 2'b11; end
endcase
end always@(negedge vs or posedge reset)
begin
if(reset)
begin
h_speed <= 1;
v_speed <= 0;
end
else
begin
if(up_pos == UP_BOUND)
v_speed <= 1;
else if(down_pos == DOWN_BOUND)
v_speed <= 0;
else
v_speed <= v_speed; if (left_pos == LEFT_BOUND)
h_speed <= 1;
else if (right_pos == RIGHT_BOUND)
h_speed <= 0;
else
h_speed <= h_speed;
end
end always@(posedge vs or posedge reset)
begin
if(reset)
begin
up_pos <= 391;
down_pos <= 510;
left_pos <= 384;
right_pos <= 543;
end
else
begin
if(v_speed)
begin
up_pos <= up_pos + 1'b1;
down_pos <= down_pos + 1'b1;
end
else
begin
up_pos <= up_pos - 1'b1;
down_pos <= down_pos - 1'b1;
end if(h_speed)
begin
left_pos <= left_pos + 1'b1;
right_pos <= right_pos + 1'b1;
end
else
begin
left_pos <= left_pos - 1'b1;
right_pos <= right_pos - 1'b1;
end
end
end endmodule

verilog实现VGA显示方块屏幕保护的更多相关文章

  1. 使用 WPF 开发一个 Windows 屏幕保护程序

    最近有小伙伴问我如何可以让 Windows 静置一段时间不操作之后,显示一个特殊的界面.我想了想,屏幕保护程序可以做到这一点,而且,屏幕保护程序的开发也是非常简单的. 本文将介绍如何为 Windows ...

  2. 基于FPGA的VGA显示设计(一)

    前言 FPGA主要运用于芯片验证.通信.图像处理.显示VGA接口的显示器是最基本的要求了. 原理 首先需要了解 : (1)VGA接口协议:VGA端子_维基百科 .VGA视频传输标准_百度 引脚1 RE ...

  3. 基于FPGA的VGA显示实验设计

    基于FPGA的VGA显示实验设计 成果展示(优酷视频): 视频: 基于FPGA的VGA显示技术(手机控制) http://v.youku.com/v_show/id_XNjk4ODE3ODUy.htm ...

  4. OV5640图像采集(一)VGA显示

    vga控制器模块 1 引言  项目的背景是采集无人车间现场的工件图像并送往控制间pc端处理,最终实现缺陷检测.项目包括图像采集模块,数据传输模块,上位机,缺陷检测算法等四个部分.其中,图像采集模块又分 ...

  5. 使用C#开发屏幕保护程序步骤

    本文介绍使用C#制作屏幕保护的方法,这个屏幕保护就是仿效视窗系统自带的字幕屏保. 屏幕保护程序的扩展名虽然是"scr",但其实是一个可执行的"exe"文件.但他 ...

  6. VmodCAM图像采集 VGA显示

    先上图 总体框图 效果图 效果不是很好,因为暂时用的是zedboard自带的VGA,其只能RGB只有3*3*3的彩色度 VmodCAM原理图 VmodCAM的zedboard管脚约束见:http:// ...

  7. 基于FPGA的VGA显示静态图片

    终于熬到暑假了,记过三四周的突击带考试,终于为我的大二画上了一个完整的句号,接下来终于可以静心去做自己想做的事情了,前一阵子报了一个线上培训班,学学Sobel边缘检测,之前一直在学习图像处理,但是因为 ...

  8. 基于FPGA的Uart接收图像数据至VGA显示

    系统框图 前面我们设计了基于FPGA的静态图片显示,接下来我们来做做基于FPGA的动态图片显示,本实验内容为:由PC端上位机软件通过串口发送一幅图像数据至FPGA,FPGA内部将图像数据存储,最后扫描 ...

  9. Verilog HDL VGA Driver for Xilinx Nexys 4 适用于Nexys4的VGA驱动

    /* * Function: VGA Timing Generator * Author: Liutianchen * Date: 2016-12-5 * Version: 6.0 * Environ ...

随机推荐

  1. js 中使用 #region #endregion

    vs 和 vs code 都是可以支持 js 使用 #region 折叠代码的:code 我就不说了 同理vs 的: 首先下载 vs 插件,插件路径:https://archive.codeplex. ...

  2. 【代码笔记】iOS-GCD用法

    代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // ...

  3. 为样式找到应用目标-CSS选择器

    1,常用选择器:元素(标签/简单)选择器.ID选择器.类选择器.后代选择器(可以将类或者ID应用于它们的祖先,然后使用后代选择器来定位) 2,伪类:有时候,我们需要根据文档结构之外的其他条件对元素应用 ...

  4. opencv3.2.0形态学滤波之形态学梯度、顶帽、黑帽

    /*一.形态学梯度 (1)含义:是膨胀图和腐蚀图之差 (2)数学表达式:dst=morph-grad(src,element) =dilate(src,element) - erode(src,ele ...

  5. keras Lambda 层

    Lambda层 keras.layers.core.Lambda(function, output_shape=None, mask=None, arguments=None) 本函数用以对上一层的输 ...

  6. 前端模块化方案全解(CommonJS/AMD/CMD/ES6)

    模块化的开发方式可以提高代码复用率,方便进行代码的管理.通常一个文件就是一个模块,有自己的作用域,只向外暴露特定的变量和函数.目前流行的js模块化规范有CommonJS.AMD.CMD以及ES6的模块 ...

  7. redis 命令select、dbsize、清空数据库、info、client

    select 切换库 dbsize 当前库中数据条数 清空数据库 flushdb | flushall 清空数据,一个是清空当前库,一个清空当前实例 查看服务器及redis相关信息 infoinfo ...

  8. 深入理解net core中的依赖注入、Singleton、Scoped、Transient(四)

    相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...

  9. Typescript 基础知识

    Typescript 就是 Javascript 的超集,所以首先你要知道 Javascript 基础知识 类型注解 类型注解在TypeScript中是记录函数或变量约束的简便方法. // 布尔值 l ...

  10. 对JDBC的轻量级封装,Hibernate框架

    IDEA是真的好用... 用脑子下jar包..http://mvnrepository.com/