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


更新记录

  • 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 增加了“所见即所得”的特性,和改进了几处设计输入方式,使用起来更加方便了。

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第1张图片
snap1 : 左边是设计窗口,右边是 HDL 代码窗口
有限状态机(FSM)设计 —— Fizzim2 使用帮助_第2张图片
snap2 : 按下 'Ctrl+S' 保存设计,并自动刷新右边窗口

下载和安装

下载链接:github 或 baidu

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 )

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

操作小结

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

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

几点补充

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

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第21张图片
菜单 'Settings/Global' 中可以修改 'clock' 和 'reset' 的变量名和边沿类型

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

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第22张图片
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种。

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第23张图片
菜单 Settings/Outputs 中可以编辑输出信号类型
有限状态机(FSM)设计 —— Fizzim2 使用帮助_第24张图片
Output-Type 分类树图

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

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第25张图片
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

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第26张图片
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) 同步。

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第27张图片
dff_onstate_1_result.png

example/comb_ontransit_1

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第28张图片
comb_ontransit_1.png

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

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第29张图片
comb_ontransit_1_result.png

example/dff_ontransit_1

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第30张图片
dff_ontransit_1.png

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

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第31张图片
dff_ontransit_1_result.png

example/dff_onboth_1

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第32张图片
dff_onboth_1.png

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

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第33张图片
dff_onboth_1_result.png

example/hold_1

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第34张图片
hold_1.png

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

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第35张图片
'Signals' 和 'Outputs' 的区别是生成 HDL 代码的时候,'Signals' 是一个内部信号,不会出现在代码的输出端口定义部分
有限状态机(FSM)设计 —— Fizzim2 使用帮助_第36张图片
hold_1_result.png

example/hold_2

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第37张图片
hold_2.png

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

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第38张图片
hold_2_result.png

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

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

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第39张图片
以状态 MIDDLE 为始点,共有三条转移分支
有限状态机(FSM)设计 —— Fizzim2 使用帮助_第40张图片
编辑从状态 MIDDLE 到状态 LAST 的 transition 对象优先级为 '2' 选择 transition 对象,右键菜单选择 'Edit State Transition Properties'
有限状态机(FSM)设计 —— Fizzim2 使用帮助_第41张图片
同样操作,编辑从状态 MIDDLE 到状态 LAST 的 transition 对象优先级为 '1' '//' 符号后的数字是配置的优先级

优先级约定表示法

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

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

page_mode 分为 single 和 multi 二种。

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第42张图片
菜单 'Settings/Global' 中选择 page_mode 为 single

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

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

  1. 点击左下角 'Create New Page'](http://upload-images.jianshu.io/upload_images/1786405-de8f08be02e52980.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
有限状态机(FSM)设计 —— Fizzim2 使用帮助_第43张图片
3) 选择状态 LAST,右键菜单选择 'Move to Page... /Page 2'
有限状态机(FSM)设计 —— Fizzim2 使用帮助_第44张图片
分页后 Page 1 的设计
有限状态机(FSM)设计 —— Fizzim2 使用帮助_第45张图片
分页后 Page 2 的设计

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


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

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

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第46张图片
'page_mde = multi' 是默认配置

下面例子是 'example/mode_2' 。

有限状态机(FSM)设计 —— Fizzim2 使用帮助_第47张图片
Page 1 的状态机,状态变量名 'state_1'
有限状态机(FSM)设计 —— Fizzim2 使用帮助_第48张图片
Page 2 的状态机,状态变量名 'state_2'

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

下图是仿真结果。


有限状态机(FSM)设计 —— Fizzim2 使用帮助_第49张图片
mode_2_result.png

规则检查

待续……


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

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

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

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

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

你可能感兴趣的:(有限状态机(FSM)设计 —— Fizzim2 使用帮助)