什么是有限状态机?
在深入研究设计之前,让我们快速回顾一下有限状态机。它们是时序逻辑电路的抽象数学模型,在任意给定时刻,它们只在有限数量的状态之一中运行。
FSM 可以在每个时钟周期内在其状态之间转换。下一个状态基于外部输入和当前状态(这意味着它采用内存逻辑)。
有限状态机可用于检测或生成序列,并且是电梯、交通灯、自动售货机和电子锁等系统的基础。
二进制计数器
FSM 的一个特定实现是二进制计数器。这些电路的设计目标是迭代并显示所需的二进制数序列,通常使用一系列互连的触发器构建。二进制计数器的每个新状态都必须由输入脉冲触发,该脉冲可以来自外部源或来自电路自己的时钟信号。
有了这些背景知识,让我们深入研究 4 位二进制计数器的代码。
FSM 二进制计数器的 VHDL 代码
我们将通过在 VHDL 文件顶部声明几个库来开始编写二进制计数器的代码:
![](https://file3.dzsc.com/news/24/09/02/155953748.webp)
端口定义
接下来,我们将为电路创建一个名为fsm的实体,并定义其输入和输出端口:
![](https://file3.dzsc.com/news/24/09/02/160020499.webp)
在此代码片段中我们定义了:
由命令“in std_logic”定义的时钟信号CLK输入一个名为CNT 的4 位输出端口,使用“out std_logic_vector(3 downto 0)”
一个名为SEL的 4 位输入端口,使用“in std_logic_vector(3 downto 0)”
流程和数据类型定义
现在我们已经定义了fsm实体,我们可以为我们的电路创建一个架构。该架构将有三个过程:
状态记忆。
下一个状态逻辑。
输出逻辑。
在我们创建这些过程之前,我们需要为我们的状态定义一种新的数据类型和两个该数据类型的信号变量来记住当前状态和下一个状态(将它们视为寄存器)。
状态记忆过程
现在我们可以创建个名为STATE_MEMORY的进程。使用IF语句,它在CLK信号的每个上升沿将下一个状态的值写入当前状态变量中。
![](https://file3.dzsc.com/news/24/09/02/160135177.webp)
下一状态逻辑过程
我们将使用SEL输入端口和CURRENT_STATE信号创建一个名为NEXT_STATE_LOGIC的进程。在这个进程中,我们为当前状态调用一个CASE-WHEN语句。我们在个CASE-WHEN语句的每个WHEN子句内嵌套了用于模式的其他CASE-WHEN语句。
这样,我们就有了一个架构,它首先检查FSM的当前状态,然后从SEL端口读取值。当此过程完成时,一个嵌套的WHEN子句将根据我们的代码将正确的下一个状态值写入NEXT_STATE信号(写入正在计数的序列)。
下面的代码块显示了一个简单的递增计数器,当SEL端口值等于“0000”时,该计数器处于活动状态。为简洁起见,我仅显示了其中几个重复的 case 语句,但完整的代码在下面提供。
![](https://file3.dzsc.com/news/24/09/02/160150301.webp)
跳过类似的 C3 到 C13 的情况,我们到达NEXT_STATE_LOGIC过程的末尾,其中:
![](https://file3.dzsc.com/news/24/09/02/160159960.webp)
输出逻辑过程
,为了将当前状态输出到 4 位 LED 显示屏上,我们需要编写另一个名为OUTPUT_LOGIC的过程。它用相应的 4 位二进制数枚举我们之前定义的每种状态类型。
这再次通过使用CURRENT_STATE信号并调用另一个CASE-WHEN语句来完成。CNT输出以其 4 位二进制对应项表示当前状态: