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. 悟空模式-java-工厂方法模式

    [却说那七衣仙女自受了大圣的定身法术,一周天方能解脱,各提花篮,回奏王母说道:“齐天大圣使术法困住我等,故此来迟.”王母问道:“汝等摘了多少蟠桃?”仙女道:“只有两篮小桃,三篮中桃.至后面,大桃半个也 ...

  2. Git——克隆部分文件

    在进行项目开发的时候,有时候会有这样的需求那就是:我们只希望从Git仓库里取指定的文件或者文件夹出来.在SVN里面,这非常容易实现,因为SVN基于文件方式存储,而Git却是基于元数据方式分布式存储文件 ...

  3. Android可伸缩布局-FlexboxLayout(支持RecyclerView集成)

    Android可伸缩布局-FlexboxLayout(支持RecyclerView集成) 1 . 前言 前几天看到Google官方的博客介绍了Google开源的一个强大的布局-FlexboxLayou ...

  4. VC++ 共享内存读写操作

    此解决方案含两个工程文件,一个是写操作工程文件,即把任意字符串写入创建的共享内存里,另外一个读操作工程文件,则是读取共享内存里的数据,从而实现了进程之间的共享内存读写操作. 源码下载

  5. 浅谈Java——泛型DAO

    首先解释一下为什么要学习泛型DAO.平时在写DAO的时候是一个接口对应一个实现类,实现类里面要写很多的操作数据库的方法.当我们有很多的javaben的时候我们会写很多的接口和实现类,并且里面的代码都是 ...

  6. python之线程、进程

    线程语法 class Thread(_Verbose): """A class that represents a thread of control. This cla ...

  7. C#对DataTable里数据排序的方法

    protected void Page_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Ad ...

  8. MySQL: OPTIMIZE TABLE: Table does not support optimize, doing recreate + analyze instead

    show create table history;-------------------------- CREATE TABLE `foo` (  `itemid` bigint(20) unsig ...

  9. 用CHTCollectionViewWaterfallLayout写瀑布流

    用CHTCollectionViewWaterfallLayout写瀑布流 实现的瀑布流效果图: 源码: WaterfallCell.h 与 WaterfallCell.m // // Waterfa ...

  10. 可以简易设置文字内边距的EdgeInsetsLabel

    可以简易设置文字内边距的EdgeInsetsLabel 最终效果: 源码: EdgeInsetsLabel.h 与 EdgeInsetsLabel.m // // EdgeInsetsLabel.h ...