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
161

posted on 2011-01-19 22:51  齐威王  阅读(2957)  评论(1编辑  收藏  举报

导航