1. 程式人生 > 實用技巧 >二進位制轉格雷碼

二進位制轉格雷碼

一、前言

  格雷碼計數器可以運用於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
View Code

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    
View Code

Modelsim模擬: