有限狀態(tài)機(jī)(FSM)設(shè)計 —— 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,一個非常好的設(shè)計。給作者提了幾點改進(jìn)建議,沒有被采納!也許是理念不同,也許是語言不通(一個中國人和一個德國人之間使用英語交流)。好在原設(shè)計是開源的(點贊),于是就自己動手操刀了。

Fizzim2 對其做了下面增強和改進(jìn):

  • 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 增加了“所見即所得”的特性,和改進(jìn)了幾處設(shè)計輸入方式,使用起來更加方便了。

snap1 : 左邊是設(shè)計窗口,右邊是 HDL 代碼窗口
snap2 : 按下 'Ctrl+S' 保存設(shè)計,并自動刷新右邊窗口

下載和安裝

下載鏈接:githubbaidu

Fizzim2 工具是一個 Java 程序,所以需要安裝一個 Java 運行環(huán)境 (JRE)。我的開發(fā)版本是 Java(TM) SE Runtime Environment (build 1.6.0_33-b05),相同或高于這個版本應(yīng)該都是可以的。

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) 狀態(tài)重命名之后 (state0 -> IDLE, state1 -> RUN, state2 -> LAST)
6) 選擇 state 對象,右鍵菜單選擇 "Set as Reset"
7) IDLE 狀態(tài)被配置為啟動狀態(tài)
8) 選擇 state 對象,右鍵菜單選擇 "Add State Transition to ..."
9) 添加從 IDLE 狀態(tài)到 RUN 狀態(tài)的 transition 對象
10) 繼續(xù)添加其它 transiton 對象
11) 菜單 'Settings/Inputs',添加輸入信號 'do'
12) 選擇 transition 對象,右鍵菜單選擇 "Edit State Transition Properties"
13) 編輯轉(zhuǎn)移分支條件 'equation' 值
14) 同樣操作,編輯從狀態(tài) RUN 轉(zhuǎn)移到 狀態(tài) LAST 的轉(zhuǎn)移條件 '!do'
15) 菜單 'Settings/Outputs',添加 2 個輸出信號 'f' 和 'r'
16) 選擇 state 對象,右鍵菜單選擇 "Edit State Properties"
17) 在 RUN 狀態(tài)添加輸出 'r = 1'
18) 同樣操作,在 LAST 狀態(tài)添加輸出 'f = 1', 'Ctrl+S' 保存設(shè)計,大功告成

操作小結(jié)

1)添加狀態(tài)
2)添加轉(zhuǎn)移分支
3)添加輸入
4)編輯轉(zhuǎn)移分支條件和優(yōu)先級
5)添加輸出
6)編輯輸出結(jié)果
7)'Ctrl+S' 保存設(shè)計

注:關(guān)于轉(zhuǎn)移分支優(yōu)先級,后面有說明。

幾點補充

1)'clock' 和 'reset' 是默認(rèn)輸入信號,不用手動添加,并可以修改變量名和邊沿類型

菜單 'Settings/Global' 中可以修改 'clock' 和 'reset' 的變量名和邊沿類型

2)無條件狀態(tài)自環(huán)是默認(rèn)狀態(tài)轉(zhuǎn)移,可以省略不畫
'equation = 1' 表示無條件狀態(tài)轉(zhuǎn)移。上例(example/dff_onstate_1)中就省略了狀態(tài) IDLE 上和 狀態(tài) RUN 上的無條件自環(huán)。

19) 可以省略狀態(tài) IDLE 上和 狀態(tài) RUN 上的無條件自環(huán)

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


狀態(tài)機(jī)分類

一般狀態(tài)機(jī)基于輸出信號類型 (Output-Type-Based) 進(jìn)行分類,如 Moore 和 Mealy 等。實際設(shè)計中一個狀態(tài)機(jī)是可以混合有 Moore 輸出和 Mealy 輸出,即不是純粹的 Moore 機(jī)或是 Mealy 機(jī)。

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 信號的區(qū)別如上圖所示。沒有觸發(fā)的時候 (No),no-hold 信號會回到默認(rèn)值;而 hold 信號會繼續(xù)保持最近一次觸發(fā)值,直到下一次觸發(fā)的時候才改變。

2)onstate 信號和 ontransit 信號的區(qū)別在觸發(fā)位置上。如命名所提示,

-onstate 信號位置在 state 對象上(且只能在 state 對象上),被 state 對象觸發(fā);
-ontransit 信號位置在 transition 對象上(且只能在 transition 對象上),被 transition 對象觸發(fā);
-onboth 信號位置則兩者都可。

3)hold 信號總是 dff- 輸出類型。

4)dff-ontransit 信號和 comb-ontransit 信號在時序上的區(qū)別。dff-ontransit 比 comb-ontransit 滯后一拍。


實例分析

example/dff_onstate_1

dff_onstate_1.png

分析:
1)'do' 是輸入信號,控制從狀態(tài) IDLE 到狀態(tài) RUN 做條件轉(zhuǎn)移,控制從狀態(tài) RUN 到狀態(tài) LAST 做條件轉(zhuǎn)移;
2)從狀態(tài) LAST 到狀態(tài) IDLE 是無條件轉(zhuǎn)移 (equation = 1);
3)'r' 和 'f' 是 onstate 類型輸出,其位置在狀態(tài)圈上;
4)仿真結(jié)果顯示輸出 'r' 和狀態(tài) RUN (2'b01) 同步,輸出 'f' 和狀態(tài) LAST (2'b10) 同步。

dff_onstate_1_result.png

example/comb_ontransit_1

comb_ontransit_1.png

分析:和上例不同的是
1)'s' 和 'g' 是 comb- 類型輸出,用符號 '::' 標(biāo)記,其位置在轉(zhuǎn)移分支上;
2)仿真結(jié)果顯示輸出 's' 是在狀態(tài) RUN 上自環(huán)時觸發(fā)(比狀態(tài) RUN 少一個時鐘周期),'g' 是在從狀態(tài) RUN 轉(zhuǎn)移到狀態(tài) LAST 時觸發(fā)(超前狀態(tài) LAST 一個時鐘周期)。

comb_ontransit_1_result.png

example/dff_ontransit_1

dff_ontransit_1.png

分析:和上例 (example/comb_ontransit_1) 不同的是
1)'s' 和 'g' 是 dff- 類型輸出,用符號 '=' 標(biāo)記,其位置也在轉(zhuǎn)移分支上;
2)仿真結(jié)果顯示輸出 '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 類型輸出,其位置在狀態(tài)圈上;
3)'g'和'x' 是 comb-ontransit 類型輸出,其位置在轉(zhuǎn)移分支上。

dff_onboth_1_result.png

example/hold_1

hold_1.png

分析:
1)'g' 是 hold 類型輸出,其位置在轉(zhuǎn)移分支上,且用符號 '#' 標(biāo)記;
2)'f' 是 hold 類型輸出,其位置在狀態(tài)圈上,也用符號 '#' 標(biāo)記;
3)本例中定義的 'cnt' 是一個 'onstate' 類型的內(nèi)部信號 (Signals),實現(xiàn)計數(shù)器功能;
4)仿真結(jié)果顯示輸出 'g' 和 'f' 被觸發(fā)后會保持,直到下一次觸發(fā)才變化。

'Signals' 和 'Outputs' 的區(qū)別是生成 HDL 代碼的時候,'Signals' 是一個內(nèi)部信號,不會出現(xiàn)在代碼的輸出端口定義部分
hold_1_result.png

example/hold_2

hold_2.png

分析:和上例 (example/hold_1) 不同的是
1)'g' 是 hold 類型輸出,其位置既出現(xiàn)在轉(zhuǎn)移分支上,又出現(xiàn)在狀態(tài)圈上。

hold_2_result.png

分配轉(zhuǎn)移分支優(yōu)先級 ( Transition Priority )

下面例子是 example/priority_1。
以狀態(tài) MIDDLE 為始點,共有三條轉(zhuǎn)移分支,那條優(yōu)先呢?

以狀態(tài) MIDDLE 為始點,共有三條轉(zhuǎn)移分支
編輯從狀態(tài) MIDDLE 到狀態(tài) LAST 的 transition 對象優(yōu)先級為 '2' 選擇 transition 對象,右鍵菜單選擇 'Edit State Transition Properties'
同樣操作,編輯從狀態(tài) MIDDLE 到狀態(tài) LAST 的 transition 對象優(yōu)先級為 '1' '//' 符號后的數(shù)字是配置的優(yōu)先級

優(yōu)先級約定表示法

約定 表示法
優(yōu)先級 條件轉(zhuǎn)移,Priority = 0 或空
第二高優(yōu)先級 條件轉(zhuǎn)移,Priority = 1
第三高優(yōu)先級 條件轉(zhuǎn)移,Priority = 2
…… ……
優(yōu)先級 無條件轉(zhuǎn)移

實現(xiàn)復(fù)雜狀態(tài)機(jī)設(shè)計 —— 頁面模式 ( Page Mode )

page_mode 分為 single 和 multi 二種。

菜單 'Settings/Global' 中選擇 page_mode 為 single

模式 single:當(dāng)一個狀態(tài)機(jī)有太多狀態(tài)和轉(zhuǎn)移分支對象,不能畫在一頁中的時候,我們可以把它分開畫在多個頁面上。
下面例子是把 'example/onstate_1' 從一頁設(shè)計改成兩頁的設(shè)計。

![1) 菜單 'File/Open' 打開 'example/onstate_1'設(shè)計例子

  1. 點擊左下角 'Create New Page'](http://upload-images.jianshu.io/upload_images/1786405-de8f08be02e52980.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3) 選擇狀態(tài) LAST,右鍵菜單選擇 'Move to Page... /Page 2'
分頁后 Page 1 的設(shè)計
分頁后 Page 2 的設(shè)計

'Ctrl+S' 保存設(shè)計為 'example/mode_1',生成的 HDL 代碼和原設(shè)計 'example/onstate_1' 應(yīng)該是一致的。


我認(rèn)為下面 multi 模式在實際設(shè)計中更常用些。通常,一個實際設(shè)計是由多個獨立狀態(tài)機(jī)組合而成的。

模式 multi:一個頁面是一個獨立的狀態(tài)機(jī)。

'page_mde = multi' 是默認(rèn)配置

下面例子是 'example/mode_2' 。

Page 1 的狀態(tài)機(jī),狀態(tài)變量名 'state_1'
Page 2 的狀態(tài)機(jī),狀態(tài)變量名 'state_2'

二個狀態(tài)機(jī)分別有自己的啟動狀態(tài),它們之間通過內(nèi)部信號 'enter' 和 'exit' 交互作用。

下圖是仿真結(jié)果。


mode_2_result.png

規(guī)則檢查

待續(xù)……


……
“我這人確實胸?zé)o大志,很浮躁的。”
“我倒是有個建議:你為什么不去研究宇宙社會學(xué)呢?”
“宇宙社會學(xué)?”
“我隨便說的一個名詞,就是假設(shè)宇宙中分布著數(shù)量巨大的文明,它們的數(shù)目與能觀測到的星星是一個數(shù)量級的,很多很多,這些文明構(gòu)成了一個總體的宇宙社會,宇宙社會學(xué)就是研究這個超級社會的形態(tài)?!?br> ……
“可……目前只知道我們這一個文明啊?!?/p>

“正因為如此沒有人去做這個事情,這就留給你一個機(jī)會嘛?!?br> “葉老師,很有意思!您說下去?!?br> “我這么想是因為能把你的兩個專業(yè)結(jié)合起來,宇宙社會學(xué)比起人類社會學(xué)來呈現(xiàn)出更清晰的數(shù)學(xué)結(jié)構(gòu)?!?br> “為什么這么說呢?”

葉文潔指指天空,……
“你看,星星都是一個個的點,宇宙中各個文明社會的復(fù)雜結(jié)構(gòu),其中的混沌和隨機(jī)的因素,都被這樣巨大的距離濾去了,那些文明在我們看來就是一個個擁有參數(shù)的點,這在數(shù)學(xué)上就比較容易處理了?!?br> “但,葉老師,您說的宇宙社會學(xué)沒有任何可供研究的實際資料,也不太可能進(jìn)行調(diào)查和實驗?!?br> “所以你最后的成果就是純理論的,就像歐氏幾何一樣,先設(shè)定幾條簡單的不證自明的公理,再在這些公理的基礎(chǔ)上推導(dǎo)出整個理論體系?!?br> “葉老師,這……真是太有意思了,可是宇宙社會學(xué)的公理是什么呢?”
“第一,生存是文明的第一需要;第二,文明不斷增長和擴(kuò)張,但宇宙中的物質(zhì)總量保持不變?!?br> ……
“葉老師,從社會學(xué)角度看,這兩條公理都是足夠堅實的……您這么快就說出來,好像胸有成竹似的?!绷_輯有些吃驚地說。
“我已經(jīng)想了大半輩子,但確實是第一次同人談起這個,我真的不知道為什么要談……哦,要想從這兩條公理推論出宇宙社會學(xué)的基本圖景,還有兩個重要概念:猜疑鏈和技術(shù)爆炸?!?br> “很有意思的兩個名詞,您能解釋一下嗎?”
葉文潔看看表:“沒有時間了,其實你這樣聰明,自己也能想出來,你可以先從這兩條公理著手創(chuàng)立這門學(xué)科,那你就有可能成為宇宙社會學(xué)的歐幾里得了?!?br> “葉老師,我成不了歐幾里得,但會記住您的話,試著去做做,以后我可能還會去請教您?!?br> “怕沒有機(jī)會了……或者,你就當(dāng)我隨便說說,不管是哪種情況,我都盡了責(zé)任。好,小羅,我走了?!?br> “……葉老師,您保重。”

葉文潔在暮色中離去,走向她那最后的聚會。
……

—— 選自《三體2:黑暗森林》劉慈欣

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內(nèi)容

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