华农FPGA实验_实验七 采用状态机设计LCD1602驱动方案

一 实验目的

1、熟悉利用Quartus II 9.0 软件开发数字电路的基本流程以及熟悉Quartus II软件的操作。

2、了解使用VHDL语言和原理图设计进行HDL描述的实现方法。

3、了解有限状态机的原理和实现方案。

4、掌握LCD1602驱动电路设计的基本设计思路,软件环境参数配置,时序仿真,管脚分配,并且利用JTAG接口进行下载的常规设计流程。

二 实验前的准备

1、将红色的MODUL_SEL拨码开关组合的1、2、7拨上,3、4、5、6、8拨下,使数码管显示当前模式为:C2。

2、检查JTAG TO USB转换接口和USB连接线的连接,并且将JTAG线连接到核心板上的JTAG接口(核心板的第二个十针的插口)处。

三 实验要求

掌握有限状态机的原理,实现LCD1602驱动设计方案。

四 实验内容

(一)了解LCD1602的写入规则

  1. 1602是指显示的内容为16*2,即可以显示两行,每行16个字符。目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。

了解1602的管脚定义,见附录3,确定状态机的控制状态。

(二)利用文本描述完成LCD1602控制电路的VHDL设计

1、建立工程LCD1602,编写VHDL描述文件。要求,使用状态机描述,首先对1602进行初始化,然后设置显示格式,第三设置光标格式,第四设置光标移动格式,第五写入显示内容,第六写入下一显示内容的地址,之后循环第五和第六部。


  1. 对LCD1602工程进行编译综合,然后下载到实验箱中,检验实验箱的1602是否能输出指定的字符。
  2. 改变输出字符的内容,分两行输出自己的姓名的拼音和学号

五 电路设计、仿真与硬件分析

  1. 采用状态机设计LCD1602驱动方案

首先在对LCD1602进行测试,测试其好坏性能,接着再编写代码显示姓名学号等信息,完成本实验的设计与制作。

a.如图为LCD1602测试时的输入代码

LCD1602测试时的输入代码图(1)

LCD1602测试时的输入代码图(2)

LCD1602测试时的输入代码图

b.如图为学号姓名在LCD1602上的显示代码

学号姓名在LCD1602上的显示代码(1)

学号姓名在LCD1602上的显示代码(2)

学号姓名在LCD1602上的显示代码(3)

学号姓名在LCD1602上的显示代码(4)

分析:大致可以将程序描述分为六个部分。

第一部分,首先对1602进行初始化,即对LCD1602进行清屏操作。清屏指令01H.

第二部分,设置显示格式; D为1时,显示功能开。

第三部分设置光标格式; C为1时有光标,B为1时光标不闪烁。

第四部分设置光标移动格式,将光标设置为右移。I/D位为1时,写入新数据后光标右移。

第五部分写入显示内容,以及第六部分写入下一显示内容的地址。同时,通过查找1602液晶模块内部的字符发生存储器,找到对应于自己学号“202121510102”的字符代码以及对应于自己名字“chenxuzhao”的字符代码,并将对应部分写入程序。

之后循环第五部分和第六部分。

  1. 状态机设计LCD1602驱动方案RTL图

驱动方案RTL图

  1. 硬件运行拍照

硬件运行图

分析:

将文件下载到实验箱后,观察LCD1602可知其正常输出“202134410327 ZJY”字样,说明该设计仿真无误。

五.实验结论

由实验结果可知:

(1)设计功能正确,所设计的程序经过编译综合适配后,能够驱动LCD1602进行显示,并能够根据需要查表找到对应字符的字符编码,达到修改显示内容的效果。

(2)利用有限状态机的编程思想,能够很好地帮助我们对LCD1602驱动程序进行编写。加深了对有限状态机的四大部分:说明部分,主控时序进程,主控组合进程,辅助进程的理解,特别是对于主控组合进程,明确了它的几个基本的要领:对内下一个状态应该是怎么样,对外输出应该是怎么样,对内的控制信号变成什么。对于未来应用有限状态机进行复杂电路设计有很好的铺垫作用。

(3)熟悉了LCD1602的基本工作原理和它的一些结构与功能,像如何清屏,光标如何移动,如何写入数据和指令等等。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
FPGAVHDL编程中,有限状态机(Finite State Machine,FSM)是一种常用的设计方法。有限状态机是一种具有有限个状态和状态转移规则的计算模型,可以用来描述电路或系统的行为。 在VHDL中实现有限状态机,通常需要定义状态信号(state signal)来表示当前的状态,以及一个状态转移过程来定义状态之间的转换规则。可以使用if-then-else结构、case语句或者when-else结构来实现状态转移逻辑。 以下是一个简单的例子,展示了一个基于VHDL的有限状态机的实现: ```vhdl entity fsm_example is port ( clk : in std_logic; reset : in std_logic; input : in std_logic; output : out std_logic ); end fsm_example; architecture behavioral of fsm_example is type state_type is (StateA, StateB, StateC); signal current_state, next_state : state_type; begin process(clk) begin if rising_edge(clk) then if reset = '1' then current_state <= StateA; -- 初始状态 else current_state <= next_state; -- 更新当前状态 end if; end if; end process; process(current_state, input) begin case current_state is when StateA => if input = '1' then next_state <= StateB; -- 状态转移 else next_state <= StateA; -- 保持当前状态 end if; when StateB => if input = '1' then next_state <= StateC; -- 状态转移 else next_state <= StateB; -- 保持当前状态 end if; when StateC => if input = '1' then next_state <= StateA; -- 状态转移 else next_state <= StateC; -- 保持当前状态 end if; end case; end process; output <= '1' when current_state = StateC else '0'; -- 根据状态输出结果 end behavioral; ``` 在这个例子中,有三个状态(StateA、StateB和StateC),输入信号为input,输出信号为output。根据输入信号和当前状态,通过状态转移逻辑来更新下一个状态。 当输入信号为'1'时,状态从StateA转移到StateB,然后转移到StateC,最后循环回到StateA;当输入信号为'0'时,状态保持不变。 这只是一个简单的例子,实际应用中的有限状态机可能更加复杂。但基本思路都是类似的,通过定义状态变量和状态转移逻辑来实现所需的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值