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. tcpcopy架构

    tcpCopy 1.0 的最新架构分为三个角色: Online Server(OS):上面要部署 TCPCopy,从数据链路层(pcap 接口)抓请求数据包,发包是从IP层发出去: Test Serv ...

  2. Nginx代理后服务端使用remote_addr获取真实IP

    直奔主题,在代理服务器的Nginx配置(yourWebsite.conf)的location /中添加: #获取客户端IP proxy_set_header Host $host; proxy_set ...

  3. ArcGIS Server命令行工具学习笔记

    备份命令 backup.py 参数: -u 管理员账号 -p 密码 -s 站点URL -f 备份文件的存储目录路径 -h 显示帮助 还原命令 restore.py 参数: -u 管理员账号 -p 密码 ...

  4. 风云2号云图Mosaic Dataset处理

    # ---------------------------------------------------------------------------# -*- coding: utf-8 -*- ...

  5. 直接拿去用!每个App都会用到的LoadingLayout

    前言 项目里都会遇到几种页面,分别为加载中.无网络.无数据.出错四种情况,经常要使用,所以封成库引用了,方便使用,顺便分享出来.先看一下效果: 原理比较简单,继承FrameLayout,在xml渲染完 ...

  6. Ubunt 安装mysql

    apt-get install mysql-client-core-5.6apt-get install mysql-client-5.6apt-get install mysql-server-5. ...

  7. 查找并修复Android中的内存泄露—OutOfMemoryError

    [编者按]本文作者为来自南非约翰内斯堡的女程序员 Rebecca Franks,Rebecca 热衷于安卓开发,拥有4年安卓应用开发经验.有点完美主义者,喜爱美食. 本文系国内ITOM管理平台 One ...

  8. C++易混淆概念

    1. 引用和指针有什么区别? 本质:一个是别名,一个是地址1. 指针可以在运行时改变其所指向的值,引用一旦和某个对象绑定就不再改变2. 引用没有const, 指针有const 3. 从内存上看,指针会 ...

  9. 铁乐学python_Day44_IO多路复用

    目录 IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO ...

  10. zabbix日常监控项TCP连接状态(六)

    TCP的连接状态对于我们web服务器来说是至关重要的,尤其是并发量ESTAB或者是syn_recv值,假如这个值比较大的话我们可以认为是不是受到了攻击,或是time_wait值比较高的话,我们要考虑看 ...