数字IC经典电路设计
经典电路设计是数字IC设计里基础中的基础,盖大房子的第一部是打造结实可靠的地基,每一篇笔者都会分门别类给出设计原理、设计方法、verilog代码、Testbench、仿真波形。然而实际的数字IC设计过程中考虑的问题远多于此,通过本系列希望大家对数字IC中一些经典电路的设计有初步入门了解。能力有限,纰漏难免,欢迎大家交流指正。快速导航链接如下:
一、前言
什么是格雷码?
格雷码(Gray code)是一种二进制数码系统,格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点,就可以避免二进制编码计数组合电路中出现的亚稳态。在某些应用中,格雷码具有排除歧义和减少数据传输错误的功能。
那么格雷码相较于自然二进制数有哪些优势?
避免计数器状态的冗余转换,在格雷码中,两个连续的数值仅仅只有一位不同,而在二进制码中两个连续的数值可能会有多位不同,这会导致在计数器发生器中产生大量的冗余状态转换。格雷码可以通过降低状态转换次数来设计出更简单的计数器。
降低传输干扰和误差。在数据传输过程中,如果使用二进制码,由于两个相邻的数值可能会有多位不同,数据在传输过程中可能会因为电磁干扰等原因而发生错误。而使用格雷码则能够避免这种情况,因为任何相邻的两个数值之间只有一位不同。
格雷码广泛应用在FIFO、跨时钟域的通信(CDC)、RAM地址寻址计数器、数据纠错等电路设计中。
从自然二进制码到格雷码的转换具体方法是:从二进制的最低位起,依次起与相邻左边的一位数进行异或逻辑运算,并且作为对应格雷码该位的值,最高位保持不变。简而言之就是,将二进制码与逻辑右移的二进制码进行异或可得到格雷码。
如图所示,根据图示可以写出的代码。
//自然二进制数转格雷码
module bin2gray #(
parameter width = 4 //定义数据的位宽参数为4
)(
input [width - 1 : 0] bin,
output [width - 1 : 0] gray
);
//二进制数逻辑右移与自身进行异或逻辑运算
assign gray = (bin >> 1) ^ bin;
endmodule
`timescale 1ns/1ps; //仿真时间单位1ns 仿真时间精度1ps
module bin2gray_tb();
parameter width = 4; //定义数据的位宽参数为4
//信号申明
reg [width - 1 : 0] bin;
wire [width - 1 : 0] gray;
//模块实例化(将申明的信号连接起来即可)
bin2gray u_bin2gray(
.bin (bin),
.gray (gray)
);
//为输入数据赋值
initial begin
bin = 4'd0;
repeat(15) #10
bin = bin + 1'b1;
end
endmodule
从格雷码到二进制码的转换具体的方法就是:从格雷码左边第二位(次高位),将每一位与其左边一位解码后的值进行异或,作为当前格雷码的值,而最左边一位(最高位)的解码结果就是它本身。简而言之就是,最高位不变,与二进制数左边一位数异或可得到当前位二进制数。
如图所示,根据图示可以写出的代码。
//格雷码转自然二进制数
module gray2bin #(
parameter width = 4 //定义数据的位宽参数为4
)(
input [width - 1 : 0] gray,
output [width - 1 : 0] bin
);
//利用generate...for逐位循环输出最低位至次高位二进制数
genvar i;
generate
for(i = width - 2; i >= 0; i = i - 1) begin: gray_2_bin
assign bin[i] = bin[i + 1] ^ gray[i]; //格雷码与二进制数前一位进行异或逻辑运算
end
endgenerate
//二进制数最高位为格雷码最高位
assign bin[width - 1] = gray[width - 1];
endmodule
`timescale 1ns/1ps; //仿真时间单位1ns 仿真时间精度1ps
module gray2bin_tb();
parameter width = 4; //定义数据的位宽参数为4
//信号申明
reg [width - 1 : 0] gray;
wire [width - 1 : 0] bin;
//模块实例化(将申明的信号连接起来即可)
gray2bin u_gray2bin(
.bin (bin),
.gray (gray)
);
//为输入数据赋值
initial begin
#10 gray = 4'd0000;
#10 gray = 4'd0001;
#10 gray = 4'd0011;
#10 gray = 4'd0010;
#10 gray = 4'd0110;
#10 gray = 4'd0111;
#10 gray = 4'd0101;
#10 gray = 4'd0100;
#10 gray = 4'd1100;
#10 gray = 4'd1101;
#10 gray = 4'd1111;
#10 gray = 4'd1110;
#10 gray = 4'd1010;
#10 gray = 4'd1011;
#10 gray = 4'd1001;
#10 gray = 4'd1000;
end
endmodule
自然二进制数与格雷码转换: 从自然二进制码到格雷码的转换具体方法是:从二进制的最低位起,依次起与相邻左边的一位数进行异或逻辑运算,并且作为对应格雷码该位的值,最高位保持不变。简而言之就是,将二进制码与逻辑右移的二进制码进行异或可得到格雷码。 从格雷码到二进制码的转换具体的方法就是:从格雷码左边第二位(次高位),将每一位与其左边一位解码后的值进行异或,作为当前格雷码的值,而最左边一位(最高位)的解码结果就是它本身。简而言之就是,最高位不变,与二进制数左边一位数异或可得到当前位二进制数。 自然二进制数与格雷码两者优势:自然二进制数的编码方式简单明了,容易理解,在加减运算中能够直接进行,同时十分方便进行一些位运算操作(如移位、取反等)。 格雷码计数时只有一位变化,可有效减少计数器状态的冗余转换,同时在传输数据时能够减小传输错误的概率,此外带权重编码处理更加方便。在一定程度上自然二进制数与格雷码优缺点基本相反,综上所述,自然二进制数和格雷码各有优劣之处,需要根据具体应用场景选择合适的编码方式。简单来说,在计数器和编码器中,倾向于使用格雷码;而在进行加减运算时,则倾向于使用自然二进制数。
不定期检查、补充、纠错,欢迎随时交流纠错
最后修改日期:2023.5.07
软件版本:
仿真软件:Modelsim 10.6c
绘图软件:亿图图示
描述语言:verilog
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。