HDLBits:在线学习 Verilog (十一 · Problem 50 - 54)

本系列内容来自于知乎专栏,链接如下:https://zhuanlan.zhihu.com/c_1131528588117385216

本系列文章将和读者一起巡礼数字逻辑在线学习网站 HDLBits 的教程与习题,并附上解答和一些作者个人的理解,相信无论是想 7 分钟精通 Verilog,还是对 Verilog 和数电知识查漏补缺的同学,都能从中有所收获。

Problem 50 Truth tables 真值表

在前面的练习中,我们使用简单的逻辑门和多个逻辑门的组合。这些电路是组合电路的例子。组合意味着电路的输出只是其输入的函数(在数学意义上)。这意味着对于任何给定的输入值,只有一个可能的输出值。因此,描述组合函数行为的一种方法是显式地列出输入的每个可能值的输出应该是什么。这是一张真值表。

对于n个输入的布尔函数,有2n个可能的输入组合。真值表的每一行列出一个输入组合,因此总是有2n行。输出列显示每个输入值的输出应该是什么。

HDLBits:在线学习 Verilog (十一 · Problem 50 - 54)_第1张图片

上述真值表适用于三输入一输出函数。它为8个可能的输入组合中的每一个都有8行,以及一个输出列。输出为1时有四个输入组合,输出为0时有四个输入组合。

从真值表合成电路,且仅限使用一组标准逻辑门,将如何构建电路呢?

本解析采用最小项之和的方法来构建电路图,最小项表达式为真值表中每一个对应函数值为1的输入变量,将上图真值表中函数值为1的最小项取出相加,便是函数最小项表达式。

上图最小项表达式为:

化简后如下所示:

(具体化简公式可自行百度)

module top_module(
    input x3,
    input x2,
    input x1,  // three inputs
    output f   // one output
);

    assign f = (!x3 & x2) | (x3 & x1);

endmodule

Problem 51 Two-bit equality

创建一个两输入inputs A [1:0], B[1:0],一输出Z。当A 与 B 相等时,Z 输出为1, 否则为0;

牛刀小试

//Module Declaration
module top_module ( input [1:0] A, input[1:0] B, output z);
module top_module ( input [1:0] A, input [1:0] B, output z );

    always @ (*)
        begin
            if(A == B)
                z = 1;
            else 
                z = 0;      //注意需要else,不仅为符合题意,且需要消除latch。
        end

endmodule

Problem 52 Simple circuit A

牛刀小试

创建一个电路,其功能可以实现 z = (x ^ y) & x

//Module Declaration
module top_module (input x, input y, output z);
    assign z = (x ^ y) & x;
endmodule

Problem 53 Simple circuit B

牛刀小试

根据仿真时序图创建电路B。

HDLBits:在线学习 Verilog (十一 · Problem 50 - 54)_第2张图片

根据时序图可画出真值表,再推导出电路图。但根据观察所得输出 z 为 x 与 y 的同或输出,即相同为1, 不同为0;故实现代码如下:

//Module Declaration
module top_module (input x, input y, output z);
    assign z = x ^~ y;
endmodule

Problem 54 Combine circuits A and B

根据子模块Problem 53 与 54 来实现如下电路:

HDLBits:在线学习 Verilog (十一 · Problem 50 - 54)_第3张图片
//Module Declaration
module top_module
(
    input x,
    input y,
    output z
);

wire z1, z2, z3, z4;

assign z1 = (x^y) & x;
assign z2 = x ^~ y;
assign z3 = (x^y) & x;
assign z4 = x ^~ y;

assign z = (z1 | z2) ^ (z2 & z3);

endmodule

【打个广告】

各位对数字IC和FPGA设计感兴趣的盆友们,我们搭建了一个QQ交流群。经过这一段时间的发展,群聊中已经有将近900个志同道合的同学加入。QQ群里已经整理了许多的资料,其中包含有视频,资料,教程,芯片手册,软件安装包,虚拟机环境。覆盖了从FPGA开发,数字前端,电路设计等等一系列的内容。QQ群号为810689010 ,进群暗号:公众号。欢迎进群交流!

为了能让这个群长期发展下去,用于支付扩建群聊所需的会员费,无奈将这个群设置成付费入群,仅需一元即可,多谢大家支持。

QQ群二维码

HDLBits:在线学习 Verilog (十一 · Problem 50 - 54)_第4张图片

期待与您的添加!

‧  END  

长按识别图中二维码关注

欢迎关注微信公众号【数字积木】,更精彩的内容等着你!

你可能感兴趣的:(编程语言,人工智能,javascript,数据挖掘,ai)