VGA控制器的编写主要是了解VGA的显示标准和时序,如1024X768@60Hz,确定时钟频率(65MHz=1344X806X60),列像素时间等于时钟周期,扫描从左到右、从上到下(类似于电视扫描PAL)。除有效时间外,一行还有同步脉冲时间、后肩和前肩。(http://tinyvga.com/vgatiminghttp://wenku.baidu.com/view/13b3140102020740be1e9b94.html,

http://www.cnblogs.com/qiweiwang/archive/2011/01/17/1937688.html

VGA显示 VGA显示

 

VGA显示VGA显示

VGA显示VGA显示

VGA显示VGA显示

然后根据时序实现显示标准的功能模块,完成同步信号的输出、有效区域标志和当前坐标。一行列像素计数完成后,行计数器加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
sync_module.v

相关文章: