OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6172|回复: 0

【FPGA开源教程连载】第七章 状态机设计实例

[复制链接]

58

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2016-12-14
在线时间
44 小时
发表于 2016-12-26 00:00:49 | 显示全部楼层 |阅读模式
本帖最后由 芯航线跑堂 于 2016-12-26 00:33 编辑

状态机设计实例


实验目的:1.学习状态机的相关概念
2.理解一段式、两段式以及三段式状态机的区别以及优缺点
实验平台:无
实验原理:
状态机全称是有限状态机(finite-state machine,缩写:FSM)是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
状态机分为摩尔(Moore)型有限状态机与米利(Mealy)型有限状态机。摩尔状态机输出是只由输入确定的有限状态机(不直接依赖于当前状态)。米利有限状态机的输出不止与其输入有关还于它的当前状态相关,这也是与摩尔有限状态机的不同之处。其分别的原理图如图8-1,8-2所示
图片1.jpg
8-1 摩尔型状态机
图片2.jpg
8-2 米利型状态机
状态机顾名思义会有各种状态,这也就分支出一种情况如何对状态进行有效的编码。编码格式,最简单的就是直接使用二进制进行表示,除此之外还有使用格雷码、独热码。假设有八个状态从A到R,利用不同的编码格式分别如表8-1所示。
图片3.jpg
图片4.jpg
8-1 状态不同的编码格式
独热码,每一个状态均使用一个寄存器,相比其他译码简单;格雷码,所需寄存器数与二进制码一样,译码复杂,但相邻位只跳动一位,一般用于异步多时钟域多bit位的转换,如异步FIFO; 二进制码,最为常见的编码方式,所用寄存器少,译码较复杂。
       按照Altera给的建议,选择哪一种编码格式是要根据状态机的复杂度、器件类型以及从非法状态中恢复出来的要求均有关。在使用不同的编码格式生成出来的RTL视图中可以看出二进制比独热码使用更少的寄存器。 二进制用7个寄存器就可以实现100个状态的状态机,但是独热码就需要100个寄存器。但是另一方面,虽然独热码使用更多的寄存器但是其组合逻辑相对简单。一般推荐在CPLD中由于提供较多的组合逻辑资源多使用前者,FPGA中提供较多的时序逻辑而多用后者。
      状态机描述方式,可分为一段式、两段式以及三段式。
一段式,整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;
两段式,用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;
三段式,在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。
可以看出两段式有限状态机与一段式有限状态机的区别是FSM将时序部分(状态转移部分)和组合部分(判断状态转移条件和产生输出)分开,写为两个always语句,即为两段式有限状态机。将组合部分中的判断状态转移条件和产生输入再分开写,则为三段式有限状态机。这样就使得二段式在组合逻辑特别复杂时,注意需在后面加一个触发器以消除组合逻辑对输出产生的毛刺。三段式则没有这个问题,这是由于第三个always会生成触发器。其实现在的器件根本不在乎这一点资源消耗,推荐使用二段式或者三段式以及输出寄存的状态机输出来进行描述。
编写状态机还需主要注意的事项是状态穷举或者default 避免生成锁存器;在编写状态定义时推荐使用本地化参数定义localparam,这样可以在编写时状态更清晰且不容易出错,也方便修改;在复位或者跑飞能回到初始态或者预定态;要有异步或者同步复位来确保状态机上电有个初始态。
实验步骤:
为了实现让FPGA输出一个HELLO字符串,首先画出其状态转移图,如图8-3所示。
图片5.jpg
8-3 “HELLO”状态转移图
由上图可以看出如果在任意态不符合转换条件,那么状态就会重新回到初始态H。且每一个状态都有特定的方向,这是一个摩尔型状态机。
建立工程子文件夹后,新建一个以名为Hello的工程保存在prj下,并在本工程目录的rtl文件夹下新建verilog file文件在此文件下输入以下内容并以Hello.v保存。这里对状态机用独热码编码且如果完成一次“HELLO”输出, led灯翻转一次。
图片6.jpg
图片7.jpg
图片8.jpg
图片9.jpg
图片10.jpg

进行分析和综合直至没有错误以及警告。可以在RTL Viewer中看到实现的状态机如图8-4所示,与预期设计相同。
图片11.jpg
8-4 生成的状态转移图
为了测试仿真编写测试激励文件,新建Hello_tb.v文件保存到testbench文件夹下,输入以下内容再次进行分析和综合直至没有错误以及警告。本激励文件除产生正常的时钟以及复位信号外,还生成了状态转移信号。
图片12.jpg
图片13.jpg
图片14.jpg
图片15.jpg
图片16.jpg
图片17.jpg
图片18.jpg


设置好仿真脚本后进行功能仿真,可以看到如图8-5所示的波形文件,可以看出在复位信号置高之前状态均不发生转移。在复位有效后,只有当输入发生变化时状态才会根据设计进行转换,且没有出现转移错误,led的状态也能根据状态来进行翻转。
图片19.jpg
8-5 仿真波形文件
         至此就完成了一个简单的状态机的设计,在后面的例程中会经常用到状态机设计思想,这里也就不再对二段式、三段式状态机展开。






小梅哥
芯航线电子工作室
class8_FSM.rar (236.5 KB, 下载次数: 137)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 18:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表