更新记录
- 2016.04.26
- 修改 outputs/signals 类型为 dff-onstate, dff-ontransit, dff-onboth, comb-ontransit, hold-onstate, hold-ontransit 和 hold-onboth 共7种;
- 修正一些 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 增加了“所见即所得”的特性,和改进了几处设计输入方式,使用起来更加方便了。
下载和安装
下载链接: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 )
操作小结
1)添加状态
2)添加转移分支
3)添加输入
4)编辑转移分支条件和优先级
5)添加输出
6)编辑输出结果
7)'Ctrl+S' 保存设计
注:关于转移分支优先级,后面有说明。
几点补充
1)'clock' 和 'reset' 是默认输入信号,不用手动添加,并可以修改变量名和边沿类型
2)无条件状态自环是默认状态转移,可以省略不画
'equation = 1' 表示无条件状态转移。上例(example/dff_onstate_1)中就省略了状态 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种。
注:
dff- 表示寄存器输出
comb- 表示组合逻辑输出
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
分析:
1)'do' 是输入信号,控制从状态 IDLE 到状态 RUN 做条件转移,控制从状态 RUN 到状态 LAST 做条件转移;
2)从状态 LAST 到状态 IDLE 是无条件转移 (equation = 1);
3)'r' 和 'f' 是 onstate 类型输出,其位置在状态圈上;
4)仿真结果显示输出 'r' 和状态 RUN (2'b01) 同步,输出 'f' 和状态 LAST (2'b10) 同步。
example/comb_ontransit_1
分析:和上例不同的是
1)'s' 和 'g' 是 comb- 类型输出,用符号 '::' 标记,其位置在转移分支上;
2)仿真结果显示输出 's' 是在状态 RUN 上自环时触发(比状态 RUN 少一个时钟周期),'g' 是在从状态 RUN 转移到状态 LAST 时触发(超前状态 LAST 一个时钟周期)。
example/dff_ontransit_1
分析:和上例 (example/comb_ontransit_1) 不同的是
1)'s' 和 'g' 是 dff- 类型输出,用符号 '=' 标记,其位置也在转移分支上;
2)仿真结果显示输出 's' 和 'g' 在相位上滞后上例一个时钟周期。
example/dff_onboth_1
分析:和上例不同的是
1)兼有 onstate 类型输出和 ontransit 类型输出;
2)'r' 是dff-onboth类型输出, 'f' 是 dff-onstate 类型输出,其位置在状态圈上;
3)'g'和'x' 是 comb-ontransit 类型输出,其位置在转移分支上。
example/hold_1
分析:
1)'g' 是 hold 类型输出,其位置在转移分支上,且用符号 '#' 标记;
2)'f' 是 hold 类型输出,其位置在状态圈上,也用符号 '#' 标记;
3)本例中定义的 'cnt' 是一个 'onstate' 类型的内部信号 (Signals),实现计数器功能;
4)仿真结果显示输出 'g' 和 'f' 被触发后会保持,直到下一次触发才变化。
example/hold_2
分析:和上例 (example/hold_1) 不同的是
1)'g' 是 hold 类型输出,其位置既出现在转移分支上,又出现在状态圈上。
分配转移分支优先级 ( Transition Priority )
下面例子是 example/priority_1。
以状态 MIDDLE 为始点,共有三条转移分支,那条优先呢?
优先级约定表示法
约定 | 表示法 |
---|---|
最高优先级 | 条件转移,Priority = 0 或空 |
第二高优先级 | 条件转移,Priority = 1 |
第三高优先级 | 条件转移,Priority = 2 |
…… | …… |
最低优先级 | 无条件转移 |
实现复杂状态机设计 —— 页面模式 ( Page Mode )
page_mode 分为 single 和 multi 二种。
模式 single:当一个状态机有太多状态和转移分支对象,不能画在一页中的时候,我们可以把它分开画在多个页面上。
下面例子是把 'example/onstate_1' 从一页设计改成两页的设计。
![1) 菜单 'File/Open' 打开 'example/onstate_1'设计例子
- 点击左下角 'Create New Page'](http://upload-images.jianshu.io/upload_images/1786405-de8f08be02e52980.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
'Ctrl+S' 保存设计为 'example/mode_1',生成的 HDL 代码和原设计 'example/onstate_1' 应该是一致的。
我认为下面 multi 模式在实际设计中更常用些。通常,一个实际设计是由多个独立状态机组合而成的。
模式 multi:一个页面是一个独立的状态机。
下面例子是 'example/mode_2' 。
二个状态机分别有自己的启动状态,它们之间通过内部信号 'enter' 和 'exit' 交互作用。
下图是仿真结果。
规则检查
待续……
跋
……
“我这人确实胸无大志,很浮躁的。”
“我倒是有个建议:你为什么不去研究宇宙社会学呢?”
“宇宙社会学?”
“我随便说的一个名词,就是假设宇宙中分布着数量巨大的文明,它们的数目与能观测到的星星是一个数量级的,很多很多,这些文明构成了一个总体的宇宙社会,宇宙社会学就是研究这个超级社会的形态。”
……
“可……目前只知道我们这一个文明啊。”
“正因为如此没有人去做这个事情,这就留给你一个机会嘛。”
“叶老师,很有意思!您说下去。”
“我这么想是因为能把你的两个专业结合起来,宇宙社会学比起人类社会学来呈现出更清晰的数学结构。”
“为什么这么说呢?”
叶文洁指指天空,……
“你看,星星都是一个个的点,宇宙中各个文明社会的复杂结构,其中的混沌和随机的因素,都被这样巨大的距离滤去了,那些文明在我们看来就是一个个拥有参数的点,这在数学上就比较容易处理了。”
“但,叶老师,您说的宇宙社会学没有任何可供研究的实际资料,也不太可能进行调查和实验。”
“所以你最后的成果就是纯理论的,就像欧氏几何一样,先设定几条简单的不证自明的公理,再在这些公理的基础上推导出整个理论体系。”
“叶老师,这……真是太有意思了,可是宇宙社会学的公理是什么呢?”
“第一,生存是文明的第一需要;第二,文明不断增长和扩张,但宇宙中的物质总量保持不变。”
……
“叶老师,从社会学角度看,这两条公理都是足够坚实的……您这么快就说出来,好像胸有成竹似的。”罗辑有些吃惊地说。
“我已经想了大半辈子,但确实是第一次同人谈起这个,我真的不知道为什么要谈……哦,要想从这两条公理推论出宇宙社会学的基本图景,还有两个重要概念:猜疑链和技术爆炸。”
“很有意思的两个名词,您能解释一下吗?”
叶文洁看看表:“没有时间了,其实你这样聪明,自己也能想出来,你可以先从这两条公理着手创立这门学科,那你就有可能成为宇宙社会学的欧几里得了。”
“叶老师,我成不了欧几里得,但会记住您的话,试着去做做,以后我可能还会去请教您。”
“怕没有机会了……或者,你就当我随便说说,不管是哪种情况,我都尽了责任。好,小罗,我走了。”
“……叶老师,您保重。”
叶文洁在暮色中离去,走向她那最后的聚会。
……
—— 选自《三体2:黑暗森林》刘慈欣