VGA控制器的编写主要是了解VGA的显示标准和时序,如1024X768@60Hz,确定时钟频率(65MHz=1344X806X60),列像素时间等于时钟周期,扫描从左到右、从上到下(类似于电视扫描PAL)。除有效时间外,一行还有同步脉冲时间、后肩和前肩。(http://tinyvga.com/vgatiminghttp://wenku.baidu.com/view/13b3140102020740be1e9b94.html,

http://www.cnblogs.com/qiweiwang/archive/2011/01/17/1937688.html

然后根据时序实现显示标准的功能模块,完成同步信号的输出、有效区域标志和当前坐标。一行列像素计数完成后,行计数器加1,列像素计数器清零后继续计数,知道最后一行计数完成后,行计数器清零,重复上述过程。

  1. `timescale ps/ ps
  2. module sync_module(
  3. output VSYNC_Sig,HSYNC_Sig,Ready_Sig,Frame_Sig,
  4. output [:]Column_Addr_Sig,Row_Addr_Sig,
  5. input CLK,RSTn
  6. );
  7. //VGA format: 640 X 480 @ 60Hz,pix width:0.039683us≈40ns,25MHz
  8. //场扫描时序: 2--30--484-- 9, 525
  9. //一般: 2--33--480-- 10
  10. //行扫描时序:96--45--646--13, 800
  11. //一般: 96--48--640--16
  12.  
  13. //VGA format: 1024 X 768 @ 60Hz,pix width:1/65MHz
  14. //场扫描时序: 6-- 29-- 768-- 3, 806
  15. //行扫描时序:136--160--1024--24, 1344
  16. /********************************/
  17.  
  18. reg [:]Count_H;
  19.  
  20. always @ ( posedge CLK or negedge RSTn )
  21. if( !RSTn )
  22. Count_H <= 'd0;
  23. else if( Count_H == 'd1343 )
  24. Count_H <= 'd0;
  25. else
  26. Count_H <= Count_H + 'b1;
  27.  
  28. /********************************/
  29.  
  30. reg [:]Count_V;
  31.  
  32. always @ ( posedge CLK or negedge RSTn )
  33. if( !RSTn )
  34. Count_V <= 'd0;
  35. else if( Count_V == 'd805 )
  36. Count_V <= 'd0;
  37. else if( Count_H == 'd1343 )
  38. Count_V <= Count_V + 'b1;
  39.  
  40. /********************************/
  41. wire isReady;
  42.  
  43. assign isReady = ( ( Count_H >= 'd296 && Count_H <= 11'd1319 ) && //有效时间1024
  44. ( Count_V >= 'd35 && Count_V <= 11'd802 ) ) ? 'b1 : 1'b0; //
  45.  
  46. /*********************************/
  47.  
  48. assign VSYNC_Sig = ( Count_V < 'd6 ) ? 1'b0 : 'b1; //场同步信号
  49. assign HSYNC_Sig = ( Count_H < 'd136 ) ? 1'b0 : 'b1; //行同步信号
  50. assign Ready_Sig = isReady;
  51. assign Frame_Sig = ( Count_V == 'd805 ) ? 1'b1 : 'b0; //帧结束标志
  52.  
  53. /********************************/
  54.  
  55. assign Column_Addr_Sig = isReady ? Count_H - 'd296 : 11'd0; // Count from 0; 列地址
  56. assign Row_Addr_Sig = isReady ? Count_V - 'd35 : 11'd0; // Count from 0; 行地址
  57.  
  58. /********************************/
  59.  
  60. endmodule

sync_module.v

第二个模块根据有效区域标志和当前坐标完成图像的显示,输出需要的RGB值,相对简单。

  1. `timescale ps/ ps
  2. module vga_control_module(
  3. output Red_Sig,Green_Sig,Blue_Sig,
  4. output[:]Rom_Addr,
  5. input[:]Rom_Data,
  6. input [:]Column_Addr_Sig,Row_Addr_Sig,
  7. input Ready_Sig,Frame_Sig,CLK,RSTn
  8. );
  9.  
  10. /**********************************/
  11. //greenman 16X16,6pics
  12. //16X96,reg [15:0] mem [6:0],帧偏移量16
  13.  
  14. reg [:]m;
  15. wire[:]row_addr;
  16. wire row_valid;
  17. assign row_addr = Row_Addr_Sig - 'd300; //图片显示起始位置y坐标:300
  18. assign row_valid = row_addr < && row_addr >= ; //图片行有效0-15
  19.  
  20. always @ ( posedge CLK or negedge RSTn )
  21. if( !RSTn )
  22. m <= 'd0;
  23. else if( Ready_Sig && row_valid )
  24. m <= row_addr[:];
  25. else
  26. m <= 'd0;
  27.  
  28. /************************************/
  29.  
  30. reg [:]n;
  31. wire[:]col_addr;
  32. wire col_valid;
  33. assign col_addr = Column_Addr_Sig - 'd500; //图片显示起始位置x坐标:500
  34. assign col_valid = col_addr < && col_addr >= ; //图片列有效0-15
  35.  
  36. always @ ( posedge CLK or negedge RSTn )
  37. if( !RSTn )
  38. n <= 'd0;
  39. else if( Ready_Sig && col_valid )
  40. n <= col_addr[:];
  41. else
  42. n <= 'd0;
  43.  
  44. /**********************************/
  45.  
  46. parameter FRAME = 'd10; //每幅图像显示10帧 X 6 = 60Hz
  47.  
  48. /**********************************/
  49.  
  50. reg [:]Count_Frame;
  51.  
  52. always @ ( posedge CLK or negedge RSTn )
  53. if( !RSTn )
  54. Count_Frame <= 'd0;
  55. else if( Count_Frame == FRAME )
  56. Count_Frame <= 'd0;
  57. else if( Frame_Sig )
  58. Count_Frame <= Count_Frame + 'b1; //帧计数
  59.  
  60. /************************************/
  61. ///// 帧偏移地址16,状态机控制,跳转条件计数到10帧切换下一幅图像
  62.  
  63. reg [:]rAddr;
  64. reg [:]state;
  65.  
  66. always @ ( posedge CLK or negedge RSTn )
  67. if( !RSTn )
  68. begin
  69. rAddr <= 'd0;
  70. state <= 'd0;
  71. end
  72. else
  73. case ( state )
  74.  
  75. 'd0 :
  76. if( Count_Frame == FRAME ) state <= 'd1;
  77. else rAddr <= 'd0;
  78.  
  79. 'd1 :
  80. if( Count_Frame == FRAME ) state <= 'd2;
  81. else rAddr <= 'd16;
  82.  
  83. 'd2 :
  84. if( Count_Frame == FRAME ) state <= 'd3;
  85. else rAddr <= 'd32;
  86.  
  87. 'd3 :
  88. if( Count_Frame == FRAME ) state <= 'd4;
  89. else rAddr <= 'd48;
  90.  
  91. 'd4 :
  92. if( Count_Frame == FRAME ) state <= 'd5;
  93. else rAddr <= 'd48;
  94.  
  95. 'd5 :
  96. if( Count_Frame == FRAME ) state <= 'd6;
  97. else rAddr <= 'd64;
  98.  
  99. 'd6 :
  100. if( Count_Frame == FRAME ) state <= 'd0;
  101. else rAddr <= 'd80;
  102.  
  103. endcase
  104.  
  105. /************************************/
  106.  
  107. assign Rom_Addr = rAddr + m; //图像起始地址 + 行寻址
  108.  
  109. assign Red_Sig = Ready_Sig ? Rom_Data[ 'd15 - n ] : 1'b0; //扫描到图片大小区域时获取ROM数据,
  110. assign Green_Sig = Ready_Sig ? Rom_Data[ 'd15 - n ] : 1'b0; //row_valid && col_valid
  111. assign Blue_Sig = Ready_Sig ? ~Rom_Data[ 'd15 - n ] : 1'b0; //不在图片区域内时显示底色:蓝色
  112.  
  113. /***********************************/
  114.  
  115. // /**********************************/
  116. //
  117. // reg [5:0]m;
  118. // wire[10:0]row_add;
  119. // assign row_add = Row_Addr_Sig - 11'd300;
  120. //
  121. // always @ ( posedge CLK or negedge RSTn )
  122. // if( !RSTn )
  123. // m <= 6'd0;
  124. // else if( Ready_Sig && row_add < 64 && row_add >= 0 )
  125. // m <= row_add[5:0];
  126. // else
  127. // m <= 6'd0;
  128. //
  129. // /************************************/
  130. //
  131. // reg [5:0]n;
  132. // wire[10:0]col_add;
  133. // assign col_add = Column_Addr_Sig - 11'd500;
  134. //
  135. // always @ ( posedge CLK or negedge RSTn )
  136. // if( !RSTn )
  137. // n <= 6'd0;
  138. // else if( Ready_Sig && col_add < 64 && col_add >= 0 )
  139. // n <= col_add[5:0];
  140. // else
  141. // n <= 6'd0;
  142. //
  143. // /************************************/
  144. //
  145. // assign Rom_Addr = m;
  146. //
  147. // assign Red_Sig = Ready_Sig ? Red_Rom_Data[ 6'd63 - n ] : 1'b0; //3个ROM读取不同的RGB值
  148. // assign Green_Sig = Ready_Sig ? Green_Rom_Data[ 6'd63 - n ] : 1'b0;
  149. // assign Blue_Sig = Ready_Sig ? Blue_Rom_Data[ 6'd63 - n ] : 1'b0;
  150.  
  151. ////---------显示一个圆--------------------
  152. //parameter radius = 11'd100; //半径
  153. //parameter radius2 = radius * radius; //半径的平方
  154. //parameter x_pos = 11'd400; //圆心x坐标
  155. //parameter y_pos = 11'd500; //圆心y坐标
  156. //
  157. //reg[10:0] x_temp,y_temp;
  158. //reg[21:0] x_temp_2,y_temp_2;
  159. //wire is_flag;
  160. //
  161. //always@*
  162. // if(Column_Addr_Sig >= x_pos)
  163. // x_temp = Column_Addr_Sig - x_pos;
  164. // else
  165. // x_temp = x_pos - Column_Addr_Sig;
  166. //
  167. //always@*
  168. // if(Row_Addr_Sig >= y_pos)
  169. // y_temp = Row_Addr_Sig - y_pos;
  170. // else
  171. // y_temp = y_pos - Row_Addr_Sig;
  172. //
  173. //always@*
  174. // x_temp_2 = x_temp * x_temp;
  175. //
  176. //always@*
  177. // y_temp_2 = y_temp * y_temp;
  178. //
  179. //assign is_flag = (x_temp_2 + y_temp_2) <= 10000;
  180. //
  181. //assign Red_Sig = Ready_Sig ? is_flag : 1'b0;
  182. //assign Green_Sig = Ready_Sig ? ~is_flag : 1'b0;
  183. //assign Blue_Sig = Ready_Sig ? ~is_flag : 1'b0;
  184.  
  185. //--------------------------------------------------
  186. //显示一个矩形框
  187. //wire a_dis,b_dis,c_dis,d_dis; //矩形框显示区域定位
  188. //
  189. //assign a_dis = ( (Column_Addr_Sig>=200) && (Column_Addr_Sig<220) )
  190. // && ( (Row_Addr_Sig>=140) && (Row_Addr_Sig<460) );
  191. //
  192. //assign b_dis = ( (Column_Addr_Sig>=580) && (Column_Addr_Sig<600) )
  193. // && ( (Row_Addr_Sig>=140) && (Row_Addr_Sig<460) );
  194. //
  195. //assign c_dis = ( (Column_Addr_Sig>=220) && (Column_Addr_Sig<580) )
  196. // && ( (Row_Addr_Sig>=140) && (Row_Addr_Sig<160) );
  197. //
  198. //assign d_dis = ( (Column_Addr_Sig>=220) && (Column_Addr_Sig<580) )
  199. // && ( (Row_Addr_Sig>=440) && (Row_Addr_Sig<460) );
  200. //
  201. // //显示一个小矩形
  202. //wire e_rdy; //矩形的显示有效矩形区域
  203. //
  204. //assign e_rdy = ( (Column_Addr_Sig>=385) && (Column_Addr_Sig<=415) )
  205. // && ( (Row_Addr_Sig>=285) && (Row_Addr_Sig<=315) );
  206. //
  207. ////--------------------------------------------------
  208. // //r,g,b控制液晶屏颜色显示,背景显示蓝色,矩形框显示红蓝色
  209. //assign Red_Sig = Ready_Sig ? e_rdy : 1'b0;
  210. //assign Green_Sig = Ready_Sig ? (a_dis | b_dis | c_dis | d_dis) : 1'b0;
  211. //assign Blue_Sig = Ready_Sig ? ~(a_dis | b_dis | c_dis | d_dis) : 1'b0;
  212.  
  213. //wire a_pos;
  214. //assign a_pos = Column_Addr_Sig > 11'd0 && Row_Addr_Sig < 11'd100 ;
  215. //// /************************************/
  216. ////
  217. // assign Red_Sig = Ready_Sig ? a_pos: 1'b0;
  218. // assign Green_Sig = Ready_Sig ? a_pos : 1'b0;
  219. // assign Blue_Sig = Ready_Sig ? ~a_pos : 1'b0;
  220.  
  221. endmodule

vga_control_module.v

VGA显示的更多相关文章

  1. VmodCAM图像采集 VGA显示

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

  2. vga显示彩条

    vga显示驱动程序可分为扫描行列和行列同步两个部分 //注意:只有在有效区域内给vga赋值才会有颜色变化 assign vga_b = isready ? vga_s[:] :'d0; assign ...

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

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

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

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

  5. 纠错:基于FPGA串口发送彩色图片数据至VGA显示

    今天这篇文章是要修改之前的一个错误,前面我写过一篇基于FPGA的串口发送图片数据至VGA显示的文章,最后是显示成功了,但是显示的效果图,看起来确实灰度图,当时我默认我使用的MATLAB代码将图片数据转 ...

  6. 基于FPGA驱动VGA显示图片的小问题

    学习VGA显示图片的过程中,遇到了一个小问题,我在显示屏上开了一个60x60的框,放了一张图片进去显示,但是最终的结果如下图所示. 出现了一个竖黑边,看了看代码,分析了一下逻辑没问题,然而看这个显示那 ...

  7. FPGA驱动VGA显示静态图片

    一 .前言 本文设计思想采用明德扬至简设计法.VGA是最常见的视频显示接口,时序也较为简单.本文从利用显示屏通过VGA方式显示测试图案及静态图片着手带大家接触图像显示应用,算是为后续VGA显示摄像头采 ...

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

    verilog实现VGA显示方块屏幕保护 输入和输出 时钟信号 clk 复位信号 reset rgb三颜色输出 [2:0] r,g, [1:0] b 行信号输出 hs 列信号输出 vs 参数设定 设定 ...

  9. 基于FPGA的VGA显示设计(二)

    上一篇:基于FPGA的VGA显示设计(一)     参照 CrazyBingo 的 基于FPGA的VGA可移植模块终极设计代码  的工程代码风格,模块化处理了上一篇的代码,并增加了一点其它图形. 顶层 ...

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

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

随机推荐

  1. vue render函数

    基础 vue推荐在绝大多数情况下使用template来创建你的html.然而在一些场景中,你真的需要javascript的完全编程能力.这就是render函数.它比template更接近编译器 < ...

  2. Unity—JsonFx序列化场景

    场景数据类: /// <summary> /// 关卡数据 /// </summary> public class LevelData {     //关卡名称     pub ...

  3. hdu6078 Wavel Sequence dp+二维树状数组

    //#pragma comment(linker, "/STACK:102400000,102400000") /** 题目:hdu6078 Wavel Sequence 链接:h ...

  4. highCharts图表应用-模拟心电图

    通过前两章的学习,相信大家对highcharts已经有了初步的了解.这一章将通过一个例子来模拟Highcharts如何实现经常变化的数据显示. 比如说股票的涨停.实时篮球比分以及A选手和B选手的支持率 ...

  5. 【BZOJ】3404: [Usaco2009 Open]Cow Digit Game又见数字游戏(博弈论)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3404 写挫好几次.... 裸的博弈论即可.. #include <cstdio> #in ...

  6. 虚拟机安装Ubuntu过程记录

    1.WMware中新建虚拟机 2.选择安装程序光盘镜像iso 3.个性化Linux(全名.用户名.密码等) 4.指定虚拟机名称以及安装位置 5.指定虚拟机磁盘容量大小 6.完成虚拟机配置 安装过程.. ...

  7. eclipse ${user}和${date}

    在Eclipse中使用类的自动注释时,@author ${user}, 这个值不会随着你更改系统用户名而改变.有的人会将这个 ${user} 变量直接替换为某个固定名称. 以下方法可以修改它的值. 在 ...

  8. win7物理主机与虚拟XP系统互相ping不通解决方法

    安装了虚拟XP系统,win7物理主机与XP系统ping不通,原因在于安装虚拟XP系统网络连接方式选的仅主机网络,则win7物理主机上的网卡应为VMnet1,而自己的win7VMnet1网卡处于禁用状态 ...

  9. 《JavaScript高级程序设计》读书笔记1--HTTP头部信息

    优秀的书籍常读常新 ----------------------------------------- 在发送XHR请求的同时,还会发送如下头部信息: --Accept: 浏览器能够处理的内容类型 - ...

  10. 170213、亿级Web系统搭建——单机到分布式集群

    [导读]徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设. 大规模流量的网站架构,从来都是慢慢“成长”而来.而这 ...