天天看點

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

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

     先看看這三種編碼的定義

二進制碼

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

格雷碼

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

獨熱碼

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

下面看看十進制數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中顯示波形如下:

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

展開二進制碼波形

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

二進制碼用3個bit可以表示出十進制數0---7,消耗的觸發器比較少,每次數字變化時,狀态位會出現多位同時變化。

展開獨熱碼波形

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

獨熱碼用8個bit來表示十進制數0---7,也就是說用一個bit的高電平來表示一個數字,每次數字發生變化時,狀态位2位同時變化。

bit[0]為高電平代表數字1,bit1[1]為高電平代表數字2,bit[2]為高電平代表數字3,依次類推。

展開格雷碼波形

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

格雷碼用3個bit來表示十進制數0---7,每次數字發生變化時,狀态位隻有一位發生變化。

展開全部波形

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

下面分析一個這三種編碼在數字變化時,狀态變化情況。

二進制碼

二進制碼由001變化到010時,變化波形如下:

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

此時bit[1]由低電平變為高電平,bit[0]由高電平變為低電平。理想情況下bit[0]和bit[1]同時跳變,但是在實際電路中會存在延時,那麼bit[0]和bit[1]跳變時有先後順序,假如bit[0]由高電平變為低電平後,bit[1]延遲了一段時間才由低電平變為高電平。

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

那麼在bit[1]延時的這點時間内,bit[0]和bit[1]就會同時為低電平,那麼輸出的資料就會變成3'b000,這個0在電路中就相當于一個毛刺。

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

假如bit[1]由低電平變為高電平後,bit[0]延時了一段時間才由高電平變為了低電平,那麼在bit[0]延時的這段時間内,輸出資料就會變成3'b011,如果系統響應速度非常快的話,那麼在數字1到2跳變時,就會出現一次3。造成代碼中的邏輯錯誤。

獨熱碼

獨熱碼數字由2、3變化時,bit[1]由高電平變為低電平,bit[2]由低電平變為高電平。

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

在由數字2變為數字3時,理想情況下bit[2]和bit[3]要同時變化,但是在實際電路中存在延時。bit[2]和bit[3]電平變化時會有先後順序。

假如bit[2]由低電平變為高電平後,bit[1]延遲了一段時間才由高電平變為低電平。

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

這樣在很短的一段時間内就會出現bit[1] 和bit[2]同時為高電平的情況,根據獨熱碼的特點,為高電平時代表資料有效,那麼在這段時間内說明數字2和3同時有效。如果系統反應速度比較快的話,就會導緻邏輯上的錯誤。相當于電路中出現了毛刺。

格雷碼

格雷碼在數字變化時,相鄰兩個數字之間每次隻會有一個bit位的電平發生改變

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

由圖上可以看書,數字1、2、3變化時,每次隻有一個bit的電平發生改變,這樣在實際電路中,bit電平變化時就算存在延時,也不會出現在數字變化過程中出現其他數字,造成程式邏輯或者時序上的錯誤。也就是說格雷碼可以避免電路産生毛刺。

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

二進制編碼:

    優點:屬于壓縮狀态編碼,使用的觸發器位數少,可以直接比較大小和算術運算。

    缺點:譯碼複雜;相鄰狀态變換時,多位發生改變,電噪聲大,轉換速度較慢,易出錯;

獨熱碼:

    優點:狀态比較時僅僅需要比較一個位,進而一定程度上簡化了譯碼邏輯,譯碼簡單,減少了毛刺産生的機率。

    缺點:速度較慢,觸發器資源占用較多,面積較大;

格雷碼:

    優點:屬于壓縮狀态編碼,使用的觸發器位數少;相鄰狀态變換時,僅一位發生改變,電噪聲小,轉換速度較快;

    缺點:譯碼複雜,沒有固定大小,很難直接進行比較大小和算術運算,需要轉換為自然二進制碼來判斷。

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

繼續閱讀