本实验的任务是搭建一个3-8的解码器,并通过小脚的LED灯显示解码结果。
听起来并不难,我可以想象很多同学会立即开始画8行真值表,然后通过卡诺图进行简化,根据最终的逻辑表达式画出门电路图。 这种方法当然没有什么问题,但如果你面对的是位数更多的系统,比如 4-16 或 8-256 解码器,构建一个数百行的真值表并执行逻辑运算可能听起来不太好。 科学。
这里我们将使用模块化的方法来完成我们的实验设计。
在开始模块化设计之前,我们首先制作一个2-4解码器,这是解码器系列中最底层的基础模块。
A1
A0
Y3
Y2
Y1
Y0
这次我们使用行为级描述(-level)来编写代码,根据真值表直接关联输入和输出的各种组合。 可以看出,行为级的写法甚至不需要门电路的搭建。 它只能通过输入-输出对应关系来构造。 因此,它是最抽象的,也意味着更快的计算速度? 。
[1:0]A, //定义两个输入
reg[3:0] Y //定义输出4位解码结果对应的LED
);
@(A) //Block语句,当a的值改变时执行一次过程块
开始
案例(A)
2'b00:Y = 4'b0001; //2-4解码结果
2'b01:Y = 4'b0010;
2'b10:Y = 4'b0100;
2'b11:Y = 4'b1000;
结尾
有了最基本的模块,如何通过它搭建一个3-8的解码器呢? 现在,我们在原来的真值表中添加一个使能信号E,然后看看新的真值表。 可以发现,当E为低电平时,无论输入值如何,前四位的输出都是0。当E为高电平时,右侧仍然是2-4解码器的输出结构。
A1
A0
Y3
Y2
Y1
Y0
我们可以将表 3 视为 3-8 解码器的真值表,只不过将输入的最高位替换为 E。由于 E 为低电平时输出的 4 个最高位均为 0,因此我们保证赋值至最后四位输出(黄色)不会影响前四位的输出。
A2
A1
A0
Y7
Y6
Y5
Y4
Y3
Y2
Y1
Y0
A1
A0
Y3
Y2
Y1
Y0
y3
y2
y1
y0
从表3中不难看出,黄色和红色方框对应的是带使能端的2-4解码器,使能端E控制前后半位数字的输出结果。 换句话说,一个3-8解码器可以由两个2-4解码器组成。 同样,一个4-16解码器可以由两个3-8解码器组成,以此类推。
启用 E 的 2-4 解码器如下所示。 其实就是对之前的代码稍作修改。 这里就不详细写出来,给大家自己练习的机会。
接下来,根据前面的分析,我们画出了两个2-4解码器组成的3-8解码器的结构。
下面是用编写的3-8解码器。 在程序中,我们调用了2-4解码器的子模块两次。 注意,子模块文件需要和文件放在同一个项目目录下,否则就成了邻家老人了。
输入线[2:0] X,
线[7:0]D
);
upper //调用第一个子模块,命名为upper
.a(X[1:0]), //将大模块的X1、X0与下模块的A1、A0匹配
.E(X[2]), //将大模块的X2与下模块的E进行匹配
.Y(D[7:4]) //将大模块的D7-D4与下模块的Y3-Y0匹配
);
lower //调用第二个子模块,命名为lower
.a(X[1:0]), //将大模块的X1、X0与下模块的A1、A0匹配
.E(!X[2]), //将大模块的X2与下模块的E进行匹配
.Y(D[3:0]) //将大模块的D7-D4与下模块的Y3-Y0匹配
);
当你在图片和代码之间反复徘徊了几轮,痛苦的领悟之后,你可以把你编译好的程序下载到 Foot中,然后通过实验来测试你的代码。
作为练习,当我们将输出D7-D1分别对应小脚上的L7-L1,输入X2-X0分别对应小脚的SW3-SW1时,请判断以下LED状态。
折腾了半天,你终于拿到了代码,并在你的小脚丫上成功验证了你的设计。 那么带着十足的信心,你终于可以上床睡觉尝试通过模块化的设计思路搭建4-16了。 更多位的解码器。
当然啦~我知道你再也不会真正老老实实地写程序了,所以我在这里问几个简单的问题,你可以自己动手思考一下。
Q1:构建一个4-16解码器需要多少个3-8解码器? 回答:
Q2:构建一个4-16解码器需要多少个2-4解码器? 回答:
Q3:构建一个 5-32 解码器需要多少个 2-4 解码器? 回答:
Q4:小明家的4-16解码器售价200元,小李家的2-4解码器售价50元。 现在您需要一个4-16解码器,您会如何选择:
A:去小明家买
B:去小李家买