FPGA學習筆記---二進制碼、獨熱碼、格雷碼分析對比

       在Verilog學習中常用的編碼方式有二進制編碼(Binary)、格雷碼(Gray-code)編碼、獨熱碼(One-hot)編碼,對於新手來說,搞不清楚編碼爲什麼要分這麼多格式?統一用一種格式不好嗎?那麼現在就來看看這三種編碼的區別和應用。

     先看看這三種編碼的定義

二進制碼

格雷碼

   

獨熱碼

下面看看十進制數0---7用三種編碼如何表示

十進制數

二進制

獨熱碼

格雷碼

0

3b000

8b0000_0001

3b000

1

3b001

8b0000_0010

3b001

2

3b010

8b0000_0100

3b011

3

3b011

8b0000_1000

3b010

4

3b100

8b0001_0000

3b110

5

3b101

8b0010_0000

3b111

6

3b110

8b0100_0000

3b101

7

3b111

8b1000_0000

3b100

在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電平變化時就算存在延時,也不會出現在數字變化過程中出現其他數字,造成程序邏輯或者時序上的錯誤。也就是說格雷碼可以避免電路產生毛刺。

通過上面對三種編碼的分析,可以總結出這三種編碼的優缺點。

二進制編碼:
    優點:屬於壓縮狀態編碼,使用的觸發器位數少,可以直接比較大小和算術運算。
    缺點:譯碼複雜;相鄰狀態變換時,多位發生改變,電噪聲大,轉換速度較慢,易出錯;

獨熱碼:
    優點:狀態比較時僅僅需要比較一個位,從而一定程度上簡化了譯碼邏輯,譯碼簡單,減少了毛刺產生的概率。
    缺點:速度較慢,觸發器資源佔用較多,面積較大;

格雷碼:
    優點:屬於壓縮狀態編碼,使用的觸發器位數少;相鄰狀態變換時,僅一位發生改變,電噪聲小,轉換速度較快;
    缺點:譯碼複雜,沒有固定大小,很難直接進行比較大小和算術運算,需要轉換爲自然二進制碼來判斷。

在實際應用中,根據自己系統情況,選擇適合自己的編碼方式。

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