更新記錄
- 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,一個非常好的設(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è)計輸入方式,使用起來更加方便了。
下載和安裝
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 )
操作小結(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)輸入信號,不用手動添加,并可以修改變量名和邊沿類型
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)。
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種。
注:
dff- 表示寄存器輸出
comb- 表示組合邏輯輸出
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
分析:
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) 同步。
example/comb_ontransit_1
分析:和上例不同的是
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 一個時鐘周期)。
example/dff_ontransit_1
分析:和上例 (example/comb_ontransit_1) 不同的是
1)'s' 和 'g' 是 dff- 類型輸出,用符號 '=' 標(biāo)記,其位置也在轉(zhuǎn)移分支上;
2)仿真結(jié)果顯示輸出 's' 和 'g' 在相位上滯后上例一個時鐘周期。
example/dff_onboth_1
分析:和上例不同的是
1)兼有 onstate 類型輸出和 ontransit 類型輸出;
2)'r' 是dff-onboth類型輸出, 'f' 是 dff-onstate 類型輸出,其位置在狀態(tài)圈上;
3)'g'和'x' 是 comb-ontransit 類型輸出,其位置在轉(zhuǎn)移分支上。
example/hold_1
分析:
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ā)才變化。
example/hold_2
分析:和上例 (example/hold_1) 不同的是
1)'g' 是 hold 類型輸出,其位置既出現(xiàn)在轉(zhuǎn)移分支上,又出現(xiàn)在狀態(tài)圈上。
分配轉(zhuǎn)移分支優(yōu)先級 ( Transition Priority )
下面例子是 example/priority_1。
以狀態(tài) MIDDLE 為始點,共有三條轉(zhuǎn)移分支,那條優(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 二種。
模式 single:當(dāng)一個狀態(tài)機(jī)有太多狀態(tài)和轉(zhuǎn)移分支對象,不能畫在一頁中的時候,我們可以把它分開畫在多個頁面上。
下面例子是把 'example/onstate_1' 從一頁設(shè)計改成兩頁的設(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ī)。
下面例子是 'example/mode_2' 。
二個狀態(tài)機(jī)分別有自己的啟動狀態(tài),它們之間通過內(nèi)部信號 'enter' 和 'exit' 交互作用。
下圖是仿真結(jié)果。
規(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:黑暗森林》劉慈欣