一、前言
格雷碼計數器可以運用於FIFO中。格雷碼計數器的優勢在於其相鄰兩個數值之間只有一位發生變化,提高了系統的抗干擾能力,而且在計數時,各個輸出的門電路翻轉次數要遠遠小於二進制計數器,從而可以大幅度的降低系統的功耗。
二、二進制轉格雷碼的原理
由表可知,格雷碼相鄰兩個數之間只有一位會改變。
數學原理:
格雷碼的最高位和二進制的最高位保持不變,然后二進制的最高位和次高位相異或得到格雷碼的次高位,其他各位依次類推。
三、代碼實現

1 // ********************************************************************************* 2 // Project Name : bin_gray 3 // Email : 4 // Create Time : 2020/07/22 10:46 5 // Module Name : bin_gray 6 // editor : L 7 // Version : Rev1.0.0 8 // ********************************************************************************* 9 10 module bin_gray( 11 input sclk, 12 input s_rst_n, 13 input en, 14 output reg [7:0] gray_out 15 ); 16 17 reg [7:0] cnt; 18 19 always @(posedge sclk or negedge s_rst_n) begin 20 if(!s_rst_n) begin 21 cnt <= 0; 22 end 23 else if(en) begin 24 cnt <= cnt + 1'b1; 25 end 26 else begin 27 cnt <= cnt; 28 end 29 end 30 31 always @ (posedge sclk or negedge s_rst_n) begin 32 if(s_rst_n == 1'b0) 33 gray_out <= 0; 34 else 35 gray_out <= cnt ^ (cnt >> 1); 36 end 37 38 endmodule
testbench:

1 // ********************************************************************************* 2 // Project Name : bin2gray 3 // Email : 4 // Create Time : 2020/07/24 9:25 5 // Module Name : bin2gray_tb 6 // editor : L 7 // Version : Rev1.0.0 8 // ********************************************************************************* 9 10 module bin2gray_tb; 11 reg sclk ; 12 reg s_rst_n ; 13 reg en ; 14 wire [7:0] gray_out ; 15 16 bin_gray bin2gray_inst( 17 .sclk (sclk ), 18 .s_rst_n (s_rst_n ), 19 .en (en ), 20 .gray_out (gray_out ) 21 ); 22 23 initial 24 sclk = 1'b0; 25 always #10 sclk = ~sclk; 26 27 initial 28 begin 29 #1; 30 en = 1'b0; 31 s_rst_n = 1'b0; 32 #21; 33 s_rst_n = 1'b1; 34 #21; 35 en = 1'b1; 36 #500 37 en = 1'b0; 38 end 39 40 endmodule
Modelsim仿真: