格雷码与二进制码的相互转换(verilog)

1.什么是格雷码?

        格雷码是由弗兰克·格雷于1953年发明的,最初是以发明专利的形式出现。格雷码的主要特点是相邻编码值中只有一个比特发生变化(任意两个相邻的代码只有一位二进制数不同),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码反射码

        在数字系统中,常要求代码按一定顺序变化。例如,按自然数递增计数,若采用8421码,则数0111变到1000时四位均要变化,而在实际电路中,4位的变化不可能绝对同时发生,则计数中可能出现短暂的其它代码(1100、1111等)。在特定情况下可能导致电路状态错误或输入错误。使用格雷码可以避免这种错误。(来源百度百科)

        这些特点使得格雷码有着非常广泛的应用,比如在数字电路设计中被应用于两个不同时钟域的异步fifo中,此时单比特翻转的特性就变得极为重要,如下图所示(图片来源于verilog高级数字系统设计技术与实例分析)。

2.二进制转换为格雷码

2.1转换方法

        保留二进制码的最高位作为格雷码的最高位,而次高位格雷码的值为二进制的高位与次高位想异或的结果。如下链接里面有更为直观的图片,便于理解:格雷码与二进制的转换_格雷码与二进制码的互转_探花郎K的博客-CSDN博客

2.2 二进制转格雷码代码和仿真设计

设计源码

module btgray#(parameter PTR = 8)(
input   [PTR-1:0] binary_value,
output  [PTR-1:0] gray_value
    );
genvar i;
generate
    for(i=0;i<(PTR-1);i=i+1) begin
        assign gray_value[i] = binary_value[i]^binary_value[i+1];
    end    
endgenerate
       assign gray_value[PTR-1] = binary_value[PTR-1];
    
endmodule

testbench编写

`timescale 1ns / 1ps
module tb_btgray(    );
reg [7:0] binary_value;
wire [7:0] gray_value ;
initial begin
binary_value = 'b0;
#100;
binary_value = 8'b11001010;

end  

btgray u_tbgray(
.binary_value(binary_value),
.gray_value(gray_value)
);
endmodule

仿真波形

3.格雷码转换为二进制

3.1转换方法

        同样是保留格雷码的最高位作为二进制码的最高位,而次高位二进制码的值为高位二进制码与次高位格雷码异或的值。

3.2格雷码转二进制代码和仿真设计

设计源码

module graytb#(parameter PTR = 8)( 
input  [PTR-1:0] gray_value,
output [PTR-1:0] binary_value
 );
 genvar i;
 generate 
 for(i=0;i<(PTR-1);i=i+1)
    begin
        assign binary_value[i] = binary_value[i+1]^gray_value[i];
    end
 endgenerate 
        assign binary_value[PTR-1] = gray_value[PTR-1];
endmodule

testbench编写

module tb_grayt();
reg [7:0] gray_value;
wire [7:0] binary_value;
initial begin
gray_value ='b0;
#100;
gray_value = 8'b10011100;
end
graytb u_graytb(
.gray_value(gray_value),
.binary_value(binary_value)
);
endmodule

仿真波形

参考文献:

verilog高级数字系统设计技术与实例分析

格雷码与二进制的转换_格雷码与二进制码的互转_探花郎K的博客-CSDN博客

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
格雷码与普通二进制码可以按照以下方法进行互相转换。对于格雷码转换成普通二进制码,可以按照以下步骤进行: 1. 从左边第二位起,将每一位格雷码与左边一位解码后的值异或,作为该位解码后的值(最左边一位保持不变)。 2. 重复上述步骤,直到解码完所有位数。 而对于普通二进制码转换成格雷码,可以按照以下步骤进行: 1. 从最右边一位起,依次将每一位与左边一位异或,作为对应格雷码该位的值,最左边一位保持不变(相当于左边是0)。 2. 重复上述步骤,直到编码完所有位数。 这样就可以实现格雷码与普通二进制码的互相转换。 #### 引用[.reference_title] - *1* *2* [格雷码与普通二进制码相互转换——学习笔记](https://blog.csdn.net/I_LOVE_MCU/article/details/126822306)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [格雷码二进制码转换](https://blog.csdn.net/weixin_30765577/article/details/97881995)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值