二进制与格雷码之间的转换的Verilog实现(更多一点的讨论)
目录
前言
二进制码转换为格雷码的方法
格雷码转换为二进制码的过程
更多一点讨论之generate for
更多一点讨论之for
最后对格雷码的介绍
前言
以前的博客也有写这方面的内容,只是没有显式的命名,导致查找复习的时候并不能立即找到,这里单独成立一篇,记录与此,方便你我他。
这篇博客来自于FPGA之道,其中提到了格雷码;
和格雷码相关的其他问题也贴出来吧:关于格雷码和独热码消耗资源情况;
二进制码转换为格雷码的方法
从自然二进制码到格雷码
该过程也称为格雷码的编码,方法是从二进制码的最右边一位(最低位)起,依次将每一位与左边一位进行异或运算,作为对应格雷码该位的值,而最左边一位(最高位)不变。 对应公式如下:
g[n] = b[n],
g[i] = b[i] xor b[i+1] (i∈N,n-1≥i≥0);
其中g、b分别对应n位的格雷码和二进制码。
例如,将自然二进制码“10110”转换为格雷码,可以形象的用下图表示其转换过程:
简单说来,就是对二进制码右移移位,与其本身相异或即可。
根据以上说法,用Verilog描述为:
assign gray_value = binary_value ^ (binary_value>>1);
格雷码转换为二进制码的过程
该过程也称为格雷码的解码,方法是从格雷码左边第二位(次高位)起,将每一位与其左边一位解码后的值异或,作为该位解码后的值,而最左边一位(最高位)的解码结果就是它本身。对应公式如下:
b[n] = g[n],
b[i] = g[i] xor b[i+1] (i∈N, n-1≥i≥0)。
其中g、b分别对应n位的格雷码和二进制码。
例如,将格雷码“11101”转换为自然二进制码,可以形象的用下图表示其转换过程:
我的理解是先根据格雷码的最高位,得到二进制的最高位,然后,用二进制码的最高位与格雷码的次高位相异或,得到二进制的次高位,依次类推。
根据理解写出对应的Verilog设计:
module gray2bin #(parameter N = 4
)(input [N-1:0] gray,output [N-1:0] bin);assign bin[N-1] = gray[N-1];genvar i;generatefor(i = N-2; i >= 0; i = i - 1) begin: gray_2_binassign bin[i] = bin[i + 1] ^ gray[i];endendgenerateendmodule
这是其对应的RTL原理图:
上图中粗的绿线代表总线,画的比较清晰了,但是呢?
如果我们自己手工画,应该是?
上图不考虑任何延迟。
更多一点讨论之generate for
上述代码用到了generate for,在其内部是将assign语句展开,这里验证下:
换一种写法,就是for中的i不从N-2开始,从0开始到N-2,如果二者的RTL电路一致,则可代表generate for是将内部循环语句,展开来实现:
module gray2bin #(parameter N = 4
)(input [N-1:0] gray,output [N-1:0] bin);assign bin[N-1] = gray[N-1];genvar i;generate/* for(i = N-2; i >= 0; i = i - 1) begin: gray_2_binassign bin[i] = bin[i + 1] ^ gray[i];end */for(i = 0; i <= N-2; i = i + 1) begin: beassign bin[i] = bin[i + 1] ^ gray[i];endendgenerateendmodule
可见,RTL原理图一致;
更多一点讨论之for
那用for语句实现上述电路会是怎么样呢?
module gray_to_binary #(parameter N = 4)(
input [N-1:0] gray_value,
output [N-1:0] binary_value
);
reg [N-1:0] binary_value;
integer i;always@(*)begin
binary_value[N-1] = gray_value[N-1];
for(i=0; i<=N-2; i=i+1)begin:U1
binary_value[i] = binary_value[i+1]^gray_value[i];
end
end
endmodule
RTL原理图:
可见,同样可以实现同样的功能。
简单的电路,我就不进行行为仿真了。
最后对格雷码的介绍
在FPGA之道这本书上,对格雷码的一点描述作为结尾:
格雷码,英文全称:Gray code。由于自然二进制码在相邻数据之间可能存在多个bit的变化,例如自然数7和8对应的4bits自然二进制码分别“0111”、“1000”,因此当寄存器的输出从7变到8时,寄存器的每一位都会发生变化,从而造成不稳定态,并且会使得数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,因为格雷码是一种数字排序系统,其中的所有相邻整数在它们的二进制表示中仅有一位不同。例如下表给出了4bits自然二进制码、格雷码与十进制整数的对照表:
十进制数 |
自然二进制编码 |
格雷码 |
0 |
0000 |
0000 |
1 |
0001 |
0001 |
2 |
0010 |
0011 |
3 |
0011 |
0010 |
4 |
0100 |
0110 |
5 |
0101 |
0111 |
6 |
0110 |
0101 |
7 |
0111 |
0100 |
8 |
1000 |
1100 |
9 |
1001 |
1101 |
10 |
1010 |
1111 |
11 |
1011 |
1110 |
12 |
1100 |
1010 |
13 |
1101 |
1011 |
14 |
1110 |
1001 |
15 |
1111 |
1000 |
从上表我们看出,格雷码在任意两个相邻的数之间转换时,只有1个bit发生了变化,所以它有效的避免了寄存器由一个数值到下一个数值时的不稳定态。并且由于格雷码中最大数与最小数之间也仅1个bit不同,因此通常又被称作循环二进制码或者反射二进制码。
不过格雷码也有一个缺点,那就是相比于自然二进制码来说,它是一种无权码(而自然二进制码实际上是“8421”码,因此很难直接进行比较和数学运算,所以一般都需要将采集到的以格雷码为表示形式的数据先转换成自然二进制码,然后再参与运算。
而二者之间的转换,上面也说了。
参考书籍:FPGA之道
二进制与格雷码之间的转换的Verilog实现(更多一点的讨论)相关推荐
- 自然二进制与格雷码的转换
自然二进制:Bn-1Bn-2-.B2B1B0 格雷码 :Gn-1Gn-2-G2G1G0 自然二进制转格雷码公式: Gi = Bi ,i = n-1 Gi = Bi xor Bi+1 ,i = ...
- 生成二进制反射格雷码
递归生成二进制反射格雷码: 需求: 我们使用递归的方式来生成二进制的反射格雷码. 什么是格雷码? 典型的二进制格雷码(Binary Gray Code)简称格雷码,因1953年公开的弗兰克·格 ...
- 二进制和格雷码转换方法及程序
二进制和格雷码转换方法及程序 1 格雷码介绍 2 二进制转格雷码 3 格雷码转二进制 1 格雷码介绍 格雷码(Gray code)是1880年由法国工程师Jean-Maurice-Emlle Baud ...
- 减治法在生成子集问题中的应用(JAVA)--递归、二进制反射格雷码
减治法在生成组合对象问题中的应用 生成子集问题:经典的背包问题就是求解一个最优子集的问题,这里我们来讨论一个更简单的问题.对于任意一个集合来说,它都存在2^n个子集(一个集合所有的子集集合称为幂集). ...
- 【FPGA实验2】二进制转为格雷码
关于FPGA入门实验2--二进制到格雷码的转换的一个记录 实验中作用到的仪器信息: 芯片商家:ALTERA 编程软件:Quartus II 试验箱上的芯片型号:EP4CE6E22C8N 快速导航
- (88)FPGA面试题-使用Verilog HDL编写二进制转格雷码
1.1 FPGA面试题-使用Verilog HDL编写二进制转格雷码 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-使用Verilog HDL编写二进制 ...
- 格雷码与二进制码转换
格雷码转二进制码 二进制码转格雷码 代码如下 //gray to bin module gray2bin #(parameter ADDR_WIDTH=8)(input [ADDR_WIDTH-1:0 ...
- 【分治法】解决中位数问题、格雷码问题以及分治法直接折半存在的问题讨论————武汉理工大学算法分析实验1
AlgorithmExperiment 算法分析课实验 分治法的核心思想是将问题分为若干子问题去,使规模一步步缩小,最终分到一步就能得出结果.要注意每个子问题需要性质相同而且相互不重复. 采用分治法完 ...
- 字母与ASCII码之间的转换
1.先解释下两个名词,主要从百度百科中查询得到: ASCII (American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字 ...
最新文章
- 车联网技术对中老年人吸引力更大
- pycharm 自动函数注释
- 学python的好处-学习python有什么好处?python强大之处在哪?
- 深入理解pthread_cond_wait、pthread_cond_signal
- 服务器kvm切换器维修,KVM切换器常见问题
- kali 开启ssh服务
- 控制流图|圈复杂度|基本复杂度
- 有测试狗狗好坏的软件吗,6个测试判断狗狗性格,胆小或凶猛一测便知,你家狗狗是哪种?...
- 【Java】简单的马戏团节目单项目
- 哈利波特AR游戏-巫师联盟 深度解析
- 2018 Arab Collegiate Programming Contest (ACPC 2018) G. Greatest Chicken Dish (线段树+GCD)
- git的项目创建和常用命令
- 在Linux中查找和删除重复文件的4种方法
- 为什么说BMC才是国产服务器的“命门”?
- meanShift算法介绍
- dSYM文件解析与分析
- MATLAB之楚列斯基分解法(九)
- 用户行为分析面面观(之一)-----用户行为研究体系 + 特征1:差异性
- css实现简单的头像遮罩效果
- 企业数据无忧 飞客功不可没
热门文章
- 界面Hello world
- linux___ip
- tomcat如何增大并发_系统的性能瓶颈,排查该从哪些方面入手,如何定位?
- 怎么往integer型数组添加数据_用户日活月活怎么统计 - Redis HyperLogLog 详解
- pdo mysql.so不存在_PHP致命错误:找不到类’PDO’
- 数据库中省区市组装成json_全国各省、市、县、镇、村的mysql数据库和JSON格式数据...
- 拾谈“用最有效率的方法算出2乘以8等於几?”
- 三星 android recovery,三星recovery模式怎么操作
- 安装linux系统报softlock,soft lockup 解决思路
- 第十六届全国大学生智能车竞赛组委会第三次扩大会议