Verilog | 二进制与格雷码

格雷码是一种用于通信的循环二进制码,减少编码转换时的错误,常用于计数器和地址寻址。其特点是相邻数值间仅一位变化。文章介绍了从自然二进制码到格雷码以及反向转换的原理,并提供了一个4位格雷计数器的电路设计示例。
摘要由CSDN通过智能技术生成

一、格雷码简介

格雷码是一个叫弗兰克·格雷的人在 1953 年发明的,最初用于通信。格雷码是一种循环二进制码或者叫作反射二进制码。格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点,就可以避免二进制编码计数组合电路中出现的亚稳态。格雷码常用于通信,FIFO 或者 RAM 地址寻址计数器中。

格雷码属于可靠性编码,是一种错误最小化的编码方式,因为虽然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的 3 转换为 4 时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。

十进制自然二进制格雷码
0000000
1001001
2010011
3011010
4100110
5101111
6110101
7111100

二、转化原理

自然二进制码binary_code转换为格雷码gray_code如下:

在这里插入图片描述

g r a y _ c o d e = b i n a r y _ c o d e ⊕ ( b i n a r y _ c o d e > > 1 ) gray\_code=binary\_code⊕(binary\_code>>1) gray_code=binary_code(binary_code>>1)

格雷码gray_code转换为自然二进制码binary_code要复杂一些,以4bit码为例:

在这里插入图片描述

{ b i n a r y _ c o d e 3 = g r a y _ c o d e 3 , b i n a r y _ c o d e 2 = g r a y _ c o d e 2 ⊕ b i n a r y _ c o d e 3 = g r a y _ c o d e 2 ⊕ g r a y _ c o d e 3 , b i n a r y _ c o d e 1 = g r a y _ c o d e 1 ⊕ b i n a r y _ c o d e 2 = g r a y _ c o d e 1 ⊕ g r a y _ c o d e 2 ⊕ g r a y _ c o d e 3 , b i n a r y _ c o d e 0 = g r a y _ c o d e 0 ⊕ b i n a r y _ c o d e 1 = g r a y _ c o d e 0 ⊕ g r a y _ c o d e 1 ⊕ g r a y _ c o d e 2 ⊕ g r a y _ c o d e 3 \begin{cases}binary\_code_3=gray\_code_3,\\binary\_code_2=gray\_code_2⊕binary\_code_3=gray\_code_2⊕gray\_code_3,\\binary\_code_1=gray\_code_1⊕binary\_code_2=gray\_code_1⊕gray\_code_2⊕gray\_code_3,\\binary\_code_0=gray\_code_0⊕binary\_code_1=gray\_code_0⊕gray\_code_1⊕gray\_code_2⊕gray\_code_3\end{cases} binary_code3=gray_code3,binary_code2=gray_code2binary_code3=gray_code2gray_code3,binary_code1=gray_code1binary_code2=gray_code1gray_code2gray_code3,binary_code0=gray_code0binary_code1=gray_code0gray_code1gray_code2gray_code3

三、实现

`timescale 1ns/1ns
 
module gray_counter(
   input   clk,
   input   rst_n,
 
   output  reg [3:0] gray_out
);
//格雷码转二进制
reg  [3:0] bin_out;
wire [3:0] gray_wire;
 
always @(posedge clk or negedge rst_n)begin
   if(rst_n == 1'b0) begin
      bin_out <= 4'b0;
   end
   else begin
      bin_out[3] = gray_wire[3];
      bin_out[2] = gray_wire[2]^bin_out[3];
      bin_out[1] = gray_wire[1]^bin_out[2];
      bin_out[0] = gray_wire[0]^bin_out[1];
   end 
end
//二进制加一
reg [3:0] bin_add_wire;
always @(posedge clk or negedge rst_n)begin
   if(rst_n == 1'b0) begin
      bin_add_wire <= 4'b0;
   end
   else begin
      bin_add_wire <= bin_out + 1'b1;
   end
end
//二进制转格雷码
assign gray_wire = (bin_add_wire >> 1) ^ bin_add_wire;
 
always @(posedge clk or negedge rst_n)begin
   if(rst_n == 1'b0) begin
      gray_out <= 4'b0;
   end
   else begin
      gray_out <= gray_wire;
   end
end
endmodule
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值