《基于FPGA的VGA显示控制器设计.pdf》由会员分享,可在线阅读,更多相关《基于FPGA的VGA显示控制器设计.pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、课课程程学学院:院:专专业:业:班班级:级:学学号:号:设设计计开课学期:开课学期:第六学期课程名称:课程名称:FPGA 课程设计姓姓名:名:任课教师:任课教师:2015 年 7 月 20 日基于基于 FPGAFPGA 的的 VGAVGA 显示控制器设计显示控制器设计一一、设计方案、设计方案1.1.设计的主要内容设计的主要内容此设计要求实现某一分辨率下(如 640*48060Hz)的 VGA 显示驱动,能简单显示彩条和图像等。能够熟悉 VGA 接口协议、工作时序及 VGA 工作原理,并计算出合适的时序,对原始时钟进行分频处理以获取符合时序要求的各率,此外须要显示的图像等可存储于外部存储器,运行
2、时,从外部存储器读取显示数据。将图像控制模块分为这样几部分;二分频电路、地址发生器、VGA 时序控制模块、图像数据存储器读出模块.如图 1-1 所示:图 1-1 VGA 显示控制系统框图2.2.设计原理设计原理显示控制器是一个较大的数字系统,采用模块化设计原则、借鉴自顶向下的程序设计思想,进行功能分离并按层次设计。利用 VHDL 硬件描述语言对每个功能模块进行描述,并逐一对每个功能模块进行编译仿真,使顶层VGA 显示控制器的模块实体仿真综合得以顺利通过。其中二分频把 50MHZ 实在频率分成 25Mhz 并提供给其它模块作为时钟;VGA 时序控制模块用于产生 640X480 显示范围,并控制显
3、示范围和消隐范围以及产生水平同步时序信号 HS 和垂直同步时序信号 VS 的值;存储器读出模块提供给 SRAM 地址并按地址读出八位数据(灰度值 Y),然后得到 R、G、B 的值(若 Y中间值,则 R=G=B=1;否则 R=G=B=0),并把R、G、B 的值通过 VGA 接口传送给 VRT 显示器9。地址发生器接收所要显示的数据读取控制信号,产生与图像数据ROM 模块对应得地址,根据VGA 显示的像素分布,确定读取对应数据的地址,由于所显示的图形每行需256 个像素,而ROM 中每个地址存储的数据时 64 位,故每 4 个地址取出的数据用于一行的显示。VGA 显示控制模块:主要分为时序信号和数
4、据颜色的控制,imgrom 模块即图像数据 ROM 模块,在这一模块中需要解决的是图像数据 BMP 位图文件的来源及转换成 HEX 文件,利用 Image2lcd对本次设计图片处理得到 BMP 文件,最终在 Quartus II 得到 HEX 文件,在已设置 LPM_ROM进行加载图像数据。注意其数据线宽为 3,恰好可以放置 RGB 三信号数据,因此此设计图像仅能显示 8 种颜色。此外注意各模块对图像显示的区域控制。二、系统实现二、系统实现此系统设计分主要由,二分频模块,地址译码器模块,VGA 显示控制模块及图像数据 ROM 来实现对图像的显示。计数器模块设计简单,用计数器计数来控制,以实现某
5、一个区域显示相应的颜色。具体以 VGA 显示模块和图像数据 ROM 为例进行详细分析与操作。1.1.VGAVGA 显示控制模块显示控制模块VGA 显示控制模块主要通过 VGA 时序产生 640*480 显示范围,并控制和消隐范围以及产生水平同步时序信号 hs 和垂直同步时序信号 vs 的值。一个独立的计数器产生垂直时序信号。垂直同步计数器在每个 HS 脉冲信号来临时自动加 1,译码值产生 VS 信号。计数器产生当前显示行。这两个计数器从地址到显示缓冲器连续计数。首先启动 QUARTUS 软件,新建 vga640480 显示扫描模块工程文件,如下图 2-1所示:图 2-1创建工程 vga6404
6、80单击完成按钮,创建好了设计工程,选择【FILE】【NEW】菜单,出现如图2-2 所示的新建设计文件类型窗口。图 2-2选择编程 VHDL 文本文件在上图 2-2 中选择【VHDL File】,单击【OK】建立一个新的文本设计文件,命名为vga640480.vhd。随即进行程序代码的输入。图 2-3保存设计文件在图 2-3 中的【File】菜单中点选【Save as】存盘并保证该文件添加到了工程中,文件名为默认的即可。至此,vga640480 显示扫描模块文件建立完成。2.rom2.rom 载入载入当 VGA 显示器要显示一帧图像,需要较多的数据量,FPGA 芯片内置的 ROM 存储器很难符
7、合如此大的数据存储要求,所以必须借助于外部的存储器存入图像数据。读取控制模块的数据读取方式决定于采用何种存储器。然而外部存储器有多种选择,如 ROM,、双口RAM、甚至SDRAM 等,例如ROM 可用直接产生地址信号的方式对芯片进行访问,而 SDRAM 则是利用 DMA 控制方式配合 CPU 进行读写操作6。接下来将详细介绍如何将已有的 rom_r、rom_g 和 rom_b 文件载入开发板的 rom 中。首先,以“rom”作为关键词在 IP 目录中进行搜索,选择并双击“ROM:1-PORT”:在对话框中选择“Verilog”,在默认目录下选择合适的“*.v”文件。选择 ROM 控制线,地址线
8、和数据线。在图 2-6 所示的对话框中选择地址线位宽和 ROM数据线分别为 8 和 65536,选择的地址锁存控制信号 Single clock。图图 2-42-4 载入载入 romrom选择已有的“*.mif”文件,载入 rom。3.3.二分频模块二分频模块在系统进行设计中二分频把50MHz时钟频率分成25MHz并提供给其它模块作为时钟。显示器的像素分辨率是 640480,像素时钟 25Mhz,刷新频率 60Hz1。开发板提供的系统时钟 50MHz,所以要对板载时钟进行分频后才能使用。由于 50M 分频难以仿真,故将输入时钟clk50m设置为50kHz,分频得到clk25m实际为25kHz。
9、它的模块设计相比VGA显示模块更为简单,在项目中创建新的文件,编写二分频模块代码,保存编译。4.4.顶层设计顶层设计在以上模块设计完成后,整体编译并无错误后,建原理图文件,调用 VGA 显示模块、图像数据 rom、二分频模块,用软件自带的RTL Viewer 自动生成他们连线组成系统的原理图,如图 2-8 所示:按照开发板手册进行管脚分配,如下图所示:图图 2-62-6 选择选择 romrom 模块数据线和地址线宽度模块数据线和地址线宽度图图 2-72-7 载入载入 romrom图图 2-82-8RTL ViewerRTL Viewer 自动生成的原理图自动生成的原理图图图 2-9 FPGA2
10、-9 FPGA 开发板管脚分配开发板管脚分配5.5.仿真波形仿真波形图图 2-102-10 仿真波形图仿真波形图6.6.设计结果设计结果通过上述的步骤之后,将系统顶层文件烧写进开发板,将 CRT显示器连接到开发板的VGA接口上。给系统上电,在显示器就可以看见本次设计所选用的图片,如图 1-11所示:三、三、结束语结束语用 FPGA 来控制 VGA,充分利用了 FPGA 可重构这一优势,克服了以前通用处理器体积较大体系结构不易修改、体系结构不易修改等弊端。通过 rom 来存储图片的信息,实现了基于 FPGA 的图形显示,方便图片信息的输入,更新显示的内容以及修改。可以使图片的显示脱离计算机的控制
11、,而且使控制器的体积减小很多,对各种便携式设备和小型嵌入式系统的实现具有工程价值现实意义和现实意义。使用可编程逻辑器件可以很方便地实现数字系统设计,为此基于 FPGA 器件的 VGA控制器可以实现显示器的实时显示。系统设计方案、硬件描述语言设计以及开发工具的性能决定了该系统性能高低。随着 VGA 接口的普遍使用,这种结合 FPGA 的系统级设计方法已经展现优势。从整个设计流程来看,系统的可靠性高,灵活性强,设计周期大大缩减,成本降低,且系统的可扩展性强。不久的将来,VGA 接口的图像与视频监控系统应用定会很有广阔的市场。经过此次课程设计,我不仅更加学会知识之间的融会贯通,而且丰富了大脑,同时在
12、查找资料的过程中也了解了许多课外知识,开拓了视野,认识了未来电子的发展方向,专业基础知识方面和动手能力方面有了质的飞跃。做课程设计的同时也是对自己能力的一种提高。通过此课程设计,我明白了自己原来所掌握的知识太理论化了,面对单独的课题产生着很茫然的感觉,自己要学习的东西还很多。也让我明白学习是一个长期的过程,需要不断的积累,在以后的工作和生活中都需坚持学习,努力提高自己的知识和综合素质。总之,不管掌握的了的还是不懂得,困难确实比较多,凡是难开头,不知道从哪入手。也得到一个结论:知识也只能通过应用和实践方能实现它应具有的价值!有些东西自认为会了,然而当到用时才发现其实真的是两回事,为此知识真正能用
13、时才是真的学会了。感谢三位指导老师们所给予过的帮助。在设计过程中,我通过查阅大量有关资料,自学和与同学之间经验的交流,并向老师请教等方式。使自己学到了不少知识,也经历了不少艰辛,因而得以有巨大的收获。在整个设计,使我懂得了许多东西,不仅培养了我独立工作的能力,而且更加树立了对自己工作能力的信心,定会对今后的学习工作生活有非常重要的影响。在动手的能力大大提高之余,充分体会在创造过程中探索的艰难和成功时的喜悦。也许这个设计做的并不是很好,但在设计过程中所学到的东西才是这次课程设计的最大收获和财富,为之受益终身。完成之后更深体会到课程设计是对前面所学知识的一种总结与检验。附附 录录显示控制模块代码显
14、示控制模块代码moduleVGA_Ctrl/Host Sideinput7:0input7:0input7:0output16:0output10:0output10:0output/VGA Sideoutput7:0output7:0output7:0outputregoutputregoutputoutput(/Host SideiRed,iGreen,iBlue,oCurrent_X,oCurrent_Y,oAddress,oRequest,/VGA SideoVGA_R,oVGA_G,oVGA_B,oVGA_HS,oVGA_VS,oVGA_SYNC,oVGA_BLANK,oVGA_CL
15、OCK,/Control SignaliCLK,iRST_N);iRed;iGreen;iBlue;oAddress;oCurrent_X;oCurrent_Y;oRequest;oVGA_R;oVGA_G;oVGA_B;oVGA_HS;oVGA_VS;oVGA_SYNC;oVGA_BLANK;outputoVGA_CLOCK;/Control SignalinputiCLK;inputiRST_N;/Internal Registersreg10:0H_Cont;reg10:0V_Cont;wire10:0picture_x;wire10:0picture_y;/HorizontalPara
16、meterparameterH_FRONT=16;parameterH_SYNC=96;parameterH_BACK=48;parameterH_ACT=640;parameterH_BLANK=H_FRONT+H_SYNC+H_BACK;parameterH_TOTAL=H_FRONT+H_SYNC+H_BACK+H_ACT;/Vertical ParameterparameterV_FRONT=11;parameterV_SYNC=2;parameterV_BACK=31;parameterV_ACT=480;parameterV_BLANK=V_FRONT+V_SYNC+V_BACK+
17、32;parameterV_TOTAL=V_FRONT+V_SYNC+V_BACK+V_ACT;/assignoVGA_SYNC=1b1;/This pin isassignoVGA_BLANK=(H_ContH_BLANK)|(V_Cont=H_BLANK&H_Cont=V_BLANK&V_Cont=H_BLANK)?H_Cont-H_BLANK:8h0;assignoCurrent_Y=(V_Cont=V_BLANK)?V_Cont-V_BLANK:8h0;/assignpicture_x=oCurrent_X 150?oCurrent_X:155;/assignpicture_y=oCu
18、rrent_Y 200?oCurrent_Y:155;/Horizontal Generator:Refer to the pixel clockalways(posedge iCLK or negedge iRST_N)beginif(!iRST_N)beginH_Cont=0;oVGA_HS=1;endelsebeginif(H_ContH_TOTAL)H_Cont=H_Cont+1b1;elseH_Cont=0;/Horizontal Syncif(H_Cont=H_FRONT-1)/Front porchoVGA_HS=1b0;if(H_Cont=H_FRONT+H_SYNC-1)/S
19、ync pulse endoVGA_HS=1b1;endend/Vertical Generator:Refer to the horizontal syncalways(posedge oVGA_HS or negedge iRST_N)beginif(!iRST_N)beginV_Cont=0;oVGA_VS=1;endelsebeginif(V_ContV_TOTAL)V_Cont=V_Cont+1b1;elseV_Cont=0;/Vertical Syncif(V_Cont=V_FRONT-1)/Front porchoVGA_VS=1b0;if(V_Cont=V_FRONT+V_SY
20、NC-1)/Sync pulse endoVGA_VS=1b1;endendendmodule二分频器模块代码二分频器模块代码module clock(clkin,clkout);input clkin;output clkout;reg clkout;always(posedge clkin)beginclkout=clkout;endendmodule顶层文件代码顶层文件代码module VGA_TOP(/Host Sidewire7:0wire7:0wire7:0/VGA Sideoutput7:0output7:0output7:0outputoutputoutputoutputout
21、put/Control Signalinputwire/VGA SideoVGA_R,oVGA_G,oVGA_B,oVGA_HS,oVGA_VS,oVGA_SYNC,oVGA_BLANK,oVGA_CLOCK,/Control Signalclkin,rst_n);iRed;iGreen;iBlue;oVGA_R;oVGA_G;oVGA_B;oVGA_HS;oVGA_VS;oVGA_SYNC;oVGA_BLANK;oVGA_CLOCK;clkin;clk;inputrst_n;/internal wirewire 16:0 address;/实例化 clockclock u5(.clkin(c
22、lkin),.clkout(clk);/实例化 VGA 控制器VGA_Ctrl u4(/Host Side.iRed(iRed),.iGreen(iGreen),.iBlue(iBlue),.oCurrent_X(),.oCurrent_Y(),.oAddress(address),.oRequest(),/VGA Side.oVGA_R(oVGA_R),.oVGA_G(oVGA_G),.oVGA_B(oVGA_B),.oVGA_HS(oVGA_HS),.oVGA_VS(oVGA_VS),.oVGA_SYNC(oVGA_SYNC),.oVGA_BLANK(oVGA_BLANK),.oVGA_CLOCK(oVGA_CLOCK),/Control Signal.iCLK(clk),.iRST_N(rst_n);/实例化 ROMrom_r u1(.address(address),.clock(clk),.q(iRed);rom_g u2(.address(address),.clock(clk),.q(iGreen);rom_b u3(.address(address),.clock(clk),.q(iBlue);endmodule