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. 向ueditor中插入内容

    html在ueditor中插入内容不能直接插入,必须判断编辑器是否创建成功,jsp可以用java代码嵌套的方式. html页面中:<textarea id="zym" nam ...

  2. SKU和SPU表的设计

    1.什么是SKU,SPU SKU:Stock Keeping Unit (库存量单位)SKU即库存进出计量的单位,可以是以件.盒.托盘等为单位,是物理上不可分割的最小存货单元.在使用时要根据不同业态, ...

  3. 模块 -logging

    模块 -logging 一:在控制台显示:默认 import logging logging.debug("debug") logging.info("debug&quo ...

  4. P1064 金明的预算方案 (依赖性背包问题)

    这道题可以用分组背包来做. 但是分组有两种方式 一种是把主件,主件+附件1,主件+附件2分成一组 组内只能选一个物品 一种是建一颗树,用树形dp的方式去做 第二种更通用,就算物品的依赖关系是森林都可以 ...

  5. python中的try...except...finally函数

    异常Error 我们在写代码的时候,经常会遇见程序抛出Error无法执行的情况 一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当Python脚本发 ...

  6. openssh 升级到7.5p1

    1. 参照: http://www.cnblogs.com/xiegj/p/5669800.html http://blog.csdn.net/u011080082/article/details/5 ...

  7. LoadRunner使用入门 进行Webservice负载測试

    1.什么是LoadRunner LoadRunner是HP公司的一款付费工具,该工具是一种预測系统行为和性能的负载測试工具. 通过模拟上千万用户实施并发负载来确认和查找问题. 2.什么是负载測试 通过 ...

  8. d堆

    就是d叉堆,是二叉堆的简单推广(http://blog.csdn.net/buleriver/article/details/38469907) 对于一个d堆.也是能够使用数组表示.关键是怎样通过索引 ...

  9. mysql-基础和基本指令

    基础: 1.数据库模式:简单的说:就是一个数据库用户所拥有的数据库的对象.   比如scott用户建立了表,索引,视图,存储过程等对象,那么这些对象就构成了schema   scott .有时用作数据 ...

  10. USACO Section 1.3 : Calf Flac (calfflac)

    题意:据说假设你给无限仅仅母牛和无限台巨型便携式电脑(有很大的键盘),那么母牛们会制造出世上最优秀的回文. 你的工作就是去寻找这些牛制造的奇观(最优秀的回文). 在寻找回文时不用理睬那些标点符号.空格 ...