一、组合逻辑电路
-
基本门
-
电线
实现以下电路:
![](https://i-blog.csdnimg.cn/blog_migrate/ff8606dabf00ba3006086c0f46483d33.png)
-
GND
实现以下电路:
![](https://i-blog.csdnimg.cn/blog_migrate/ae68fd1cbeb9e519433128979daafb14.png)
-
NOR或非门
实现以下电路:
![](https://i-blog.csdnimg.cn/blog_migrate/c6306b00c7a6d5018e6be9c11304f416.png)
-
Another gate
实现以下电路:
![](https://i-blog.csdnimg.cn/blog_migrate/192a3b314eb74e6f44b5dca8f233493d.png)
-
两个逻辑门级联
实现以下电路:
![](https://i-blog.csdnimg.cn/blog_migrate/d2938c1855238339547e7efba8f6dd0f.png)
-
More logic gates
好吧,我们试着同时建造几个逻辑门。构建具有两个输入的组合电路,a和b.
有7个输出,每个输出都有一个逻辑门驱动:
-
out_and: a和b
-
out_or: a还是b
-
out_xor: a xor b
-
out_nand: a nand b
-
out_nor: a或非b
-
out_xnor: a xnor b
-
out_anotb: a和-not b
-
7420芯片
7400系列集成电路是一系列数字芯片,每个芯片都有几个门。7420是一个带有两个4输入与非门的芯片。
创建一个功能与7420芯片相同的模块。它有8个输入和2个输出。
![](https://i-blog.csdnimg.cn/blog_migrate/25ff8e711e1fbc0070eb23ee48e7538a.png)
-
真值表1
在前面的练习中,我们使用了简单的逻辑门和几个逻辑门的组合。这些电路是组合的电路。组合意味着电路的输出仅仅是其输入的函数(在数学意义上)。这意味着对于任何给定的输入值,只有一个可能的输出值。因此,描述一个组合函数的行为的一种方式是明确地列出对于每个可能的输入值,输出应该是什么。这是一个真值表。
对于N输入的布尔函数,有2N可能的输入组合。真值表的每一行都列出了一个输入组合,所以总是有2个N行。输出列显示了每个输入值的输出。
排 | 输入 | 输出 | ||
数字 | x3 | x2 | x1 | f |
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | 0 |
2 | 0 | 1 | 0 | 1 |
3 | 0 | 1 | 1 | 1 |
4 | 1 | 0 | 0 | 0 |
5 | 1 | 0 | 1 | 1 |
6 | 1 | 1 | 0 | 0 |
7 | 1 | 1 | 1 | 1 |
上面的真值表是针对一个三输入一输出的函数。对于8种可能的输入组合,每种组合有8行,还有一个输出列。有四种输入组合,其中输出为1,四种输入组合中输出为0。
从真值表合成电路
假设我们想构建上述电路,但我们仅限于使用一组标准逻辑门。你如何构建任意的逻辑函数(用真值表来表示)?
创建实现真值表功能的电路的一种简单方法是以积和的形式表示该功能。总和的(意思是或)制品(意为和)表示使用一个N-真值表每一行的输入与门(检测输入何时匹配每一行),后跟一个或门,只选择产生“1”输出的那些行。
对于上面的例子,如果输入匹配第2行,则输出为“1”或者第三排或者第5行或者第7行(这是一个4输入OR门)。如果x3=0,则输入匹配第2行和x2=1和x1=0(这是一个3输入与门)。因此,这个真值表可以在权威的使用4个“与”门进行“或”运算形成。
一点点练习
创建一个实现上述真值表的组合电路。
![](https://i-blog.csdnimg.cn/blog_migrate/634b9e014ae331e64af9e0e6c625a3b5.png)
-
两位相等
创建一个具有两个2位输入的电路答[1:0]和乙[1:0],并产生输出z。的价值z应为1,如果A = B,否则z应该是0。
module top_module ( input [1:0] A, input [1:0] B, output z );
-
简单逻辑电路A
模块A应该实现这个功能z = (x^y) & x。实现此模块。
-
简单逻辑电路B
电路B可由以下模拟波形描述: 实现这个电路。
![](https://i-blog.csdnimg.cn/blog_migrate/fbf8b90542d4702e6146c997d3f2b153.png)
-
组合电路A和B
看见mt2015_q4a和mt2015_q4b对于这里使用的子模块。顶层设计由子电路A和B的两个实例组成,如下所示。
![](https://i-blog.csdnimg.cn/blog_migrate/87dc4e3e6412bc7ff0d0d2aa361d1317.png)
实现这个电路。
-
Ring还是Vibrate?
假设你正在设计一个电路来控制手机的铃声和振动马达。每当电话需要因来电而响铃时(input ring),您的电路必须打开振铃器(output ringer = 1)或马达(output motor = 1),但不可兼得。如果电话处于振动模式(input vibrate_mode = 1),打开电机。否则,打开振铃器。
尽量只使用assign语句,看看能否将一个问题描述翻译成一组逻辑门。
设计提示:设计电路时,人们常常不得不“逆向”考虑问题,从输出开始,然后向输入逆向工作。这通常与人们思考(顺序的、命令式的)编程问题的方式相反,人们会首先查看输入,然后决定一个动作(或输出)。对于顺序程序,人们通常会认为“如果(输入是__)那么(输出应该是__)”。另一方面,硬件设计者往往认为“当(输入为__)时(输出应为__)”。
上述问题描述是以适用于软件编程的命令式形式编写的(如果响了,就这样做),因此您必须将其转换为更适合硬件实现的声明性形式(assign ringer = ___).能够在两种风格中思考和转换是硬件设计所需的最重要的技能之一。
![](https://i-blog.csdnimg.cn/blog_migrate/8bed31c4baf05a43492fcb7e4d19c770.png)
-
恒温器电路
加热/冷却恒温器控制加热器(在冬天)和空调(在夏天)。实施一个可以根据需要打开和关闭加热器、空调和鼓风机的电路。
恒温器可以处于两种模式之一:加热(mode = 1)和冷却(mode = 0).在加热模式下,当温度太低时打开加热器(too_cold = 1)但是不要用空调。在制冷模式下,太热时打开空调(too_hot = 1),但不要打开加热器。当加热器或空调打开时,也要打开风扇使空气流通。此外,用户还可以请求风扇打开(fan_on = 1),即使暖气空调都关了。
尽量只使用assign语句,看看能否将一个问题描述翻译成一组逻辑门。
-
3-bit群体计数电路
“群体计数”电路计算输入向量中“1”的数量。为一个3位输入向量构建一个群体计数电路。
-
门和向量
在[3:0]中给你一个四位输入向量。我们想知道每一位与其相邻位之间的一些关系:
-
out_both:该输出向量的每一位应该指示两者对应的输入位及其与左边的(较高的指数)为“1”。举个例子,out_both[2]应指出是否在[2]和在[3]都是1。因为在[3]左边没有邻居,答案是显而易见的,所以我们不需要知道out_both[3].
-
out_any:该输出向量的每一位应该指示任何的对应的输入位和它的邻居正确为“1”。举个例子,out_any[2]应指出是否在[2]或者在[1]是1。因为在[0]中右边没有邻居,答案是显而易见的,所以我们不需要知道out_any[0].
-
out _不同:该输出向量的每一位应该指示相应的输入位是否不同于它的邻居左边的。举个例子,out_different[2]应指出是否在[2]不同于在[3]。对于这一部分,将向量视为环绕,因此在[3]左边的邻居是在[0]中.
-
100位输入向量
在[99:0]中给你一个100位的输入向量。我们想知道每一位与其相邻位之间的一些关系:
-
out_both:该输出向量的每一位应该指示两者对应的输入位及其与左边的为“1”。举个例子,out_both[98]应指出是否在[98]和在[99]都是1。因为在[99]左边没有邻居,答案是显而易见的,所以我们不需要知道out_both[99].
-
out_any:该输出向量的每一位应该指示任何的对应的输入位和它的邻居正确为“1”。举个例子,out_any[2]应指出是否在[2]或者在[1]是1。因为在[0]中右边没有邻居,答案是显而易见的,所以我们不需要知道out_any[0].
-
out _不同:该输出向量的每一位应该指示相应的输入位是否不同于它的邻居左边的。举个例子,out_different[98]应指出是否在[98]不同于在[99]。对于这一部分,将向量视为环绕,因此在[99]左边的邻居是在[0]中.