有限狀態機(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閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容

  • 目錄 一. 背景 二. 概念 1.1 狀態機模型的概念 2.2 組成要素 3.3 三個特征 4.4 執行邏輯 5....
    獨釣寒江雪_520閱讀 20,624評論 4 46
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔,今天18年5月份再次想寫文章,發現簡書還為我保存起的...
    Jenaral閱讀 2,819評論 2 9
  • 初識 我第一次知道狀態機,是在大學學習《數字電子技術基礎》的時候。一塊控制芯片有若干輸入數據總線Data_in,一...
    邱simple閱讀 25,815評論 2 15
  • 計算機系統漫游 代碼從文本到可執行文件的過程(c語言示例):預處理階段,處理 #inlcude , #defin...
    willdimagine閱讀 3,616評論 0 5
  • 寫在前面 本文集主要總結歸納了一些ES6的基本語法,主要引用了阮一峰老師的《ECMAScript 6 標準入門》一...
    追憶_programmer閱讀 1,265評論 0 1