1、一、VGA 时序下面的图是本人画了一个晚上的结果,个人认为能够比较详细的阐述 VGA的信号时序。VGA 的时序根据不同的显示分辨率和刷新频率会有变化,具体各种类型的时序信息可以参考下面的网站,这里非常详细的说明的每一种显示模式的 VGA 时序信息。http:/ 电平VSYNC,HSYNC 为标准 TTL 电平,0V3.3V。RGB 的电平在 0V0.7V 之间(0V 为黑色,0.7V 为全色)。三、程序顶层框图VGA 产生行同步(HSYNC),场同步信号(VSYNC),并产生每个像素的地址输入单口 ROM(显存)中,ROM 输出该点需要显示的颜色值。四、单口 ROM(显存)设计程序的显示模式为
2、 800*600,72Hz 刷新频率,像素频率为 50MHz。每个像素需要显示的颜色存储在单口 RAM 中,每种颜色用 8 个字节表示,则如果要显示800*600 分辨率,则需要 800*600 字节(480KB)的单口 ROM,由于 FPGA 内部没有这么大的 RAM(我用的是 ep2c8),因此我把屏幕上 100*100 个像素组成的矩形作为一个逻辑像素(即显示同一种颜色),这样只要 8*6 字节(48 字节),用 FPGA 自带的 RAM 是很容易实现的。ROM 中颜色存储地址表将全屏划分成 8*6 的方格,每个方格的颜色存储在 ROM 中,VGA 控制器不断产生行坐标(ROM 水平地址
3、)和场坐标(ROM 垂直地址),最后组合成 ROM 实际地址输入 ROM 中,ROM 输出该地址的颜色值,显示在 LCD 中。五、程序设计VGA 控制器程序module VGA(clk,rst_n,hsync,vsync,vga_r,vga_g,vga_b);input clk; /50MHzinput rst_n; /复位信号output hsync; /行同步信号output vsync; /场同步信号/ R、G、B 信号输出output1:0 vga_r;output2:0 vga_g;output2:0 vga_b;/-reg10:0 x_cnt; /行坐标(这里包括了行同步、后沿、有
4、效数据区、前沿)reg9:0 y_cnt; /列坐标(这里包括了场同步、后沿、有效数据区、前沿)reg5:0 Xcoloradd;reg2:0 Ycoloradd;parameter Left = 184,PixelWidth = 100,Top = 29;always (posedge clk or negedge rst_n)if(!rst_n) x_cnt = Left /产生 hsync 信号(行同步)when x_cnt=50,then hsync_r=1,else 0;低电平同步vsync_r = 10d6; /产生 vsync 信号(场同步)my LCD is low synce
5、ndassign hsync = hsync_r;assign vsync = vsync_r;/- /颜色输出assign vga_r1 = valid ? color7 : 1b0;assign vga_r0 = valid ? color6 : 1b0;assign vga_g2 = valid ? color5 : 1b0;assign vga_g1 = valid ? color4 : 1b0;assign vga_g0 = valid ? color3 : 1b0;assign vga_b2 = valid ? color2 : 1b0; assign vga_b1 = valid ? color1 : 1b0;assign vga_b0 = valid ? color0 : 1b0;endmodule六、运行结果相机不好,拍的不太清晰,大家将就看看。