Verilog RTL 代码设计新手上路

article/2025/10/3 0:55:24

1.      做一个4选1的mux,并且进行波形仿真 和2选1的mux对比,观察资源消耗的变化:

实验分析:4选1的mux实际上就是在2选1的mux上进行拓展,选用2位的控制信号控制4位输入信号的选择输出

实验代码设计如下:

RTL视图如下:

波形仿真结果如下:

资源消耗变化如下:

4选1的mux

2选1的mux

2.      编写一个4X4路交叉开关的RTL,然后编译,看RTL View 比较2x2与4x4之间消耗资源的区别。通过对比资源,你有什么结论?

实验分析: 2X2路的交叉开关核心思想就是使用2个输出分别对应1个1位的控制信号,选择该输出哪一个输入信号。根据该思想设计4X4路的交叉开关,则每个输出对应一个2位的控制信号,从四个输入信号中选择一个进行输出,然后并联输出。

实验代码设计如下:

RTL视图如下:

波形仿真结果如下:

资源消耗对比如下:

4X4的交叉开关

2X2的交叉开关

可见4X4的交叉开关消耗资源成倍的增长了。

 

3.      编写一个8输入的优先编码器,然后编译,看RTL View:

实验分析:4输入的优先编码器本质就是一个4位输入的信号对输出进行控制,当对应为输入1时,输出与位数对应的数值,且高位输入控制优先。编写8输入的优先编码器实际上就是对4输入的位数进行一个简单拓展。

实验代码设计如下:

RTL视图如下:

波形仿真结果如下:



4.      编写一个4-16的译码器,编译;和3-8译码器对比资源开销;看RTL View:

实验分析:3-8译码器即3位输入的2进制值对应相应位置的输出位输出1。编写4-16译码器本质上是对3-8译码器输入、输出位数的一个拓展。

实验代码设计如下:


RTL视图如下:


波形仿真结果如下:


资源消耗变化如下:

3-8译码器

4-16译码器

输入多了一位、输出多了八位的情况下资源消耗几乎多了一倍,可见资源消耗主要与输出位数正相关。

 

5.      (1)把加法器的输出信号改成4比特位宽,编译,波形仿真。观察输出结果,说出输出和输入的对应关系。

(2)把加法器的输入信号改成8比特位宽,编译,波形仿真。观察加法器的输出延迟,和4比特输入位宽的情况对比,你有什么结论,为什么?

实验分析:例子程序给出无符号加法器是一个4位输入5位输出的加法器,即两个0~15的数相加,其结果范围应该在0~30。当输入仍为4位而输出改为4位时,输出结果范围仅为0~15,当两位输入相加结果大于15后输出结果会出现错误,仅能输出正确结果的后四位;而输入改为8位而输出仍为5位时,两个0~127的数相加,可结果范围只能为0~31,这时只能输出正确结果的后5位,然而加法器仍然要运算正确结果的前3位,所以输出延时应该要大于4输入-5输出的加法器。

实验代码设计如下:

4输入-4输出无符号加法器

8输入-5输出无符号加法器

波形仿真结果如下:

4输入-4输出无符号加法器

可见当正确结果大于15后只能输出正确结果的后4位。

8输入-5输出无符号加法器

可见其输出时延稍大于4输入的无符号加法器。

 

6.      把加法器的输出信号改成4比特位宽,编译,波形仿真。观察输出结果,观察输出结果在什么时候是正确的?。 把加法器的输入信号改成8比特位宽,编译,波形仿真。观察加法器的输出延迟,和4比特输入位宽的情况对比,你有什么结论,为什么?

实验分析:其基本原理与上面无符号加法器相同,只不过其运算法则变为补码运算。对于组合逻辑门的层面来说,主要是“Signed”关键字生成的。

实验代码设计如下:

4输入-4输出补码加法器

8输入-5输出补码加法器

波形仿真结果如下:

4输入-4输出补码加法器

8输入-5输出补码加法器

 

7.      不改变流水线的级数,把加法器的输入信号改成8比特位宽,编译,波形仿真,和不带流水线的情况对比一下,你有什么结论? 在8比特输入位宽的情况下,在输入上再添加一级流水线,观察编译和仿真的结果,你有什么结论?

实验分析:与不加流水线的加法器相比,带流水线的加法器即在加法器的输入与输出都连接了D触发器,有效的减少了组合逻辑的竞争与冒险,从而明显减少了“毛刺”的长度。而流水线的级数越高,毛刺也随之越短,但输出的时延也会相应的对一个时钟周期。

实验代码设计如下:

8输入-5输出带流水线加法器

4输入-5输出2级流水线加法器

RTL视图如下:

8输入-5输出带流水线加法器

 

4输入-5输出2级流水线加法器

波形仿真结果如下:

8输入-5输出带流水线加法器

4输入-5输出2级流水线加法器

 

 

8.      (1)改变乘法器的输入位宽为8比特,编译,波形仿真,观察信号毛刺的时间长度。

(2)选一款没有硬件乘法器的FPGA芯片(例如Cyclone EP1C6)对比8比特的乘法器和加法器两者编译之后的资源开销(Logic Cell的数目)

(3)编写一个输入和输出都有D触发器的流水线乘法器代码,编译后波形仿真,观察组合逻辑延迟和毛刺的时间,和不带流水线的情况下对比。

实验代码设计如下:

8输入-8输出无符号乘法器

无硬件乘法器芯片的8输入-8输出无符号乘法器

4输入-8输出带流水线乘法器

波形仿真结果如下:

8输入-8输出无符号乘法器

可见相较4输入的无符号乘法器“毛刺”时间变短。

无硬件乘法器芯片的8输入-8输出无符号乘法器

可见无硬件乘法器的无符号乘法器“毛刺”时间大大变长。

4输入-8输出带流水线乘法器

可见相较4输入-8输出无流水线乘法器,其毛刺时间相较更短,但输出延时更长(多了一个时间周期)。

 

资源消耗如下:

8输入-8输出无符号乘法器

无硬件乘法器芯片的8输入-8输出无符号乘法器

可见无硬件乘法器芯片的无符号乘法器硬件资源消耗非常巨大。

 

9.      (1)设计一个最简单的计数器,只有一个CLK输入和一个OVerflow输出,当计数到最大值的时钟周期CLK输出1

(2)设计复杂的计数器,和本例相似,带有多种信号,其中同步清零CLR的优先级最高,使能EN次之,LOAD最低。

实验分析:(1)中所要求的即不再考虑清零信号、使能信号、置数信号,当计数器还没到达最大值时,每个时间周期内计数加1,当达到计数最大值时,输出信号置1、计数置0即可;(2)即改变三个额外输入信号的优先级,只要CLR为1则执行清零,否则判断EN是否为1,为1则执行最基本的技术功能,否则执行置数功能。

实验代码设计:

只有CLK和Overflow信号的简单计数器

改变三种信号优先级的计数器

RTL视图如下:

只有CLK和Overflow信号的简单计数器

改变三种信号优先级的计数器

波形仿真结果如下:

只有CLK和Overflow信号的简单计数器

改变三种信号优先级的计数器

 

 

10.   设计一个用于识别2进制序列“1011”的状态机

(1)    基本要求:电路每个时钟周期输入1比特数据,当捕获到1011的时钟周期,电路输出1,否则输出0;使用序列101011010作为输出的测试序列;

(2)    扩展要求:给你的电路添加输入使能端口,只有输入使能EN为1的时钟周期,才从输入的数据端口向内部获取1比特序列数据。

实验分析:因为要捕获的是“1011”序列,从最低位开始进行匹配,匹配成功跳转到下一状态匹配更高一位,只要有一位匹配错误就应该跳转至状态0重新开始。而加上使能信号后,只有EN为1才从输入端读入输入数据进行匹配。

实验代码设计如下:

基本要求的状态机

带使能信号的状态机

状态转移图及表达式如下:

波形仿真结果如下:

基本要求的状态机

带使能信号的状态机

 

11.   设计一个如本节“电路描述”部分的“带加载使能和移位使能的并入串出”的移位寄存器,电路的RTL结构图如“电路描述”部分的RTL结构图所示。

实验分析:所谓“串入并出”的移位寄存器,及输入一个1位输入信号,移位寄存器将这个一位数据存入第0位,并将原本的后3位一同前移1位,最后从高到低并行输出四位数据。而“并入串出”的移位寄存器是指,输入一个4位输入信号,存入移位寄存器,若移位使能有效,则将最高位输出,移位寄存器后三3同时前移1位,最低位存入0;若加载时能有效,则从输入端重新读入4位数据。

实验代码设计如下:

RTL视图如下:

波形仿真结果如下:


 

 

 

实验小结:

本次实验共分为11个小的实验,通过Verilog代码模拟了各种逻辑组合电路的基本原理。通过例子实验和自主进行的实验可以发现,任何一个复杂的组合电路都可以拆分成许多简单的基本电路,通过熟练这些基本电路的Verilog代码编写,并在每次实验前都先对要完成的项目进行拆分与简化,重视RTL视图,就可以实现各类大型项目的编写。

同时,在实验过程中自己也检验了对Verilog代码的使用熟练度与理解,如[3:0]即声明一个最高位为第三位最低位为第零位的变量、if...else语句最好使用begin...end括起来,以及一些其他的代码规范。这些都对之后的开发仿真工作有极大的提示帮助。



http://chatgpt.dhexx.cn/article/Y54ZeEHQ.shtml

相关文章

代码设计流程

一、需求分析 1、需求分析的三层境界:实现者、分析者、引导者。 2、在需求中提取到合适的用例(以抽卡系统为例) 3、用例分析法 5W1H分析法 对上面的“抽卡”用例进行分析如下 5W内容What抽取卡牌Who玩家When游戏服务器开启期间Where抽卡…

代码设计的内功——代码设计原则

引言 好代码是设计出来的,也是重构出来的,更是不断迭代出来的。在我们接到需求,经过概要设计过后就要着手进行编码了。但是在实际编码之前,我们还需要进行领域分层设计以及代码结构设计。那么怎么样才能设计出来比较优雅的代码结构…

二维傅里叶变换频谱图的含义

二维傅里叶变换频谱图的含义 在一维傅里叶变换得到的频谱图中,每个点表示其对应的幅度频率与其坐标对应的简谐波。二位傅里叶变换的频谱图,简谐波的振幅由对应点处对应的亮度表示,每一个点表示的波形为其对应的横纵坐标所表示的简谐波的叠加…

二维傅里叶变换深度研究-图像与其频域关系

一:二维傅里叶变换的数学原理 1.2D离散傅里叶公式解释: 那么,其F(u,v) 本质就是: 后续说明时的”频域”均指的其傅里叶功率谱,后面为了演示方便,所有频域图均经过了fftshift移动到中心位置。 2.2D傅里叶频…

使用matlab对图像进行二维傅里叶变换

这学期选了《图像工程基础》这门课,课上老师留了一个作业:对图像进行二维傅里叶变换。 现在我使用matlab解决这个问题 1.实验基本指令 首先我试了一下matlab图像处理的基本指令 原图: 经过以下指令后 将图片导入matlab后,命名…

二维离散傅里叶变换

在学完一维的傅里叶变换后,紧接着就是二维的傅里叶变换了。直接上干货吧!!! 途中会用到opencv读取与显示图片。 一. 公式 M表示图像的行数,N表示图像的列数。 经过欧拉公式可以得一下形式,这样就可以轻松…

Matlab图像的二维傅里叶变换频谱图特点研究

一、先放一些相关的结论&#xff1a; 1、傅里叶变换的幅值称为傅里叶谱或频谱。 2、F(u)的零值位置与“盒状”函数的宽度W成反比。 3、卷积定理&#xff1a;空间域两个函数的卷积的傅里叶变换等于两个函数的傅里叶变换在频率域中的乘积。f(t)*h(t) <> H(u)F(u) 4、采…

OpenCV学习——图像二值化处理及二维傅里叶变换

小古在本学期选修了《计算机视觉原理与应用》&#xff0c;最近有一份作业 —— 利用matlab或者OpenCV对图像进行一些处理&#xff0c;由于完全没有接触过matlab和OpenCV,但是学习了一些python语言&#xff0c;所以便利用opencv-python来完成作业。 1 图像二值化处理 1.1 图像…

二维傅里叶变换是怎么进行的?

1.首先回顾一下一维FT 通俗来讲&#xff0c;一维傅里叶变换是将一个一维的信号分解成若干个三角波。 对于一个三角波而言&#xff0c;需要三个参数来确定它&#xff1a;频率,幅度 A &#xff0c;相位。因此在频域中&#xff0c;一维坐标代表频率&#xff0c;而每个坐标对应的…

二维傅里叶变换需知

from: https://blog.csdn.net/wenhao_ir/article/details/51037744 代码如下&#xff0c;这个代码是实现灰度图像作二维傅里叶变换后的非线性变换哈~ clear all; Iimread(coins.png); Ffft2((im2double(I))); Ffftshift(F); Fabs(F); Tlog(F1); subplot(1,2,1); imshow(F,[]…

傅里叶级数、一维傅里叶变换到二维傅里叶变换数理推导

傅里叶级数、一维傅里叶变换到二维傅里叶变换数理推导 参考资料&#xff1a; 如何理解傅里叶级数公式 二重傅里叶级数 从傅里叶级数到傅里叶变换 高维傅里叶变换的推导 连续傅里叶变换和离散傅里叶变换 二维离散傅里叶变换 IDL实现傅里叶变换 想要用傅里叶变换的思维处理一个…

二维傅里叶变换简化方式

在处理二维矩阵时&#xff0c;常想着如何把时域转换到频域来处理&#xff0c;因此翻来了以往数分里面的常用的傅里叶(Fourier Transform); &#xff08;Notes:一下公式中 M,N分别为二维矩阵的列数和行数&#xff0c;f(x,y) 代表改二维矩阵&#xff0c;F(u,v)为转换后的矩阵&…

C++中fftw库二维傅里叶变换笔记

目录 1.相关基础知识参考链接 2.二维傅里叶变换作用简介 3.FFTW二维傅里叶变换输出分析 &#xff08;1&#xff09;原始输出数据​ &#xff08;2&#xff09;频谱中心化后的输出数据 4.频谱图绘制 5.二维傅里叶变换逆变换 6.从输出结果中分离各平面波并画出波形平面图…

二维傅里叶变换的理解和使用

目录 似模似样的前言一维傅里叶二维傅里叶 似模似样的前言 最近的瑕疵检测项目需要在有纹理的产品上做很细致的检测。由于当前做项目使用的还是halcon居多&#xff0c;目前知道的方法还是傅里叶变换比较靠谱。 但仅靠halcon自带的样例并不能很好的理解和使用傅里叶&#xff0…

二维傅里叶变换频谱图的直观理解

众所周知&#xff1a;频谱中心代表低频&#xff0c;四周代表高频。 问&#xff1a;那&#xff08;u&#xff0c;v&#xff09;一点代表什么&#xff1f; 答&#xff1a; 1.当为水平方向的正弦图片时&#xff0c;二维傅里叶变换后&#xff0c;其只有u方向的频谱值&#xff1b; 2…

Matlab:二维傅里叶变换

Matlab:二维傅里叶变换 二维傅里叶变换二维衍射模式fft2 函数将二维数据变换为频率空间。例如,您可以变换二维光学掩膜以揭示其衍射模式。 二维傅里叶变换 以下公式定义 mn 矩阵 X 的离散傅里叶变换 Y。 i 是虚数单位,p 和 j 是值范围从 0 到 m–1 的索引,q 和 k 是值范围…

matlab二维傅里叶变换ffshift,形象理解二维傅里叶变换

点击上方“机器学习与生成对抗网络”,关注"星标" 获取有趣、好玩的前沿干货! 来自 | 知乎 阿姆斯特朗 链接 | https://zhuanlan.zhihu.com/p/110026009 文仅交流,侵删 1.回顾一下一维FT 公式: 通俗来讲,一维傅里叶变换是将一个一维的信号分解成若干个复指数波 …

傅里叶变换(二维离散傅里叶变换)

离散二维傅里叶变换 一常用性质&#xff1a; 可分离性、周期性和共轭对称性、平移性、旋转性质、卷积与相关定理&#xff1b; &#xff08;1&#xff09;可分离性&#xff1a; 二维离散傅里叶变换DFT可分离性的基本思想是DFT可分离为两次一维DFT。因此可以用通过计算两次一维…

二维傅里叶变换

fft2 函数将二维数据变换为频率空间。例如&#xff0c;可以变换二维光学掩膜以揭示其衍射模式。 二维傅里叶变换 以下公式定义 mn 矩阵 X 的离散傅里叶变换 Y。 和 是以下方程所定义的复单位根。 i 是虚数单位&#xff0c;p 和 j 是值范围从 0 到 m–1 的索引&#xff0c;q …

【深度好文】二维图像傅里叶变换 YYDS

1. 傅里叶变换原理 在数学中进行傅里叶变换为连续模拟信号&#xff0c;通常来说&#xff1a; 二维连续函数f(x,y)的傅里叶正变换为&#xff1a; 相应的傅里叶逆变换公式为&#xff1a; 但是在计算机领域&#xff0c;计算机一般处理的是数字信号&#xff0c;只能进行有限次计…