首页 > 其他分享 >【Verilog实例】1_LCD字符串显示

【Verilog实例】1_LCD字符串显示

时间:2025-01-12 09:30:01浏览次数:3  
标签:实例 00H 写入 LCD CGRAM Verilog 所示 DDRAM

  • 功能描述:

  通过写入指令或数据,控制内部的驱动芯片,从而实现在LCD显示屏上显示字符串:
I _ ❤ L O V E ❤ _ B U A A ! {I\_❤LOVE❤\_BUAA!} I_❤LOVE❤_BUAA!

1952 − − 2022 {1952--2022} 1952−−2022

  • 设计方案:

  设计将以有限状态机的形式完成功能设计,其中涉及的状态及相关功能如下图1所示,
在这里插入图片描述

  CGRAM_ADDR前面均为LCD初始化状态,不多赘述。CGRAM_ADDR状态下,传送指令:要写入CGRAM,地址为00H;下面CGRAM_WRITE状态下,传送数据:其中字模数据为8行八列数据,不能一次传入,故设计一计数器,若计数到7,则跳转下一状态ADDR1,否则继续CGRAM_WRITE状态直到完成一个字符的写入;ADDR1和ADDR2状态下均传送指令:要写入DDRAM,地址分别为00H和40H,完成后均跳转到WRITE_DDRAM状态;WRITE_DDRAM也需要一计数器来监控传到了第几行 以及是否传送完毕,结束后跳转至STOP状态,维持当下显示

  下面将说明具体实现。

  ①使能信号的生成: 当LCD的时钟频率设置错误时,LCD的显示就会闪,或者没有显示,故选择控制使能信号的周期生成,来达到设计要求的500Hz,这里选择的是计数方法,已知我们的初始时钟是CLOCK_50,若每逢上升沿计数,为生成500Hz的工作时钟,需每逢计数99999,进行一次归零进入下一计数周期,并设置使能信号LCD_EN,每逢49999进行一次翻转,即可对应得到使能信号;

  ②延时15ms的实现: 在空闲IDLE状态下,需延时15ms进入下一状态,综合考虑电路性能,选择以计数的形式来实现,同上①;

  ③LCD的显示: 在LCD上显示字符的过程就是向DDRAM的相应地址写入数据的过程,其中DDRAM地址与显示位置的对应关系如下图2所示。若想要在LCD的第一行最左显示字母A,则过程为:传指令DDRAM地址00H → {→} →传数据字母A(41H)

在这里插入图片描述

  ④自定义字符的实现: 在芯片中内置了192个常用字符的字模,存于CGROM中,可以实现基本数字和字母的直接调用显示(如上文中字母A),此外还有8个允许用户自定义字符的CGRAM,即为下图3中绿框中所示,我们可以通过先将自定义字符写入CGRAM,再调入写入DDRAM的方法实现自定义字符的显示,下面以字符 ❤ {❤} ❤为例加以说明:

在这里插入图片描述

  • 取字模: 将图形转换为二进制数,显示出来的部分置1,未显示的部分置0,如下图4所示,可以得到8列八位数据

在这里插入图片描述

  • 写入CGRAM: 写入CGRAM的指令如下图5所示,其中CGRAM的地址为00H-0FH,这里我们选择写入地址为00H,将上面得到的8列八位数据依次写入CGRAM,则CGROM中00H就代表了字符 ♥ {♥} ♥;

在这里插入图片描述

  • 显示: 即将地址指针指向DDRAM即可,写入数据为00H。

  • 关键代码:

	/***main_FSM***/
	//Section1
	always@(posedge clk, negedge rstn)	begin
		if(!rstn)	cur_state <= IDLE;
		else if(cnt_500hz == 17'b01100001101001111)
			cur_state <= next_state;
	end

    //Section2
	always @(cur_state)	begin
		case(cur_state)
			IDLE:				begin
									if(flag)	next_state = CLEAR_LCD;
									else		next_state = IDLE;
								end
			CLEAR_LCD:		next_state = SET_DISP_MODE;
			SET_DISP_MODE:	next_state = DISP_ON;
			DISP_ON: 		next_state = SHIFT_DOWN;
			SHIFT_DOWN: 	next_state = CGRAM_ADDR;
			CGRAM_ADDR:		next_state = WRITE_CGRAM;
			WRITE_CGRAM:	begin
									if(cnt_cgram == 4'd7)		next_state = ADDR1;
									else								next_state = WRITE_CGRAM;
								end
			ADDR1:			next_state <= WRITE_DDRAM;
			WRITE_DDRAM:	begin
									if(cnt_char == 6'd15)		next_state = ADDR2;
									else if(cnt_char == 6'd31)	next_state = STOP;
									else								next_state = WRITE_DDRAM;
								end
			ADDR2:			next_state = WRITE_DDRAM;
			STOP:				next_state = STOP;
			default:			next_state = IDLE;
		endcase
	end

	//Section3
	always @(posedge clk, negedge rstn)	begin
		if(!rstn)	begin
			lcd_rs <= 1'b0;
			lcd_data <= 8'b00000000;
		end
		else	begin
			case(cur_state)	
				IDLE:				begin	lcd_rs<=1'b0; lcd_data<=8'b00000000;	end
				CLEAR_LCD:		begin lcd_rs<=1'b0; lcd_data<=8'b00000001;	end
				SET_DISP_MODE:	begin lcd_rs<=1'b0; lcd_data<=8'b00111000;	end
				DISP_ON: 		begin lcd_rs<=1'b0; lcd_data<=8'b00001100;	end
				SHIFT_DOWN: 	begin	lcd_rs<=1'b0; lcd_data<=8'b00000110;	end
				CGRAM_ADDR: 	begin lcd_rs<=1'b0; lcd_data<=8'b01000000;	end
				WRITE_CGRAM:	begin lcd_rs<=1'b1; lcd_data<=char_heart[cnt_cgram];		end
				ADDR1:			begin lcd_rs<=1'b0; lcd_data<=8'b10000000;	end
				WRITE_DDRAM:	begin lcd_rs<=1'b1; lcd_data<=char;				end
				ADDR2:			begin lcd_rs<=1'b0; lcd_data<=8'b11000000;	end
				STOP:				begin lcd_rs<=1'b0; lcd_data<=8'b00111000;	end
				default:			begin	lcd_rs<=1'b0; lcd_data<=8'b00111000;	end
			endcase
		end
	end
  • 综合结果:

  顶层模块的综合结果如下图6所示,仅有一lcd1602模块;

在这里插入图片描述

  lcd1602模块的综合结果如下图7所示,无LATCH;

在这里插入图片描述

  得到的状态转移图如下图8所示,与设计思路相符合;

在这里插入图片描述

  SUMMARY的结果如下图9所示。

在这里插入图片描述

  • 显示结果:
    在这里插入图片描述

标签:实例,00H,写入,LCD,CGRAM,Verilog,所示,DDRAM
From: https://blog.csdn.net/v_o_i_l_a/article/details/145075772

相关文章

  • 手把手教你学simulink(69.3)--毫米波5G/6G 系统场景实例设计并实现基于Simulink的毫米波
    目录项目背景介绍毫米波5G/6G系统与多用户MIMO技术概述研究目标系统架构1. 数据生成模块(DataGeneration)2. 多用户MIMO模块(Multi-UserMIMO)3. 信道模块(Channel)4. 接收端模块(Receiver)5. 性能评估模块(PerformanceEvaluation)仿真实现步骤1.创建......
  • 计算机视觉算法实战——实例分割
       ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨  ✨个人主页欢迎您的访问 ✨期待您的三连✨  ​​​​​​​​​​​​​​​​​​​​​​​1.算法基本原理✨✨实例分割(Instance Segmentation)是计算机视觉中......
  • 《Linux设备驱动开发详解(第3版)》 第17章 Linux设备驱动开发综合实例
    17.1开发板硬件介绍假设我们使用的是一款基于ARM架构的开发板,板上集成了多种设备,如串口、GPIO、SPI、I2C等接口,以及网卡、USB控制器、PCI插槽等设备。不同的开发板硬件特性会有所不同,这里以通用的硬件配置为例进行说明。17.2字符设备驱动开发实例字符设备是一种以字节......
  • 一个实例用全创建型模式-优化(冗余消除)
       上一篇:一个实例用全创建型模式-CSDN博客目录:《一个实例讲完23种设计模式》当前:单件+抽象工厂+创建者+工厂方法+优化需求:坦克大战创建两种坦克坦克类型   射程   速度b70   70米   时/70公里b50   50米   时/50公里设计说明1.抽......
  • 【AI中数学-线代-综合实例-包括python实现】揭秘数据:主成分分析的特征探险
    第三章线性代数--综合实例第4节揭秘数据:主成分分析的特征探险主成分分析(PCA,PrincipalComponentAnalysis)是一种常用的数据降维技术,通过将高维数据投影到低维空间,保留数据中的主要特征和变异性。PCA不仅能够帮助我们理解数据结构,还能提升机器学习算法的效率和性能。本节......
  • 【C++】揭开C++类与对象的神秘面纱(首卷)(类的基础操作详解、实例化艺术及this指针的深
    文章目录一、类的定义1.类定义格式2.类访问限定符3.类域二、类的实例化1.实例化概念2.对象的大小三、隐藏的this指针与相关练习1.this指针的引入与介绍练习1练习2练习3一、类的定义1.类定义格式   在讲解类的作用之前,我们来看看类是如何定义的,在C++中,class......
  • 三层神经网络计算实例
    三层神经网络0.15w10.20w20.25w30.30w40.40w50.45w60......
  • 基于Simulink的模糊逻辑控制(Fuzzy Logic Control, FLC)的他励直流电动机与永磁直流电动
    目录基于Simulink的模糊逻辑控制(FuzzyLogicControl,FLC)的他励直流电动机与永磁直流电动机模型实例1.项目背景2.系统架构2.1他励直流电动机简介2.2永磁直流电动机简介2.3模糊逻辑控制原理3.模型设计3.1他励直流电动机建模3.2永磁直流电动机建模3.3模糊逻......
  • 基于FPGA的直接数字频率合成器verilog实现,包含testbench
    1.算法运行效果图预览(完整程序运行后无水印)  2.算法运行软件版本vivado2019.2 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频)//sin,cos相位累加器的控制always@(posedgei_clk)//时钟上边沿触发beginif(i_rst)//系统复位 begin o_sin_......
  • 常见的七种贪心算法应用实例
            贪心算法(GreedyAlgorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。以下是一些常见的贪心算法应用实例:1.钱币找零问题:        在找零时,希望用最少数量的钱币凑成特定的金额。......