学习verilog generate语句时,偶然看到用generate语句来进行格雷码到二进制码转换的代码,就从网上找了一些案例来学习。

下表为几种自然二进制码与格雷码的对照表:

十进制数 自然二进制数 格雷码 十进制数 自然二进制数 格雷码
0 0000 0000 8 1000 1100
1 0001 0001 9 1001 1101
2 0010 0011 10 1010 1111
3 0011 0010 11 1011 1110
4 0100 0110 12 1100 1010
5 0101 0111 13 1101 1011
6 0110 0101 14 1110 1001
7 0111 0100 15 1111 1000

格雷码转换为二进制码算法有以下几种表述形式:

表述一:

二进制格雷码为Gn-1Gn-2...G2G1G0

对应的自然二进制码为Bn-1Bn-2...B2B1B0

其中:最高位保留—Bn-1=Gn-1

其他各位—Bi-1=Gi-1 xor Bi ,i=1,2,...,n-1

表述二:

Bi = ˆG[n-1:i]=G[n-1]ˆG[n-2]ˆ..ˆG[i],i=0,1,...,n-1

表述三:

Bi = ˆ(G>>i),i=0,1,...,n-1

表述一的仿真实例:

源代码:

 //http://www.cnblogs.com/adamite/archive/2008/10/20/1314949.html
//example2
module GrayToBinary2 (binarycode, graycode);
parameter n = ; // this module is parameterizable
output reg [n-:] binarycode;
input [n-:] graycode;
integer i;
always @ (graycode)
begin
binarycode[n-]=graycode[n-];
for(i=;i<=n-;i=i+)
binarycode[i-]=graycode[i-] ^ binarycode[i];//比较节省空间
end
endmodule

测试代码:

 `timescale 1ns/1ns
module tb_GrayToBinary2; reg [:] gray;
wire [:] bin; GrayToBinary2 dut (bin,gray); initial begin
gray = 'h0;
#;
gray = 'h1;
#;
gray = 'h2;
#;
gray = 'h3;
#;
gray = 'he;
#;
gray = 'h7;
#;
gray = 'hf;
end
endmodule

仿真结果:

modelsim生成的原理图(注意要在vsim后面加上-debugDB选项)

从仿真结果来看,格雷码转二进制码过程中出现错误。开始两次转换出现不定态,而且后面的转换结果也是错误的。是什么原因呢?从算法上看,格雷码的最高位给了二进制码的最高位,这没问题。但是接下来的for循环,从二进制的最低bit位开始,即B0=G0 xor B1 ,i=1,2,...,n-1。此时G0是确定的值,但是B1还未计算出来,是不定值x,因此二者异或结果为不定值x,其他bit以此类推。从modelsim生成的原理图也能看出来,二进制码的次态输出除了取决于格雷码的现态值,还依赖于二进制码的现态值。

将上述算法进行修改,for循环从高bit为开始,结果如下。

表述一修改后的仿真实例:

源代码:

 //http://www.cnblogs.com/adamite/archive/2008/10/20/1314949.html
//example2
module GrayToBinary2ex (binarycode, graycode);
parameter n = ; // this module is parameterizable
output reg [n-:] binarycode;
input [n-:] graycode;
integer i;
always @ (graycode)
begin
binarycode[n-]=graycode[n-];
// for(i=1;i<=n-1;i=i+1)
// binarycode[i-1]=graycode[i-1] ^ binarycode[i];//比较节省空间
for(i=n-;i>;i=i-)
binarycode[i-]=graycode[i-] ^ binarycode[i];//比较节省空间
end
endmodule

测试代码:

 `timescale 1ns/1ns
module tb_GrayToBinary2ex; reg [:] gray;
wire [:] bin; GrayToBinary2ex dut (bin,gray); initial begin
gray = 'h0;
#;
gray = 'h1;
#;
gray = 'h2;
#;
gray = 'h3;
#;
gray = 'he;
#;
gray = 'h7;
#;
gray = 'hf;
end
endmodule

仿真结果:

modelsim生成的原理图(注意要在vsim后面加上-debugDB选项)

表述二的仿真实例:

源代码:

 // Verilog LRM 1364-2005.pdf P184
module gray2bin (bin, gray);
parameter SIZE = ; // this module is parameterizable
output [SIZE-:] bin;
input [SIZE-:] gray; genvar i;
generate
for (i=; i<SIZE; i=i+) begin:bit
assign bin[i] = ^gray[SIZE-:i];
// i refers to the implicitly defined localparam whose
// value in each instance of the generate block is
// the value of the genvar when it was elaborated.
end
endgenerate
endmodule

测试代码:

 `timescale 1ns/1ns
module tb_gray2bin; reg [:] gray;
wire [:] bin; gray2bin dut (bin,gray); initial begin
gray = 'h0;
#;
gray = 'h1;
#;
gray = 'h2;
#;
gray = 'h3;
#;
gray = 'he;
#;
gray = 'h7;
#;
gray = 'hf;
end
endmodule

仿真结果:

modelsim生成的原理图(注意要在vsim后面加上-debugDB选项)

表述三的仿真实例:

源代码:

 //http://www.cnblogs.com/adamite/archive/2008/10/20/1314949.html
//example1
module GrayToBinary1 (binarycode, graycode);
parameter n = ; // this module is parameterizable
output reg [n-:] binarycode;
input [n-:] graycode;
integer i;
always @ (graycode)
begin
for(i=;i<=n-;i=i+)
binarycode[i]=^(graycode>>i);//比较浪费空间
end
endmodule

测试代码:

 `timescale 1ns/1ns
module tb_GrayToBinary1; reg [:] gray;
wire [:] bin; GrayToBinary1 dut (bin,gray); initial begin
gray = 'h0;
#;
gray = 'h1;
#;
gray = 'h2;
#;
gray = 'h3;
#;
gray = 'he;
#;
gray = 'h7;
#;
gray = 'hf;
end
endmodule

仿真结果:

modelsim生成的原理图(注意要在vsim后面加上-debugDB选项)

格雷码(Gray Code)转二进制码(Binary Code)的更多相关文章

  1. 格雷码Gray Code详解

    格雷码简介 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码.格 ...

  2. 格雷码(Gray code)仿真

    作者:桂. 时间:2018-05-12  16:25:02 链接:http://www.cnblogs.com/xingshansi/p/9029081.html 前言 FIFO中的计数用的是格雷码, ...

  3. LeetCode:Gray Code(格雷码)

    题目链接 The gray code is a binary numeral system where two successive values differ in only one bit. Gi ...

  4. 用硬件(Verilog)实现二进制码和格雷码的转换

    格雷码(Gray code)是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码,是一种绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环. ...

  5. 构建n位元的格雷码

    二进制格雷码的生成 1.什么是格雷码 Gray Code是一个数列集合,每个数使用二进制来表示,假设使用n位元来表示每个数字,那么任两个数之间只有一个位元值不同.log2(16)=4 例如: 生成4位 ...

  6. 产生n位元的所有格雷码

    原文链接:http://blog.csdn.net/beiyeqingteng/article/details/7044471 问题:产生n位元的所有格雷码. 格雷码(Gray Code)是一个数列集 ...

  7. 解题(GeLeiMa -生成格雷码)

    题目描述 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码. 给定一个整数n,请返回n位的格雷码 ...

  8. 格雷码C++递归实现

    昨天参加腾讯的笔试,结果答的一塌糊涂,大题第一题是关于格雷码的递归实现的,当时没写出来,今天查了下资料试着用C++实现一下. #include <iostream> #include &l ...

  9. 原码、反码、补码、BCD码、格雷码

    二进制的最高位表示这个二进制的正负符号(0为正,1为负),其余各位数表示其数值本身称为原码. 正数的反码等于原码,负数的反码是在原码的基础上,符号位不变,其余各位取反. 正数的补码等于原码,负数的补码 ...

随机推荐

  1. django访问sqlserver中的坑

    首先不用说先安装django-sqlserver    pip install django-sqlserver 然后在settings.py中修改'ENGINE': 'sqlserver_ado', ...

  2. List<String^>^ 引用空间

    莫名其妙报错 需要在.h和.cpp文件中都引用: using namespace System::Collections;using namespace System::Collections::Ge ...

  3. CodeFirst中DB保存时报错:对一个或多个实体的验证失败。

    错误提示如下: 开始以为有字段可能没有添加数据,可是检查了很久,仍然没有任何头绪. 后使用DbEntityValidationException进行调试,问题才得以解决

  4. iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)

    iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)       1.UIGestureRecognizer介绍 手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加 ...

  5. python 性能鸡汤

    转载自:http://www.oschina.net/question/1579_45822 1:使用内建函数input() int() isinstance() issubclass() iter( ...

  6. Shuffle'm Up

    poj3087:http://poj.org/problem?id=3087 题意:题意简化之后的就是:给你两个长度均为c的字符串s1,s2,然后给你一个2*c的串ss,现在每次从s2,中取一个,然后 ...

  7. Zabbix的集中式监控

    相对于传统的ZABBIX硬件系统级监控(CPU,内存,硬盘,网卡),应用级的监控就显得有些复杂了. 如果对不同的应该来不同的应用,配置会很多的. 如果我们能在一个指定的AGENT上监控所有的APACH ...

  8. open和fopen的区别(转)

    转载自:http://www.cnblogs.com/joeblackzqq/archive/2011/04/11/2013010.html open和fopen的区别: 1.缓冲文件系统缓 冲文件系 ...

  9. POJ2442 Sequence

    题目链接. #include <iostream> #include <cstdio> #include <cstring> #include <cstdli ...

  10. CH Round #51 - Shinrein祭 #1

    A.Phorni 题目:http://www.contesthunter.org/contest/CH%20Round%20%2351%20-%20Shinrein祭%20%231/Phorni 没做 ...