1、 电子线路测试与实验报告 基于 FPGA 的 VGA 显示实验 姓名: 专业班级:光电 1208 学号: U2012 一、实验要求 功能要求:利用 Basys2 实验板实现图片在 VGA 接口显示器上的显示。 基本要求: 1)实现 240*160 以上像素的图片在 VGA 接口显示器上的显示; 2)利用算法实现特定图片在 VGA 接口显示器上的放大、缩小旋转及其他动作的自动变换。 二、实验具体目标 1.首先实现特定图片在显示器上的显示; 2.图片自动旋转 90 度; 3.实现图片的放大与缩小,同样通过一个按键实现; 4.添加复位键,按下复位键后图片返回最初的状态。 三、实验原理 1.VGA 的
2、显示原理 在基于 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 度,那么相当于显示的图片是
3、 40*160 的,重新考虑 addr 与两个坐标之间映射关系。容易得到,此时: addr=(39-x_vdn)*160+y_vd 对图片的缩放操作 对图片的缩放操作则只考虑以下两种变化,即放大一倍, 此时图片的大小为 320*80;缩小一倍,此时图片的大小为 80*20。 对于图片的放大一倍,则要考虑不同的像素点对显示信号的共用(在这里即为 m信号)。由 通常的规则,按照顺序,构成一个正方形的每四个相邻的像素点共用一个 m 信号。同时,在这里对 x_vdn 以及 y_vdn 的最后一位判断,并且形成不同的映射规则。具体的映射规则在源代码中给出。 对于图片的缩小, 则相对简单的多 。此时的映射
4、关系为: 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 核,用来存放、输出要显示图片的数据信息。最后一个模块则是显示模块,同时包括对图片的相关变换。各模块的详细说明会在下文中给出。 四
5、、源码清单 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
6、addr; clkdiv u1( .mclk(clk), .clr(clr), .clk25(clk25) );/u1 为 2 分频程序,使时钟信号为 25MHz my_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 .dou
7、ta(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. 时钟 分频模块(
8、clkdiv.v) 信号 模式 描述 mclk Input 主时钟输入 clr Input 复位键 clk25 output 输出 25MHz 时钟 module clkdiv(mclk,clr,clk25);/对时钟信号进行二分频 input mclk, clr; output clk25; reg 1:0 q; assign clk25 = q0; /25Mhz always (posedge mclk or posedge clr) if(clr) q hbp) else vidon = 0; end endmodule 4.IP 核 rom( rom.xco) 这是一个调用 IP 核的
9、模块,该模块有两个输入,除了 clka 为时钟信号外, addra 是一个地址信号,通过 addra的控制来输出不同的 m 信号。 rom 模块示意图: 5.vga 显示模块( vga_stripes.v) 信号 模式 描述 m7:0 Input 像素数据 zoom Input 缩放信号 turn Input 翻转信号 vidon Input vidon 像素可见 hc Input 行同步 vc Input 场同步 red Output 红色 green Output 绿色 blue Output 蓝色 cntdyn Output vga 控制 addr10:0 Output 地址 modul
10、e 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*40 reg 7:0 red_r; reg 7:0 green_r, blue_r; reg addr; reg 1:0 mode
11、; reg 1:0 set; parameter hbp = 10b0010010000;/144 parameter vbp = 10b0000011111;/31 reg 10:0 y_vdn, x_vdn; assign red = red_r7:5; assign green = green_r7:5; assign blue = blue_r7:6; always(*) begin y_vdn = vc - vbp ; x_vdn = hc - hbp ; end always(posedge turn or posedge clr)/选择模式 begin if(clr) mode=
12、0;/若复位,则选择模式 0 else if(turn)/若无复位,按键则模式加一 mode=mode+1; end always(posedge zoom or posedge clr) /当放大或复位信号处于上升沿时 begin if (clr) set=0;/若复位,大小设定选择 0 else if(zoom)/如果有放大信号 begin if(set=2b10) set=0;/若大小设定为 2,则改为设定 0,否则设定加一 else set=set+1; end end always (*)/当有涉及到的变量改变时 if(vidon = 1) begin if(set=2b01)/设定 1,显示 320*80 begin if(x_vdn=0) 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; end