华科基于FPGA的VGA显示实验.doc

上传人:w****2 文档编号:6629962 上传时间:2020-03-01 格式:DOC 页数:13 大小:83KB
返回 下载 相关 举报
华科基于FPGA的VGA显示实验.doc_第1页
第1页 / 共13页
华科基于FPGA的VGA显示实验.doc_第2页
第2页 / 共13页
华科基于FPGA的VGA显示实验.doc_第3页
第3页 / 共13页
点击查看更多>>
资源描述
电子线路测试与实验报告基于FPGA的VGA显示实验姓名:专业班级:光电1208学号:U2012一、实验要求功能要求:利用Basys2实验板实现图片在VGA接口显示器上的显示。基本要求:1)实现240*160以上像素的图片在VGA接口显示器上的显示;2)利用算法实现特定图片在VGA接口显示器上的放大、缩小旋转及其他动作的自动变换。二、实验具体目标1.首先实现特定图片在显示器上的显示;2.图片自动旋转90度;3.实现图片的放大与缩小,同样通过一个按键实现;4.添加复位键,按下复位键后图片返回最初的状态。三、实验原理 1.VGA的显示原理 在基于FPGA的VGA控制中,只需考虑行同步信号(HS),场同步信号(VS),以及红绿蓝三基色(R、G、B)这五个信号,即可实现对VGA显示的控制。 2.对图片的旋转与缩放操作 对图片的旋转操作在本质上是对IP核ROM的输入地址addr进行变换的过程。在这里,假定显示的坐标分别为x_vdn以及y_vdn,由于图片是160*40的,在正常的显示时,addr与x_vdn以及y_vdn的对应关系应该为:addr=x_vdn+y_vdn*160即依次取像素点,图片正常显示。要把图片顺时针旋转90度,那么相当于显示的图片是40*160的,重新考虑addr与两个坐标之间映射关系。容易得到,此时:addr=(39-x_vdn)*160+y_vd对图片的缩放操作对图片的缩放操作则只考虑以下两种变化,即放大一倍,此时图片的大小为320*80;缩小一倍,此时图片的大小为80*20。对于图片的放大一倍,则要考虑不同的像素点对显示信号的共用(在这里即为m信号)。由通常的规则,按照顺序,构成一个正方形的每四个相邻的像素点共用一个m信号。同时,在这里对x_vdn以及y_vdn的最后一位判断,并且形成不同的映射规则。具体的映射规则在源代码中给出。对于图片的缩小,则相对简单的多。此时的映射关系为:addr=y_vdn*320+x_vdn*2; 3工程结构与解读 如图,下图为系统的结构框图。各模块之间的关系为:_top.v 工程顶层模块|_clkdiv.v 时钟分频|_my_vga.v 同步信号模块|_rom.xco 像素数据|_ vga_stripes.v vga 显示说明:顶层模块只是对各模块的调用;时钟分频是用于产生25MHz的扫描信号;同步信号用来产生相应的VGA显示控制信号;rom.xco是IP核,用来存放、输出要显示图片的数据信息。最后一个模块则是显示模块,同时包括对图片的相关变换。各模块的详细说明会在下文中给出。四、源码清单1.顶层模块(top.v)module top(zoom,turn,clk, clr, hs, vs, red, green, blue );input zoom;/缩放信号input turn;/模式改变信号input clk;/时钟信号input clr;/复位信号output hs, vs;/水平和垂直输出output 2:0 red, green;/红绿蓝三色输出output 1:0 blue;wire clk25;wire 9:0 hc, vc;wire vidon;wire 27:0 cntdyn;wire 7:0 m;wire 12:0 addr;clkdiv u1( .mclk(clk), .clr(clr), .clk25(clk25) );/u1为2分频程序,使时钟信号为25MHzmy_vga u2( .clk(clk25), .clr(clr), .hs(hs), .vs(vs), .hc(hc), .vc(vc), .vidon(vidon), .cntdyn(cntdyn) );/u2为160*40VGA图像显示程序/-160*40-xilinx-rom u3( .clka(clk25), / input clka .addra(addr), / input 12 : 0 addra .douta(m) / output 7 : 0 douta);/-160*40-xilinx-u3为ROM的IP核,功能为存储、输出图片vga_stripes u4 ( .clr(clr), .zoom(zoom), .turn(turn), .vidon(vidon), .m(m), .hc(hc), .vc(vc), .red(red), .green(green), .blue(blue), .cntdyn(cntdyn), .addr(addr) );/u4对图像的显示进行各种操作endmodule说明:顶层模块比较简单,只是对各分模块的调用。2. 时钟分频模块(clkdiv.v)信号模式描述mclkInput主时钟输入clrInput复位键clk25output输出25MHz时钟module clkdiv(mclk,clr,clk25);/对时钟信号进行二分频input mclk, clr;output clk25;reg 1:0 q;assign clk25 = q0; /25Mhzalways (posedge mclk or posedge clr)if(clr)q = 0;elseq = q + 1;endmodule /实现25MHz的频率3.控制信号模块(my_vga.v)信号模式描述clrInput复位clkInput主时钟25MHzhc9:0Output行计数vc9:0Output场计数cntdyn27:0Outputvga控制计数vidonOutputvidon可见信号module my_vga(clk,clr,hs,vs,hc,vc,vidon,cntdyn );input clk,clr;output reg hs,vs;output reg 9:0 hc,vc;output reg vidon;output reg 27:0 cntdyn;parameter hpixels = 10b1100100000; /800parameter vlines = 10b1000001001; /521parameter hbp = 10b0010010000; /144parameter hfp = 10b1100010000; /784parameter vbp = 10b0000011111;/31parameter vfp = 10b0111111111;/511reg vsenable;always (posedge clk or posedge clr) beginif(clr)cntdyn = 0;elsecntdyn = cntdyn + 1;endalways(posedge clk or posedge clr)beginif(clr)hc=0;else beginif(hc = hpixels - 1)beginhc = 0;vsenable = 1;endelse beginhc = hc + 1;vsenable = 0;endendendalways(*)beginif (hc 96)hs = 0;elsehs = 1;endalways (posedge clk or posedge clr)beginif(clr)vc = 0;else if (vsenable = 1)beginif (vc = vlines - 1)vc = 0;elsevc = vc + 1;endendalways (*)beginif (vc 2)vs = 0;else vs = 1;endalways (*)beginif (hc hbp)&(vcvbp)vidon = 1;elsevidon = 0;endendmodule4.IP核rom(rom.xco)这是一个调用IP核的模块,该模块有两个输入,除了clka为时钟信号外,addra是一个地址信号,通过addra的控制来输出不同的m信号。rom模块示意图:5.vga显示模块(vga_stripes.v)信号模式描述m7:0Input像素数据zoomInput缩放信号turnInput翻转信号vidonInputvidon像素可见hcInput行同步vcInput场同步redOutput红色greenOutput绿色blueOutput蓝色cntdynOutputvga 控制addr10:0Output地址module vga_stripes(clr,zom,turn,vidon,m,hc,vc,red,green,blue,cntdyn,addr );input clr;input zoom; input turn;input 7:0 m;input vidon;input 9:0 hc,vc;input 27:0 cntdyn;output 2:0 red,green;output 1:0 blue;output 12:0 addr; /6400 160*40reg 7:0 red_r;reg 7:0 green_r, blue_r; reg addr;reg 1:0 mode;reg 1:0 set;parameter hbp = 10b0010010000;/144parameter vbp = 10b0000011111;/31reg 10:0 y_vdn, x_vdn;assign red = red_r7:5;assign green = green_r7:5;assign blue = blue_r7:6;always(*)beginy_vdn = vc - vbp ; x_vdn = hc - hbp ;endalways(posedge turn or posedge clr)/选择模式beginif(clr) mode=0;/若复位,则选择模式0else if(turn)/若无复位,按键则模式加一mode=mode+1;endalways(posedge zoom or posedge clr) /当放大或复位信号处于上升沿时begin if (clr) set=0;/若复位,大小设定选择0else if(zoom)/如果有放大信号 begin if(set=2b10) set=0;/若大小设定为2,则改为设定0,否则设定加一 else set=set+1; endendalways (*)/当有涉及到的变量改变时if(vidon = 1) begin if(set=2b01)/设定1,显示320*80 begin if(x_vdn=0)&(x_vdn=0)&(y_vdn=79)/如果0=x_vdn=319且0=y_vdn=79if(x_vdn0=0)&(y_vdn0=0) addr=x_vdn/2+y_vdn*80;/起点为(0,0)时 else if(x_vdn0=0)&(y_vdn0=1) addr=x_vdn/2+(y_vdn-1)*80;/起点为(0,1)时 else if(x_vdn0=1)&(y_vdn0=0) addr=(x_vdn-1)/2+y_vdn*80;/起点为(1,0)时 else addr=(x_vdn-1)/2+(y_vdn-1)*80;/起点为(1,1)时red_r = m7:5,5b00000 ;/显示green_r = m4:2,5b00000 ;blue_r = m1:0, 6h00; end else begin/否则不显示red_r = 0;green_r = 0;blue_r =0)&(x_vdn=0)&(y_vdn=19) /如果0=x_vdn=79且0=y_vdn=19,则显示 begin addr=y_vdn*320+x_vdn*2;red_r = m7:5,5b00000 ;green_r = m4:2,5b00000 ;blue_r = m1:0, 6h00;endelse begin red_r = 0; green_r = 0; blue_r =0)&(x_vdn=0)&(y_vdn=39) /显示160*40 begin /160 * 40 200 = 144+55+1 addr=y_vdn*160+x_vdn;red_r = m7:5,5b00000 ;green_r = m4:2,5b00000 ;blue_r = m1:0, 6h00;endelse begin /其他地方不显示 red_r = 0; green_r = 0; blue_r =0)&(x_vdn=0)&(y_vdn=159)/显示40*160begin /160 * 40 200 = 144+55+1addr=(39-x_vdn)*160+y_vdn;red_r = m7:5,5b00000 ;green_r = m4:2,5b00000 ;blue_r = m1:0, 6h00;endelse begin /其他地方不显示red_r = 0;green_r = 0;blue_r = 0;end endcase end endelse /不显示beginred_r = 0;green_r = 0;blue_r = 0;endendmodule说明:相应的变量说明在表格中已经给出,有一点需要注意的是,在这里是先对zoom进行判断的,假如zoom为1,那就要对图片进行缩放处理。只有在zoom为0的情况下,才会进行翻转的变换。也就是说,这两个过程是有优先级的。若要去掉这个优先级,代码会复杂一些。同时,图片的放大只能对原图放大缩小,已经旋转的图片则不能。6.引脚约束文件(top.ucf)NET clk LOC = B8;NET clr LOC = G12;# Bank = 2, Pin name = IO/D5, Type = DUAL, Sch name = RED0NET red0 LOC = C14;# Bank = 2, Pin name = IO_L10N_2, Type = I/O, Sch name = RED1NET red1 LOC = D13;# Bank = 2, Pin name = IO_L10P_2, Type = I/O, Sch name = RED2NET red2 LOC = F13;# Bank = 2, Pin name = IO_L09N_2, Type = I/O, Sch name = GRN0NET green0 LOC = F14;# Bank = 2, Pin name = IO_L09P_2, Type = I/O, Sch name = GRN1NET green1 LOC = G13;# Bank = 2, Pin name = IO_L05N_2, Type = I/O, Sch name = GRN2NET green2 LOC = G14;# Bank = 2, Pin name = IO/VREF_2, Type = VREF, Sch name = BLU1NET blue0 LOC = H13;# Bank = 2, Pin name = IO_L03P_2/DOUT/BUSY, Type = DUAL, Sch name = BLU2NET blue1 LOC = J13;# Bank = 2, Pin name = IO_L03N_2/MOSI/CSI_B, Type = DUAL, Sch name = HSYNCNET hs LOC = J14;# Bank = 2, Pin name = IO_L01P_2/CSO_B, Type = DUAL, Sch name = VSYNCNET vs LOC = K13;NET turn LOC = A7;# PlanAhead Generated physical constraints NET zoom LOC = M4;说明:处理相关的信号、颜色引脚按照手册来配置以外,clr、turn、zoom分别配置按键G12、A7、M4。五、系统功能与测试结果1.将bit下载到板子后,连接开发板和显示器的VGA接口,就能看到显示器上左上角显示该图片。2.开发板上的A7键控制翻转,按一次图片会自动旋转90度,再按一次回复到原来的图形。3.开发板上的M4键控制图片的放大与缩小,连续按键会让图片先放大一倍,再变为原图的缩小一倍,再回到原处。4.在任何时刻按下G12键(即复位键),会回到原图的状态。5.需要注意的是,在图片处于放大或者缩小的状态中,是不能对图片进行翻转操作的,但是在翻转的状态中则可以对图片进行缩放,但是缩放的也只是原图。这是由程序中设计的优先级导致的。6.测试结果:可以完成上述功能,但是图片显示并不是很稳定。六、心得体会与建议1.这个实验是利用IP核来完成某项功能的,IP核是为开发人员提供便利的,但是怎么合理利用IP核、怎么创建其中有些细节需要去注意。在这个实验中,重点并不是VGA显示,而是怎样利用IP核来显示特定的图片。因为有范例,所以其中对各种参数的设置变得并不困难,各种参数的意义也更容易理解。在了解VGA的基本原理后,就能比较快速地解决这个问题。而利用matlab 把图片转换为coe格式,再存入IP ROM内由于有给出的程序,这一过程也变得并不复杂。2实际上实验结果还是有很多不足。一个是做出来的图片像素要小于实验要求。另一个存在的问题则是显示的图片不是特别稳定,扫描不太均匀,但是迫于时间原因并没有深究这个问题。3.在设计旋转的过程中,可以看到输入rom模块的地址和屏幕显示坐标之间的映射关系是非常重要的。假如只考虑90度的旋转,其实是可以很容易做出180度和270度的旋转的,但是其他的角度的话,映射规则会非常复杂,难以实现,故应该寻找其他跟好的算法。4.心得体会:这是一个非常好的锻炼机会,对于工科学生来说,重要的在于实践,在于创造,在于自己主动地学习和创新,因此抓住这样的锻炼机会是对自己非常有好处的。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 临时分类 > 人文社科


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

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


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