单色VGA显示verilogHDL通用代码

 

  今天做VGA,真是拼凑了好久啊。唉,总算完成了。

  本来想偷懒移植,最后还是自己写的代码。

 

 

 1 //2015/12/13
 2 //designer : pengxiaoen 
 3 //function : vga control
 4 /*备注:
 5     1,三个test pin 是用来测试pll是否工作
 6     2,r,g,b 三色分别对应三个不同的key 以及三个led进行显示
 7     3,因为这个板子的 r ,g ,b  分别只有一个pin ,显示色彩有限
 8 */
 9 module vga_top (
10                 clock ,
11                 rst_n ,
12                 key_r,key_g,key_b ,
13                 
14                 clk_vga ,clk_board, clk_500k ,  //test pin  
15                 led_r ,led_g,led_b ,
16                 
17                 vga_hs ,vga_vs,vga_r,vga_g,vga_b 
18                 
19                 );
20 input clock ; 
21 input rst_n ; 
22 input key_r,key_g,key_b ; 
23 
24 output vga_hs ; 
25 output vga_vs ; 
26 output vga_r ; 
27 output vga_g ; 
28 output vga_b ; 
29 
30 output  clk_vga ; 
31 output  clk_board ; 
32 output  clk_500k ; 
33 output  led_r,led_g,led_b ; 
34 
35 wire clk_65m ; 
36 
37 altera_pll_peng  pll_U(
38                         .areset (!rst_n),
39                         .inclk0 (clock),
40                         .c0  (clk_65m),
41                         .c1  (clk_500k)
42                         );
43                             
44                             
45 
46  vga_driver vga_dri_U
47                 (
48                 .pix_clk  (clk_65m),
49                 .rst_n    (rst_n),
50                 .key_r      (key_r),
51                 .key_g    (key_g),
52                 .key_b    (key_b),
53                 
54                 .vga_r    (vga_r),
55                 .vga_g    (vga_g),
56                 .vga_b    (vga_b),
57                 .vga_hs   (vga_hs),
58                 .vga_vs   (vga_vs)
59                 ); 
60 
61                 
62 // for  test  or display
63 assign clk_board = clock ; 
64 assign clk_vga = clk_65m ; 
65 assign led_r = key_r ; 
66 assign led_g = key_g ; 
67 assign led_b = key_b ; 
68 
69 endmodule 


子模块

 1 module vga_driver
 2                 (
 3                 pix_clk ,
 4                 rst_n ,
 5                 key_r,
 6                 key_g,
 7                 key_b,
 8                 
 9                 vga_r,
10                 vga_g,
11                 vga_b,
12                 vga_hs,
13                 vga_vs
14                 ); 
15 input   pix_clk ;   // VGA像素时钟
16 input   rst_n ;      // 异步复位信号
17 input     key_b,key_g,key_r ; 
18 
19 output      vga_r ; 
20 output      vga_g ;
21 output      vga_b ; 
22 output   vga_hs ;  // VGA管脚 行同步
23 output   vga_vs ;  // VGA管脚 场同步
24 
25 //定义VGA_1024_768_65M_60HZ显示协议标准 
26 //  pix_clk  65m
27 
28 parameter H_SYNC  = 16'd136;   // 同步脉冲      vga_hs
29 parameter H_BACK  = 16'd160;    // 显示后沿 
30 parameter H_DISP  = 16'd1024;   // 显示时序
31 parameter H_FRONT = 16'd24;    // 显示前沿
32 parameter H_TOTAL = 16'd1344;  // 时序帧长   ---hs_cnt 
33 
34 parameter V_SYNC  = 16'd6;     // 同步脉冲      vga_vs
35 parameter V_BACK  = 16'd29;    // 显示后沿
36 parameter V_DISP  = 16'd768;   // 显示时序 
37 parameter V_FRONT = 16'd3;    // 显示前沿
38 parameter V_TOTAL = 16'd806;   // 时序帧长   --- vs_cnt 
39 //------------------------------------------
40 reg [15:0] hs_cnt ; 
41 reg [15:0] vs_cnt ;
42 always @ (posedge pix_clk )
43     if(!rst_n) hs_cnt <= 16'd0; 
44     else if(hs_cnt == H_TOTAL-1) hs_cnt <= 16'd0 ; 
45     else     hs_cnt <= hs_cnt + 16'd1 ; 
46 always @(posedge pix_clk)
47     if(!rst_n) vs_cnt <= 16'd0 ; 
48     else if (vs_cnt == V_TOTAL-1) vs_cnt <= 16'd0 ; 
49     else if (hs_cnt == H_TOTAL-1) vs_cnt <= vs_cnt + 16'd1 ; 
50     
51 reg hsync_r,vsync_r;    //同步信号
52 //------------------------------------------------- 
53 always @ (posedge pix_clk)
54     if(!rst_n) hsync_r <= 1'b1;                                
55     else if(hs_cnt == 16'd0)    hsync_r <= 1'b0;    //产生hsync信号
56     else if(hs_cnt == H_SYNC-1) hsync_r <= 1'b1;
57 
58 always @ (posedge pix_clk )
59     if(!rst_n) vsync_r <= 1'b1;                              
60     else if(vs_cnt == 16'd0)    vsync_r <= 1'b0;    //产生vsync信号
61     else if(vs_cnt == V_SYNC-1) vsync_r <= 1'b1;
62 
63 assign vga_hs = hsync_r;
64 assign vga_vs = vsync_r;
65 
66 //--------------------------------------------------------------------------
67 //有效信号范围
68 reg     x_en ,y_en ; 
69 always @ (posedge pix_clk)
70     if(!rst_n) x_en  <= 1'd0 ; 
71     else if (hs_cnt==(H_SYNC + H_BACK)) x_en  <= 1'd1 ; 
72     else if (hs_cnt==(H_SYNC + H_BACK + H_DISP)) x_en  <= 1'd0 ; 
73 
74 always @ (posedge pix_clk)
75     if(!rst_n) y_en <= 1'd0 ; 
76     else if (vs_cnt == (V_SYNC + V_BACK)) y_en <= 1'd1 ; 
77     else if (vs_cnt == (V_SYNC + V_BACK + V_DISP)) y_en <= 1'd0 ; 
78 
79     
80 assign vga_r = (x_en&y_en) ? key_r: 1'd0 ; 
81 assign vga_g = (x_en&y_en) ? key_g: 1'd0 ; 
82 assign vga_b = (x_en&y_en) ? key_b: 1'd0 ; 
83     
84 endmodule 

 

posted on 2015-12-13 18:43  清霜一梦  阅读(920)  评论(0编辑  收藏  举报