VERILOG代码:VGA显示字符串的解读

`timescale 1ns/1ns
module lcd_display
(
 input     clk,  //system clock
 input    rst_n,  //sync clock
 
 input  [10:0] lcd_xpos, //lcd horizontal coordinate
 input  [10:0] lcd_ypos, //lcd vertical coordinate
 output reg [23:0] lcd_data, //lcd data
 output [7:0] add1
);
`include "lcd_para.v"
`define LCD_COLOR_DEFAULT `YELLOW
`define LCD_ADDR_AHEAD   9'd2 //lcd address ahead, it is very important


//--------------------------------------------------------------
/****************************************************************
   Display : "Hello World*^_^*", 32*16 = 512 (Char: 32 * 64)
****************************************************************/
wire vip_area1 = (lcd_xpos >= 0 && lcd_xpos <512) && (lcd_ypos >= 0 && lcd_ypos < 32);
wire [63:0] vip_data1;       
wire [8:0] vip_addr1 = lcd_xpos[8:0] - (9'd64 - `LCD_ADDR_AHEAD); //32*16 = 512
assign add1 = vip_addr1[7:0];
vip_rom1 u_vip_rom1
(
 .clock  (clk),
 .address (vip_addr1),
 .q   (vip_data1)
);


//--------------------------------------------------------------
/****************************************************************
   Display : "I am CrazyBingo!", 32*16 = 512 (Char: 32 * 64)
单个字符的宽度WIDTH为32,高度HEIGHT为64,一行可以显示16个字符。故一行
共有32*16个像素。共有512(WIDTH)*64(HEIGHT)这么大的区域,需要显示
像素。

****************************************************************/
wire vip_area2 = (lcd_xpos >= 64 && lcd_xpos < 576) && (lcd_ypos >= 256 && lcd_ypos < 320); 
wire [63:0] vip_data2; 

/*在这里取水平位置,即显示区域512这个方向的位置,显示时,由于需要往后面移一点位置,所以减掉
了一个数据,这样实际的地址为62时,vip_addr2才是有效地址,同时lcd_xpos需要大于等于64时,所以
vip_addr2在lcd_xpos方向大于64时开始取数据*/      
wire [8:0] vip_addr2 = lcd_xpos[8:0] - (9'd64 - `LCD_ADDR_AHEAD); //32*16 = 512
vip_rom2 u_vip_rom2
(
 .clock  (clk),
 .address (vip_addr2),
 .q   (vip_data2)
);


//--------------------------------------------------------------
//LCD char display with rom input
always@(posedge clk or negedge rst_n)
begin
 if(!rst_n)
  lcd_data <= 0;
 else
  begin
  //Display : "Hello World*^_^*" 
  if(vip_area1 == 1'b1) // 判断是否在显示区域中,这里有一个水平显示方向从MIF文件数组取64位数据
   if(vip_data1[6'd63-lcd_ypos[5:0]] == 1'b1) // 列取模时,第一个点是最高位,所以需要找到vip_data1[6'd63]
    lcd_data <= `GREEN;
   else          
    lcd_data <= `LCD_COLOR_DEFAULT;

  //Display : "I am CrazyBingo!"
  else if (vip_area2 == 1'b1)  
   if(vip_data2[6'd63-lcd_ypos[5:0]] == 1'b1) 
    lcd_data <= `GREEN;
   else          
    lcd_data <= `LCD_COLOR_DEFAULT;
   
  //Display : WHITE AREA    
  else           
   lcd_data <= `LCD_COLOR_DEFAULT;

  end
end

 

endmodule

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值