【异步FIFO】格雷码和二进制的相互转换

这个东西一直记得乱乱的 格雷码转二进制只会铺开写 理一下

1、基本原理:

(1)二进制转格雷码:

格雷码最高位是二进制最高位,然后将二进制最高位和次高位做^

或者简单点 在二进制前补一个0,从左到右与二进制^

(2)格雷码转二进制:

二进制最高位是格雷码最高位,然后将二进制最高位和格雷码次高位做^

或者简单点 在二进制前补一个0,从左到右与格雷码^

2、代码:

(1)二进制转格雷码:

module bin2gray
#(
    parameter DW = 8 
)(
    input  [DW - 1:0]  bin ,
    output [DW - 1:0]  gray

);

assign gray = (bin >> 1) ^ bin; 

endmodule

(2)格雷码转二进制:

module gray2bin
#(
    parameter DW = 8 
)(
    input      [DW - 1:0]  gray ,
    output reg [DW - 1:0]  bin

);

integer i;
always@(*)begin
    for(i = 0;i < DW ;i = i + 1)begin
        bin[k] = ^(gray >> k); 
    end
end

endmodule

放一段代码这,用于参考:

/*Logic to convert binary numbers into Gray coded binary numbers is implemented in the following Verilog Code.
*/
module binary2gray();
reg clk;
reg rstn;
reg [5:0] counter_binary, counter_binary_reg, counter_gray, counter_gray_reg;
integer count, file_wr;

/* Initial block to generate clock and reset */ 
initial  begin
    clk = 0; rstn = 0;  #100 rstn = 1;
    forever begin
        #10 clk = !clk; 
 end end    

/* Synchronous Logic for registering the data and incrementing the counter for binary data */
always @ (posedge clk or negedge rstn)
begin
    if (!rstn) begin
        counter_binary_reg <= 'b0;
        counter_gray_reg <= 'b0;  end
    else begin 
        counter_binary_reg <= counter_binary + 1;
        counter_gray_reg <= counter_gray;
        $display("binary number= 6'b%b : gray en-coded binary number = 6'b%b", counter_binary_reg, counter_gray_reg);   end end

/* Logic is to get Gray code from Binary code */
function[5:0] binary2gray ;
    input[5:0] value;
    integer i;
    begin 
        binary2gray[5] = value[5];
        for (i=5; i>0; i = i - 1)
            binary2gray[i-1] = value[i] ^ value[i - 1];
    end
endfunction

/* Get gray encoded output */
always @(*)
begin 
  counter_gray = counter_gray_reg;
  counter_binary = counter_binary_reg;
  counter_gray = binary2gray(counter_binary_reg); end
endmodule

参考:

Verilog 中的 ^ 的用法_李锐博恩的博客-CSDN博客_^ verilog

进阶之路——二进制与格雷码的相互转换模块设计_尼德兰的喵的博客-CSDN博客_格雷码转二进制电路图

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值