有限狀態(tài)機(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)機分類

一般狀態(tài)機基于輸出信號類型 (Output-Type-Based) 進(jìn)行分類,如 Moore 和 Mealy 等。實際設(shè)計中一個狀態(tài)機是可以混合有 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 信號的區(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)機設(shè)計 —— 頁面模式 ( Page Mode )

page_mode 分為 single 和 multi 二種。

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

模式 single:當(dāng)一個狀態(tài)機有太多狀態(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)機組合而成的。

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

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

下面例子是 'example/mode_2' 。

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

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

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


mode_2_result.png

規(guī)則檢查

待續(xù)……


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

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

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容