璀璨星空
[野火] 第10章 简单组合逻辑 --- 多路选择器
00 min
Sep 20, 2023
Feb 25, 2024
type
status
date
slug
summary
tags
category
icon
password
💡
特别鸣谢野火FPGA的教学与帮助! 本节相关的教程link 📌
 

10.1 章节导读


在本章节,我们用Verilog 语言描述一个具有多路选择器功能的电路,使读者能够掌握新的语法知识和基本的框图、波形、代码设计方法,最后通过仿真来验证设计的正确性。

10.2 理论学习


多路选择器是数据选择器的别称。在多路数据传送过程中,能够根据需要将其中任意一路选出来的电路,叫做数据选择器,也称多路选择器或多路开关。在选择变量控制下, 从多路数据输入中某一路数据送至输出端。对于一个具有 2^n 个输入和 1 个输出的多路选择器,有 n 个选择变量。多路选择器也是 FPGA 内部的一个基本资源,主要用于内部信号的选通。简单的多路选择器还可以通过级联生成更大的多路选择器。

10.3 实战演练


10.3.1 实验目标


设计并实现 2 选 1 多路选择器,主要功能是通过选通控制信号 S 确定选通 A 路或 B 路作为信号输出。当选通控制信号 S 为 1 时,信号输出为 A 路信号;当选通控制信号 S 为 0 时,信号输出为 B 路信号。

10.3.2 硬件资源


我们使用开发板上的按键和 LED 灯进行 2 选 1 多路选择器的验证,选取 KEY1、KEY2、KEY3 分别作为信号 A、信号 B 和选通信号 S 的信号输入;以 LED 灯 D6 作为信号输出 O,如图 10-1 所示。
notion image
notion image

10.3.3 程序设计


 

1. 模块框图


根据功能分析,该工程只需实现一个 2 选 1 多路选择器的功能,所以设计成一个模块即可。模块命名 mux2_1,模块的输入有三个 1bit 信号,两个名为 in1 和 in2 的数据输入信
号和一个名为 sel 的选通控制信号,输出为 1bit 名为 out 的数据输出信号。根据上面的分析设计出的 Visio 框图如图 10-4 所示。
notion image

2. 波形图绘制


框图结构设计完毕后就可以实现该模块的具体功能了,也就是要找到输入和输出之间具体的映射关系。输入和输出满足信号与系统中输入与响应的关系。其中输入信号的名字用绿色表示,输出信号的名字用红色表示,任意模拟输入波形,画出输出信号的波形。
经分析得,当 sel 为低电平时,out 的输出波形和 in2 相同;当 sel 为高电平时,out 的输出波形和 in1 相同。根据分析的输入输出关系,我们列出如表格 10-2 所示的真值表,然后再根据真值表的输入与输出的对应关系画出波形图。其波形图如图 10-5 所示,图中蓝色的线代表有效信号。
notion image
notion image

3. 代码编写


实现 2 选 1 多路选择器功能的 Verilog 代码形式有很多种,我们这里主要列举三种实现方法,这三种方法对应的核心语法各不相同,后面我们还会经常用到。
notion image
notion image
就是为什么 always 块中被赋值的一定要是 reg 型变量,他并没有生成寄存器而是实现的的组合逻辑的功能?因为在 Verilog 语言中,寄存器的特点是,它需要在仿真运行器件中保存其值,也就是说这个变量在仿真时需要占据内存空间, 而上面的 always 块只对 sel、in1、in2 三个变量的输入敏感,如果没有这三个变量的变化事件,则 out 变量将需要保存其值,因此它们必须被定义为 reg 型变量,但是在综合之后,并不对应硬件锁存器或者触发器(后面会讲到什么时候会出现综合成这两种的情况)。
notion image
notion image
notion image
我们发现这并不是最基本的门电路,而是一个多路器的符号,之前不是说数字电路不都是由最基本的门电路构成的吗, 这个为什么不是呀?因为我们描述的角度不同,我们是从寄存器传输级这个层次来描述的,最基本的单元可能就是这些寄存器、多路器、译码器、比较器、加法器等等,这些基本的单元再往底层划分还是可以由其他的门电路构成的,所以在描述这些电路功能时我们也可以用最基本的门电路来描述,那我们最后看到的 RTL 视图就是由门电路构成的了,其缺点就是效率太低。既然我们可以从更高的层次描述实现的功能来提高效率,为什么还要用低层次的描述方式呢,所以基于门级的描述我们很少用,大家在看其他资料的时候有很多都是将这两者混在一起讲的,这样是让初学者感觉迷惑的地方。那就有人问了还有没有更高层次的描述方法?当然有,比寄存器传输级还高的描述方式有算法级和系统级,将会使用到更高级的语言,如 System Verilog 和 Ssytem C,也可以使用 C 和 C++再通过高层次综合(High-level Synthesis,HLS)的方式来实现。
notion image
通过以上三种不同的代码编写方式,我们首先可以了解到一个最基本模块的书写格式和方法,还知道 Veriolg 语言和 C 语言相似的地方就是实现相同功能,其代码方式是多种多样的,所以大家在代码的实现上就有很多的选择,看到别人不同的写法也不要大惊小怪,我们要关注的是最后的功能,在不考虑资源使用的情况下只要功能满足要求,代码的灵活性可以随意控制。通过对比发现以上三种不同代码方式实现的 2 选 1 多路选择器对应综合出的 RTL 视图虽有所差别,但综合工具在布局布线和最后映射 FPGA 资源时会自动优化,使最终的功能和占用的逻辑资源都是相同的。

4. 仿真验证


notion image
notion image

仿真波形分析


在验证 RTL 逻辑时,我们不用关心内部结构是如何实现的,只需达到被验证的“黑盒子”模块需要什么激励才能够比较完全的达到验证功能正确性的目的,根据此需求来提供相应的输入激励,观察输出是否为我们最初设计的结果。这个模块的输入信号只有两个, 因为是组合逻辑,输入信号的时序关系也很简单,只需要给不同的输入输出值就可以了, 我们在 testbench 中使用随机数函数生成随机变化的 0、1 给输入端口,先通过 ModelSim 仿真出的波形验证 RTL 逻辑是否正确,再通过观察“Transcript”中打印的信息进行验证。
ModelSim 打开后仿真波形自动运行的时间为 1us,这里我们不需要观察这么多时间。先清空波形,然后重新设置仿真时间为 500ns,运行后即可验证结果的正确性(在某些情况下仿真波形运行 1u 后仍不能观察到所需要验证的结果,此时可以再重新设置仿真时间,该时间也不宜设置太久,否则会使会导致运行的时间过长且运行后占用较大的电脑内存空间,总之以适度原则为主,或者用修改参数的方法同比例缩小必要仿真时间)。 通过图 10-9 所示的波形我们可以观察到,当 sel 为高电平时,out 输出为 in1 的值;当sel 为低电平时,out 输出为 in2 的值,完全符合我们代码中的逻辑设计。
notion image
下面我们通过观察“Transcript”界面(如图 10-10 所示)打印的结果再进行验证(如果打开的界面找不到 Wave 或 Transcript 窗口可以点击“Tool”下面的列表进行添加,如图 10-11 所示)。
notion image
我们通过观察“Transcript”界面(如图 10-12 所示)中打印的结果发现红色小框组成的结果即为 out 输出的结果,我们可以发现这个打印信息和真值表的样式几乎是一模一样,在组合逻辑中,因为不考虑延时的问题,所以一行有效数据对应的就是独立的一行, 清晰直观,将打印信息与前面绘制的真值表进行比对,能够更加快速验证结果的正确性。
notion image

10.3.4 上板验证


 

1. 引脚约束


仿真验证通过后,准备上板验证,上板验证之前先要进行引脚约束。工程中各输入输出信号与开发板引脚对应关系如表格 10-3 所示。引脚配置如图 10-13 所示。
notion image
notion image

2. 结果验证


如图 10-14 所示,开发板连接 5V 直流电源和 USB-Blaster 下载器 JTAG 端口。线路正确连接后,打开开关为板卡上电
程序下载完毕后,开始进行结果验证。当按键 KEY3 未被按下时,sel 输出为高电平,输出信号为 in1;按键 KEY1 未按下,in1 输出高电平,led 灯未被点亮;按键 KEY1 按下,in1 输出低电平,led 灯点亮。当按键 KEY3 按下时,sel 输出为低电平,输出信号为 in2;按键 KEY2 按下,in2 输出低电平,led 灯点亮。

10.4 章末总结


本章通过 2 选 1 多路选择器介绍了如何编写一个最简单的 RTL 逻辑功能模块以及对应的仿真的代码如何编写,并进行了仿真验证。其中介绍了很多语法的实际应用和需要注意事项,希望读者能够掌握。
notion image
notion image

10.5 拓展训练


完成本章实例程后,希望大家可以自己多动手练习,并分别用本章中提到的三种方式分别编写一个 8 选 1 多路选择器,并编写对应的 Testbench,且使用 ModelSim 进行验证, 以达到强化熟悉语法、模块结构和软件操作流程的目的。

Comments