以一个三输入的全加器为例,全加器的作用是将两个 1 位(1-Bit)的二进制数相加,并考虑到可能的进位。
关于 Full Adder 更详细的讲解,你可以在 Homework 1 的题目中看到!
SOP形式是用“与”(Product,或者称 And)项(称为 Product Terms)的“相加”(Add,或者称 Or)来表达逻辑函数,这些 Product Term 中的每个都能导致逻辑函数输出为 1 。
标准SOP形式中的每个product term都应该包含逻辑函数中的所有变量,无论是原始变量还是其反转形式。
例如,对于一个三输入函数
仍以全加器为例,观察真值表中 Sum(
布尔代数提供了一系列规则,用于逻辑函数的化简,使之可以用更少的逻辑门电路实现相同的功能。
虽然布尔代数可以用于化简逻辑函数,但是这种方法的局限性在于,可能无法找到逻辑函数的最简形式。尤其是对于包含多个变量的函数,手动化简可能既复杂又容易出错。
卡诺图是真值表的图形化表示。一个逻辑函数的卡诺图就是将此函数的最小项表达式中的各项最小项相应地填入一个特定的方格图内,此方格图为卡诺图。
左图为最小项的序号排列,右图为表达式对应的最小项
为什么两侧的数值不采用二进制数从小到大进行排列(事实上,这种排列形式叫“格雷码”)?
局限性:只能化简小于等于四个变量,(五个变量也可以,但一般不用)
这是一些不同大小的卡诺图。
基于化简后的逻辑表达式,可以选择合适的逻辑门来实现相应的逻辑功能。
例如,对于前述全加器中S的逻辑表达式
根据上面所学到的步骤,尝试搭建一个红绿灯故障检测的电路:
使用逻辑门电路设计一个监视交通信号灯工作状态的逻辑电路。每一组信号灯均由红、黄、绿三盏灯组成,如下图所示。正常工作情况下,任何时刻必有一盏灯点亮,而且只允许有一盏灯点亮。而当出现其他五种点亮状态时,电路发生故障,这时要求发出故障信号,以提醒维护人员前去修理。
取红、黄、绿三盏灯的状态为输入变量,分别用 R、A、G 表示,并规定灯亮时为 1,不亮时为 0。
取故障信号为输出变量,以 Z 表示之,并规定正常工作状态下 Z 为 0,发生故障时 Z 为 1。
R | A | G | Z |
---|---|---|---|
0 | 0 | 0 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 0 | 0 |
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
找 Z=1
时对应的 R、A、G 的值
化简后的逻辑表达式为:
Tunnel的规范使用如下,它会简化导线连接在电路图上的呈现。
Pin 能够创造一个数字信号输入电路,但是请不要对着一个Tunnel输入两组数字信号!
Splitter 能够将一路多位数字信号输入拆分为多路一位(或多位)数字信号输入。下面展示了一个将一路八位信号输入拆分为四路两位信号输出的Splitter:
Bit Width In
是输入的数字信号的位宽。Fan Out
是输出数字信号的路数,也就是个数。
对于一个 1 Bit 的二进制( 0
or 1
)来说,它的加法被定义为:
其中,在 1+1 中出现的 (1) 被称之为“进位”标志。因此,在硬件上,我们定义半加器有两个输入 a
和 b
和两个输出 sum
(表示 1 Bit 加法的结果) 和 cout
(表示进位),其公式为:
半加器只能执行 1 Bit 的加法运算,这显然不够“给力”。我们需要进一步分析加法的逻辑,来构建更加有用的加法单元:全加器。
全加器的核心是考虑了进位(被记为 cin
)。对于某一位来说,我们除了考虑两个加数的对应位数 a
和 b
,还要考虑是否有前一位传来的进位信息。因此,我们的输入就有三个数:a
,b
,cin
。我们需要构建这三个数到输出 sum
和 cout
的逻辑运算。
运行逻辑
cout
: a
、b
、cin
之中至少两个为高电平时,输出高电平。此时我们对输入两两取逻辑与,如果 a
、b
、cin
之中至少有两个高电平,那么三个逻辑与的输出也至少有一个为高电平,对逻辑与的三个输出取逻辑或即可。sum
: a
、b
、cin
之中仅有一个或全部为高电平时,输出高电平。将 a
、b
、cin
输入一个三输入异或门即可。(注意!这里的“三输入异或门”有不同的定义方式,请参考 Piazza 上的解答)关于“三输入的异或门”的两种定义方式:
你可以仔细思考一下这两种定义方式的异同,然后想一想,我们的全加器应该使用哪种定义方式。
刚才,我们设计了一位的全加器。这种全加器引入了 Cin 和 Cout 的概念,可以很方便的扩展到多位全加器,从而实现我们常规认知意义上的加法运算。
现在,我们尝试将 1-Bit 的全加器扩展到四位:我们需要四个输入 A、B、C、D,四个输出 Sum 和 Cout。我们需要将四个全加器连接起来,使得每一个全加器的 Cout 都连接到下一个全加器的 Cin 上。
在全加器的实现中,我们忽略可能出现的“多”的一位(称之为“溢出”位),这个值体现为全加器模块 Cout 的值,例如:
0b1111(15) + 0b1111(15) = 0b11110(30)
(Cout)1 (其他部分)1110
1110
部分即可。所谓“补码”,是指在二进制数的表示中,用一种特殊的方式表示负数:
0101
。0101
,取反得到 1010
,加1得到 1011
。在数字电路中,如果我们使用补码实现数字的表示,则“对一个数取负数”的操作是非常简单的。
使用了 Cin 和 Cout 结构的全加器可以很方便的实现减法:
我们就得到了一个减法器。事实上,这个减法器所计算的结果就是
Cout
的输出。七段 LED 数码管是一种常用的显示元件,常应用于手表、计算器等仪器中,用于显示数值。
数码管分为共阴极和共阳极两种类型:
这里的 LED 是共阴极 LED。
右图为数码管显示的数字 0~9 及十六进制的 a~f 的显示方式。
可以看到,每一个数字或字母都可以用七个二进制位表示,每一个二进制位对应数码管的一个引脚。我们所要做的就是将输入的数字或字母转换为七个二进制位,然后输出到数码管的引脚上。
我们将以1号管为例讲解。观察.circ文件:
既然只研究1号管,我们只需要关心: 四位输入是如何决定Disp1的高低电平的?
在 4-1 选择器中,我们已经熟悉了两位二进制输入表示一位四进制的想法,这里我们用分线器将输入拆分为独立的四个二进制输入 A、B、C、D。
你的工作流程应该是:。
真值表
2 3 4 5 6 8 9 A B d E F