美文网首页
有限状态机(FSM)设计 —— Fizzim2 使用帮助

有限状态机(FSM)设计 —— Fizzim2 使用帮助

作者: balanx | 来源:发表于2016-03-22 14:29 被阅读0次

更新记录

  • 2016.04.26
  1. 修改 outputs/signals 类型为 dff-onstate, dff-ontransit, dff-onboth, comb-ontransit, hold-onstate, hold-ontransit 和 hold-onboth 共7种;
  2. 修正一些 bugs
  • 2016.03.22
    第一版

简介

Fizzim2 是一个FSM (Finite State Machine) 工具,可以自动生成 Verilog HDL 代码。

这个工具源于 Fizzim,一个非常好的设计。给作者提了几点改进建议,没有被采纳!也许是理念不同,也许是语言不通(一个中国人和一个德国人之间使用英语交流)。好在原设计是开源的(点赞),于是就自己动手操刀了。

Fizzim2 对其做了下面增强和改进:

  • all java, NOT need perl
  • add HDL-View, what you see is what you get
  • focus on design entry, ignore some features e.g. 'statebit' which can be accomplished by synthesizer
  • more explicitly in use, change type from 'statebit, regdp, comb, flag' to 'onstate, ontransit, ontransit-dd, hold'
  • add 'signals' & 'page_mode' feature, support complicated FSM design model
  • modify priority feature, use 'UserAttrs' of transition as priority
  • 'reset_state' can be set by right-click on state
  • fix some bugs

总的说来,Fizzim2 增加了“所见即所得”的特性,和改进了几处设计输入方式,使用起来更加方便了。

snap1 : 左边是设计窗口,右边是 HDL 代码窗口 snap2 : 按下 'Ctrl+S' 保存设计,并自动刷新右边窗口

下载和安装

下载链接:githubbaidu

Fizzim2 工具是一个 Java 程序,所以需要安装一个 Java 运行环境 (JRE)。我的开发版本是 Java(TM) SE Runtime Environment (build 1.6.0_33-b05),相同或高于这个版本应该都是可以的。

JRE 安装好以后,Windows 下直接双击下载的 jar 文件,如 "Fizzim2-16.03.22.jar",就可以运行本工具了。

命令行方式:java -jar Fizzim2-16.03.22.jar


一个实例操作 ( example/dff_onstate_1 )

1) 常用操作直接右键就可以了 2) 添加3个 state 对象 3) 选择 state 对象,右键菜单选择 "Edit State Properties" 4) 重命名 state 对象 5) 状态重命名之后 (state0 -> IDLE, state1 -> RUN, state2 -> LAST) 6) 选择 state 对象,右键菜单选择 "Set as Reset" 7) IDLE 状态被配置为启动状态 8) 选择 state 对象,右键菜单选择 "Add State Transition to ..." 9) 添加从 IDLE 状态到 RUN 状态的 transition 对象 10) 继续添加其它 transiton 对象 11) 菜单 'Settings/Inputs',添加输入信号 'do' 12) 选择 transition 对象,右键菜单选择 "Edit State Transition Properties" 13) 编辑转移分支条件 'equation' 值 14) 同样操作,编辑从状态 RUN 转移到 状态 LAST 的转移条件 '!do' 15) 菜单 'Settings/Outputs',添加 2 个输出信号 'f' 和 'r' 16) 选择 state 对象,右键菜单选择 "Edit State Properties" 17) 在 RUN 状态添加输出 'r = 1' 18) 同样操作,在 LAST 状态添加输出 'f = 1', 'Ctrl+S' 保存设计,大功告成

操作小结

1)添加状态
2)添加转移分支
3)添加输入
4)编辑转移分支条件和优先级
5)添加输出
6)编辑输出结果
7)'Ctrl+S' 保存设计

注:关于转移分支优先级,后面有说明。

几点补充

1)'clock' 和 'reset' 是默认输入信号,不用手动添加,并可以修改变量名和边沿类型

菜单 'Settings/Global' 中可以修改 'clock' 和 'reset' 的变量名和边沿类型

2)无条件状态自环是默认状态转移,可以省略不画
'equation = 1' 表示无条件状态转移。上例(example/dff_onstate_1)中就省略了状态 IDLE 上和 状态 RUN 上的无条件自环。

19) 可以省略状态 IDLE 上和 状态 RUN 上的无条件自环

3)可以在“example/”目录下找到本教程中所有例子的源文件


状态机分类

一般状态机基于输出信号类型 (Output-Type-Based) 进行分类,如 Moore 和 Mealy 等。实际设计中一个状态机是可以混合有 Moore 输出和 Mealy 输出,即不是纯粹的 Moore 机或是 Mealy 机。

Fizzim2的输出信号类型有 dff-onstate, dff-ontransit, dff-onboth, comb-ontransit, hold-onstate, hold-ontransit 和 hold-onboth 共7种。

菜单 Settings/Outputs 中可以编辑输出信号类型 Output-Type 分类树图

注:
dff- 表示寄存器输出
comb- 表示组合逻辑输出

hold 信号和 non-hold 信号的不同行为

1)hold 信号和 non-hold 信号的区别如上图所示。没有触发的时候 (No),no-hold 信号会回到默认值;而 hold 信号会继续保持最近一次触发值,直到下一次触发的时候才改变。

2)onstate 信号和 ontransit 信号的区别在触发位置上。如命名所提示,

-onstate 信号位置在 state 对象上(且只能在 state 对象上),被 state 对象触发;
-ontransit 信号位置在 transition 对象上(且只能在 transition 对象上),被 transition 对象触发;
-onboth 信号位置则两者都可。

3)hold 信号总是 dff- 输出类型。

4)dff-ontransit 信号和 comb-ontransit 信号在时序上的区别。dff-ontransit 比 comb-ontransit 滞后一拍。


实例分析

example/dff_onstate_1

dff_onstate_1.png

分析:
1)'do' 是输入信号,控制从状态 IDLE 到状态 RUN 做条件转移,控制从状态 RUN 到状态 LAST 做条件转移;
2)从状态 LAST 到状态 IDLE 是无条件转移 (equation = 1);
3)'r' 和 'f' 是 onstate 类型输出,其位置在状态圈上;
4)仿真结果显示输出 'r' 和状态 RUN (2'b01) 同步,输出 'f' 和状态 LAST (2'b10) 同步。

dff_onstate_1_result.png

example/comb_ontransit_1

comb_ontransit_1.png

分析:和上例不同的是
1)'s' 和 'g' 是 comb- 类型输出,用符号 '::' 标记,其位置在转移分支上;
2)仿真结果显示输出 's' 是在状态 RUN 上自环时触发(比状态 RUN 少一个时钟周期),'g' 是在从状态 RUN 转移到状态 LAST 时触发(超前状态 LAST 一个时钟周期)。

comb_ontransit_1_result.png

example/dff_ontransit_1

dff_ontransit_1.png

分析:和上例 (example/comb_ontransit_1) 不同的是
1)'s' 和 'g' 是 dff- 类型输出,用符号 '=' 标记,其位置也在转移分支上;
2)仿真结果显示输出 's' 和 'g' 在相位上滞后上例一个时钟周期。

dff_ontransit_1_result.png

example/dff_onboth_1

dff_onboth_1.png

分析:和上例不同的是
1)兼有 onstate 类型输出和 ontransit 类型输出;
2)'r' 是dff-onboth类型输出, 'f' 是 dff-onstate 类型输出,其位置在状态圈上;
3)'g'和'x' 是 comb-ontransit 类型输出,其位置在转移分支上。

dff_onboth_1_result.png

example/hold_1

hold_1.png

分析:
1)'g' 是 hold 类型输出,其位置在转移分支上,且用符号 '#' 标记;
2)'f' 是 hold 类型输出,其位置在状态圈上,也用符号 '#' 标记;
3)本例中定义的 'cnt' 是一个 'onstate' 类型的内部信号 (Signals),实现计数器功能;
4)仿真结果显示输出 'g' 和 'f' 被触发后会保持,直到下一次触发才变化。

'Signals' 和 'Outputs' 的区别是生成 HDL 代码的时候,'Signals' 是一个内部信号,不会出现在代码的输出端口定义部分 hold_1_result.png

example/hold_2

hold_2.png

分析:和上例 (example/hold_1) 不同的是
1)'g' 是 hold 类型输出,其位置既出现在转移分支上,又出现在状态圈上。

hold_2_result.png

分配转移分支优先级 ( Transition Priority )

下面例子是 example/priority_1。
以状态 MIDDLE 为始点,共有三条转移分支,那条优先呢?

以状态 MIDDLE 为始点,共有三条转移分支 编辑从状态 MIDDLE 到状态 LAST 的 transition 对象优先级为 '2' 选择 transition 对象,右键菜单选择 'Edit State Transition Properties' 同样操作,编辑从状态 MIDDLE 到状态 LAST 的 transition 对象优先级为 '1' '//' 符号后的数字是配置的优先级

优先级约定表示法

约定 表示法
优先级 条件转移,Priority = 0 或空
第二高优先级 条件转移,Priority = 1
第三高优先级 条件转移,Priority = 2
…… ……
优先级 无条件转移

实现复杂状态机设计 —— 页面模式 ( Page Mode )

page_mode 分为 single 和 multi 二种。

菜单 'Settings/Global' 中选择 page_mode 为 single

模式 single:当一个状态机有太多状态和转移分支对象,不能画在一页中的时候,我们可以把它分开画在多个页面上。
下面例子是把 'example/onstate_1' 从一页设计改成两页的设计。

![1) 菜单 'File/Open' 打开 'example/onstate_1'设计例子

  1. 点击左下角 'Create New Page'](https://img.haomeiwen.com/i1786405/de8f08be02e52980.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3) 选择状态 LAST,右键菜单选择 'Move to Page... /Page 2' 分页后 Page 1 的设计 分页后 Page 2 的设计

'Ctrl+S' 保存设计为 'example/mode_1',生成的 HDL 代码和原设计 'example/onstate_1' 应该是一致的。


我认为下面 multi 模式在实际设计中更常用些。通常,一个实际设计是由多个独立状态机组合而成的。

模式 multi:一个页面是一个独立的状态机。

'page_mde = multi' 是默认配置

下面例子是 'example/mode_2' 。

Page 1 的状态机,状态变量名 'state_1' Page 2 的状态机,状态变量名 'state_2'

二个状态机分别有自己的启动状态,它们之间通过内部信号 'enter' 和 'exit' 交互作用。

下图是仿真结果。


mode_2_result.png

规则检查

待续……


……
“我这人确实胸无大志,很浮躁的。”
“我倒是有个建议:你为什么不去研究宇宙社会学呢?”
“宇宙社会学?”
“我随便说的一个名词,就是假设宇宙中分布着数量巨大的文明,它们的数目与能观测到的星星是一个数量级的,很多很多,这些文明构成了一个总体的宇宙社会,宇宙社会学就是研究这个超级社会的形态。”
……
“可……目前只知道我们这一个文明啊。”

“正因为如此没有人去做这个事情,这就留给你一个机会嘛。”
“叶老师,很有意思!您说下去。”
“我这么想是因为能把你的两个专业结合起来,宇宙社会学比起人类社会学来呈现出更清晰的数学结构。”
“为什么这么说呢?”

叶文洁指指天空,……
“你看,星星都是一个个的点,宇宙中各个文明社会的复杂结构,其中的混沌和随机的因素,都被这样巨大的距离滤去了,那些文明在我们看来就是一个个拥有参数的点,这在数学上就比较容易处理了。”
“但,叶老师,您说的宇宙社会学没有任何可供研究的实际资料,也不太可能进行调查和实验。”
“所以你最后的成果就是纯理论的,就像欧氏几何一样,先设定几条简单的不证自明的公理,再在这些公理的基础上推导出整个理论体系。”
“叶老师,这……真是太有意思了,可是宇宙社会学的公理是什么呢?”
“第一,生存是文明的第一需要;第二,文明不断增长和扩张,但宇宙中的物质总量保持不变。”
……
“叶老师,从社会学角度看,这两条公理都是足够坚实的……您这么快就说出来,好像胸有成竹似的。”罗辑有些吃惊地说。
“我已经想了大半辈子,但确实是第一次同人谈起这个,我真的不知道为什么要谈……哦,要想从这两条公理推论出宇宙社会学的基本图景,还有两个重要概念:猜疑链和技术爆炸。”
“很有意思的两个名词,您能解释一下吗?”
叶文洁看看表:“没有时间了,其实你这样聪明,自己也能想出来,你可以先从这两条公理着手创立这门学科,那你就有可能成为宇宙社会学的欧几里得了。”
“叶老师,我成不了欧几里得,但会记住您的话,试着去做做,以后我可能还会去请教您。”
“怕没有机会了……或者,你就当我随便说说,不管是哪种情况,我都尽了责任。好,小罗,我走了。”
“……叶老师,您保重。”

叶文洁在暮色中离去,走向她那最后的聚会。
……

—— 选自《三体2:黑暗森林》刘慈欣

相关文章

网友评论

      本文标题:有限状态机(FSM)设计 —— Fizzim2 使用帮助

      本文链接:https://www.haomeiwen.com/subject/zpcllttx.html