在Verilog學習中常用的編碼方式有二進制編碼(Binary)、格雷碼(Gray-code)編碼、獨熱碼(One-hot)編碼,對于新手來說,搞不清楚編碼為什麼要分這麼多格式?統一用一種格式不好嗎?那麼現在就來看看這三種編碼的差別和應用。
先看看這三種編碼的定義
二進制碼
格雷碼
獨熱碼
下面看看十進制數0---7用三種編碼如何表示
十進制數 | 二進制 | 獨熱碼 | 格雷碼 |
3’b000 | 8’b0000_0001 | 3’b000 | |
1 | 3’b001 | 8’b0000_0010 | 3’b001 |
2 | 3’b010 | 8’b0000_0100 | 3’b011 |
3 | 3’b011 | 8’b0000_1000 | 3’b010 |
4 | 3’b100 | 8’b0001_0000 | 3’b110 |
5 | 3’b101 | 8’b0010_0000 | 3’b111 |
6 | 3’b110 | 8’b0100_0000 | 3’b101 |
7 | 3’b111 | 8’b1000_0000 | 3’b100 |
在Modelsim中顯示波形如下:
展開二進制碼波形
二進制碼用3個bit可以表示出十進制數0---7,消耗的觸發器比較少,每次數字變化時,狀态位會出現多位同時變化。
展開獨熱碼波形
獨熱碼用8個bit來表示十進制數0---7,也就是說用一個bit的高電平來表示一個數字,每次數字發生變化時,狀态位2位同時變化。
bit[0]為高電平代表數字1,bit1[1]為高電平代表數字2,bit[2]為高電平代表數字3,依次類推。
展開格雷碼波形
格雷碼用3個bit來表示十進制數0---7,每次數字發生變化時,狀态位隻有一位發生變化。
展開全部波形
下面分析一個這三種編碼在數字變化時,狀态變化情況。
二進制碼
二進制碼由001變化到010時,變化波形如下:
此時bit[1]由低電平變為高電平,bit[0]由高電平變為低電平。理想情況下bit[0]和bit[1]同時跳變,但是在實際電路中會存在延時,那麼bit[0]和bit[1]跳變時有先後順序,假如bit[0]由高電平變為低電平後,bit[1]延遲了一段時間才由低電平變為高電平。
那麼在bit[1]延時的這點時間内,bit[0]和bit[1]就會同時為低電平,那麼輸出的資料就會變成3'b000,這個0在電路中就相當于一個毛刺。
假如bit[1]由低電平變為高電平後,bit[0]延時了一段時間才由高電平變為了低電平,那麼在bit[0]延時的這段時間内,輸出資料就會變成3'b011,如果系統響應速度非常快的話,那麼在數字1到2跳變時,就會出現一次3。造成代碼中的邏輯錯誤。
獨熱碼
獨熱碼數字由2、3變化時,bit[1]由高電平變為低電平,bit[2]由低電平變為高電平。
在由數字2變為數字3時,理想情況下bit[2]和bit[3]要同時變化,但是在實際電路中存在延時。bit[2]和bit[3]電平變化時會有先後順序。
假如bit[2]由低電平變為高電平後,bit[1]延遲了一段時間才由高電平變為低電平。
這樣在很短的一段時間内就會出現bit[1] 和bit[2]同時為高電平的情況,根據獨熱碼的特點,為高電平時代表資料有效,那麼在這段時間内說明數字2和3同時有效。如果系統反應速度比較快的話,就會導緻邏輯上的錯誤。相當于電路中出現了毛刺。
格雷碼
格雷碼在數字變化時,相鄰兩個數字之間每次隻會有一個bit位的電平發生改變
由圖上可以看書,數字1、2、3變化時,每次隻有一個bit的電平發生改變,這樣在實際電路中,bit電平變化時就算存在延時,也不會出現在數字變化過程中出現其他數字,造成程式邏輯或者時序上的錯誤。也就是說格雷碼可以避免電路産生毛刺。
通過上面對三種編碼的分析,可以總結出這三種編碼的優缺點。
二進制編碼:
優點:屬于壓縮狀态編碼,使用的觸發器位數少,可以直接比較大小和算術運算。
缺點:譯碼複雜;相鄰狀态變換時,多位發生改變,電噪聲大,轉換速度較慢,易出錯;
獨熱碼:
優點:狀态比較時僅僅需要比較一個位,進而一定程度上簡化了譯碼邏輯,譯碼簡單,減少了毛刺産生的機率。
缺點:速度較慢,觸發器資源占用較多,面積較大;
格雷碼:
優點:屬于壓縮狀态編碼,使用的觸發器位數少;相鄰狀态變換時,僅一位發生改變,電噪聲小,轉換速度較快;
缺點:譯碼複雜,沒有固定大小,很難直接進行比較大小和算術運算,需要轉換為自然二進制碼來判斷。
在實際應用中,根據自己系統情況,選擇适合自己的編碼方式。