Verilog學習筆記設計和驗證篇(三)...............同步有限狀態機的指導原則


 因為大多數的FPGA內部的觸發器數目相當多,又加上獨熱碼狀態機(one hot code machine)的譯碼邏輯最為簡單,所以在FPGA實現狀態機時,往往采用獨熱碼狀態機(即每個狀態只有一個寄存器置位的狀態機)。建議采用case語句來建立狀態機的模型,因為這些語句表達清晰明了,可以方便的由當前狀態轉向下一個狀態並設置輸出。記得:不要忘記在case語句的最后寫上default分支,並將狀態設置為'bx這就等於告訴綜合器case語句已經指定了所有的狀態。這樣綜合器就可以刪除不必要的譯碼電路使生成的電路簡潔。

如果將默認的狀態設置為某一確定值的狀態可不可以呢?

這樣會導致,雖然綜合器產生的邏輯和設置default:state=’bx;相同,但是狀態機的Verilog模型綜合前和綜合后的仿真結果不一致。因為啟動仿真器時,狀態機的所有狀態都不確定,因此立即進入default狀態。這時便會導致開始的狀態為state1,但是實際的硬件電路在通電以后,進入的狀態是不確定的,很可能不是state1的狀態,因此'bx更切合實際一些。但是再有多余狀態的情況下,可以通過哦綜合指令(高級教程)將默認狀態設置為某一確定的有效狀態,因為這樣能夠使得狀態機在偶然進入多余狀態后,仍能在下一時鍾跳變沿返回正常工作狀態,否則引起死鎖。

目前大多數綜合其往往不支持在一個always快中由多個事件觸發的狀態機(隱含狀態機,implicit state machine),為了能綜合出有效的電路,用Verilog描述的狀態機應明確的由唯一時鍾觸發。如果比需要用到不同時鍾觸發的狀態機,可以采用以下程序:編寫另一個模塊,並采用第二種時鍾觸發;然后用適中調用的方法再領一個模塊中將它們連接起來。為了使設計更簡單,調試更加容易,通常使得兩個狀態機的周期由一定的關系。

在Verilog中狀態必須明確賦值,使用參數parameter和define都可以實現:

參數定義:parameter state1=2'0,state2=2'1;

                              ...

                     current_state=state1;

宏定義:`define state1=2'b0,state2=2'b1;

                           ....

                     current_state=`state2;

語言指導原則:

1)always塊

(1)每個always塊只能有一個事件控制@(event-control),而且要緊跟在always關鍵詞后面。

(2)always塊可以表示時序邏輯或者組合邏輯,也可以同時表示透明鎖存器和組合邏輯,但是不建議使用,因為可能產生不希的透明鎖存器。

(3)帶有posedge和negedge關鍵詞的事件表達式代表邊沿觸發的時序邏輯,沒有這兩種關鍵詞的表示組合邏輯或者點評敏感的鎖存器,如果有多個沿和電平,期間必須用or隔離。

(4)每個在always中復制的信號都必須定義成reg型或整型。整形變量默認位32位,可以對整形變量的范圍進行規定,如 integer  [7:0]amm;

(5)always塊中應避免組合反饋回路。每個表示時序的always塊只能有一個時鍾沿跳變觸發,置位和復位信號最好也由該時鍾觸發。

在用always塊設計純組合邏輯網絡時,在生成組合邏輯的always中參與復制的所有信號都必須有明確的值,即在賦值表達式右邊賦值信號必須都在always的敏感列表中列出。如果某一變量沒有出現在變量列表中,那么在綜合時將會該信號隱含的產生一個透明鎖存器,這是因為該信號的變化並不能改變賦值的變化,而要先把該信號的變化存起來,等到敏感列表中的其他值發生變化時再起作用,純組合邏輯不能做到這一點。這樣綜合后的電路就不是純組合電路了,這時綜合器會發出警告,提示設計插入了鎖存器。見下例:

1    input a,b,c; 2 reg e,d; 3 always @(a or b or c) 4 begin 5 e=d&a&b; 6 /*因為d沒有在敏感列表中列出,多以d變化時,e不能立刻變化,必須等到a或b或c變化時才體現出來。這就是說實際上相當於存在一個電平敏感的透明鎖存器在起作用,把d的信號變化鎖存在其中*/ 7 d=e|c; 8 end

2)賦值

(1)對一個寄存器變量(reg)和整型(integer)變量給定位的賦值,只允許在一個alawys塊內進行,如果在另一個always塊中也賦值,這是非法的。

(1)把一個信號的值賦值為'bx,綜合器就把他解釋成無關狀態,因而綜合器為其生成的硬件電路最簡潔。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM