更新記錄
- 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,一個非常好的設計。給作者提了幾點改進建議,沒有被采納!也許是理念不同,也許是語言不通(一個中國人和一個德國人之間使用英語交流)。好在原設計是開源的(點贊),于是就自己動手操刀了。
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 增加了“所見即所得”的特性,和改進了幾處設計輸入方式,使用起來更加方便了。
下載和安裝
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)添加輸入
4)編輯轉移分支條件和優先級
5)添加輸出
6)編輯輸出結果
7)'Ctrl+S' 保存設計
注:關于轉移分支優先級,后面有說明。
幾點補充
1)'clock' 和 'reset' 是默認輸入信號,不用手動添加,并可以修改變量名和邊沿類型
2)無條件狀態自環是默認狀態轉移,可以省略不畫
'equation = 1' 表示無條件狀態轉移。上例(example/dff_onstate_1)中就省略了狀態 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種。
注:
dff- 表示寄存器輸出
comb- 表示組合邏輯輸出
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
分析:
1)'do' 是輸入信號,控制從狀態 IDLE 到狀態 RUN 做條件轉移,控制從狀態 RUN 到狀態 LAST 做條件轉移;
2)從狀態 LAST 到狀態 IDLE 是無條件轉移 (equation = 1);
3)'r' 和 'f' 是 onstate 類型輸出,其位置在狀態圈上;
4)仿真結果顯示輸出 'r' 和狀態 RUN (2'b01) 同步,輸出 'f' 和狀態 LAST (2'b10) 同步。
example/comb_ontransit_1
分析:和上例不同的是
1)'s' 和 'g' 是 comb- 類型輸出,用符號 '::' 標記,其位置在轉移分支上;
2)仿真結果顯示輸出 's' 是在狀態 RUN 上自環時觸發(比狀態 RUN 少一個時鐘周期),'g' 是在從狀態 RUN 轉移到狀態 LAST 時觸發(超前狀態 LAST 一個時鐘周期)。
example/dff_ontransit_1
分析:和上例 (example/comb_ontransit_1) 不同的是
1)'s' 和 'g' 是 dff- 類型輸出,用符號 '=' 標記,其位置也在轉移分支上;
2)仿真結果顯示輸出 's' 和 'g' 在相位上滯后上例一個時鐘周期。
example/dff_onboth_1
分析:和上例不同的是
1)兼有 onstate 類型輸出和 ontransit 類型輸出;
2)'r' 是dff-onboth類型輸出, 'f' 是 dff-onstate 類型輸出,其位置在狀態圈上;
3)'g'和'x' 是 comb-ontransit 類型輸出,其位置在轉移分支上。
example/hold_1
分析:
1)'g' 是 hold 類型輸出,其位置在轉移分支上,且用符號 '#' 標記;
2)'f' 是 hold 類型輸出,其位置在狀態圈上,也用符號 '#' 標記;
3)本例中定義的 'cnt' 是一個 'onstate' 類型的內部信號 (Signals),實現計數器功能;
4)仿真結果顯示輸出 'g' 和 'f' 被觸發后會保持,直到下一次觸發才變化。
example/hold_2
分析:和上例 (example/hold_1) 不同的是
1)'g' 是 hold 類型輸出,其位置既出現在轉移分支上,又出現在狀態圈上。
分配轉移分支優先級 ( Transition Priority )
下面例子是 example/priority_1。
以狀態 MIDDLE 為始點,共有三條轉移分支,那條優先呢?
優先級約定表示法
約定 | 表示法 |
---|---|
最高優先級 | 條件轉移,Priority = 0 或空 |
第二高優先級 | 條件轉移,Priority = 1 |
第三高優先級 | 條件轉移,Priority = 2 |
…… | …… |
最低優先級 | 無條件轉移 |
實現復雜狀態機設計 —— 頁面模式 ( Page Mode )
page_mode 分為 single 和 multi 二種。
模式 single:當一個狀態機有太多狀態和轉移分支對象,不能畫在一頁中的時候,我們可以把它分開畫在多個頁面上。
下面例子是把 'example/onstate_1' 從一頁設計改成兩頁的設計。

'Ctrl+S' 保存設計為 'example/mode_1',生成的 HDL 代碼和原設計 'example/onstate_1' 應該是一致的。
我認為下面 multi 模式在實際設計中更常用些。通常,一個實際設計是由多個獨立狀態機組合而成的。
模式 multi:一個頁面是一個獨立的狀態機。
下面例子是 'example/mode_2' 。
二個狀態機分別有自己的啟動狀態,它們之間通過內部信號 'enter' 和 'exit' 交互作用。
下圖是仿真結果。
規則檢查
待續……
跋
……
“我這人確實胸無大志,很浮躁的。”
“我倒是有個建議:你為什么不去研究宇宙社會學呢?”
“宇宙社會學?”
“我隨便說的一個名詞,就是假設宇宙中分布著數量巨大的文明,它們的數目與能觀測到的星星是一個數量級的,很多很多,這些文明構成了一個總體的宇宙社會,宇宙社會學就是研究這個超級社會的形態。”
……
“可……目前只知道我們這一個文明啊。”
“正因為如此沒有人去做這個事情,這就留給你一個機會嘛。”
“葉老師,很有意思!您說下去。”
“我這么想是因為能把你的兩個專業結合起來,宇宙社會學比起人類社會學來呈現出更清晰的數學結構。”
“為什么這么說呢?”
葉文潔指指天空,……
“你看,星星都是一個個的點,宇宙中各個文明社會的復雜結構,其中的混沌和隨機的因素,都被這樣巨大的距離濾去了,那些文明在我們看來就是一個個擁有參數的點,這在數學上就比較容易處理了。”
“但,葉老師,您說的宇宙社會學沒有任何可供研究的實際資料,也不太可能進行調查和實驗。”
“所以你最后的成果就是純理論的,就像歐氏幾何一樣,先設定幾條簡單的不證自明的公理,再在這些公理的基礎上推導出整個理論體系。”
“葉老師,這……真是太有意思了,可是宇宙社會學的公理是什么呢?”
“第一,生存是文明的第一需要;第二,文明不斷增長和擴張,但宇宙中的物質總量保持不變。”
……
“葉老師,從社會學角度看,這兩條公理都是足夠堅實的……您這么快就說出來,好像胸有成竹似的。”羅輯有些吃驚地說。
“我已經想了大半輩子,但確實是第一次同人談起這個,我真的不知道為什么要談……哦,要想從這兩條公理推論出宇宙社會學的基本圖景,還有兩個重要概念:猜疑鏈和技術爆炸。”
“很有意思的兩個名詞,您能解釋一下嗎?”
葉文潔看看表:“沒有時間了,其實你這樣聰明,自己也能想出來,你可以先從這兩條公理著手創立這門學科,那你就有可能成為宇宙社會學的歐幾里得了。”
“葉老師,我成不了歐幾里得,但會記住您的話,試著去做做,以后我可能還會去請教您。”
“怕沒有機會了……或者,你就當我隨便說說,不管是哪種情況,我都盡了責任。好,小羅,我走了。”
“……葉老師,您保重。”
葉文潔在暮色中離去,走向她那最后的聚會。
……
—— 選自《三體2:黑暗森林》劉慈欣