【数字IC手撕代码】Verilog 2^N的格雷码二进制转换|题目|原理|设计|仿真

简介: 【数字IC手撕代码】Verilog 2^N的格雷码二进制转换|题目|原理|设计|仿真

image.png


一、前言


本系列旨在提供100%准确的数字IC设计/验证手撕代码环节的题目,原理,RTL设计,Testbench和参考仿真波形,每篇文章的内容都经过仿真核对。快速导航链接如下:


1.奇数分频

2.偶数分频

3.半整数分批

4.小数/分数分频

5.序列检测器

6.模三检测器

7.饮料机

8.异步复位,同步释放

9.边沿检测(上升沿,下降沿,双边沿)

10.全加器,半加器

11.格雷码转二进制

12.单bit跨时钟域(打两拍,边沿同步,脉冲同步)

13.奇偶校验

14.伪随机数生成器[线性反馈移位寄存器]

15.同步FIFO

16.无毛刺时钟切换电路


应当说,手撕代码环节是面试流程中既重要又简单的一个环节,跟软件类的岗位相比起来,数字IC的手撕代码题目固定,数量有限,属于整个面试中必得分的一个环节,在这个系列以外,笔者同样推荐数字IC求职者使用“HdlBits”进行代码的训练

链接如下

HDLBits — Verilog Practice


二、题目


使用verilog语言,完成4bit二进制输入的格雷码的转换


三、原理


格雷码想要解决什么?、

生活中我们最常接触到的是natural code也可以称为8421码,在这种码制中,十进制的3和4分别在二进制中表示为011和100,在naturalcode中由3转换到4的过程中,可以发现一共有3位发生变化,因为不同的位 改变(指0到1或1到0)到达的时间可能不相同,所以采样的时候可能 采到正确的结果 100,也可能 采样到错误的结果 比如111/101等


什么是格雷码

因为这个问题,我们提出了一种新的码值,他的特点就是相邻两位只有单bit发生改变,这里提前引用格雷码中的3和4的表示0010和0110,这个时候采样从3到4,只有可能采样到0010和0110,即前一个结果和后一个结果,不会出现这两者之外的错位结果,格雷码的优势由此体现,也正是因为格雷码的优势,它广泛的应用在包括FIFO,跨时钟域的通信,纠错等内容中。


格雷码的转换表

image.png

在这里其实就可以发现,格雷码的转换其实是在纯组合逻辑下的由natural code转换到gray code的过程。


四、RTL设计


module gray_change(binary_code, gray _code);
input [3:0] binary_code;
output [3:0] gray_code;
assign gray_code = binary_code ^ (binary_code >> 1);
endmodule


这里再稍微讨论一下“自身” 与 “自身右移一位” 取异或,生成格雷码的方法,这个方法只适用于2^N情况,因为格雷码的一个重要应用就是FIFO,这个生成方法对于FIFO的深度约束起到了重要的作用,即FIFO的深度只能是8位16位32位64位这种情况,假如我们想使用一个偶数深度,比如10位,14位,我们需要其他的方式来生成格雷码,这里我们按下不表,以后再更新一篇如何生成非2次方项的格雷码。


五、Testbench


`timescale 1ns /1ps
module gray_code_tb();
reg  [3:0] binary_code;
wire [3:0] gray_code;
gray_code u1(.binary_code(binary_code),.gray_code(gray_code));
initial
begin
binary_code = 4'b1001;
#30
binary_code = 4'b1010;
#30;
$stop;
end
endmodule


六、仿真结果分析


9f54e44f6d7a479e8c75d09b0a7df300.png

比较了两个值,换成了十进制,上面的是natural code,下面的是gray_code,发现结果正确。

相关文章
|
7月前
|
存储 算法 程序员
探索C/C++ 进制转换之美:从原理到应用(一)
探索C/C++ 进制转换之美:从原理到应用
137 0
|
7月前
|
存储 网络协议 算法
探索C/C++ 进制转换之美:从原理到应用(二)
探索C/C++ 进制转换之美:从原理到应用
200 0
|
7月前
|
算法 C++
探索C/C++ 进制转换之美:从原理到应用(三)
探索C/C++ 进制转换之美:从原理到应用
72 0
【数字IC手撕代码】Verilog小数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog小数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog小数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog自动售卖饮料机|题目|原理|设计|仿真
【数字IC手撕代码】Verilog自动售卖饮料机|题目|原理|设计|仿真
【数字IC手撕代码】Verilog自动售卖饮料机|题目|原理|设计|仿真
【数字IC手撕代码】Verilog半整数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog半整数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog半整数分频|题目|原理|设计|仿真
|
人工智能
【数字IC手撕代码】Verilog全加器半加器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog全加器半加器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog全加器半加器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog奇偶校验|题目|原理|设计|仿真
【数字IC手撕代码】Verilog奇偶校验|题目|原理|设计|仿真
【数字IC手撕代码】Verilog奇偶校验|题目|原理|设计|仿真
【数字IC手撕代码】Verilog模三检测器(判断输入序列能否被三整除)|题目|原理|设计|仿真
【数字IC手撕代码】Verilog模三检测器(判断输入序列能否被三整除)|题目|原理|设计|仿真
【数字IC手撕代码】Verilog模三检测器(判断输入序列能否被三整除)|题目|原理|设计|仿真
【数字IC手撕代码】Verilog序列检测器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog序列检测器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog序列检测器|题目|原理|设计|仿真