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

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'](http://upload-images.jianshu.io/upload_images/1786405-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:黑暗森林》刘慈欣

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容

  • 目录 一. 背景 二. 概念 1.1 状态机模型的概念 2.2 组成要素 3.3 三个特征 4.4 执行逻辑 5....
    独钓寒江雪_520阅读 20,166评论 4 46
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,645评论 2 9
  • 初识 我第一次知道状态机,是在大学学习《数字电子技术基础》的时候。一块控制芯片有若干输入数据总线Data_in,一...
    邱simple阅读 25,355评论 2 15
  • 计算机系统漫游 代码从文本到可执行文件的过程(c语言示例):预处理阶段,处理 #inlcude , #defin...
    willdimagine阅读 3,506评论 0 5
  • 写在前面 本文集主要总结归纳了一些ES6的基本语法,主要引用了阮一峰老师的《ECMAScript 6 标准入门》一...
    追忆_programmer阅读 1,244评论 0 1