电子设计自动化课程设计报告.doc

上传人:w****2 文档编号:6524710 上传时间:2020-02-28 格式:DOC 页数:17 大小:250KB
返回 下载 相关 举报
电子设计自动化课程设计报告.doc_第1页
第1页 / 共17页
电子设计自动化课程设计报告.doc_第2页
第2页 / 共17页
电子设计自动化课程设计报告.doc_第3页
第3页 / 共17页
点击查看更多>>
资源描述
电子设计自动化课程设计报告学生姓名: 学 号: 课设题目: VGA彩条信号显示控制器设计 同组人: 电子设计自动化课程设计报告郝欣欣一、课程设计内容1、 使用Verilog语言和Modelsim仿真器完成可显示横彩条、竖彩条、棋盘格相间的VGA控制器的设计和验证2、 设计并验证可显示英语单词”HIT”的VGA控制器3、 使用Quartus II和SOPC实验箱验证设计的正确性4、 Verilog代码要符合微电子中心编码标准二、FPGA原理CPLD、FPGA是在PAL、GAL等基础上发展起来的一种具有丰富的可编程I/O引脚、逻辑宏单元、门电路以及RAM空间的可编程逻辑器件,几乎所有应用门阵列、PLD和中小规模通用数字集成电路的场合均可应用FPGA和CPLD器件。CPLD的设计是基于乘积项选择矩阵来实现的,而FPGA基于查找表来设计的。查找表就是实现将输入信号的各种组合功能以一定的次序写入RAM中,然后在输入信号的作用下,输出特定的函数运算结果。其结构图如图1所示:图1. FPGA查找表单元一个N输入查找表 (LUT,Look Up Table)可以实现N个输入变量的任何逻辑功能,如 N输入“与”、 N输入“异或”等。输入多于N个的函数、方程必须分开用几个查找表( LUT)实现(如图2所示)。 图2 FPGA查找表单元内部结构该系统设计中,FPGA芯片用的是ALTERA公司的EP1K30QC208-2,它的系统结构如图3所示。它由若干个逻辑单元和中央布线池加I/O端口构成图3 EP1K30QC208内部结构三、VGA接口VGA的全称为Video Graphic Array,即显示绘图阵列。在PC行业发展的初期,VGA以其支持在640X480的较高分辨率下同时显示16种色彩或256种灰度,同时在320X240分辨率下可以同时显示256种颜色的良好特性得到广泛支持。后来,厂商们纷纷在VGA基础上加以扩充,如将显存提高至1M并使其支持更高分辨率如800X600或1024X768,这些扩充的模式就称之为VESA(Video Electronics Standards Association,视频电子标准协会)的Super VGA模式,简称SVGA,现在的显卡和显示器都支持SVGA模式。图4 VGA接口VGA接口就是显卡上输出模拟信号的接口,也叫D-Sub接口。VGA接口是一种D型接口,上面共有15针空,分成三排,每排五个。VGA接口是显卡上应用最为广泛的接口类型,绝大多数的显卡都带有此种接口。表1 VGA管脚定义管脚定义1红基色 red 2绿基色 green 3蓝基色 blue4地址码 ID Bit5自测试 (各家定义不同)6红地7绿地8蓝地9保留(各家定义不同)10数字地11地址码12地址码13行同步14场同步15地址码 (各家定义不同)通过模拟VGA接口和计算机连接的显示器的工作原理,是计算机内部以数字方式生成的显示图像信息,被显卡中的数字/模拟转换器转变为R、G、B三原色信号和行、场同步信号,信号通过电缆传输到显示设备中。对于模拟显示设备,如模拟CRT显示器,信号被直接送到相应的处理电路,驱动控制显像管生成图像。而对于LCD、DLP等数字显示设备,显示设备中需配置相应的A/D(模拟/数字)转换器,将模拟信号转变为数字信号。在经过D/A和A/D2次转换后,不可避免地造成了一些图像细节的损失。VGA接口应用于CRT显示器无可厚非,但用于连接液晶之类的显示设备,则转换过程的图像损失会使显示效果略微下降。CRT显示器因为设计制造上的原因,只能接受模拟信号输入,也就是我们为什么在CRT显示器上只看到VGA接口的原因。四、VGA显示接口原理计算机显示器的显示有许多标准,常见的有VGA、SVGA等。本系统采用FPGA来实现图像显示控制器,这在产品开发设计中有许多实际应用。常见的彩色显示器,一般由CRT(阴极射线管)构成,彩色是由G、R、B(绿:Green,红:Red,蓝:Blue)三基色组成。显示是用逐行扫描的方式解决,阴极射线枪发出电子束打在涂有荧光粉的荧光屏上,产生GRB三基色,合成一个彩色像素。扫描从屏幕的左上方开始,从左到右,从上到下,进行扫描,每扫完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行行同步;扫描完所有行,用场同步信号进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,预备下一场的扫描。对于普通的VGA显示器,其引出线共含5个信号:G、R、B:三基色信号;HS:行同步信号;VS:场同步信号。对于5个信号的时序驱动,对于VGA显示器要严格遵循“VGA工业标准”,即64048060Hz模式。通常我们用的显示器都满足工业标准,因此我们设计VGA控制器时要参考显示器的技术规格。图5是VGA行扫描、场扫描的时序图:图5 VGA行扫描、场扫描时序图表2 VGA参考时序设计VGA工业标准所要求的频率:时钟频率(Clock frequency):25.175MHz(像素输出的频率);行频(Line frequency):31469Hz;场频(Field frequency):59.94Hz(每秒图像刷新频率)。五、FPGA的设计实现设计VGA图像显示控制需要注意两个问题:一个是时序的驱动,这是完成设计的关键,时序稍有偏差,显示必然不正常,甚至会损坏彩色显示器;另一个是VGA信号的电平驱动。显示控制器设计提示:显示器的技术规格提供的行频一般都满足在30-45KHz(保守数据),场频一般满足在50-75Hz(保守数据),针对以上保守数据,我们以30KHz的行频进行扫描时所需时钟频率为:30KHz800(行周期)=24MHz,则场频为:30KHz525(场周期)=57.14Hz,针对实验箱的条件,可以用12MHz的信号经过倍频(EP1K30QC208-2芯片特有的功能,在MaxPlusII软件中调用参数可设置兆功能元件库mega_lpm的CLKLOCK元件来倍频)来产生24MHz的时钟频率,参考设计的顶层文件如下图所示:图6.VGA接口实现顶视图VGACORE模块包含了扫描时序产生模块、图像描述模块。时序产生模块的设计可参考图5所示来设计,图像描述模块主要通过640480个像素点来描述图像。如本项设计的彩条信号发生器可通过图像描述模块产生如下表所示的3种显示模式,共6种显示变化的图像。表3 VGA图形编码1行彩条1:白黄青绿品红蓝黑2:黑蓝红品绿青黄白2竖彩条1:白黄青绿品红蓝黑2:黑蓝红品绿青黄白3棋盘格1:棋盘格显示模式12:棋盘格显示模式2上表颜色对应的编码为:表4 VGA颜色编码颜 色黑蓝红品绿青黄白G00001111R00110011B01010101在设计完彩条信号发生器的基础上很容易完成汉字/图像的设计。由于本设计是对视频数据进行处理,用普通的设计方法(不使用专用芯片),在单芯片上实现是不可思议的,而在此用FPGA设计,轻松地达到了面积和速度上的要求。六、程序及仿真(一)、管脚分配本设计采用主板上的VGA接口实验模式:模式5时钟及控制clk-pin_29 clock9 实验要求采用12M的时钟rst-pin_240 键8,低电平有效,作为使能信号MD -pin_233 键1,模式选择信号,共有6种模式显示器输出R -pin_180 PIO29G -pin_181 PIO30B -pin_182 PIO31HS -pin_183 PIO32VS -pin_185 PIO34(二)、彩条发生器程序实现及仿真1、主程序module vga(clk_25m,rst_n,/系统控制hsync,vsync,vga_rgb,MD/ VGA控制);input clk_25m;/ 25MHzinput rst_n;/低电平复位input MD;/ FPGA与VGA接口信号output hsync;/行同步信号output vsync;/场同步信号output2:0 vga_rgb;/-/ 坐标计数reg9:0 x_cnt;/行坐标reg9:0 y_cnt;/列坐标always (posedge clk_25m or negedge rst_n)if(!rst_n) x_cnt = 10d0;else if(x_cnt = 10d799) x_cnt = 10d0;else x_cnt = x_cnt+1b1;always (posedge clk_25m or negedge rst_n)if(!rst_n) y_cnt = 10d0;else if(y_cnt = 10d524) y_cnt = 10d0;else if(x_cnt = 10d799) y_cnt = y_cnt+1b1;/-/ 产生VGA场同步,行同步信号reg hsync_r,vsync_r; always (posedge clk_25m or negedge rst_n)if(!rst_n) hsync_r = 1b1;else if(x_cnt = 10d0) hsync_r = 1b0;/产生hsync信号else if(x_cnt = 10d96) hsync_r = 1b1;always (posedge clk_25m or negedge rst_n)if(!rst_n) vsync_r = 1b1; else if(y_cnt = 10d0) vsync_r = 1b0;/产生vsync信号else if(y_cnt = 10d2) vsync_r = 1b1;assign hsync = hsync_r;assign vsync = vsync_r;/-/有效显示标志位产生reg valid_yr;/行显示有效信号always (posedge clk_25m or negedge rst_n)if(!rst_n) valid_yr = 1b0;else if(y_cnt = 10d32) valid_yr = 1b1;else if(y_cnt = 10d512) valid_yr = 1b0;wire valid_y = valid_yr;reg valid_r;/ VGA有效显示区标志位always (posedge clk_25m or negedge rst_n)if(!rst_n) valid_r = 1b0;else if(x_cnt = 10d141) & valid_y) valid_r = 1b1;else if(x_cnt = 10d781) & valid_y) valid_r = 1b0;wire valid = valid_r;wire9:0 x_dis;/横坐标显示有效区域相对坐标值0-639wire9:0 y_dis;/竖坐标显示有效区域相对坐标值0-479assign x_dis = x_cnt - 10d142;assign y_dis = y_cnt - 10d33;/-/-reg2:0 cnt;always (posedge MD or negedge rst_n) beginif(!rst_n)cnt = 3d0;else if(cnt=3d5)cnt=3d0;elsecnt=cnt+3d1;end/- / VGA色彩信号产生/*RGB = 000 黑色 RGB = 100 红色 = 001 蓝色 = 101紫色 = 010 绿色 = 110黄色 = 011 青色 = 111白色*/-reg2:0 vga_rgb;always( posedge clk_25m)beginif(!valid) vga_rgb = 10d0 & x_dis 10d80) vga_rgb = 10d80 & x_dis 10d160) vga_rgb = 10d160 & x_dis 10d240) vga_rgb = 10d240 & x_dis 10d320) vga_rgb = 10d320 & x_dis 10d400) vga_rgb = 10d400 & x_dis 10d480) vga_rgb = 10d480 & x_dis 10d560) vga_rgb = 10d560 & x_dis 10d640) vga_rgb = 10d0 & x_dis 10d80) vga_rgb = 10d80 & x_dis 10d160) vga_rgb = 10d160 & x_dis 10d240) vga_rgb = 10d240 & x_dis 10d320) vga_rgb = 10d320 & x_dis 10d400) vga_rgb = 10d400 & x_dis 10d480) vga_rgb = 10d480 & x_dis 10d560) vga_rgb = 10d560 & x_dis 10d640) vga_rgb = 10d0 & y_dis 10d60) vga_rgb = 10d60 & y_dis 10d120) vga_rgb = 10d120 & y_dis 10d180) vga_rgb = 10d180 & y_dis 10d240) vga_rgb = 10d240 & y_dis 10d300) vga_rgb = 10d300 & y_dis 10d360) vga_rgb = 10d360 & y_dis 10d420) vga_rgb = 10d420 & y_dis 10d480) vga_rgb = 10d0 & y_dis 10d60) vga_rgb = 10d60 & y_dis 10d120) vga_rgb = 10d120 & y_dis 10d180) vga_rgb = 10d180 & y_dis 10d240) vga_rgb = 10d240 & y_dis 10d300) vga_rgb = 10d300 & y_dis 10d360) vga_rgb = 10d360 & y_dis 10d420) vga_rgb = 10d420 & y_dis 10d480) vga_rgb = 10d0 & y_dis 10d60) vga_rgb = 10d60 & y_dis 10d120) vga_rgb = 10d120 & y_dis 10d180) vga_rgb = 10d180 & y_dis 10d240) vga_rgb = 10d240 & y_dis 10d300) vga_rgb = 10d300 & y_dis 10d360) vga_rgb = 10d360 & y_dis 10d420) vga_rgb = 10d420 & y_dis 10d480) vga_rgb = 3d7; end 10d80,10d160,10d240,10d320,10d400,10d480,10d560,10d640: vga_rgb = 10d0 & y_dis 10d60) vga_rgb = 10d60 & y_dis 10d120) vga_rgb = 10d120 & y_dis 10d180) vga_rgb = 10d180 & y_dis 10d240) vga_rgb = 10d240 & y_dis 10d300) vga_rgb = 10d300 & y_dis 10d360) vga_rgb = 10d360 & y_dis 10d420) vga_rgb = 10d420 & y_dis 10d480) vga_rgb = 3d0; end 10d80,10d160,10d240,10d320,10d400,10d480,10d560,10d640: vga_rgb = vga_rgb+3d1; /每80个横坐标像素点后显示色彩数据增1变化 default: ; endcaseendendendendmodule2、验证程序timescale 1 ns/ 1 psmodule tb_vga ();reg t_clk_25m;reg t_rst_n; wire t_hsync;wire 2:0 t_vga_rgb;wire t_vsync; wire t_MD; vgahct dut( .clk_25m(t_clk_25m), .hsync(t_hsync), .rst_n(t_rst_n), .vga_rgb(t_vga_rgb), .vsync(t_vsync), .MD(t_MD);initial begin t_clk_25m=0;t_rst_n=1;t)MD=0;#20;t_rst_n=0; #50; t_rst_n=1; $display(Running testbench); #10000000000 $stop; endalways #0.04 t_clk_25m=t_clk_25m; always #200 t_MD=t_MD; endmodule3、仿真波形(三)、字符显示程序及仿真1、主程序timescale 1ns / 1psmodule vga_char(clk_25m,rst_n,/系统控制hsync,vsync,vga_rgb/ VGA控制);input clk_25m;/ 25MHzinput rst_n;/低电平复位/ FPGA与VGA接口信号output hsync;/行同步信号output vsync;/场同步信号output2:0 vga_rgb;/-/ 坐标计数reg9:0 x_cnt;/行坐标reg9:0 y_cnt;/列坐标always (posedge clk_25m or negedge rst_n)if(!rst_n) x_cnt = 10d0;else if(x_cnt = 10d799) x_cnt = 10d0;else x_cnt = x_cnt+1b1;always (posedge clk_25m or negedge rst_n)if(!rst_n) y_cnt = 10d0;else if(y_cnt = 10d524) y_cnt = 10d0;else if(x_cnt = 10d799) y_cnt = y_cnt+1b1;/-/ VGA场同步,行同步信号reg hsync_r,vsync_r;/同步信号 always (posedge clk_25m or negedge rst_n)if(!rst_n) hsync_r = 1b1;else if(x_cnt = 10d0) hsync_r = 1b0;/产生hsync信号else if(x_cnt = 10d96) hsync_r = 1b1;always (posedge clk_25m or negedge rst_n)if(!rst_n) vsync_r = 1b1; else if(y_cnt = 10d0) vsync_r = 1b0;/产生vsync信号else if(y_cnt = 10d2) vsync_r = 1b1;assign hsync = hsync_r;assign vsync = vsync_r;/-/有效显示标志位产生reg valid_yr;/行显示有效信号always (posedge clk_25m or negedge rst_n)if(!rst_n) valid_yr = 1b0;else if(y_cnt = 10d32) valid_yr = 1b1;else if(y_cnt = 10d512) valid_yr = 1b0;wire valid_y = valid_yr;reg valid_r;/ VGA有效显示区标志位always (posedge clk_25m or negedge rst_n)if(!rst_n) valid_r = 1b0;else if(x_cnt = 10d141) & valid_y) valid_r = 1b1;else if(x_cnt = 10d781) & valid_y) valid_r = 1b0;wire valid = valid_r;/wire9:0 x_dis;/横坐标显示有效区域相对坐标值0-639wire9:0 y_dis;/竖坐标显示有效区域相对坐标值0-479/assign x_dis = x_cnt - 10d142;assign y_dis = y_cnt - 10d33;/-/- / VGA色彩信号产生/*RGB = 000 黑色RGB = 100红色= 001 蓝色= 101紫色= 010绿色= 110黄色= 011青色= 111白色*/*HIT字模参数*/parameter char_line0=24h000000, char_line1=24h000000, char_line2=24h000000, char_line3=24he77cfe, char_line4=24h421092, char_line5=24h421010, char_line6=24h421010, char_line7=24h421010, char_line8=24h7e1010, char_line9=24h421010, char_linea=24h421010, char_lineb=24h421010, char_linec=24h421010, char_lined=24he77c38, char_linee=24h000000, char_linef=24h000000;reg4:0 char_bit;/显示位计算always (posedge clk_25m or negedge rst_n)if(!rst_n) char_bit = 5h1f;else if(x_cnt = 10d442) char_bit 10d442 & x_cnt 10d466) char_bit = char_bit-1b1;/依次显示后面的数据reg2:0 vga_rgb;/ VGA色彩显示寄存器always (posedge clk_25m)if(!valid) vga_rgb 10d442 & x_cnt 10d467) begincase(y_dis)10d231: if(char_line0char_bit) vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色10d232: if(char_line1char_bit) vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色10d233: if(char_line2char_bit) vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色10d234: if(char_line3char_bit) vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色10d235: if(char_line4char_bit) vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色10d236: if(char_line5char_bit) vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色10d237: if(char_line6char_bit) vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色10d238: if(char_line7char_bit) vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色10d239: if(char_line8char_bit) vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色10d240: if(char_line9char_bit) vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色10d241: if(char_lineachar_bit) vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色 10d242: if(char_linebchar_bit)vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色 10d243: if(char_linecchar_bit)vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色10d244: if(char_linedchar_bit)vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色10d245: if(char_lineechar_bit)vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色10d246: if(char_linefchar_bit)vga_rgb = 3b100;/红色 else vga_rgb = 3b010;/绿色 default: vga_rgb = 3b000;endcaseendelse vga_rgb =3b000 ;endmodule2、验证程序timescale 1 ns/ 1 psmodule tb_vga_char();reg t_clk_25m;reg t_rst_n; wire t_hsync;wire 1:0 t_vga_b;wire 2:0 t_vga_g;wire 2:0 t_vga_r;wire t_vsync; vga_char dut( .clk_25m(t_clk_25m),.hsync(t_hsync),.rst_n(t_rst_n),.vga_b(t_vga_b),.vga_g(t_vga_g),.vga_r(t_vga_r),.vsync(t_vsync);initial begin t_clk_25m=0;t_rst_n=1;#20;t_rst_n=0; #50; t_rst_n=1; $display(Running testbench); #1000 $stop; endalways #0.04 t_clk_25m=t_clk_25m; endmodule3、仿真波形六、总结在本次课程设计中,对VGA显示的原理有了一定的了解,在团队的分工合作下使用Verilog语言和Modelsim仿真器完成了可显示横彩条、竖彩条、棋盘格相间的VGA控制器的设计和验证,设计并验证了可显示英语单词”HIT”的VGA控制器,并掌握了Quartus II软件和SOPC实验箱的使用。本次课程设计让我受益匪浅,让我提高了研究、解决问题的能力,和团队合作的意识。对我今后的学习有一定的启迪作用,使我对FPGA设计产生了新的认识,并产生了很浓厚的兴趣。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!