基于fpga的vga显示控制器设计与图像显示内容摘要:

尽管下面的描述仅限于 CRT, LCD已经发展到可以同 CRT使用同样的时序信号了。 因此,下面的讨论均适合 CRT和 LCD。 在 CRT显示器中,电流的波形通过蹄形磁铁产生磁场,使得电子束偏转,光栅在显示屏上横向显示,水平方向从左至右,垂直方向从上至下。 当电子束向正方向移动时,信息才显示,即从左至右、从上至下。 如果电子束从后返回左或顶边,显示屏并不显示任何信息。 在消隐周期 —— 电子束重新分配和稳定于新的水平或垂直位时,丢失了许多信息。 显示协议定义了电子束的大小以及通过显示屏的频率,该频率是可 调的。 现在的 VGA显示屏支持多种显示协议, VGA控制器通过协议产生时序信号来控制光栅。 控制器产生同步脉冲 TTL电平来设置电流通过偏转磁铁的频率,以确保像素或视频数据在适当的时间送给电子枪。 视频数据一般来自重复显示存储器中一个或多个字节 —— 它们被分配到每个像素单元。 入门实验板使用每个像素中的 3位,产生图 8中可能的一种颜色。 控制器指定视频数据缓冲器以备电子束通过显示屏。 然后,控制器接收并利用视频数据在适当的时间显示,电子束移动到指定的像素点。 根据图 , VGA控制器产生水平同步时序信号( HS)和垂直 同步时序信号(VS),调节在每个像素时钟视频数据的传送。 像素时钟定义了显示像素信息的有效时间段。 VS信号定义显示的更新频率,或刷新屏幕信息的频率。 最小的刷新频率是取决于显示器的亮度和电子束的强度,实际频率一般在 60~ 120Hz之间。 给定的刷新频率的水平线的数量定义了水平折回频率 [23]。 下 表的时序信号是 640 480,像素时钟 25Mhz,刷新频率 60Hz177。 1。 图 7说明了每个时序的联系。 同步脉冲的时序宽度( TPW)和前后门拱的间隔 TFP和 TBP)基于观察多种VGA的显示屏的结果。 前后门拱的间隔是前后同步脉冲 时间。 在这些时段信息不能显示。 图 VGA 控制器时序信号 图 各时序之间的联系 设计方案 设计方案如下: 将图像控制模块分为这样几部分:二分频电路( )、 VGA时序控制模块( )、存储器读出模块( )。 其中二分频把 50mhz时钟频率分成25mhz并提供给其它模块作为时钟; VGA时序控制模块用于产生 640 480显示范围,并控制显示范围和消隐范围以及产生水平同步时序信号 hs和垂直同步时序信号 vs的值;存储器读出模块提供给 SRAM地址并按地址读出八位数据(灰度值 Y),然后得到 R、 G、B的值(若 Y中间值,则 R=G=B=1;否则 R=G=B=0),并把 R、 G、 B的值通过 VGA接口传到 CRT显示器 ,如图。 图 模块设计总体结构 3 VGA 显示调试与显示 软件程序设计 本设计需要三个模块,一个是二分频电路、 VGA 时序控制模块 、 存储器读出模块。 1. 二分频电路 二分频把 50MHz 时钟频率分成 25MHz 并提供给其它模块作为时钟。 显示器的像素分辨率是 640 480,像素时钟 25Mhz,刷新频率 60Hz177。 1。 开发板提 供的系统时钟50MHz,所以要对板载时钟进行分频后才能使用。 分频电路的设计部分程序如下 : module clkdiv( input wire mclk, input wire clr, output wire clk25 )。 reg[24:0] q。 //25bit counter always @ (posedge mclk or posedge clr) begin if(clr==1) q=0。 else q=q+1。 end assign clk25=q[0]。 //25mhz endmodule VGA 时序控制模块用于产生 640*480 显示范围,并控制显示范围和消隐范围以及产生水平同步时序信号 hs 和垂直同步时序信号 vs 的值。 一般来说,时钟计数器通过像素时钟来控制水平时序信号。 译码计数器的值产生HS 信号。 在指定的行,计数器产生当前像素显示的位置。 一个独立的计数器产生垂直时序信号。 垂直同步计数器在每个 HS 脉冲信号来临时自动加 1,译码值产生 VS 信号。 计数器产生当前显示行。 这两个计数器从地址到显示缓冲器连续计数。 开发板的 DDR SDRAM 提供了一个足够的显示缓 冲区。 在 HS 脉冲的开始和 VS 脉冲的开始没有具体规定相对的时序关系。 因此,计数器被分配到简单格式的视频 RAM 地址,或分配到同步脉冲产生器的最小译码逻辑。 设计对时序控制部分的部分代码如下 : module vga640480( input wire clk, input wire clr, output reg hsync, output reg vsync, output reg [9:0]hc, output reg [9:0]vc, output reg vidon )。 parameter hpixels=1039。 b1100100000。 //行像素点 =800 parameter vlines=1039。 b1000001001。 //行数 =521 parameter hbp=1039。 b0010010000。 //行显示后沿 =144( 128+16) parameter hfp=1039。 b1100010000。 //行显示前沿 =784(128+16+640) parameter vbp=1039。 b0000011111。 //场显示后沿 =31( 2+29) parameter vfp=1039。 b0111111111。 //场显示前沿 =511(2+29+480) reg vsenable。 //Enbale for the Vertical counter //行同步信号计数器 always@(posedge clk or posedge clr) begin if(clr==1) hc=0。 else begin if(hc==hpixels1) begin //The counter has reached the end of pixel count hc=0。 //计数器复位 vsenable=1。 //Enable the vertical counter to increment end else begin hc=hc+1。 //Increment the horizontal counter vsenable=0。 //Leave the vsenable off end end end //产生 hsync 脉冲 //当 hc 为 0~127 时,行同步脉冲为低电平 always@(*) begin if (hc128) hsync=0。 else hsync=1。 end //场同步信号计数器 always@(posedge clk or posedge clr) begin if(clr==1) vc=0。 else if(vsenable==1) begin if(vc==vlines1) //Reset when the number of lines is reached vc=0。 else vc=vc+1。 //场计数器加 1 end end //产生 vsync 脉冲 //当 hc 为 0 或 1 时,场同步脉冲为低电平 always@(*) begin if(vc2) vsync=0。 else vsync=1。 end //Enable video out when within the porches always@(*) begin if((hchfp)amp。 amp。 (hchbp)amp。 amp。 (vcvfp)amp。 amp。 (vcvbp)) vidon=1。 else vidon=0。 end endmodule module vga_stripes( input wire vidon, input wire[9:0]hc,vc, output reg red,green, output reg blue )。 //输出 16 行宽的红绿条纹 always@(*) begin red=0。 green=0。 blue=0。 if(vidon==1) begin red={vc[4]}。 green=~{vc[4]}。 end end endmodule 彩条显示的顶层文件设计 module vga_initials_top( input wire mclk, input wire[3:0]btn, input wire[7:0]sw, output wire hsync, output wire vsync, output wire [2:0]red, output wire [2:0]green, output wire [1:0]blue )。 wire clr,clk25,vidon。 wire[9:0]hc,vc。 wire[0:31]M。 wire[3:0]rom_addr4。 assign clr=btn[3]。 clkdiv U1(.mclk(mclk), .clr(clr), .clk25(clk25) )。 vga640480 U2(.clk(clk25), .clr(clr), .hsync(hsync), .vsync(vsync), .hc(hc), .vc(vc), .vidon(vidon) )。 vga_initials U3(.vidon(vidon), .hc(hc), .vc(vc), .M(M), .sw(sw), .rom_addr4(rom_addr4), .red(red), .green(green), .blue(blue) )。 prom_DHM U4(.addr(rom_addr4), .M(M) )。 endmodule 程序在 QuartusⅡ 下的 编译与仿真 本设计利用 QuartusⅡ 软件进行设计与编译仿真和下载。 采用有源晶体频率为 50M Hz 给 FPGA 的 P23 提供时钟。 (第 23 叫输入时钟)。 独立按键的 I/O 分配: KEY1: PIN 144 KEY2: PIN 145 分别作为复位按钮和 SW 控制。 VGA 接口的分配 R : PIN 151 G : PIN 150 B : PIN 149 VGA VS : PIN 161 VGA HS : PIN 152 显示结果 通过以上的步 骤,将程序烧写进开发板中后,将 CRT 显示器连接到开发板的 VGA接口上。 给系统上电,在显示器上就可以看见两种模式的彩条:横彩条和竖彩条。 横彩条由场计数器 vcont 计数来进行控制,以实现某一个区域显示相应的颜色。 设计产生 8 个彩。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。