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. Form表单中Post与Get方法的区别

    Form提供了两种数据传输的方式:get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响. Form中的get和post方法,在数据传输过程中分别 ...

  2. Springmvc中的HandlerAdaptor执行流程

    今天讲解一下在Springmvc中的HandlerAdaptor执行流程,明白这个过程,你就能画出下面的图: 接下来我们就来看看具体的实现过程吧. 1.0在DispatcherServlet中找到ge ...

  3. Hackerrank GCD Product(莫比乌斯反演)

    题意 题目链接 Sol 一道咕咕咕了好长时间的题 题解可以看这里 #include<bits/stdc++.h> #define LL long long using namespace ...

  4. AIX修改时区,配置NTP服务

    AIX修改时区 smitty --> System Environments -->Change/Show Data and Time -->Change Time Zone Usi ...

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

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

  6. web 学习资源

    学习 https://skills.bugbank.cn/ https://github.com/JnuSimba/MiscSecNotes 靶场 http://skysec.top/2018/01/ ...

  7. Oracle数据库通过DBLINK实现远程访问

    什么是DBLINK? dblink(Database Link)数据库链接顾名思义就是数据库的链接  ,就像电话线一样,是一个通道,当我们要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中就 ...

  8. springboot学习网站及博客

    1关于Spring Boot的博客集合https://www.jianshu.com/p/7e2e5e7b32ab 2泥瓦匠BYSocket的Spring Boot系列 https://www.bys ...

  9. LeetCode题解之To Lower Case

    1.题目描述 2.分析 遍历字符串,使用C++ 的 标准库函数 isalpha() 判断字符是否为 字母,然后对其做 tolower() . 3.代码 string toLowerCase(strin ...

  10. springMVC入门-08

    这一讲介绍用户登录实现以及两种异常处理controller控制器的方法,最后提一下在springMVC中对静态资源访问的实现方法. 用户登录需要一个登录页面login.jsp,对应代码如下所示: &l ...