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

你可能感兴趣的:(汉字)