二進制轉格雷碼


一、前言

  格雷碼計數器可以運用於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仿真:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM