格雷码转换电路

news2024/11/25 16:32:26

目录

格雷码转换电路

1、简介

1.2、格雷码转化为二进制码原理如下:

1.3、二进制码转化为格雷码原理如下:

2、实验任务

3、程序设计

3.1、格雷码转换二进制

3.2、二进制转换格雷码

4、仿真测试

5、仿真验证


格雷码转换电路

       格雷码,是一种二进制循环码。格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点,就可以避免二进制编码计数组合电路中出现的亚稳态。格雷码常用于通信,异步 FIFO 或者 RAM 地址寻址计数器中。

1、简介

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

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

二进制计数编码从 0 15 的计数过程如下:

       从上面的对应关系微妙可以看出,当数字从 7 变为 8 时,4 位二进制数都发生跳变,如果直接使用异步时钟采样这些数字信号,这就很可能会发生亚稳态或者数据采样错误。而采用格雷码,就可以避免 4 位二进制数都同时发生跳变,导致出现的亚稳态,就算出现亚稳态,最多也就一位出现错误。

       一般数字设计里面都是使用二进制码,那么我们想使用格雷码需要怎么转换呢?这就涉及到格雷码和二进制码互相转换的问题。我们先来看下格雷码如何转换到二进制码。

1.2、格雷码转化为二进制码原理如下:

       使用格雷码的最高位作为二进制的最高位,二进制次高位产生过程是使用二进制的高位和次高位格雷码相异或得到,其他位的值与次高位产生过程类似。假设二进制和格雷码各个位分别使用如下字符表示:

  • n 位的二进制:Bn, Bn-1, Bn-2。。。B2, B1 , B0;
  • n 位的格雷码:Gn, Gn-1, Gn-2。。。G2, G1, G0;
  • 转换公式: Bn =Gn
  •                    Bi-1 = Bi ^ Gi-1;( i=0,1,2,n-1; )

其运算过程的示意图如下图所示(这里以 8 位的数据位宽为例):

下面我们演示一个 4bit 的格雷码和二进制转换的例子

       从图中可以看出,二进制最高位和格雷码最高位相同,都是 1,次高位为二进制的高位和次高位格雷码相异或得到,即 bit2 0=1^1

介绍完格雷码如何转换到二进制后,我们再来看下二进制码如何转换到格雷码。

1.3、二进制码转化为格雷码原理如下:

        二进制的最高位作为格雷码的最高位,次高位的格雷码为二进制的高位和次高位相异或得到,其他位与次高位类似。假设二进制和格雷码各个位分别使用如下字符表示:

  • n 位的二进制:Bn, Bn-1,Bn-2。。。B2,B1,B0;
  • n 位的格雷码:Gn, Gn-1,Gn-2。。。G2,G1,G0;
  • 转换公式: Gn = Bn
  •                    Gi-1=Bi ^ Bi-1; ( i=0,1,2,n-1; )

其运算过程的示意图如下图所示(这里以 8 位的数据位宽为例):

       从图可以很容易的看出,二进制码右移 1 位后与本身异或,其结果就是格雷码。从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变。

2、实验任务

使用 Verilog 语言设计格雷码转换二进制电路和二进制转换格雷码电路。

3、程序设计

3.1、格雷码转换二进制

我们先来编写格雷码转换二进制的代码,根据简介介绍的格雷码转换二进制的思路,我们可以写出如下代码。

代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/06/20 17:15:34
// Design Name: 
// Module Name: gray_to_bin
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
//实验任务 
//使用 Verilog 语言设计格雷码转换二进制电路和二进制转换格雷码电路。

//格雷码转换二进制
module gray_to_bin(
    gray_in,
    bin_out
);

//parameter define
parameter WIDTH = 4;

input [WIDTH-1:0] gray_in;
output reg [WIDTH-1:0] bin_out;

//===================================================
// ------------------- MAIN CODE -------------------
//===================================================
always @(*) begin
    bin_out[3] = gray_in[3]; 
    bin_out[2] = gray_in[2]^bin_out[3];
    bin_out[1] = gray_in[1]^bin_out[2];
    bin_out[0] = gray_in[0]^bin_out[1];
end

endmodule

3.2、二进制转换格雷码

       我们再先来编写二进制转换格雷码的代码,根据简介介绍的二进制转换格雷码的思路,我们可以写出如下代码。

代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/06/20 17:17:23
// Design Name: 
// Module Name: bin_to_gray
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
//实验任务 
//使用 Verilog 语言设计格雷码转换二进制电路和二进制转换格雷码电路。

//二进制转换格雷码
module bin_to_gray(
   bin_in,
   gray_out
);

parameter WIDTH = 4;

input [WIDTH-1:0] bin_in;
output wire [WIDTH-1:0] gray_out;

//================================================================
// ------------------------- MAIN CODE --------------------------
//================================================================
assign gray_out = (bin_in >> 1) ^ bin_in;
// gray_out[0] = (bin_in[1]) ^ bin_in[0];
// gray_out[1] = (bin_in[2]) ^ bin_in[1];
// gray_out[2] = (bin_in[3]) ^ bin_in[2];
// gray_out[3] = (bin_in[3]) ^ 0 ;

endmodule

4、仿真测试

      下面我们编写一个 testbech 测试电路,这个 testbech 激励需要一个连续变化的二进制数,输入 a 信号持续 100ns 累加一次,我们通过仿真来看下二进制转换格雷码的波形。

测试代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/06/20 17:23:23
// Design Name: 
// Module Name: tb_test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module tb_test();

reg [3:0]    a;

wire [3:0]   y;

initial begin
     a = 4'd0;
     #100
     a = 4'd1;
     #100
     a = 4'd2;
     #100
     a = 4'd3;
     #100
     a = 4'd4;
     #100
     a = 4'd5;
     #100
     a = 4'd6;
     #100
     a = 4'd7;
     #100
     a = 4'd8;
     #100
     a = 4'd9;
     #100
     a = 4'd10;
     #100
     a = 4'd11;
     #100
     a = 4'd12;
     #100
     a = 4'd13;
     #100
     a = 4'd14;
     #100
     a = 4'd15; 
end

//二进制转换格雷码
bin_to_gray  u_bin_to_gray (
   .bin_in    (a   ),
   .gray_out  (y   )
);
     
endmodule

5、仿真验证

       测试程序在 Modelsim 或者其他仿真工具(Xilinx Vivado 软件也有仿真功能)运行后的波形如下显示,可以看出,当二进制数字依次累加的时候,都是有几个 bit 发生跳变,而格雷码每次变化都是只有 1 个bit 发生跳变,注意,这种情况只适用于二进制依次累加的时候,如果二进制变化没有任何规律,那么格雷码也可能发生多 bit 的跳变,而 FIFO 设计中的读写地址都是连续变化的,因此格雷码适用于 FIFO 的地址处理。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/667950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

推荐一款能够节省办公空间的显示器!

作为一名高校科研人员,课题组师生日常科研工作必备电子设备的维护及更新对于科研进度有着极大影响作用。近日购买了最新一代的戴尔显示器E2424HS。 以下是我的一些真实使用体验: 01 外观高端大气 拆箱前,在检查外包装没有任何破损后&#…

城市道路工程设计技术措施

为在城市道路工程建设中正确执行国家和行业有关法律、标准、规范和规程,提高工程建设质量,特制定《城市道路工程设计技术规程》(2011年版)专门编的。  本办法主要依据国家和行业有关法规、标准、规范和规程等,参照地…

Spring 是什么框架?

对于一门技术,我们需要从为什么要学、学什么以及怎么学这三个方向入手来学习。那在说Spring这三点之前,我们先看Spring之前要学什么。 Java基础、Java语法进阶、MySQL基础操作、MySQL数据库设计和多表操作、JDBC、Maven基础、MyBatis、HMLCSS、JavaScrip…

字节跳动做了3年软件测试,五月无情被辞,想给划水的兄弟提个醒

前言 先简单交代一下背景吧,某不知名 985 的本硕,20 年毕业加入字节,以“人员优化”的名义无情被裁员,之后跳槽到了有赞,一直从事软件测试的工作。之前没有实习经历,算是5年的工作经验吧。 这5年之间完成…

全网最全,Web测试点详细整理(测试场景举例+常见问题分析)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Web测试检查表 功…

go环境安装配置(windows)

下载go 安装包 官网: https://go.dev/dl/ go语言中文网: https://studygolang.com/dl 下载压缩包,解压 环境变量配置 GOROOT 配置你解压的目录 在Path中追加一条 %GOROOT%\bin 这里go对比JAVA还多了一个配置: GOPATH 配置go以…

原生微信小程序基础-分包加载自定义组件项目全流程

小程序基础-分包加载&&自定义组件 小程序分包加载 小程序分包加载-为什么要分包加载 微信平台对小程序单个包的代码体积限制为 2M,超过 2M 的情况下可以采用分包来解决即使小程序代码体积没有超过 2M 时也可以拆分成多个包来实现按需加载配置文件能忽略的…

远程控制电脑软件全方位测评,远程控制工具哪家强

*本文内容以及测试数据来自“B站” 作者:小李student 先问大家一个问题,你心目中最好的远控软件是哪个? 今天我要测评几个有意思的远控软件,他们分别是todesk 、向日葵、RayLink、parsec、其实我还测试了微软自带的远程控制,但…

用 Optaplanner 实现云资源优化:建模详解

引言 装箱问题是一个经典的计算机科学优化问题,它的目标是将一堆物品尽可能地放入一些容器中,以最小化容器数量或最大化容器利用率。在实际应用中,我们可以在物流、资源调度、计算机集群等领域看到装箱问题的应用。 问题描述 在云计算领域,装箱问题同样非常重要。比如,…

Java中关于字符串常量池的详解!!!

字符串常量池 前言1. 直接赋值法,默认从常量池中取对象2. new一个对象3. 字符串常量池、字符串对象、内部的value引用、具体的字符数组之间的关系4. 手动入池方法:intern方法 前言 Java使用 “ ” 称为字符串常量,为了提高程序的运行速度&am…

2023最新软件测试面试题【1000道题含答案】

1、自动化代码中,用到了哪些设计模式? 单例设计模式 工厂模式PO设计模式数据驱动模式面向接口编程设计模式 2、什么是断言( Assert) ? 断言Assert用于在代码中验证实际结果是不是符合预期结果,如果测试用例执行失败会抛出异常并提供断言日志 3、什么是web自动化测…

非法收集儿童数据,微软与 2000w 美元和解

文章目录 🤨 非法收集儿童数据,微软与 2000w 美元和解📈 苹果股价和 Vision Pro 一样高涨👮‍♀️ 美国证监会狙击币安和其老板赵长鹏3️⃣ 红杉资本一拆为三😮 加息出乎意料!澳洲央行对抗通胀&#x1f91c…

硬核拆解 | 拓尔微65W 2C1A氮化镓多口快充

随着身边智能设备的增多,一个充电头对应一个设备,出门需要携带多个充电器已经成为日常,有时还会忘带匹配的充电头,无法充电造成困扰...... 多口快充的出现解决了这一难题,出门仅需携带一个充电头,减轻背包…

AI智慧安监平台EasyCVR新版本v3.3如何接入V1版智能分析网关硬件?

EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流…

VFP发送公众号模板消息

公众号模板消息向用户发送重要的服务通知,比如验证码,消费通知,比如时间提醒什么的。 调用代码很简单 *--发送模板消息TEXT TO msgJson NOSHOW TEXTMERGE {"touser":"oljsK6OgHA9ftJxuCUWg7cFylj6Y","template_id&…

Godot 4 源码分析 - Project Manager

简单来说,Godot 4一共有三种运行模式:工程管理、编辑、运行 有点意思的是,每次调试,只能在其中一种模式下运行 如果同时配置了编辑器与工程管理器,则会报错: if (editor && project_manager) {O…

uni-app uni-forms组件的表单验证

前言 最近使用uni-app开发时,在使用加强表单时,使用表单验证的过程和PC端的区别uni-app文档说如果要使用自定义表单验证是需要去掉form中:rules"rules",使用ref绑定但最终我使用validateFunction 自定义校验规则,使用上面2种方式都…

音质更进一步,更耐用的骨传导耳机,南卡Runner Pro 4S上手

骨传导耳机是一种非常适合户外使用的耳机,很多喜欢运动的朋友都会配备一副,户外健身的时候会一直戴着。这种耳机使用时不入耳,通过震动颧骨来传递声音,不影响我们和别人的正常交流,户外也可以清楚感知车流、鸣笛的声音…

专业小程序开发平台 教你如何开发点餐小程序

今天小编借助在线工具乔拓云,只需借助在线模板和无编程开发工具,轻松实现点餐小程序开发和管理,下面跟着小编的教程一起学习,如何使用乔拓云工具开发专属的外卖点餐订餐小程序平台。 像这样一个点餐外卖小程序只需一个模板无编程就…

Java多线程与并发-原理

1、synchronized 线程安全问题的主要诱因 存在共享数据(也称临界资源)。存在多条线程共同操作这些共享数据。 解决问题的根本方法: 同一时刻有且只有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后再对共享数据进…