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. ajax请求携带 cookie

    之前都有这样一个理解:ajax请求时是不会自动带上cookie的,要是想让他带上的话,必须哟啊设置withCredential为true.这个说法会让人产生完全扭曲的误解,我就是其中之一.完整的无歧义 ...

  2. C语言运行时数据结构

    段(Segment): 对象文件/可执行文件: SVr4 UNIX上被称为ELF(起初"Extensible Linker Format", 现在"Executable ...

  3. Linux 和 Windows 双系统时间同步问题 修改注册表

    路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation 1:新建  >> DWORD(32 b ...

  4. [luogu]P4364 [九省联考2018]IIIDX

    题目背景 Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在,他在世界知名游戏公司KONMAI 内工作,离他的梦想也越来越近了. 这款音乐 ...

  5. 配置oh-my-zsh

    1. 当使用zsh进入庞大的git工程目录下时,会发生cd命令很慢的情况 可以把~/.oh-my-zsh/lib/git.zsh里面的git_prompt_info函数替换为 function git ...

  6. poj 2079 Triangle,旋转卡壳求点集的最大三角形

    给出一个点集,求顶点在点集中的最大的三角形面积. 我们知道这三角形的三个点肯定在凸包上,我们求出凸包之后不能枚举,由于题目n比較大,枚举的话要O(n^3)的数量级,所以採用旋转卡壳的做法: 首先枚举三 ...

  7. Linux路由表的抽象扩展应用于nf_conntrack

    思想 标准IP路由查找的过程为我们提供了一个极好的"匹配-动作"的例程. 即匹配到一个路由项.然后将数据包发给该路由项指示的下一跳.假设我们把上面对IP路由查找的过程向上抽象一个层 ...

  8. C# Hook

    C# Hook原理及EasyHook简易教程 前言 在说C# Hook之前,我们先来说说什么是Hook技术.相信大家都接触过外挂,不管是修改游戏客户端的也好,盗取密码的也罢,它们都是如何实现的呢? 实 ...

  9. python 3.x 学习笔记4(函数)

    1.编程方式分:面向对象.面向过程.函数式编程 2.区分面向对象---->类---->class面向过程---->过程---->def函数式编程---->函数----&g ...

  10. javascript常用收集一下

    事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcEl ...