Verilog有限狀態機比較
來自專欄匠人電子實驗室5 人贊了文章
綜述
本文探究了使用什麼碼作為狀態表示的優缺點,三種狀態機的比較,並編寫兩段式、三段式代碼進行比較。
狀態編碼之間比較
在Verilog中最常用的編碼方式有二進位編碼(Binary)、格雷碼(Gray-code)編碼、獨熱碼(One-hot)編碼。
二進位碼和格雷碼是壓縮狀態編碼。
格雷編碼,則相鄰狀態轉換時只有一個狀態位發生翻轉,這樣不僅能消除狀態轉換時由多條狀態信號線的傳輸延遲所造成的毛刺,又可以降低功耗。格雷碼的相鄰碼元值間只有一位是不同的,如S0=3b000,S1=3b001,S2=3b011,S3=3b010....
二進位編碼也可稱連續編碼,也就是碼元值的大小是連續變化的。如S0=3d0,S1=3d1,S2=3d2,S3=3d3....獨熱編碼即 One-Hot 編碼,又稱一位有效編碼,其方法是使用N位狀態寄存器來對N個狀態進行編碼,每個狀態都由他獨立的寄存器位,並且在任意時候,其中只有一位有效。雖然使用較多的觸發器,但由於狀態解碼簡單,可減少組合邏輯且速度較快, 這種編碼方式還易於修改,增加狀態或改變狀態轉換條件都可以在不影響狀態機的其它部分的情況下很方便地實現。另外,它的速度獨立於狀態數量。與之相比,壓縮狀態編碼在狀態增加時速度會明顯下降。獨熱碼值每個碼元值只有一位是1,其他位都是0,如S0=3b001,S1=3b010,S2=3b100
總結編碼使用的場合
獨熱碼組合邏輯最少,觸發器最多,工作時鐘頻率可以做到最高。
FPGA的一個最小結構單元(CLB/LE)中含有查找表(實現組合邏輯)和DFF(實現時序邏輯),布局布線最好的結果是同一個結構單元中的查找表和DFF都使用,但是大部分情況是僅使用其中一種資源,這樣另外的資源就是閑置而浪費。而CPLD中DFF資源本來就很少,由此可見One-hot編碼更適合於FPGA設計,而不適合CPLD設計,在CPLD中應該選擇二進位編碼。
IC設計中,應該綜合考慮。因為One-hot編碼使用DFF會大大增加設計面積(diesize),因此在時序可以滿足的條件下儘可能使用二進位編碼。就面積與速度的折中考慮來說Gray碼是最好的選擇,當然Gray碼還有其他很多好的特性,暫時不屬於這次討論的範疇。一般的綜合工具對狀態機進行綜合時都可以讓用戶對這三種編碼進行選擇。
關於Gray碼的其他應用,參考之前的文章。
Kevin Zhang:非同步FIFO設計(1)狀態機之間的比較
一段式狀態機:有的設計者習慣將整個狀態機寫到1 個always 模塊裡面,在該模塊中即描述狀態轉移,又描述狀態的輸入和輸出,這種寫法一般被稱為一段式FSM 描述方法。
二段式狀態機:還有一種寫法是將用2 個always 模塊,其中一個always 模塊採用同步時序描述狀態轉移;另一個模塊採用組合邏輯判斷狀態轉移條件,描述狀態轉移規律,這種寫法被稱為兩段式FSM 描述方法。
三段式狀態機:這種寫法使用3 個always 模塊,一個always模塊採用同步時序描述狀態轉移;第二個採用組合邏輯判斷狀態轉移條件,描述狀態轉移規律;第三個always 模塊使用同步時序電路描述每個狀態的輸出。
一般而言,推薦的 FSM 描述方法是後兩種,即兩段式和三段式FSM 描述方法。其原因為:FSM 和其他設計一樣,最好使用同步時序方式設計,以提高設計的穩定性,消除毛刺。狀態機實現後,一般來說,狀態轉移部分是同步時序電路,而狀態的轉移條件的判斷是組合邏輯。兩段式之所以比一段式編碼合理,就在於兩段式編碼將同步時序和組合邏輯分別放到不同的always 程序塊中實現。這樣做的好處不僅僅是便於閱讀、理解、維護,更重要的是利於綜合器優化代碼,利於用戶添加合適的時序約束條件,利於布局布線器實現設計。而 一段式FSM 描述不利於時序約束、功能更改、調試等,而且不能很好的表示米勒FSM 的輸出,容易寫出Latches,導致邏輯功能錯誤。
在一般兩段式描述中,為了便於描述當前狀態的輸出,很多設計者習慣將當前狀態的輸出用組合邏輯實現。 但是這種組合邏輯仍然有產生毛刺的可能性,而且不利於約束,不利於綜合器和布局布線器實現高性能的設計。因此如果設計運行額外的一個時鐘節拍的插入 (latency),則要求盡量對狀態機的輸出用寄存器寄存一拍。但是很多實際情況不允許插入一個寄存節拍,此時則可以通過三段式描述方法進行解決。三段式與兩段式相比,關鍵在於根據狀態轉移規律,在上一狀態根據輸入條件判斷出當前狀態的輸出,從而在不插入額外時鐘節拍的前提下,實現了寄存器輸出。
一段式與三段式的代碼:
zhangkunming0216/ex_FSM
推薦閱讀: