一、前言
格雷码计数器可以运用于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仿真: