EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2008/1/29 14:19:58

3

关于投票

FSM的安全选项——“安全”意味着什么?

    Quartus II中的Safe State Machine编译选项对FSM在FPGA中的实现方式有很大影响。 riple

    这一影响在RTL视图中不可见。 riple

    这一选项是否引入了“Booby Trap”电路?观察Technology Map视图,可以发现一些原有的寄存器合并优化不执行了,实际的寄存器个数和HDL代码中描述的个数一样了,而且增加了一些组合逻辑。“Booby Trap”电路的恢复状态是哪一个?是不是default语句指定的状态? riple

    在StateCAD工具中的Options -> Machine Attribute -> Default State选项中可以指定恢复电路的缺省状态,在生成的HDL代码中可以很容易地找到对应的“Booby Trap”电路。在Quartus II中针对这一HDL代码编译后,可以在RTL视图中找到对应的电路。 riple

    在手工编写的HDL代码中,default语句并不能产生相应的恢复电路,综合工具通常忽略这一语句,为的是简化逻辑。只有像StateCAD生成的代码中描述的恢复电路才能被综合工具有效识别。 riple

    可以得出这样的结论:Quartus II对“Booby Trap”电路的插入是隐式的,StateCAD是显式的。 riple

    “安全”的FSM意味着:1. “Booby Trap”电路的插入;2. 寄存器合并优化失效了;3. 电路的时序性能下降了;4. 在正常使用环境下,无需过多考虑FSM“跑飞”的问题,也就不需要选择“安全”选项。 riple

系统分类: CPLD/FPGA  |  用户分类: FSM优化  |  标签: FSM 安全 捕弊束缚电路  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1894) | 回复(3)

发表于 2008/1/29 13:41:41

1

关于投票

FSM的状态编码——还是托付给综合工具吧

    在Quartus II的Assignment Editor里可以指定任意一个FSM的状态编码方式;在编译报告里可以看到FSM的最终状态编码。即使选用User-Encoded的方式,也有可能状态寄存器的个别位的逻辑会发生翻转。 riple

    Quartus II可以通过复位信号识别IDLE状态,并且针对这一状态进行“全零”编码,以保证FPGA上电配置完成后,状态寄存器缺省清零,FSM无需复位就进入IDLE这一缺省状态。 riple

    Synplify也有类似的状态编码功能。状态编码是否考虑了上电复位问题还需要试验一下。 riple

    所以,手工给FSM状态编码是不必要的,只需约束一下,交给综合工具完成即可。

系统分类: CPLD/FPGA  |  用户分类: FSM优化  |  标签: FSM 状态编码  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1044) | 回复(0)

发表于 2008/1/29 13:13:07

1

关于投票

FSM的时序优化——输入逻辑预计算和流水化

1. 跨时钟域同步。对于FPGA的异步输入信号,这是必须的,对于FSM更是如此。因为没有跨时钟域信号的前级驱动时钟特性信息,所以需要在同步器前设置时序约束:false_path。 riple

2. 复杂组合逻辑寄存。增加的一级寄存器会引入一个周期的延时,需要在设计中通过“预计算”考虑进去。这一寄存器的引入,形成了FSM输入逻辑的一级流水。对于该问题,请参考下面的资料。我以后会给出一个例子的。 riple

 

参考资料:《完整的数字设计》P245。 riple

系统分类: CPLD/FPGA  |  用户分类: FSM优化  |  标签: FSM 输入逻辑 流水  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(981) | 回复(0)

发表于 2008/1/5 8:51:25

4

关于投票

FSM的最佳描述——输出同步的Mealy型状态机

    在上一篇关于FSM的blog中,我分析了状态机输出同步对状态机运行性能的影响——结论是,输出同步可以带来运行性能的提升。 riple

    这一结论是通过分析一个简单的Mealy型FSM得到的。该结论是否也适用于Moore型状态机呢?对于Moore型状态机,输出同步会不会带来更差的响应延时呢?采用HDL,该如何描述Mealy和Moore混合型FSM呢?在这一篇关于FSM优化的blog中,我就尝试给出上述问题的答案。 riple

一、同步Mealy型和Moor型描述的优点 riple

    对于Mealy型状态机,输出同步不仅会带来运行性能的提升,还会增加系统的稳定性:防止输出信号出现毛刺,防止组合回路的产生。原理:给Mealy型FSM的输出增加同步寄存器,把异步电路变为同步电路,从而避免了异步电路的缺点,增加了同步电路的优点。结论:在同步电路设计中,Mealy型状态机的输出同步是必不可少的。采用输出同步的Mealy型FSM被称为“同步Mealy”(Synchronous Mealy machine)或“输出流水型Mealy”(Mealy machine with pipelined outputs)。 riple

    对于Moore型状态机,不采用输出同步,电路本质上仍然是同步的。原理:Moore型FSM的输出是仅由状态寄存器驱动的,由于状态寄存器是同步的,所以由其驱动的输出逻辑也是同步的。进一步,Moore型FSM的输出逻辑相对于Mealy型FSM的输出逻辑简单了许多,仅仅是对状态寄存器进行译码的组合逻辑。再进一步,通过对Moore型FSM的状态寄存器进行恰当地编码,可以简化对状态寄存器进行译码的组合逻辑,得到更加简单的输出逻辑。结论:给Moore型状态机增加输出同步寄存器,有画蛇添足之嫌。 riple

    用HDL描述异步Mealy型和Moore型FSM,可以统一采用三段式: riple

  1. 状态寄存器现态赋值(时序逻辑) riple
  2. 状态寄存器次态赋值(组合逻辑) riple
  3. 输出寄存器次态赋值(组合逻辑) riple

    用HDL描述同步Mealy型FSM,需要采用四段式: riple

  1. 状态寄存器现态赋值(时序逻辑) riple
  2. 状态寄存器次态赋值(组合逻辑) riple
  3. 输出寄存器现态赋值(时序逻辑) riple
  4. 输出寄存器次态赋值(组合逻辑) riple

    比较上述两组公式,第二组公式去除第三项后就可以得到第一组公式。也就是说,从异步Mealy型HDL描述转化为同步Mealy型HDL描述只需要增加一项即可,其余三项可以原封不动地保留。 riple

    这样一来,从异步Mealy型FSM的HDL描述风格改到同步Mealy型描述就容易多了。 riple

二、采用同步Mealy型方法描述混合型FSM riple

    总结一下前面的内容,接下来就是本篇blog的关键转折点了。Moore型FSM不需要采用输出同步,得到的电路就是近似最佳的,可以延用三段式描述;Mealy型FSM必须采用输出同步,需要采用四段式描述。 riple

    那么,如果设计的FSM是Moore和同步Mealy混合型的,我们该如何描述呢?对于已有的Moore和异步Mealy混合型FSM,该如何简单过渡到Moore和同步Mealy混合型呢?再进一步,有没有可以统一描述Moore和同步Mealy型FSM的HDL描述风格呢?如果有的话,记忆起来不就更加方便了吗? riple

    对于上述问题,可以有两种解决方案。 riple

    先说第一种,也是最普通,最容易实施的。再次比较上述两组公式,两组公式的前两项完全相同。可以得到这样的结论:对于Moore型、异步Mealy型、同步Mealy型三种FSM,状态寄存器的现态逻辑和次态逻辑描述是完全一致;三者的差异仅存在于输出逻辑的描述上。 riple

    结论:输出逻辑的描述是区分三种FSM的唯一信息。所谓的状态机分类,其实是输出逻辑的分类。 riple

    有了上述结论,我们就很容易得到第一种解决方案:对于混合型FSM,对所有输出信号进行分类,可以划分成Moore型、异步Mealy型、同步Mealy型三种输出,对三种输出分别进行描述;Moore型输出保持不变;把异步Mealy型输出的描述通过增加一级寄存器转化为同步Mealy型输出;最后合并原有的同步Mealy型和新得到的同步Mealy型描述。 riple

    这样一来,就可以得到Moore和同步Mealy混合型FSM的描述。 riple

三、同步Mealy型描述可以统一所有的FSM描述方法 riple

    上述的方法很简单,也很清晰,可以解决前述的前两个问题。但是没有解决最后一个:有没有统一的描述方法。 riple

    第二种方案就给出了统一的描述方法,也就是本篇blog的题目:输出同步的Mealy型状态机——最佳的FSM描述。 riple

    比较Moore型和同步Mealy型FSM,两种电路具有共同的特点:都是同步电路。 riple

    同步Mealy型在同步这一点上比Moore型做得更彻底——所有的输出都是寄存器直接驱动。而Moore型在状态寄存器和输出信号之间还会存在一些状态译码组合逻辑。 riple

    在前面对Moore型FSM的分析中,我提到:通过恰当地改变Moore型FSM的状态编码,可以简化状态寄存器和输出信号之间的译码逻辑。再进一步,通过增加状态寄存器和恰当的状态编码,可以把状态寄存器和输出信号之间的译码逻辑全部化简掉——也就是说,我们可以得到一种Moore型状态机,其所有输出逻辑是由状态寄存器直接驱动的,状态寄存器与输出信号之间没有任何组合逻辑。 riple

    这样的Moore型FSM的输出是最优化的,可以得到最快的输出。这样的Moore型FSM被称为“针对输出优化进行状态编码”的Moore型FSM(Moore machine with output-encoded state assignment)。下文简称“最优”Moore型FSM。 riple

    把这样得到的最优Moore型FSM与同步Mealy型比较,可以发现二者具有完全一样的特性:同步电路 + 寄存器直接驱动输出信号。 riple

    进一步,通过采用“前瞻”(look-ahead)式描述方法,可以用同步Mealy型方式描述最优Moore型输出。在最优Moore型输出的描述中,输出信号仅是当前状态的函数;与之等价的“前瞻”式的同步Mealy型描述中,输出信号是进入当前状态的多个“前一”状态和输入信号的函数。由于电路原本是Moore型的,而且状态寄存器与输出信号之间不存在任何组合逻辑——就用一根线连接,所以这样等价变换后得到的HDL描述是存在冗余的:输出信号次、现态逻辑与状态寄存器的次、现态逻辑完全一致。这一冗余在经过综合工具处理后可以被优化掉,仅剩下状态寄存器的次、现态逻辑,输出信号直接连接到状态寄存器的输出端口上——经过综合优化的电路又还原为最优Moore型电路。所以,最优Moore和同步Mealy型状态机是同一电路的两种不同描述 riple

    上述变换过程可以表述为:普通Moore型描述 => 最优Moore型描述 <=> 同步Mealy型描述 <=> 最优Moore型描述。 riple

    既然最优Moore型和同步Mealy型描述是等价的,而最优Moore型又可以由普通Moore型转化得来,我们就得到第二种解决方案:采用同步Mealy型描述方法描述所有类型的状态机。这样就不存在前述的前两个问题和最后一个问题——Moore型描述和同步Mealy型描述统一了。 riple

    这一方法不是我的发明,在StateCAD生成的代码中早已采用了这样的描述方法。对于一个自动代码生成工具来说,采用一种算法描述所有的状态机,并得到最优的代码,无疑是效率最高的方式。对于我们手工编码来说,一种统一的描述方法也是最容易记忆的。 riple

    其实,通过掌握前述的同步Mealy型四段式描述方法,可以很容易地掌握Moore型和异步Mealy型描述方法。所以可以说,“四段式”描述是一种统一的FSM描述方法。推荐大家掌握这种描述方法。 riple

四、同步Mealy型和最优Moore型描述的缺点: riple

    对于Moore型描述,手工化简输出逻辑得到最优Moore型描述是很繁琐的,如非必要不要采用手工化简方式。采用同步Mealy型描述可以得到等价最优Moore型描述,虽然复杂一些。 riple

    由于“前瞻”式描述的复杂性,手工编写FSM最好采用上述的第一种方案,Moore型输出和同步Mealy型输出分开描述;采用StateCAD可以自动得到完备的“前瞻”式描述(这一点是Altera的FSM生成工具不具备的)。 riple

    输出最优的Moore和等价的同步Mealy型状态机会引入较多的寄存器,在资源的使用效率上是较低的。所以更加适合FPGA的器件结构,而不适用于CPLD的器件结构(Altera的MAX II系列除外)。 riple

相关资料:State Machine Coding Styles for Synthesispdf

Coding And Scripting Techniques For FSM Designs With Synthesis-Optimized, Glitch-Free Outputspdf

Synthesizable Finite State Machine Design Techniques Using the New SystemVerilog 3.0 Enhancementspdf

 

PS:   

    引发我思考上述问题的缘由,是半年前和一名同事一起分析StateCAD生成的Verilog代码时,发现对于Moore型FSM描述,StateCAD生成的代码既做到了同步输出,还做到了响应速度最快(没有Moore型输出逻辑寄存引入的一个时钟周期的延迟,其实是与输出编码的Moore型等价的同步Mealy型代码)。这一事实的发现,引发了我对FSM的描述方法的进一步思考。 riple

    在这半年里,我查找了很多数电教材。其中《Digital Design: Principles & Practices(Third Edition)》和《Contemporary Logic Design(Second Edition)》两本书里分析了同步Mealy型描述的原理和优点,给出了同步Mealy和Moore型描述的等价原理。但是,这两本书都没有明确建议所有状态机都采用同步Mealy型描述方法(但是强烈反对异步Mealy型描述方法),而是建议根据实际情况选择描述方式。我在上文中建议采用统一描述方法的原因是这一方法可以推而广之得到其他各种描述方法,而且对于FPGA设计工作者来说是最适用的。 riple

    此外,对于Xilinx的StateCAD工具的使用,《Advanced FPGA Design:Architecture Implementation and Optimization》一书里虽然没有分析自动生成代码的结构和优势,但是明确建议所有的状态机都采用StateCAD设计,而最终的状态编码和逻辑优化交给后端实现工具进行,这样的设计流程省去了手工编写代码的工作,还避免了手工编写代码风格不一致、容易出错的问题,易于其他设计者理解设计意图。在我看来,这样的设计流程最突出的优点是有利于设计文档和设计代码的实时同步,因为StateCAD设计文件是最好的“可执行文档”(executable document)。我在实际工作中,采用StateCAD已经设计了50多个状态机,对于这一工具的效率和稳定性有很大的信心。 riple

系统分类: CPLD/FPGA  |  用户分类: FSM优化  |  标签: 状态机 Mealy 同步  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(2475) | 回复(2)

发表于 2007/11/18 20:36:34

1

关于投票

FSM的时序优化——输出逻辑同步和响应速度

    一、“x段式”描述的由来。 riple

    考虑了时序优化的FSM的描述由两部分组成:状态寄存器及其更新逻辑和输出寄存器及其更新逻辑。如果把寄存器和更新逻辑分开描述,一个FSM可以最多采用四段代码进行描述: riple

  1. 状态寄存器现态赋值(时序逻辑) riple
  2. 状态寄存器次态赋值(组合逻辑) riple
  3. 输出寄存器现态赋值(时序逻辑) riple
  4. 输出寄存器次态赋值(组合逻辑) riple

    如果从编码方便和易于阅读的角度考虑,可以把上述组成部分任意合并,得到不同的“n段式”描述方式。(我在学习数字电路时总结出了这样一个公式:组合逻辑 + 时序逻辑 = 时序逻辑,时序逻辑和组合逻辑的界限并不是那么清晰。) riple

 

 

    二、输出采用寄存器驱动可以优化FSM的时序性能。 riple

    影响一个时序电路运行速度的主要因素是该电路中两个寄存器之间组合逻辑路径的长度。越长的组合逻辑路径,其时序性能越差。一个电路中最长的组合逻辑路径决定了该电路最高运行频率,该路径就是该电路的“关键路径”(critical path)。所以,切断最长的组合逻辑路径可以提高局部电路的运行频率,切断多个较长的组合逻辑路径可以提高整体电路的运行频率。切断组合逻辑路径的工具就是寄存器。所以,添加寄存器可以提高电路的性能,但是会带来资源(面积)的增长。这也就是速度(speed)和面积(area)互为矛盾的原因。 riple

    由上面的分析,也就不难得出输出采用寄存器驱动可以优化FSM时序性能的原因。在考虑FSM的时序问题时,不能独立地考虑FSM本身,需要综合考虑FSM模块和其下游模块构成的电路。在FSM不采用输出寄存时,在FSM模块和其下游模块的接口处,组合逻辑路径由两部分组合逻辑直接相连组成: riple

 

    关键路径 = FSM的状态寄存器输出端(Q)到FSM模块输出端口之间的组合逻辑com1 + 下游模块的输入端口到下游模块第一级寄存器输入端(D)之间的组合逻辑com2 riple

 

    与此相反,在FSM采用输出寄存时,这两部分组合逻辑之间不是直接相连,而是通过FSM的输出寄存器连接,也就是说:两个模块之间的组合逻辑路径被切断成了两段,可能的关键路径被切断了。 riple

点击看大图

 

 

    三、输出采用寄存器驱动会减慢输出对输入信号变化的响应速度? riple

    输出采用寄存器驱动可以带来电路运行速度的提升,但是会导致电路对输入信号响应速度的下降。这是令人困惑的:到底该不该采用FSM输出寄存器?是否必须要在时序性能和响应速度之间做出取舍?在同步电路设计中,答案是必须牺牲一定的响应速度以换取最佳的时序性能,只考虑电路的响应速度会带来潜在的时序性能损失。 riple

    在考虑FSM的响应速度问题时,不能独立地考虑FSM本身,需要综合考虑FSM模块和其上、下游模块构成的电路。 riple

    去除FSM模块的输出寄存器后,关键路径由下面公式构成: riple

 

    关键路径 = 上游模块的输出寄存器输出端(Q1)到FSM模块输出端口之间的组合逻辑com1 + FSM模块输出端口到下游模块的输入寄存器输入端(D3)之间的组合逻辑com2 riple

 

    与上面对电路时序性能的分析相同,添加输出寄存器后,该关键路径也被切断成为两部分,电路的运行频率得到了提高。 riple

点击看大图

 

    在上图中,由于采用了输出寄存器,上侧电路的运行频率高于下侧电路的运行频率。当仅考虑局部路径上的传播差异时,上侧电路的响应时间比下侧电路的响应时间长Tsu+Tco;如果上侧电路降低运行频率,运行在下侧电路的运行频率时,上侧电路需要两个时钟周期,下侧电路仅需一个时钟周期即可完成对输入信号的响应,上侧电路的响应时间比下侧电路的响应时间长一个时钟周期;如果下侧电路提高运行频率,强行运行在上侧电路的最高运行频率时,下侧电路不能在一个时钟周期内完成com1+com2所需的传播时间(该路径成为multi-cylcle path),需要两个时钟周期才能完成,上下两个电路的响应时间相同。 riple

 

    所以,采用输出寄存器的电路可以运行在更高的时钟频率下,所引入的响应延时与更高的运行频率相比是可以牺牲的。 riple

系统分类: CPLD/FPGA  |  用户分类: FSM优化  |  标签: FSM 时序优化 响应速度  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1892) | 回复(1)

发表于 2007/10/27 10:43:37

2

关于投票

StateCAD——简介和使用心得

    什么是StateCAD?StateCAD是Xilinx ISE中集成的一款FSM状态图输入和验证工具。StateCAD原本是Visual Software Solutions公司的主打产品,1994年底发布了2.0版本,那时还不支持Verilog HDL。Xilinx最初(2000.8)通过EDA ALLiance STARter项目在Foundation ISE版本和WebPACK ISE版本(这可就免费下载啦)中集成了该工具,当时的版本是5.03。随后(2000.11.02),Visual Software Solutions公司被Xilinx收购,其主要产品StateCAD和HDL Bencher被集成到了ISE开发环境中。 riple

    StateCAD采用图形化的输入方式,从最直观的状态转移图开始,支持直接生成AHDL、VHDL和Verilog HDL的代码,还支持测试平台的生成和状态转移覆盖率的测试。早期的StateCAD还支持C代码的生成,现在已经不支持了。 riple

    StateCAD由两个工具组成:StateCAD用于状态图输入和代码生成,StateBench用于测试。 riple

    网上介绍使用StateCAD的文章很多,在这里我就不介绍最基本的操作了。 riple

    我在两年前开始使用StateCAD,最初纯粹是为了偷懒。两年下来,采用StateCAD设计了几十个FSM,对这款工具的各项功能也有了清晰的认识。随着使用经验的不断积累,我对于在工程开发中如何规范、高效地使用StateCAD设计FSM,有了一定的心得: riple

    1. 不要使用wizard,手工绘制和编辑配置选项即可完成所有功能。只建议初学者使用wizard。 riple

    2. 不要使用复杂的输出逻辑,只在状态图中设计简单的输出逻辑,复杂的输出逻辑可以通过在自动生成的代码之外采用wrapper的方式手工添加到设计中。 riple

    3. 不要试图采用StateCAD生成整个设计,只把它用于设计的核心控制部分,数据通路的代码手工编写和维护。 riple

    4. 设计中如果需要多个FSM,不要试图在同一幅图中设计多个状态机,可以建立多个绘图文件,每幅图设计一个状态机。 riple

    5. 设计中如果需要多个FSM,给每个状态指定一个唯一的状态名,避免不同的状态机中的状态重名,最好是通过前缀或后缀的方式加以区分。 riple

    6. StateCAD是一款“老”工具,不支持鼠标滚轮,不支持长的变量名,所以不适合设计过于复杂的FSM,可以考虑从算法上把复杂FSM拆分为多个简单的小FSM分别加以实现。 riple

    7. 把.dia绘图文件作为设计源文件添加到代码版本维护工具中。 riple

    8. 熟练使用StateCAD需要弄明白Options下的Configuration配置选项栏和各种选项的组合效果。Options下的Machine Attribute和Variable也需要加以注意。 riple

    9. StateBench的功能很强大,但是操作很复杂,而且可重用性差,不适于在项目开发中使用。 riple

 

    背景资料:  riple

IEEE Expert 1994 December上的一篇短讯: riple

点击看大图

Visual Software adds test-bench generator to StateCAD riple

Visual Software Solutions releases HDL Bencher for automatic VHDL & Verilog test bench generation riple

Xilinx Now Shipping StateCAD and HDL Bencher from VSS riple

XILINX INCORPORATES NEXT-GENERATION TECHNOLOGY INTO FREE WEBPACK SOFTWARE riple

Xilinx buys software tool firm to accelerate FPGA-based designs riple

Xilinx Acquires Visual Software Solutions; Technology Will Improve Time-to-Market for Multimillion Gate Virtex-II FPGA Designs riple

 

系统分类: CPLD/FPGA  |  用户分类: FSM优化  |  标签: StateCAD  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(3197) | 回复(7)

发表于 2007/10/21 13:51:18

0

关于投票

FSM的几种“口味”

    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这样的状态图输入工具来设计,既提高了设计效率也有利于创建文档和交流设计意图。 riple

   9. “实现方式”——硬连线(hardwired)和微编码(microcoded)。二者的区别在于次态生成逻辑的实现方式,前者采用基本组合逻辑器件,后者采用ROM或RAM器件。从次态逻辑的真值表看来,二者完全等价,这是由于ROM或RAM可以以查找表的工作方式在功能上模拟组合逻辑,实现任意的布尔等式。采用硬连线实现方式可以有效地利用LE中包含的LUT组合逻辑,非常适合FPGA的底层结构,而且FSM的跳转逻辑可以用行为级HDL进行描述,综合工具对行为级HDL描述的FSM可以很好地识别和优化;微编码方式的FSM如果采用RAM实现,就可以动态修改FSM的功能,以一当十,而且由于复杂的组合逻辑可以采用一片或几片存储芯片实现,简化了电路,适合采用离散器件实现。StateCAD生成的都是硬连线方式的FSM,Altera参考设计中提供的Avalon State Sequencer属于微编码的FSM,虽然它采用了组合逻辑与RAM的混合实现方式。采用微编码方式实现的状态机,通常被称为Microsequencer。由于这一类状态机的功能可以重新编程,相当于简单的MCU,所以可以以LSI芯片的形式大批量生产并用于不同的产品中。AMD曾经生产这种芯片,型号是2910

 

    背景资料:Maximizing Performance and Reliability of FSMs with Precision Synthesispdf riple

系统分类: CPLD/FPGA  |  用户分类: FSM优化  |  标签: FSM 有限状态机 风格  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(2012) | 回复(7)

Total , Page /