组合逻辑
组合逻辑
数字电路根据逻辑功能的不同特点,可以分成两大类,一类叫组合逻辑电路(简称组合电路),另一类叫做时序逻辑电路(简称时序电路)。他们有什么区别呢,其实很简单:大家都知道,我们做的每个小电路,都可以抽象成一块封装好的,具有一定功能的电路板,它有输入端、电路板主体(就是内部结构)和输出端。电路内部结构和输入信号共同决定输出信号。组合逻辑电路的输出仅仅取决于当前输入;时序逻辑电路的输出取决于当前的输入和电路原来的状态,或者可以说:时序逻辑电路的输出,不仅与当前输入有关,也与过去的输入有关。时序逻辑是有记忆的电路板,组合逻辑是没有记忆的电路板。

我们首先来学习组合逻辑。
组合逻辑就很简单,理论上,只要明确了我们需要实现的电路的逻辑表达式(大家上学期的离散数学课应该都学过吧?),就可以按照逻辑表达式轻而易举的做出电路图。所以组合逻辑这块的重点就是写好逻辑表达式:大家需要分析题目的需求,抽象出逻辑表达式,然后画出对应的电路图,组合逻辑的问题就是这样。
我们来看一道例题:现在需要你实现一个电路,它有三个输入端:S、i1、2,和两个输出端 o1、o2。要实现的功能很简单:当 S=0 时,你要保证 o1=i1且 o2=i2;当 S=1 时,你要保证 o1=i2,o2=i1。
题目的需求了解了,这就是一个一位 swap 电路。首先我们要按照题目需求写出真值表。
S i1 i2 o1 o2
0 0 0 0 0
0 0 1 0 1
0 1 0 1 0
0 1 1 1 1
1 0 0 0 0
1 0 1 1 0
1 1 0 0 1
1 1 1 1 1
接下来按照真值表写出对应的逻辑表达式并化简。 (说明:写出并化简逻辑表达式的方法可以参考《数字设计原理与实践 第四版》P213 。)
然后按照化简完的表达式画出电路图就可以了:

也许你会觉得这个过程很繁琐,的确,尤其是输入输出信号变多的时候,手动进行"写真值表->写逻辑表达式->化简逻辑表达式->制作电路"这个过程将变得相当复杂。
没关系,Logisim 提供了一种更加简便的方法:Analyze Circuit。
点击左上角 Project->AnalyzeCircuit,定义你的输入输出信号名称,再点击 窗口中的Table,手动输入真值表,就可以自动生成化简好的逻辑表达式以及电路了,非常的方便!

绝大多数情况,课设需要你实现的组合逻辑问题,都可以用 Analyze Circuit 完成,大家记得写完真值表后检查一下,看看有没有疏漏,以防出现马虎产生的bug。
接下来大家可以通过练习一下Lab1的课下实验1(搭建一个小型ALU)来检验对组合逻辑电路的掌握情况。
思考:
课下测试 1 做出的 ALU 其实是有缺陷的。
真正我们在设计 CPU 的时候是绝对不允许这样的缺陷存在的,否则我们的 CPU将无法正确执行乘除指令。
我们使用的 MIPS-Lite2 指令集规定:对于乘法指令,得到的结果,高 32 位存储在 hi 寄存器中,低 32 位存储在 lo 寄存器中;对于除法指令,32位的商存储在 lo 寄存器中,32 位的余数存储在 lo寄存器中.而且,真实情况下乘除法运算部件的延迟是比其他算数、逻辑运算的延迟高得多的。因此在真正搭建 CPU 时,乘除法运算通常是放在单独的乘除法运算模块进行,而不是在 ALU 中。
感兴趣的同学可以自行查阅资料了解。