谢丫丫

如何在VHDL中实现有限状态机?

0
阅读(545) 评论(0)

简介

在数字系统中,有两种基本类型的电路。第一种类型是组合逻辑电路。在组合逻辑电路中,输出仅取决于输入。组合逻辑电路的示例包括加法器,编码器和多路复用器。例如,在加法器中,输出只是输入的总和; 什么以前的输入或输出都没关系。第二类数字逻辑电路是时序逻辑电路。在时序逻辑电路中,输出不仅取决于输入,还取决于系统的当前状态(即输出值和任何内部信号或变量)。顺序逻辑电路的复杂性从简单的计数器到基本序列(例如,0,1,2,3 ... 0,1,2,3 ......)从一种状态移动到另一种状态到非常大规模的电路,例如具有数百万的微处理器本文的重点是将时序逻辑电路表示为有限状态机,以及如何将这些有限状态机转换为硬件描述语言VHDL。

顺序逻辑系统是有限状态机(FSM)。作为FSM,它们由一组状态,一些输入,一些输出和一组用于从一个状态移动到另一个状态的规则组成。在进行数字系统设计时,首先定义系统如何使用有限状态机模型是很常见的。此设计步骤允许设计人员从高级别的角度考虑设计,而无需考虑系统将在何种硬件上实现,或者需要哪些设计工具来实现设计。一旦FSM完全设计好,如果设计得很好,就很容易用硬件描述语言(如Verilog或VHDL)写出设计,以便在数字IC(集成电路)上实现。

本文将首先通过定义设计问题来创建数字系统的设计过程,其次,将系统的计算模型创建为有限状态机,第三,将FSM转换为硬件描述语言VHDL。(VHDL实际上是双重缩写.VHDL代表VHSIC硬件描述语言,VHSIC代表超高速集成电路)。

读者应具备数字电路和IC的一些经验。他们还应该对VHDL有基本的了解,或者至少有一些阅读结构化计算机代码的经验。使用计算机代码的经验将帮助您识别VHDL的一些结构和构造,但应该注意VHDL不是一种编程语言; 它是一种硬件描述语言(HDL)。换句话说,您编写的语句将在您正在设计的系统中创建硬件(门,触发器等)。

 

有限状态机

要设计的系统非常简单,其目的是介绍将FSM转换为VHDL的想法。此FSM具有四个状态:A,B,C,和d。该系统具有被称为一个输入信号P,和的值P确定什么状态系统移动到下一个。该系统从改变状态阿到B到C ^到d只要输入P为高(1)。如果P为低,并且系统处于状态A,B或C,则状态不会改变。如果系统处于状态d,则切换到乙如果P为高,如果P为低则为A. 系统还有一个名为R的输出,如果处于状态D,则为1 ,否则为0.图1是FSM的图,但首先是关于该图的几个注释:

  • 圆圈代表各州

  • 圆圈之间的箭头表示从州到州的规则。例如,在该系统中,如果输入P等于1 ,则状态机从状态A移动到状态B(否则它保持在状态A)

  • 圆圈中线下方的信息表示每种状态下的输出值。

  • 从“无处”到A的箭头表示A是初始状态。

简单有限状态机图

图1.一个简单的有限状态机

 

这个完全定义的状态机可以很容易地转换为VHDL。重要的是要记住,在编写VHDL代码时,您正在做的是描述您希望如何实现硬件(即数字门)。因此,例如,当您在此系统中定义一组状态(如A,B,C和D)时,这些状态将由位表示,更具体地说,由触发器的输出表示。在具有四个状态的系统中,如此状态,可以用2位(2个触发器)表示这四个状态。还有其他方式可以代表各州。其中一种方法是使用四个位,其中每个位代表一个状态,但一次只能打开一个位。所以A将用0001表示,B乘以0010,C乘以0100,D乘以1000.使用高级硬件描述语言的一个好处是,您经常可以忽略此级别的细节。

图2显示了在合成VHDL代码以创建硬件时将创建的硬件电路的一般概念。

为状态机创建的逻辑的框图表示

图2.为状态机创建的逻辑的框图表示

该图表示存在一组表示状态的n个触发器。还有一些逻辑使用触发器的输出和系统的输入来确定下一个状态。最后,有一些逻辑解码触发器的输出值以产生m个输出信号。

同样,在使用HDL时,您通常可以忽略设计中的这种详细程度。了解HDL创建的电路类型仍然很重要,因为您可能需要计算并最小化设计中的逻辑门数。通过了解HDL语句创建的内容,您可以设计最小化门创建。

 

VHDL实现设计

为此FSM编写VHDL的第一步是定义VHDL实体。VHDL实体描述了您正在设计的系统的外部接口,其中包括输入,输出和实体名称。实体的一般形式如下所示:


image.png

 

使用此模板,可以创建简单FSM的实体。实体名称为SimpleFSM,输入为时钟信号,复位信号和P信号,输出为R信号。应该提到的是,时钟信号是周期性的高低信号,它控制着这个同步系统的定时。任何同步系统都有一个控制时钟信号,它同步系统中的所有模块,使它们同时发生变化。

将所有信息放在一起会产生一个如下所示的SimpleFSM实体:


 image.png


关于该实体的最后一个注意事项是所有输入和输出都是单个位,因此可以使用数据类型std_logic,这是VHDL中用于单比特信号的标准类型。

 

下一步是定义实体的功能; 这个VHDL块称为架构。我们正在实现的功能是图1中定义的状态机。下面的示例显示了实现SimpleFSM所需的代码。虽然此代码特定于SimpleFSM,但我将描述代码的每个部分的功能,以便用您自己的状态机的代码替换此代码是一个简单的过程。

 

image.png

image.png

 

这是状态机所需的全部代码。现在让我们看一下架构代码的一些细节。

架构定义指出:


image.png


该语句是VHDL体系结构的标准语句,它基本上说明了体系结构中将描述的抽象级别。RTL代表寄存器传输级别,是一个中级抽象。

行为  是最高级别的抽象,在编写行为代码时,您只需要定义输入和输出之间的关系,而无需指定关于如何实现这些关系的任何内容。有时行为描述太高,实际上无法合成到硬件中。如果您正在进行模拟并且只需要一个块以某种方式运行,那么行为模型就足够了。

结构  代码是最低级别的抽象。在编写结构代码时,您将描述低级结构(例如,逻辑门ICfans)如何连接在一起以为您提供所需的系统。如果您需要精确控制将要创建的逻辑门,那么结构模型就是您所需要的。

RTL适合中间。它具体描述了输入和输出之间的关系,描述了数据如何在硬件中的寄存器之间移动。RTL描述可在硬件中实现。对于这个特定的例子,理解体系结构类型(行为,RTL或结构)的细微差别并不是非常重要,您只需要将其定义为某种东西。

下一个块定义状态并创建一个将定义状态作为其值的信号。应该将此处列出的状态与FSM图中圆圈所代表的状态进行一对一的映射。


image.png

 

下一个声明是VHDL过程的开始,其信号时钟和复位在其灵敏度列表中

PROCESS (clock, reset) 
  BEGIN 
    If (reset = ‘1’) THEN   -- Upon reset, set the state to A
      State <= A;
 
    ELSIF rising_edge(clock) THEN

同样,有很多关于流程声明的细节可以在本文中忽略。您需要了解的是,在RTL级设计中,此过程将为在过程中为其分配的所有信号创建一个寄存器。在这种情况下,只有State信号有一个赋值,因此将创建一个由足够的触发器组成的寄存器来表示State的值。该寄存器将与时钟的上升沿同步,并由复位信号异步复位。可以在图2中看到由该过程创建的电路的一般视觉表示。

rising_edge(clock)语句后面的代码主体是一个VHDL case语句,它将被合成到逻辑中,用于控制状态在每个时钟上升沿上变为什么值。例如,声明

  WHEN A => 
    IF P='1' THEN 
      State <= B; 
    END IF;

表示如果State的值为A,则如果信号P为1,则在时钟上升沿将状态更改为B.

案件的最后一个陈述是

  WHEN others =>
    State <= A;

这种说法是一个包罗万象的语句,以确保如果国家以某种方式早已不是等于值A,B,C,或d,那么这将重置为值一。

代码的最后一部分在流程外部完成,并创建一个组合逻辑块。 

  R <= ‘1’ WHEN State=D ELSE ‘0’;


本声明正在做的是确定输出R的值。如果国家是D,R将是1并且在所有其他州都是0。这里需要注意的一点是,这个状态机的输出仅取决于状态。目前状态是确定输出的唯一因素的状态机被称为摩尔状态机。另一大类状态机是输出不仅取决于当前状态而且取决于输入的状态机。这种状态机称为Mealy状态机。在实践中,通常无论你使用什么样的状态机,如果你知道你正在使用什么样的状态机,它甚至都不重要。重要的是您按照定义的方式实现状态机。

设计该系统的最后几个步骤将涉及模拟系统以确保它完成预期的工作,然后最终合成硬件以在物理系统(CPLD,FPGA,ASIC等)上实现。

 

概要

这些图显示了有限状态机图和实现状态机所需的VHDL代码之间关系的摘要。

图3. FSM图和VHDL中的状态定义

 

图4. FSM图和VHDL中的状态转换规则

图5. FSM图和VHDL中的输出

总结

本文讨论了硬件描述语言的本质以及HDL语句与实现的硬件之间的关系。但是,主要目的是向您展示如何编写VHDL来实现有限状态机。该过程涉及创建VHDL实体,定义状态机的输入和输出,然后在VHDL体系结构块中编写状态转换的规则。使用此处提供的模板,您应该拥有实现自己的FSM所需的所有信息。