该个栏目的博客都是基于南京大学的数字逻辑与计算机组成的课程设计,方便以后进行总结归纳而准备的。
这次实验是实验一:选择器。设计一个简单的选择器,介绍一些常用的多路选择器的设计方法。Verilog语言中的always语句块、if-else语句和case语句的使用等。最后请读者自行设计一个多路选择器。
1.二选一多路选择器
通过上述的真值表和卡诺图,可以得到二选一选择器的表达式y=(~s&a)|(a&b);以及通过表达式可以画出其实际的逻辑电路。
常用的有以下三种方式:数据流建模方式、结构化建模和行为级建模对电路的功能进行描述。应该要做到心中有电路,直接进行描述。而不是希望通过行为级建模的方式,让综合器生成某种行为的电路,这就偏离了“描述电路”的本质了。
基于vivado的综合,这里给出一个二选一多路选择器,采用行为级建模和数据流建模的不同之处。
数据流建模:
行为级建模
可以很明显的看出,行为级建模和数据流建模通过RTL的电路都并不相同,行为级建模是通过一个多路选择器实现的,而且数据流建模则是采用与非门实现的功能。MUX的最低的单元,可能不利于描述电路。
真正的描述电路=实例化+连线;
用HDL设计电路,就是在用HDL来描述电路图纸,图纸上有什么,就直接描述什么。所以,用HDL描述电路,无非是做两件事情:
实例化:在电路板上放一个元件/模块,可以是一个门电路,或者是由门电路组成的模块
连线:用导线将元件/模块的引脚正确地连起来
大家可以体会一下,数据流建模和结构化建模是如何体现这两件事的,而行为建模又是如何把这两件简单的事情复杂化的。所以在未掌握“描述电路”的思维而不被行为建模误导之前,我们应该远离行为建模方式,仅通过数据流建模和结构化建模方式直接描述电路。可以通过思考以下问题来帮助大家测试自己是否已经掌握了Verilog的本质:
1.在硬件描述语言中,“执行”的精确含义是什么?
2.是谁在执行Verilog的语句?是电路,综合器,还是其它的?
3.if的条件满足,就不执行else后的语句,这里的“不执行”又是什么意思? 和描述电路有什么联系?
4.有“并发执行”,又有“顺序执行”,还有“任何一个变量发生变化就立即执行”,以及“在任何情况下都执行”,它们都是如何在设计出来的电路中体现的?
**虽然学了有一段时间,但这几个问题依然没有什么思路。**所以目前,不采用行为建模的方式。
2.四选一多路选择器
module mux41(a,s,y);
input [3:0] a; // 声明一个wire型输入变量a,其变量宽度是4位的。
input [1:0] s; // 声明一个wire型输入变量s,其变量宽度是2位的。
output reg y; // 声明一个1位reg型的输出变量y。
always @ (s or a)
case (s)