【转载】VGA汉字显示实验
参考特权同学的深入浅出玩转FPGA的VGA显示实验,分辨率1440×900@60
1 module vga_dis 2 ( 3 input CLOCK_50, 4 input rst_n, 5 output VGA_HS, 6 output VGA_VS, 7 output [3:0] VGA_R, 8 output [3:0] VGA_G, 9 output [3:0] VGA_B 10 ); 11 /////////////////////////////////////////////////////////////////// 12 //=========================================================================== 13 // PARAMETER declarations 1440*900 14 //=========================================================================== 15 // Horizontal Parameter 16 parameter H_FRONT = 152; 17 parameter H_SYNC = 232; 18 parameter H_BACK = 80; 19 parameter H_ACT = 1440; 20 parameter H_VALID = H_FRONT+H_SYNC; 21 parameter H_TOTAL = H_FRONT+H_SYNC+H_BACK+H_ACT; 22 23 // Vertical Parameter 24 parameter V_FRONT = 3; 25 parameter V_SYNC = 28; 26 parameter V_BACK = 1; 27 parameter V_ACT = 900; 28 parameter V_VALID = V_FRONT+V_SYNC; 29 parameter V_TOTAL = V_FRONT+V_SYNC+V_BACK+V_ACT; 30 //=============================================================================== 31 wire CLK_106; 32 33 PLL PLL_inst ( 34 .inclk0 ( CLOCK_50 ), 35 .c0 ( CLK_106 ) 36 ); 37 38 assign clk = CLK_106; 39 //-------------------------------------------------- 40 reg[10:0] x_cnt; //行坐标 41 reg[10:0] y_cnt; //列坐标 42 43 always @ (posedge clk or negedge rst_n) 44 if(!rst_n) x_cnt <= 11'd0; 45 else if(x_cnt == H_TOTAL-1) x_cnt <= 11'd0; 46 else x_cnt <= x_cnt+1'b1; 47 48 always @ (posedge clk or negedge rst_n) 49 if(!rst_n) y_cnt <= 10'd0; 50 else if(y_cnt == V_TOTAL-1) y_cnt <= 10'd0; 51 else if(x_cnt == H_TOTAL-1) y_cnt <= y_cnt+1'b1; 52 53 //-------------------------------------------------- 54 wire valid; //有效显示区标志 55 56 assign valid = (x_cnt >= H_VALID) && (x_cnt <= H_VALID+H_ACT) 57 && (y_cnt >= V_VALID) && (y_cnt <= V_VALID+V_ACT); 58 59 wire[10:0] xpos,ypos; //有效显示区坐标 60 61 assign xpos = x_cnt-H_VALID; 62 assign ypos = y_cnt-V_VALID; 63 64 //-------------------------------------------------- 65 reg hsync_r,vsync_r; //同步信号产生 66 67 always @ (posedge clk or negedge rst_n) 68 if(!rst_n) hsync_r <= 1'b1; 69 // else if(x_cnt == H_FRONT-1) hsync_r <= 1'b0; //产生hsync信号 70 //else if(x_cnt == H_FRONT+H_SYNC-1) hsync_r <= 1'b1; 71 else if(x_cnt ==11'd0) hsync_r <= 1'b0; //产生hsync信号 72 else if(x_cnt == H_FRONT-1) hsync_r <= 1'b1; 73 74 always @ (posedge clk or negedge rst_n) 75 if(!rst_n) vsync_r <= 1'b1; 76 // else if(y_cnt == V_FRONT-1) vsync_r <= 1'b0; //产生vsync信号 77 //else if(y_cnt == V_FRONT+V_SYNC-1) vsync_r <= 1'b1; 78 else if(y_cnt ==11'd0) vsync_r <= 1'b0; //产生vsync信号 79 else if(y_cnt == V_FRONT-1) vsync_r <= 1'b1; 80 81 assign VGA_HS = hsync_r; 82 assign VGA_VS = vsync_r; 83 //========================================================== 84 // VGA色彩信号产生 85 /* 86 RGB = 000 黑色 RGB = 100 红色 87 = 001 蓝色 = 101 紫色 88 = 010 绿色 = 110 黄色 89 = 011 青色 = 111 白色 90 */ 91 parameter char_line0 = 24'h000000, 92 char_line1 = 24'h000000, 93 char_line2 = 24'h000000, 94 char_line3 = 24'hfcf8c7, 95 char_line4 = 24'h424462, 96 char_line5 = 24'h484262, 97 char_line6 = 24'h484252, 98 char_line7 = 24'h784252, 99 char_line8 = 24'h48424a, 100 char_line9 = 24'h48424a, 101 char_linea = 24'h40424a, 102 char_lineb = 24'h424246, 103 char_linec = 24'h424446, 104 char_lined = 24'hfcf8e2, 105 char_linee = 24'h000000, 106 char_linef = 24'h000000; 107 reg[4:0] char_bit; //显示位计算 108 109 always @(posedge clk or negedge rst_n) 110 if(!rst_n) char_bit <= 5'h1f; 111 else if(xpos == 10'd442) char_bit <= 5'd23; //显示最高位数据 112 else if(xpos > 10'd442 && xpos < 10'd466) char_bit <= char_bit-1'b1; //依次显示后面的数据 113 114 reg[7:0] vga_rgb; // VGA色彩显示寄存器 115 116 always @ (posedge clk) 117 if(!valid) vga_rgb <= 8'd0; 118 else if(xpos > 10'd442 && xpos < 10'd467) begin 119 case(ypos) 120 10'd231: if(char_line0[char_bit]) vga_rgb <= 8'b111_000_00; //红色 121 else vga_rgb <= 8'b000_11100; //绿色 122 10'd232: if(char_line1[char_bit]) vga_rgb <= 8'b111_000_00; //红色 123 else vga_rgb <= 8'b000_111_00; //绿色 124 10'd233: if(char_line2[char_bit]) vga_rgb <= 8'b111_000_00; //红色 125 else vga_rgb <= 8'b000_111_00; //绿色 126 10'd234: if(char_line3[char_bit]) vga_rgb <= 8'b111_000_00; //红色 127 else vga_rgb <= 8'b000_111_00; //绿色 128 10'd235: if(char_line4[char_bit]) vga_rgb <= 8'b111_000_00; //红色 129 else vga_rgb <= 8'b000_111_00; //绿色 130 10'd236: if(char_line5[char_bit]) vga_rgb <= 8'b111_000_00; //红色 131 else vga_rgb <= 8'b000_111_00; //绿色 132 10'd237: if(char_line6[char_bit]) vga_rgb <= 8'b111_000_00; //红色 133 else vga_rgb <= 8'b000_111_00; //绿色 134 10'd238: if(char_line7[char_bit]) vga_rgb <= 8'b111_000_00; //红色 135 else vga_rgb <= 8'b000_111_00; //绿色 136 10'd239: if(char_line8[char_bit]) vga_rgb <= 8'b111_000_00; //红色 137 else vga_rgb <= 8'b000_111_00; //绿色 138 10'd240: if(char_line9[char_bit]) vga_rgb <= 8'b111_000_00; //红色 139 else vga_rgb <= 8'b000_111_00; //绿色 140 10'd241: if(char_linea[char_bit]) vga_rgb <= 8'b111_000_00; //红色 141 else vga_rgb <= 8'b000_111_00; //绿色 142 10'd242: if(char_lineb[char_bit]) vga_rgb <= 8'b111_000_00; //红色 143 else vga_rgb <= 8'b000_111_00; //绿色 144 10'd243: if(char_linec[char_bit]) vga_rgb <= 8'b111_000_00; //红色 145 else vga_rgb <= 8'b000_111_00; //绿色 146 10'd244: if(char_lined[char_bit]) vga_rgb <= 8'b111_000_00; //红色 147 else vga_rgb <= 8'b000_111_00; //绿色 148 10'd245: if(char_linee[char_bit]) vga_rgb <= 8'b111_000_00; //红色 149 else vga_rgb <= 8'b000_111_00; //绿色 150 10'd246: if(char_linef[char_bit]) vga_rgb <= 8'b111_000_00; //红色 151 else vga_rgb <= 8'b000_111_00; //绿色 152 default: vga_rgb <= 8'h00; 153 endcase 154 end 155 else vga_rgb <= 8'h00; 156 157 //r,g,b控制液晶屏颜色显示 158 assign {VGA_R[3:0],VGA_G[3:0],VGA_B[3:0]} = {1'b0,vga_rgb[7:5],1'b0,vga_rgb[4:2],2'b00,vga_rgb[1:0]} ; 159 160 endmodule
本文引用地址:http://www.cnblogs.com/qiweiwang/archive/2011/01/19/1939694.html,作者:齐威王