VGA显示
VGA控制器的编写主要是了解VGA的显示标准和时序,如1024X768@60Hz,确定时钟频率(65MHz=1344X806X60),列像素时间等于时钟周期,扫描从左到右、从上到下(类似于电视扫描PAL)。除有效时间外,一行还有同步脉冲时间、后肩和前肩。(http://tinyvga.com/vgatiming,http://wenku.baidu.com/view/13b3140102020740be1e9b94.html,
http://www.cnblogs.com/qiweiwang/archive/2011/01/17/1937688.html)
然后根据时序实现显示标准的功能模块,完成同步信号的输出、有效区域标志和当前坐标。一行列像素计数完成后,行计数器加1,列像素计数器清零后继续计数,知道最后一行计数完成后,行计数器清零,重复上述过程。
- `timescale ps/ ps
- module sync_module(
- output VSYNC_Sig,HSYNC_Sig,Ready_Sig,Frame_Sig,
- output [:]Column_Addr_Sig,Row_Addr_Sig,
- input CLK,RSTn
- );
- //VGA format: 640 X 480 @ 60Hz,pix width:0.039683us≈40ns,25MHz
- //场扫描时序: 2--30--484-- 9, 525
- //一般: 2--33--480-- 10
- //行扫描时序:96--45--646--13, 800
- //一般: 96--48--640--16
- //VGA format: 1024 X 768 @ 60Hz,pix width:1/65MHz
- //场扫描时序: 6-- 29-- 768-- 3, 806
- //行扫描时序:136--160--1024--24, 1344
- /********************************/
- reg [:]Count_H;
- always @ ( posedge CLK or negedge RSTn )
- if( !RSTn )
- Count_H <= 'd0;
- else if( Count_H == 'd1343 )
- Count_H <= 'd0;
- else
- Count_H <= Count_H + 'b1;
- /********************************/
- reg [:]Count_V;
- always @ ( posedge CLK or negedge RSTn )
- if( !RSTn )
- Count_V <= 'd0;
- else if( Count_V == 'd805 )
- Count_V <= 'd0;
- else if( Count_H == 'd1343 )
- Count_V <= Count_V + 'b1;
- /********************************/
- wire isReady;
- assign isReady = ( ( Count_H >= 'd296 && Count_H <= 11'd1319 ) && //有效时间1024
- ( Count_V >= 'd35 && Count_V <= 11'd802 ) ) ? 'b1 : 1'b0; //
- /*********************************/
- assign VSYNC_Sig = ( Count_V < 'd6 ) ? 1'b0 : 'b1; //场同步信号
- assign HSYNC_Sig = ( Count_H < 'd136 ) ? 1'b0 : 'b1; //行同步信号
- assign Ready_Sig = isReady;
- assign Frame_Sig = ( Count_V == 'd805 ) ? 1'b1 : 'b0; //帧结束标志
- /********************************/
- assign Column_Addr_Sig = isReady ? Count_H - 'd296 : 11'd0; // Count from 0; 列地址
- assign Row_Addr_Sig = isReady ? Count_V - 'd35 : 11'd0; // Count from 0; 行地址
- /********************************/
- endmodule
sync_module.v
第二个模块根据有效区域标志和当前坐标完成图像的显示,输出需要的RGB值,相对简单。
- `timescale ps/ ps
- module vga_control_module(
- output Red_Sig,Green_Sig,Blue_Sig,
- output[:]Rom_Addr,
- input[:]Rom_Data,
- input [:]Column_Addr_Sig,Row_Addr_Sig,
- input Ready_Sig,Frame_Sig,CLK,RSTn
- );
- /**********************************/
- //greenman 16X16,6pics
- //16X96,reg [15:0] mem [6:0],帧偏移量16
- reg [:]m;
- wire[:]row_addr;
- wire row_valid;
- assign row_addr = Row_Addr_Sig - 'd300; //图片显示起始位置y坐标:300
- assign row_valid = row_addr < && row_addr >= ; //图片行有效0-15
- always @ ( posedge CLK or negedge RSTn )
- if( !RSTn )
- m <= 'd0;
- else if( Ready_Sig && row_valid )
- m <= row_addr[:];
- else
- m <= 'd0;
- /************************************/
- reg [:]n;
- wire[:]col_addr;
- wire col_valid;
- assign col_addr = Column_Addr_Sig - 'd500; //图片显示起始位置x坐标:500
- assign col_valid = col_addr < && col_addr >= ; //图片列有效0-15
- always @ ( posedge CLK or negedge RSTn )
- if( !RSTn )
- n <= 'd0;
- else if( Ready_Sig && col_valid )
- n <= col_addr[:];
- else
- n <= 'd0;
- /**********************************/
- parameter FRAME = 'd10; //每幅图像显示10帧 X 6 = 60Hz
- /**********************************/
- reg [:]Count_Frame;
- always @ ( posedge CLK or negedge RSTn )
- if( !RSTn )
- Count_Frame <= 'd0;
- else if( Count_Frame == FRAME )
- Count_Frame <= 'd0;
- else if( Frame_Sig )
- Count_Frame <= Count_Frame + 'b1; //帧计数
- /************************************/
- ///// 帧偏移地址16,状态机控制,跳转条件计数到10帧切换下一幅图像
- reg [:]rAddr;
- reg [:]state;
- always @ ( posedge CLK or negedge RSTn )
- if( !RSTn )
- begin
- rAddr <= 'd0;
- state <= 'd0;
- end
- else
- case ( state )
- 'd0 :
- if( Count_Frame == FRAME ) state <= 'd1;
- else rAddr <= 'd0;
- 'd1 :
- if( Count_Frame == FRAME ) state <= 'd2;
- else rAddr <= 'd16;
- 'd2 :
- if( Count_Frame == FRAME ) state <= 'd3;
- else rAddr <= 'd32;
- 'd3 :
- if( Count_Frame == FRAME ) state <= 'd4;
- else rAddr <= 'd48;
- 'd4 :
- if( Count_Frame == FRAME ) state <= 'd5;
- else rAddr <= 'd48;
- 'd5 :
- if( Count_Frame == FRAME ) state <= 'd6;
- else rAddr <= 'd64;
- 'd6 :
- if( Count_Frame == FRAME ) state <= 'd0;
- else rAddr <= 'd80;
- endcase
- /************************************/
- assign Rom_Addr = rAddr + m; //图像起始地址 + 行寻址
- assign Red_Sig = Ready_Sig ? Rom_Data[ 'd15 - n ] : 1'b0; //扫描到图片大小区域时获取ROM数据,
- assign Green_Sig = Ready_Sig ? Rom_Data[ 'd15 - n ] : 1'b0; //row_valid && col_valid
- assign Blue_Sig = Ready_Sig ? ~Rom_Data[ 'd15 - n ] : 1'b0; //不在图片区域内时显示底色:蓝色
- /***********************************/
- // /**********************************/
- //
- // reg [5:0]m;
- // wire[10:0]row_add;
- // assign row_add = Row_Addr_Sig - 11'd300;
- //
- // always @ ( posedge CLK or negedge RSTn )
- // if( !RSTn )
- // m <= 6'd0;
- // else if( Ready_Sig && row_add < 64 && row_add >= 0 )
- // m <= row_add[5:0];
- // else
- // m <= 6'd0;
- //
- // /************************************/
- //
- // reg [5:0]n;
- // wire[10:0]col_add;
- // assign col_add = Column_Addr_Sig - 11'd500;
- //
- // always @ ( posedge CLK or negedge RSTn )
- // if( !RSTn )
- // n <= 6'd0;
- // else if( Ready_Sig && col_add < 64 && col_add >= 0 )
- // n <= col_add[5:0];
- // else
- // n <= 6'd0;
- //
- // /************************************/
- //
- // assign Rom_Addr = m;
- //
- // assign Red_Sig = Ready_Sig ? Red_Rom_Data[ 6'd63 - n ] : 1'b0; //3个ROM读取不同的RGB值
- // assign Green_Sig = Ready_Sig ? Green_Rom_Data[ 6'd63 - n ] : 1'b0;
- // assign Blue_Sig = Ready_Sig ? Blue_Rom_Data[ 6'd63 - n ] : 1'b0;
- ////---------显示一个圆--------------------
- //parameter radius = 11'd100; //半径
- //parameter radius2 = radius * radius; //半径的平方
- //parameter x_pos = 11'd400; //圆心x坐标
- //parameter y_pos = 11'd500; //圆心y坐标
- //
- //reg[10:0] x_temp,y_temp;
- //reg[21:0] x_temp_2,y_temp_2;
- //wire is_flag;
- //
- //always@*
- // if(Column_Addr_Sig >= x_pos)
- // x_temp = Column_Addr_Sig - x_pos;
- // else
- // x_temp = x_pos - Column_Addr_Sig;
- //
- //always@*
- // if(Row_Addr_Sig >= y_pos)
- // y_temp = Row_Addr_Sig - y_pos;
- // else
- // y_temp = y_pos - Row_Addr_Sig;
- //
- //always@*
- // x_temp_2 = x_temp * x_temp;
- //
- //always@*
- // y_temp_2 = y_temp * y_temp;
- //
- //assign is_flag = (x_temp_2 + y_temp_2) <= 10000;
- //
- //assign Red_Sig = Ready_Sig ? is_flag : 1'b0;
- //assign Green_Sig = Ready_Sig ? ~is_flag : 1'b0;
- //assign Blue_Sig = Ready_Sig ? ~is_flag : 1'b0;
- //--------------------------------------------------
- //显示一个矩形框
- //wire a_dis,b_dis,c_dis,d_dis; //矩形框显示区域定位
- //
- //assign a_dis = ( (Column_Addr_Sig>=200) && (Column_Addr_Sig<220) )
- // && ( (Row_Addr_Sig>=140) && (Row_Addr_Sig<460) );
- //
- //assign b_dis = ( (Column_Addr_Sig>=580) && (Column_Addr_Sig<600) )
- // && ( (Row_Addr_Sig>=140) && (Row_Addr_Sig<460) );
- //
- //assign c_dis = ( (Column_Addr_Sig>=220) && (Column_Addr_Sig<580) )
- // && ( (Row_Addr_Sig>=140) && (Row_Addr_Sig<160) );
- //
- //assign d_dis = ( (Column_Addr_Sig>=220) && (Column_Addr_Sig<580) )
- // && ( (Row_Addr_Sig>=440) && (Row_Addr_Sig<460) );
- //
- // //显示一个小矩形
- //wire e_rdy; //矩形的显示有效矩形区域
- //
- //assign e_rdy = ( (Column_Addr_Sig>=385) && (Column_Addr_Sig<=415) )
- // && ( (Row_Addr_Sig>=285) && (Row_Addr_Sig<=315) );
- //
- ////--------------------------------------------------
- // //r,g,b控制液晶屏颜色显示,背景显示蓝色,矩形框显示红蓝色
- //assign Red_Sig = Ready_Sig ? e_rdy : 1'b0;
- //assign Green_Sig = Ready_Sig ? (a_dis | b_dis | c_dis | d_dis) : 1'b0;
- //assign Blue_Sig = Ready_Sig ? ~(a_dis | b_dis | c_dis | d_dis) : 1'b0;
- //wire a_pos;
- //assign a_pos = Column_Addr_Sig > 11'd0 && Row_Addr_Sig < 11'd100 ;
- //// /************************************/
- ////
- // assign Red_Sig = Ready_Sig ? a_pos: 1'b0;
- // assign Green_Sig = Ready_Sig ? a_pos : 1'b0;
- // assign Blue_Sig = Ready_Sig ? ~a_pos : 1'b0;
- endmodule
vga_control_module.v
VGA显示的更多相关文章
- VmodCAM图像采集 VGA显示
先上图 总体框图 效果图 效果不是很好,因为暂时用的是zedboard自带的VGA,其只能RGB只有3*3*3的彩色度 VmodCAM原理图 VmodCAM的zedboard管脚约束见:http:// ...
- vga显示彩条
vga显示驱动程序可分为扫描行列和行列同步两个部分 //注意:只有在有效区域内给vga赋值才会有颜色变化 assign vga_b = isready ? vga_s[:] :'d0; assign ...
- 基于FPGA的VGA显示静态图片
终于熬到暑假了,记过三四周的突击带考试,终于为我的大二画上了一个完整的句号,接下来终于可以静心去做自己想做的事情了,前一阵子报了一个线上培训班,学学Sobel边缘检测,之前一直在学习图像处理,但是因为 ...
- 基于FPGA的Uart接收图像数据至VGA显示
系统框图 前面我们设计了基于FPGA的静态图片显示,接下来我们来做做基于FPGA的动态图片显示,本实验内容为:由PC端上位机软件通过串口发送一幅图像数据至FPGA,FPGA内部将图像数据存储,最后扫描 ...
- 纠错:基于FPGA串口发送彩色图片数据至VGA显示
今天这篇文章是要修改之前的一个错误,前面我写过一篇基于FPGA的串口发送图片数据至VGA显示的文章,最后是显示成功了,但是显示的效果图,看起来确实灰度图,当时我默认我使用的MATLAB代码将图片数据转 ...
- 基于FPGA驱动VGA显示图片的小问题
学习VGA显示图片的过程中,遇到了一个小问题,我在显示屏上开了一个60x60的框,放了一张图片进去显示,但是最终的结果如下图所示. 出现了一个竖黑边,看了看代码,分析了一下逻辑没问题,然而看这个显示那 ...
- FPGA驱动VGA显示静态图片
一 .前言 本文设计思想采用明德扬至简设计法.VGA是最常见的视频显示接口,时序也较为简单.本文从利用显示屏通过VGA方式显示测试图案及静态图片着手带大家接触图像显示应用,算是为后续VGA显示摄像头采 ...
- verilog实现VGA显示方块屏幕保护
verilog实现VGA显示方块屏幕保护 输入和输出 时钟信号 clk 复位信号 reset rgb三颜色输出 [2:0] r,g, [1:0] b 行信号输出 hs 列信号输出 vs 参数设定 设定 ...
- 基于FPGA的VGA显示设计(二)
上一篇:基于FPGA的VGA显示设计(一) 参照 CrazyBingo 的 基于FPGA的VGA可移植模块终极设计代码 的工程代码风格,模块化处理了上一篇的代码,并增加了一点其它图形. 顶层 ...
- 基于FPGA的VGA显示设计(一)
前言 FPGA主要运用于芯片验证.通信.图像处理.显示VGA接口的显示器是最基本的要求了. 原理 首先需要了解 : (1)VGA接口协议:VGA端子_维基百科 .VGA视频传输标准_百度 引脚1 RE ...
随机推荐
- vue render函数
基础 vue推荐在绝大多数情况下使用template来创建你的html.然而在一些场景中,你真的需要javascript的完全编程能力.这就是render函数.它比template更接近编译器 < ...
- Unity—JsonFx序列化场景
场景数据类: /// <summary> /// 关卡数据 /// </summary> public class LevelData { //关卡名称 pub ...
- hdu6078 Wavel Sequence dp+二维树状数组
//#pragma comment(linker, "/STACK:102400000,102400000") /** 题目:hdu6078 Wavel Sequence 链接:h ...
- highCharts图表应用-模拟心电图
通过前两章的学习,相信大家对highcharts已经有了初步的了解.这一章将通过一个例子来模拟Highcharts如何实现经常变化的数据显示. 比如说股票的涨停.实时篮球比分以及A选手和B选手的支持率 ...
- 【BZOJ】3404: [Usaco2009 Open]Cow Digit Game又见数字游戏(博弈论)
http://www.lydsy.com/JudgeOnline/problem.php?id=3404 写挫好几次.... 裸的博弈论即可.. #include <cstdio> #in ...
- 虚拟机安装Ubuntu过程记录
1.WMware中新建虚拟机 2.选择安装程序光盘镜像iso 3.个性化Linux(全名.用户名.密码等) 4.指定虚拟机名称以及安装位置 5.指定虚拟机磁盘容量大小 6.完成虚拟机配置 安装过程.. ...
- eclipse ${user}和${date}
在Eclipse中使用类的自动注释时,@author ${user}, 这个值不会随着你更改系统用户名而改变.有的人会将这个 ${user} 变量直接替换为某个固定名称. 以下方法可以修改它的值. 在 ...
- win7物理主机与虚拟XP系统互相ping不通解决方法
安装了虚拟XP系统,win7物理主机与XP系统ping不通,原因在于安装虚拟XP系统网络连接方式选的仅主机网络,则win7物理主机上的网卡应为VMnet1,而自己的win7VMnet1网卡处于禁用状态 ...
- 《JavaScript高级程序设计》读书笔记1--HTTP头部信息
优秀的书籍常读常新 ----------------------------------------- 在发送XHR请求的同时,还会发送如下头部信息: --Accept: 浏览器能够处理的内容类型 - ...
- 170213、亿级Web系统搭建——单机到分布式集群
[导读]徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设. 大规模流量的网站架构,从来都是慢慢“成长”而来.而这 ...