【转载】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,作者:齐威王


 

转载于:https://www.cnblogs.com/simmon0705/p/3664270.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值