`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