单色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