格雷码的FPGA实现
1. 格雷碼定義
???????? 在一組數的編碼中,若任意兩個相鄰的代碼只有一位二進制數不同,則稱這種編碼為格雷碼(Gray Code),另外由于最大數與最小數之間也僅一位數不同,即“首尾相連”,因此又稱循環碼或反射碼。
2. 轉換方法
(1)遞歸查表法
???????? 1位格雷碼有2個碼字:0和1;
???????? (n+1)位格雷碼中的前2^n(2的N次方)個字碼等于n位格雷碼的碼字,按順序書寫,加前綴0;
(n+1)位格雷碼中的后2^n(2的N次方)個字碼等于n位格雷碼的碼字,但按逆序書寫,加前綴1;
2)異或轉換
???????? 二進制碼→格雷碼(編碼,i為bit位數):
????????
???????? 格雷碼→二進制碼(解碼,i為bit位數):
(3)卡諾圖
???????? 三位格雷碼與四位格雷碼:
???????
(4)異或乘除法
異或乘除法沒有借位和進位
編碼:異或乘3后右移1位。
解碼:左移異或除3,忽略余數
3. 實現方法
???????? 程序采用遞歸循環查表法,FPGA多采用異或轉換
(1)二進制轉格雷碼
FPGA代碼:
//================================================================ // Filename : bin2gray.v // Created On : 2017-05-14 16:54:30 // Last Modified : 2017-05-14 16:55:14 // Author : ChrisHuang // Description : Converting Gray Code to Binary //================================================================`timescale 1ns/1psmodule bin2gray #(parameter pDataWidth = 4 ) (input [pDataWidth-1:0] iBinary,output [pDataWidth-1:0] oGrayCode );assign oGrayCode = (iBinary >> 1) ^ iBinary;endmodule testbench代碼://================================================================ // Filename : bin2gray_tb.v // Created On : 2017-05-14 16:54:30 // Last Modified : 2017-05-14 16:55:14 // Author : ChrisHuang // Description : test Converting Gray Code to Binary //================================================================`timescale 1ns/1psmodule bin2gray_tb();reg rClk; reg [3:0] rBinary; wire [3:0] wGray;initial beginrClk = 0;rBinary = 4'b0;#500 $stop; endalways #10 rClk = ~rClk;always @ (posedge rClk) beginrBinary <= rBinary + 1'b1; endbin2gray #(4) i1 (.iBinary (rBinary ),.oGrayCode (wGray ) );endmodule 仿真結果波形:
(2)格雷碼轉二進制
???????? FPGA代碼:
//================================================================ // Filename : gray2bin.v // Created On : 2017-05-14 21:22:30 // Last Modified : 2017-05-14 21:23:14 // Author : ChrisHuang // Description : Converting Gray Code to Binary //================================================================`timescale 1ns/1psmodule gray2bin #(parameter pDataWidth = 4 ) (input [pDataWidth-1:0] iGrayCode,output [pDataWidth-1:0] oBinary );reg [pDataWidth-1:0] rBinary;always @ (iGrayCode) beginrBinary[3] = iGrayCode[3];rBinary[2] = iGrayCode[2] ^ rBinary[3];rBinary[1] = iGrayCode[1] ^ rBinary[2];rBinary[0] = iGrayCode[0] ^ rBinary[1]; endassign oBinary = rBinary;endmodule testbench代碼://================================================================ // Filename : gray2bin_tb.v // Created On : 2017-05-14 21:22:30 // Last Modified : 2017-05-14 21:23:14 // Author : ChrisHuang // Description : Converting Gray Code to Binary //================================================================`timescale 1ns/1psmodule gray2bin_tb();`include "bin2gray.v"reg rClk; reg [3:0] rBinary; wire [3:0] wGray; wire [3:0] wBinary;initial beginrClk = 0;rBinary = 4'b0;#500 $stop; endalways #10 rClk = ~rClk;always @ (posedge rClk) beginrBinary <= rBinary + 1'b1; endbin2gray #(4) i1 (.iBinary (rBinary ),.oGrayCode (wGray ) );gray2bin #(4) i2 (.iGrayCode (wGray ),.oBinary (wBinary ) );endmodule 仿真結果:
參考:
http://www.cnblogs.com/logic3/p/5609919.html
http://blog.csdn.net/beiyeqingteng/article/details/7044471
http://baike.baidu.com/link?url=rNvrOCbvcfcU3T_zsJVAjTimZmICXlvFDZZIn-V8W5bBE4vTPlgYM50CyOIZfFZSGmwB1tskkgRAhUKvtAGR6UUp2TwrPVP9PgQ5tSiyPRvO-OjOhKVFviAGnv0azViO
總結
以上是生活随笔為你收集整理的格雷码的FPGA实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信jssdk开发 java_Java微
- 下一篇: 【python】错误、异常和文件---复