在Verilog學習中常用的編碼方式有二進制編碼(Binary)、格雷碼(Gray-code)編碼、獨熱碼(One-hot)編碼,對於新手來說,搞不清楚編碼爲什麼要分這麼多格式?統一用一種格式不好嗎?那麼現在就來看看這三種編碼的區別和應用。
先看看這三種編碼的定義
二進制碼
格雷碼
獨熱碼
下面看看十進制數0---7用三種編碼如何表示
十進制數 |
二進制 |
獨熱碼 |
格雷碼 |
0 |
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電平變化時就算存在延時,也不會出現在數字變化過程中出現其他數字,造成程序邏輯或者時序上的錯誤。也就是說格雷碼可以避免電路產生毛刺。
通過上面對三種編碼的分析,可以總結出這三種編碼的優缺點。
二進制編碼:
優點:屬於壓縮狀態編碼,使用的觸發器位數少,可以直接比較大小和算術運算。
缺點:譯碼複雜;相鄰狀態變換時,多位發生改變,電噪聲大,轉換速度較慢,易出錯;
獨熱碼:
優點:狀態比較時僅僅需要比較一個位,從而一定程度上簡化了譯碼邏輯,譯碼簡單,減少了毛刺產生的概率。
缺點:速度較慢,觸發器資源佔用較多,面積較大;
格雷碼:
優點:屬於壓縮狀態編碼,使用的觸發器位數少;相鄰狀態變換時,僅一位發生改變,電噪聲小,轉換速度較快;
缺點:譯碼複雜,沒有固定大小,很難直接進行比較大小和算術運算,需要轉換爲自然二進制碼來判斷。
在實際應用中,根據自己系統情況,選擇適合自己的編碼方式。