Verilog中狀態機編碼方式的選擇——FSM有限狀態機——二進制編碼(Binary)、格雷碼(Gray-code)編碼、獨熱碼(One-hot)編碼

本文轉載自:Verilog中狀態機編碼方式的選擇

文章很不錯,看到幾篇轉載此文章的,但是都沒有標明出處,我能找到的最早的文章是2012年博主“一個人遊”的文章,轉載至此,如有其他原創請聯繫博主修改或刪除此博客。

在Verilog中最常用的編碼方式有二進制編碼(Binary)、格雷碼(Gray-code)編碼、獨熱碼(One-hot)編碼。

二進制碼和格雷碼是壓縮狀態編碼。 若使用格雷編碼,則相鄰狀態轉換時只有一個狀態位發生翻轉,這樣不僅能消除狀態轉換時由多條狀態信號線的傳輸延遲所造成的毛刺,又可以降低功耗。

二進制編碼也可稱連續編碼,也就是碼元值的大小是連續變化的。如S0=3’d0,S1=3’d1,S2=3’d2,S3=3’d3…

格雷碼的相鄰碼元值間只有一位是不同的,如S0=3’b000,S1=3’b001,S2=3’b011,S3=3’b010…

獨熱編碼即 One-Hot 編碼,又稱一位有效編碼,其方法是使用N位狀態寄存器來對N個狀態進行編碼,每個狀態都由他獨立的寄存器位,並且在任意時候,其中只有一位有效。雖然使用較多的觸發器,但由於狀態譯碼簡單,可減少組合邏輯且速度較快, 這種編碼方式還易於修改,增加狀態或改變狀態轉換條件都可以在不影響狀態機的其它部分的情況下很方便地實現。另外,它的速度獨立於狀態數量。與之相比,壓縮狀態編碼在狀態增加時速度會明顯下降。
獨熱碼值每個碼元值只有一位是’1’,其他位都是’0’,如S0=3’b001,S1=3’b010,S2=3’b100

二進制編碼、格雷碼編碼使用最少的觸發器,消耗較多的組合邏輯,而獨熱碼編碼反之。獨熱碼編碼的最大優勢在於狀態比較時僅僅需要比較一個位,從而一定程度上簡化了譯碼邏輯。雖然在需要表示同樣的狀態數時,獨熱編碼佔用較多的位,也就是消耗較多的觸發器,但這些額外觸發器佔用的面積可與譯碼電路省下來的面積相抵消。

爲了進一步提高獨熱編碼的速度,可以使用並行 CASE語句"即在case(1‘b1) 後添加綜合器可以辨認的並行CASE註釋語句。注意:並行CASE 只推薦在獨熱編碼時使用,在二進制編碼和格雷編碼時使用有時反而會增大面積降低速度。

在CPLD中,由於器件擁有較多的地提供組合邏輯資源,所以CPLD多使用二進制編碼或格雷碼,而FPGA更多地提供觸發器資源,所以在FPGA中多使用獨熱碼編碼。當然,這並不是說在FPGA中就非得用獨熱編碼,在CPLD中不能用獨熱編碼,一般的,對於小型設計(狀態數小於4)使用二進制編碼,當狀態數處於4-24之間時,宜採用獨熱碼編碼,而大型狀態機(狀態數大於24)使用格雷碼更高效。

在設計狀態機時有幾種狀態編碼方法:二進制,格雷碼(gray)和獨熱碼(one hot code)。他們各有各的優點

獨熱 格雷 二進制
4’b0001 2’b00 2‘b00
4’b0010 2’b01 2’b01
4’b0100 2’b11 2‘b10
4’b1000 2’b10 2’b11

one hot,獨熱嘛,一看就明白,就是隻有一位是高電平。獨熱碼 使用的觸發器較多,但可減少實現狀態機的組合邏輯數目,減少複雜性,提高系統的速度,即工作時鐘頻率可以做到最高。格雷碼是使用最小數目的觸發器來編碼狀態機,但形成的組合邏輯比較複雜。使用獨熱碼編碼時,會出現很多未使用的狀態,而使用二進制編碼和格雷碼編碼時,如果狀態機的狀態數不是2的指數次方時,也會出現未使用狀態。格雷碼每個相鄰的狀態切換隻有一個bit的信號跳變,適用於異步握手的情況,比如異步FIFO的指針計數。

這個是參考別人的內容

在數字邏輯設計中最常用的有三種編碼方式:二進制,格雷碼 Gray,獨熱編碼One-hot One hot
編碼使用一組碼元,每一個碼元僅有1bit有效,例如
IDLE = 0001,
WRITE = 0010,
READ = 0100,
WAIT = 1000
這種編碼的譯碼部分可以最簡,因此可以總結出One-hot編碼的特點:
組合邏輯最少,觸發器最多,工作時鐘頻率可以做到最高。
FPGA的一個最小結構單元(CLB/LE)中含有查找表(實現組合邏輯)和DFF(實現時序邏輯),佈局佈線最好的結果是同一個結構單元中的查找表和DFF都使用,但是大部分情況是僅使用其中一種資源,這樣另外的資源就是閒置而浪費。而CPLD中DFF資源本來就很少,由此可見One-hot編碼更適合於FPGA設計,而不適合CPLD設計,在CPLD中應該選擇二進制編碼。
IC設計中,應該綜合考慮。因爲One-hot編碼使用DFF會大大增加設計面積(die
size),因此在時序可以滿足的條件下儘可能使用二進制編碼。就面積與速度的折中考慮來說Gray碼是最好的選擇,當然Gray碼還有其他很多好的特性,暫時不屬於這次討論的範疇。一般的綜合工具對狀態機進行綜合時都可以讓用戶對這三種編碼進行選擇。基本依據就以上所說。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章