VGA控制器的编写主要是了解VGA的显示标准和时序,如1024X768@60Hz,确定时钟频率(65MHz=1344X806X60),列像素时间等于时钟周期,扫描从左到右、从上到下(类似于电视扫描PAL)。除有效时间外,一行还有同步脉冲时间、后肩和前肩。(http://tinyvga.com/vgatiming,http://wenku.baidu.com/view/13b3140102020740be1e9b94.html,
http://www.cnblogs.com/qiweiwang/archive/2011/01/17/1937688.html)
然后根据时序实现显示标准的功能模块,完成同步信号的输出、有效区域标志和当前坐标。一行列像素计数完成后,行计数器加1,列像素计数器清零后继续计数,知道最后一行计数完成后,行计数器清零,重复上述过程。
1 `timescale 1 ps/1 ps 2 module sync_module( 3 output VSYNC_Sig,HSYNC_Sig,Ready_Sig,Frame_Sig, 4 output [10:0]Column_Addr_Sig,Row_Addr_Sig, 5 input CLK,RSTn 6 ); 7 //VGA format: 640 X 480 @ 60Hz,pix width:0.039683us≈40ns,25MHz 8 //场扫描时序: 2--30--484-- 9, 525 9 //一般: 2--33--480-- 10 10 //行扫描时序:96--45--646--13, 800 11 //一般: 96--48--640--16 12 13 //VGA format: 1024 X 768 @ 60Hz,pix width:1/65MHz 14 //场扫描时序: 6-- 29-- 768-- 3, 806 15 //行扫描时序:136--160--1024--24, 1344 16 /********************************/ 17 18 reg [10:0]Count_H; 19 20 always @ ( posedge CLK or negedge RSTn ) 21 if( !RSTn ) 22 Count_H <= 11'd0; 23 else if( Count_H == 11'd1343 ) 24 Count_H <= 11'd0; 25 else 26 Count_H <= Count_H + 1'b1; 27 28 /********************************/ 29 30 reg [10:0]Count_V; 31 32 always @ ( posedge CLK or negedge RSTn ) 33 if( !RSTn ) 34 Count_V <= 11'd0; 35 else if( Count_V == 11'd805 ) 36 Count_V <= 11'd0; 37 else if( Count_H == 11'd1343 ) 38 Count_V <= Count_V + 1'b1; 39 40 /********************************/ 41 wire isReady; 42 43 assign isReady = ( ( Count_H >= 11'd296 && Count_H <= 11'd1319 ) && //有效时间1024 44 ( Count_V >= 11'd35 && Count_V <= 11'd802 ) ) ? 1'b1 : 1'b0; //768 45 46 /*********************************/ 47 48 assign VSYNC_Sig = ( Count_V < 11'd6 ) ? 1'b0 : 1'b1; //场同步信号 49 assign HSYNC_Sig = ( Count_H < 11'd136 ) ? 1'b0 : 1'b1; //行同步信号 50 assign Ready_Sig = isReady; 51 assign Frame_Sig = ( Count_V == 11'd805 ) ? 1'b1 : 1'b0; //帧结束标志 52 53 /********************************/ 54 55 assign Column_Addr_Sig = isReady ? Count_H - 11'd296 : 11'd0; // Count from 0; 列地址 56 assign Row_Addr_Sig = isReady ? Count_V - 11'd35 : 11'd0; // Count from 0; 行地址 57 58 /********************************/ 59 60 endmodule