FPGA之VGA/LCD数字时钟显示


前言

软件实现了在4.3寸LCD左上角显示一个数字时钟,效果如下图所示。本文针对VGA/LCD控制时许有一定基础的人群,博主的开发环境为Quartus13.1和一个随便哪家的开发板,使用4.3寸LCD(RGB565接口),兼容VGA,但是相关参数需要更改。软件中部分代码模块借用野火电子的软件,感谢。后文以LCD进行说明。
获取源代码、字模软件、rom初始化文件等点击此处
在这里插入图片描述


一、LCD显示控制

1.LCD显示一个字符

LCD在显示时是从左到右、从上到下进行刷新显示,4.3寸lcd显示区域大小为480x272,软件在坐标(24,32)处划定了一个长24宽32的显示区域,将此区域命名为square1,显示的内容为时的十位(22:15中左边第一个2),如下图所示。
在这里插入图片描述
在显示一个字符1时先进行取模,如下图所示,点阵大小也为24x32,与上图square1对应,因此lcd在square1中一行一行刷新时也判断字模的值是否为1,是则点亮lcd对应位置,反之则变暗。下面举例进行说明。square1在扫描前三行时,字模为0,第四行的第13个像素点为1,那么此时lcd对应的位置点亮。软件中lcd点亮即将该点像素变红。
软件实现时,将字模存储在宽度为24bit,深度为32的rom中,square1的32行读出rom地址0的值,在本行的第24列开始判断rom地址0读出值rom_dat的最高位bit23,然后判断bit23值是否为1,是则将lcd该点变红,反之变黑,之后继续判断bit30、bit29、bit28…bit0,一行判断完成后则判断下一行。square1的第33行读出rom的地址1的数据,然后进行判断。重复以上过程直到square1最后一行,此时对应rom地址31的数据。由此完成一个字符的显示。
在这里插入图片描述
部分代码如下:

parameter 	POINTX   ='d24, //squr1
			POINTY   ='d32;
			
parameter 	WIDTH	 ='d24,
			HEIGH	 ='d32;			

else if(squr1_rden)begin
		if(squrrom_dat[WIDTH+POINTX-pix_x])
			o_tft_dat<=RED ;
		else
			o_tft_dat<=0;//BLUE;
	end 

squrrom_rdaddr =(pix_y-HEIGH)

2.LCD显示多个字符

完成一个字符显示后多个字符显示就很简单,继续划定剩下3个字符和冒号区域,4个字符的点阵大小都是24x32,冒号点阵大小为16x32。软件使用两个rom存放字模,一个存储0-9字符,地址0-31为字符“0”,32-63为字符“1”,后续依次递增;另一个存储“:”。4个字符共用一个rom,字符寻址、显示部分代码如下图:

always@(*)begin
	if(!rst_n)
		squrrom_rdaddr='d0;
	else if(squr1_rden)
		squrrom_rdaddr=suqr1_addr;
	else if(squr2_rden)
		squrrom_rdaddr=suqr2_addr;
	else if(squr3_rden)
		squrrom_rdaddr=suqr3_addr;
	else if(squr4_rden)
		squrrom_rdaddr=suqr4_addr;	
end	

assign suqr1_addr=(pix_y-HEIGH)+ squr1*32;
assign suqr2_addr=(pix_y-HEIGH)+ squr2*32;
assign suqr3_addr=(pix_y-HEIGH)+ squr3*32;
assign suqr4_addr=(pix_y-HEIGH)+ squr4*32;

always@(posedge clk,negedge rst_n)
	if(!rst_n)
		o_tft_dat<='d0;
	else if(squr1_rden)begin
		if(squrrom_dat[WIDTH+POINTX-pix_x])
			o_tft_dat<=RED ;
		else
			o_tft_dat<=0;//BLUE;
	end else if(squr2_rden)begin
		if(squrrom_dat[WIDTH+POINTX2-pix_x])
			o_tft_dat<=RED ;
		else
			o_tft_dat<=0;//YELLOW;		
	end else if(dot_rden)begin
		if(dotrom_dat[WIDTHDOT+POINTXDOT-pix_x] && dot_vld)
			o_tft_dat<=RED ;
		else
			o_tft_dat<=0;//CYAN;
	end else if(squr3_rden)begin
		if<
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值