設計可綜合狀態機的指導原則
(1)獨熱碼
本文引用地址:http://www.104case.com/article/148604.htm因為大多數FPGA內部的觸發器數目相當多,又加上獨熱碼狀態機(ONe hot STate machine)的譯碼邏輯最為簡單,所以在設計采用FPGA實現的狀態機時,往往采用獨熱碼狀態機(即每個狀態只有一個寄存器置位的狀態機)。
(2)case語句
建議采用case、casex或casez語句來建立狀態機的模型。因為這些語句表達清晰明了,可以方便地從當前狀態分支轉向下一個狀態并設置輸出。
采用這些語句設計狀態機時,不要忘記寫上case語句的最后一個分支default,并將狀態變量設為'bx。這就等于告知綜合器:case語句已經指定了所有的狀態。這樣綜合器就可以刪除不需要的譯碼電路,使生成的電路簡潔,并與設計要求一致。
如果將缺省狀態設置為某一確定的狀態(例如:設置default:state = state1),行不行呢?”這樣做有一個問題需要注意:因為盡管綜合器產生的邏輯和設置“default:state='bx”時相同,但是狀態機的Verilog HDL模型綜合前和綜合后的仿真結果會不一致。
為什么會是這樣呢?因為啟動仿真器時,狀態機所有的輸入都不確定,因此立即進入default狀態。如果通過設置將狀態變量設為state1,但是實際硬件電路的狀態機在通電之后,進入的狀態是不確定的,很可能不是state1的狀態,這樣就會產生不必要的沖突。
因此,還是設置“default:state='bx”與實際硬件電路相一致。但在有多余狀態的情況下還是應將缺省狀態設置為某一確定的有效狀態,因為這樣做能使狀態機若偶然進入多余狀態后仍能在下一時鐘跳變沿時返回正常工作狀態,否則會引起死鎖。
(3)復位
狀態機應該有一個異步或同步復位端,以便在通電時將硬件電路復位到有效狀態,也可以在操作中將硬件電路復位(大多數FPGA結構都允許使用異步復位端)。
(4)惟一觸發
目前大多數綜合器往往不支持在一個always塊中由多個事件觸發的狀態機(即隱含狀態機,implicit state machines)。因此為了能綜合出有效的電路,用Verilog HDL描述的狀態機應明確地由惟一時鐘觸發。
(5)異步狀態機
異步狀態機是沒有確定時鐘的狀態機,它的狀態轉移不是由惟一的時鐘跳變沿所觸發。目前大多數綜合器不能綜合采用Verilog HDL描述的異步狀態機。
因此應盡量不要使用綜合工具來設計異步狀態機。因為目前大多數綜合工具在對異步狀態機進行邏輯優化時會胡亂地簡化邏輯,使綜合后的異步狀態機不能正常工作。如果一定要設計異步狀態機,建議采用電路圖輸入的方法,而不要用Verilog HDL輸入的方法。
(6)狀態賦值
Verilog HDL中,狀態必須明確賦值,通常使用參數parameters或宏定義define語句加上賦值語句來實現。
使用參數parameters語句賦狀態值如下所示:
parameter state1 = 2 'h1, state2 = 2 'h2;
...
current_state = state2; //把current state設置成 2'h2
...
使用宏定義define語句賦狀態值如下所示:
'define state1 2 'h1
'define state2 2 'h2
...
current_state = 'state2; //把current state設置成 2 'h2
評論