FPGA 设计算法篇 —— 格雷码编解码原理及实现
前言:在這篇文章中FPGA 設計時序篇 —— 跨時鐘域問題及解決方法提到格雷碼在跨時鐘域的應用,本篇作為對該篇文章的補充,詳細介紹格雷碼的編解碼原理及語法實現。
一、格雷碼簡介
格雷碼,即 Gray code。由于自然二進制碼在相鄰數據之間可能存在多個bit的變化,比如8和7對應的4bit二進制碼分別為:1000,0111,當寄存器的輸出在這兩個數據簡跳轉的時候,寄存器的每一位都會發生變化,從而造成不穩定態。
為了解決上面的問題,出現了格雷碼編碼規則。在格雷碼中,所有相鄰兩數據的二進制表示中只有一位不同。下表為 4bit 自然二進制碼,格雷碼對應關系。
| 0 | 0000 | 0000 |
| 1 | 0001 | 0001 |
| 2 | 0010 | 0011 |
| 3 | 0011 | 0010 |
| 4 | 0100 | 0110 |
| 5 | 0101 | 0111 |
| 6 | 0110 | 0101 |
| 7 | 0111 | 0100 |
| 8 | 1000 | 1100 |
| 9 | 1001 | 1101 |
| 10 | 1010 | 1111 |
| 11 | 1011 | 1110 |
| 12 | 1100 | 1010 |
| 13 | 1101 | 1011 |
| 14 | 1110 | 1001 |
| 15 | 1111 | 1000 |
二、格雷碼編、解碼方法
1.編碼:將自然二進制碼轉化為格雷碼。方法是從自然二進制碼的最低位起,將每一bit位 與 左邊bit位進行異或運算,最高位不變,公式如下:
2.解碼:將格雷碼轉化為自然二進制碼。方法是從格雷碼的左邊第二位起,將每一bit位 與 左邊解碼后的bit位進行異或運算,最高位不變,公式如下:
三、格雷碼語法實現
原理方法如上述,但怎樣才能在語法中快速實現呢?
1.首先看編碼,實際也就是將自然二進制碼A向右移一位變成B(右移后高位補0),再將A與B進行以異或運算,而異或運算在FPGA中是最基本的運算,非常容易實現。
接下來分析一下:右移后最高位是否能實現算法。前面提到,編碼時最高位保持不變,B的最高位現在為0,當A的最高位為0時,0與0異或的結果為0,滿足最高位保持不變;當A的最高位為1時,1與0異或的結果為1,滿足最高位保持不變。
奈斯!
代碼如下:
module Bin2Gray #( parameter DataWidth = 4 ) ( input [DataWidth-1:0] iBinary,output [DataWidth-1:0] oGraycode );assign oGraycode = (iBinary >> 1) ^ iBinary;endmodule2.接著看解碼
module Bin2Gray #( parameter DataWidth = 8 ) ( input [DataWidth-1:0] iGraycode,output [DataWidth-1:0] oBinary );assign oBinary = { iGraycode[7],^iGraycode[7:6],^iGraycode[7:5],^iGraycode[7:4],^iGraycode[7:3],^iGraycode[7:2],^iGraycode[7:1],^iGraycode[7:0], };endmodule這里牽涉到一元約簡運算,需要注意下。
總結
以上是生活随笔為你收集整理的FPGA 设计算法篇 —— 格雷码编解码原理及实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Python3.7和Python3.
- 下一篇: tornado学习笔记day03-响应输