FSM是什么?FSM就是Finite(有限) State(状态) 机(Machine)的缩写。(之所以中英文混写,是为了强调学懂FSM的原理是根本,刻意去采用“几段式”的写法并不重要) riple

FSM的“口味”,说的是FSM的种类和编辑方式,以及由此带来的不同的代码风格。下面就列举几种不同的“口味”,并且给出进一步学习的参考。 riple

1. “经典分类”——基于状态的Moore型和基于迁移的Mealy型。对于同一个模型,Moore型描述可能会比Mealy型描述需要更多的状态。而且,即使通过添加状态的方法得到了与Mealy型等价的描述,Moore型在对输入的响应速度上也要滞后一个周期。尽管如此,Moore型状态机也有其优势,即状态机输出对输入信号噪声的免疫能力,这一点在小林芳直的《数字逻辑电路的ASIC设计》有明确的论述,甚至建议在ASIC设计中避免使用Mealy型,只使用Moore型描述。在FPGA应用中,往往并不刻意区分两种类型,经常采用两种类型混合后的描述方式。在Quartus II的语言模板里有很好的代码示例和详细说明。 riple

2. “代码结构”——一段式,两段式和三段式、四段式代码风格。在许多书里,推荐采用两段式或三段式的代码书写风格,不采用一段式的原因是“可能会导致综合工具优化困难”。其实,对于同一个电路,采用上述三种方式都可以描述,只要描述得正确,当今的综合工具都能理解,不会造成优化的困难。所谓的“优化困难”,更多的是由于描述过程中的错误表达方式造成的。相对于两段式和三段式描述方法,一段式描述更简洁,也就更容易表达不清楚,造成综合工具的“优化困难”。 riple

3. “状态编码”——User-Encoded、One-Hot、Minimal Bits、Gray、Johnson、Sequential方式对状态值进行编码。在Quartus II的Help中查找State Machine Processing logic option条目,可以看到各种编码方式的解释和优缺点。在代码书写中,不需要刻意地按照某种方式编码,只需要在编译选项中加以选择即可。其中,Gray和Johnson方式比较相似。此外,比较少见的还有One-Cold和Two-Hot型。值得一提的是,在《数字逻辑电路的ASIC设计》一书中,作者强调了“江逊编码”方式的优点,其中的“江逊”二字,就是从英文的Johnson翻译成日文,再翻译成中文的结果。 riple

4. “自动化”——手工编写和图形化输入。据我所知,支持图形化输入状态机,并自动生成代码的EDA工具有三种:Aldec的Active HDL中的State Diagrams输入功能、Xilinx的ISE中的StateCAD、Altera Quartus II 7.2版中最新添加的State Machine File输入功能。此外,Matlab的StateFlow工具也支持HDL代码的生成。这里,强烈推荐使用StateCAD,其优点我以后会给出说明。 riple

5. “优化”——资源优化和速度优化的实现方式。这里的速度优化,并不是指状态机的输出逻辑延迟(三段式描述中,简单地采用时序逻辑描述Moore型输出电路会导致一个时钟周期的输出逻辑延迟,精心设计的三段式描述可以避免该延迟,这是编写代码是否尽心尽力的问题,是另外一回事),而是指电路的最高运行频率。资源和速度是一对矛盾,简单来说,输出采用时序逻辑会带来速度的提升和资源的增加;反之,输出采用组合逻辑节省资源,但是降低速度。 riple

6. “安全”——安全和不安全的状态机实现方式。也就是状态机能否从非法状态自动恢复。在《数字逻辑电路的ASIC设计》一书中,自动恢复电路称为“捕弊束缚”电路,是英文booby trap的翻译。在Mentor的一篇关于Precision RTL编译选项的白皮书中,清楚地讲明了一点,安全不安全不取决于编码方式和风格(加入default并不能使电路更安全),而取决于综合工具的选项。在Quartus II的Help中查找Safe State Machine logic option,就可以看到简单的说明。简单来说,实现Safe State Machine会带来资源的增长和速度的下降,但是可靠性会提高一些。还需要说明一点:即使采用了自动恢复电路,状态机从非法状态跳转回了合法状态,从电路运行这个微观角度来说是“安全”的,从状态机的行为这个宏观角度来说,由于状态机进入非法状态和从非法状态返回,以及接下来的运行状态(回到了合法状态并不等于状态机就可以继续正常运行)造成的不正常行为并不是“安全”的。 riple

7. “输出方式”——同步输出和异步输出方式。其实就是采用资源优化还是速度优化的问题。异步输出表面上看会提高电路响应速度,看似既节省了资源还提高了速度,其实不然(对FPGA结构来说,节省寄存器不等同于节省LE;对同步设计方法来说,异步输出速度上的优势是可以忽略的);同步输出虽有种种好处,但是用的不得法也仅仅是“形似”而已(比如采用next_state作为同步输出的驱动信号,虽然避免了Moore型输出同步引入的一个时钟周期的滞后,但是状态机内部的组合逻辑反而复杂了)。由于上述原因,所以单列出来,引起注意。riple

8. “转移方式”——线性和非线性。这是我新添加的一种分类,分类的依据是状态转移的复杂程度。线性状态机通常是一条线走到底,转移条件仅仅是CLK,这种类型最常见于面向DSP的应用中,用于管理多级流水结构的数据处理过程,通常采用计数器或移位寄存器实现状态寄存器;非线性状态机的状态转移图结构比较复杂,转移条件是众多的输入信号,这种类型最常见于面向控制的应用中,用于应对复杂的外部输入和控制实现复杂的协议,通常很难用简单的计数器来实现,最好采用StateCAD这样的状态图输入工具来设计,既提高了设计效率也有利于创建文档和交流设计意图。

FSM的几种策略的更多相关文章

  1. 评估Divide and Conquer算法时间复杂度的几种策略

    算法导论的第四章对于divide-conquer进行了阐述, 感觉这本书特别在,实际给出的例子并不多,更多其实是一些偏向数学性质的分析, 最重要的是告诉你该类算法分析的一般性策略. 估计 首先是估计算 ...

  2. Entity FrameWork初始化数据库的四种策略

    程序猿就是苦逼,每天还得分出一些时间去写博文.天真的很热,今天就随便写一点啦! 1.EF初始化数据库的四中策略 EF可以根据项目中的模型自动创建数据库.下面我们就分类看看Entity Framewor ...

  3. ASP.NET缓存中Cache过期的三种策略

    原文:ASP.NET缓存中Cache过期的三种策略 我们在页面上添加三个按钮并双击按钮创建事件处理方法,三个按钮使用不同的过期策略添加ASP.NET缓存. <asp:Button ID=&quo ...

  4. Nginx负载均衡的5种策略(转载)

    Nginx的upstream目前支持的5种方式的分配 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. upstream backserver { s ...

  5. FastJson 支持配置的PropertyNamingStrategy四种策略

    摘要: FastJson默认使用CamelCase,在1.2.15版本之后,FastJson支持配置PropertyNamingStrategy,支持四种策略: CamelCase.PascalCas ...

  6. 分布式系统的负载均衡以及ngnix负载均衡的五种策略

    一般而言,有以下几种常见的负载均衡策略: 一.轮询. 特点:给每个请求标记一个序号,然后将请求依次派发到服务器节点中,适用于集群中各个节点提供服务能力等同且无状态的场景. 缺点:该策略将节点视为等同, ...

  7. C#.Net版本自动更新程序及3种策略实现

    C#.Net版本自动更新程序及3种策略实现 C/S程序是基于客户端和服务器的,在客户机编译新版本后将文件发布在更新服务器上,然后建立一个XML文件,该文件列举最新程序文件的版本号及最后修改日期.如程序 ...

  8. nginx负载均衡的5种策略及原理

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_35119422/article/de ...

  9. spring注入bean的几种策略模式

    上篇文章Spring IOC的核心机制:实例化与注入我们提到在有多个实现类的情况下,spring是如何选择特定的bean将其注入到代码片段中,我们讨论了按照名称注入和使用@Qualifier 注解输入 ...

随机推荐

  1. (一)React再学习

    新公司的技术栈是React,虽然之前对react大概过了一遍,但是自己没有实际落地过项目 再学习一遍react: 一.react全家桶 ·create-react-app ·组件化思维 ·JSX ·开 ...

  2. 微信小程序 上传图片

    效果图  如上,js  如下,在页面循环图片就可以 /** * 选择图片 */ uploadImgAdd: function(e) { var imgs = this.data.imgs; wx.ch ...

  3. GIT配置多用户

    在公司工作的时候有时候想提交一点代码到github上,然后一台电脑上就需要配置两个账号分别访问github和公司的gitlab 1. 分别生成两个key 为什么要生成两个key的原因我也不清楚,望路过 ...

  4. docker环境下mysql参数修改

    原文:docker环境下mysql参数修改 需要修改log_bin为on,看了好几个博客说都需要删掉容器重新生成,然而并非如此, 我们可以用docker cp 命令将docker的文件"下载 ...

  5. WPF 内部的5个窗口之 MediaContextNotificationWindow

    原文:WPF 内部的5个窗口之 MediaContextNotificationWindow 本文告诉大家在 WPF 内部的5个窗口的 MediaContextNotificationWindow 是 ...

  6. LaTeX argmin argmax 下标使用方法

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50036001 LaTeX中,使用arg ...

  7. cogs 141. [USACO Jan08] 奶牛的选举

    141. [USACO Jan08] 奶牛的选举 ★   输入文件:elect.in   输出文件:elect.out   简单对比时间限制:1 s   内存限制:16 MB 在推翻了Farmer J ...

  8. Opencv(3.0.0beta)+Python(2.7.8 64bit) 简单具体,一遍成功

    看到非常多配置的文章,都没法正常走完流程 使用到的资源,都是今天为止最新的: python-2.7.8.amd64.msi opencv-3.0.0-beta.exe numpy-MKL-1.9.1. ...

  9. 4.C语言文件操作

    总论 1.fopen r以只读方式打开文件,该文件必须存在 r+以可读写方式打开文件,文件必须存在 rb+读写打开一个二进制文件,允许读写数据,文件必须存在 rw+读写打开一个文本文件,允许读和写 w ...

  10. Kali linux 2016.2(Rolling)中metasploit的搜集特定网站的目录结构

    不多说,直接上干货! parent directory site: testfire.net 至于这里怎么FQ,很简单,请见我下面的博客! kali 2.0安装 lantern(成功FQ) shado ...