目录
8位可控加减法电路设计
实验目的
帮助学生掌握一位全加器的实现逻辑,掌握多位可控加减法电路的实现逻辑,熟悉 Logisim 平台基本功能,能在 logisim 中实现多位可控加减法电路。
首先了解一下一些概念:
半加器 是一种能实现两个一位二进制数(A, B)相加,并输出一个结果位(S)和进位(C0)的加法器电路。它没有进位输入端,因此不考虑低位向本位的进位。
![]()
全加器 是一种除了能完成两个一位二进制数(A, B)的相加功能得到和位(S)和进位(Cout)之外,还能连同低位的进位(Cin)一起相加的加法器电路。
其次,计算机无法直接进行减法运算,故引入补码概念。至此计算机中可将加减法看作一类运算。
[A]补 + [B]补 = C
[A]补 - [B]补 = [A]补 + [-B]补 = [A]补 + ([B]补)全反 + 1 = C
最后是 溢出判断,根据运算过程中的最高数据位与符号位的仅为是否一致进行检验。设最高有效数据为产生的仅为信号为 ,符号位产生的进位信号为
,则溢出检测为
接下来就是按着连线。
这里注意Cout,OF是需要自己加的隧道线路,并要将其位宽设置为1。
CLA182四位先行进位电路设计
实验目的
帮助学生掌握快速加法器中先行进位的原理,能利用相关知识设计4位先行进位电路,并利用设计的4位先行进位电路构造4位快速加法器,能分析对应电路的时间延迟。
首先我们来了解一下是先行进位的原理,在上一个实验中,看出全加器的高位运算必须等待地位的进位信号,导致延迟很大,所以我们需要考虑优化时间。
使得进位输出与最低为进位输入存在一级运算关系,大大节省了多次进位传递的时间。整个电路的延迟就是二级门电路延迟。
这样我们就可以写出并行加法器进位链 ,无需等待低位给出进位信号,因此出现了先行进位电路。缺点就是位数越长,进位链电路的复杂度就越高。
其中 Gi,Pi 为进位生成函数和传递函数,Cin 为进位输入,C1~C4 为进位输出。
这里还需介绍一下G,P 为成组进位生成函数和成组进位传递函数。
成组进位生成函数 G用于计算组内各位的进位生成情况,并综合得出整个组的进位生成信号。在四位先行进位加法器中,Gg可以表示为:
它综合了组内各位的进位生成情况,并生成一个总的进位生成信号。这个信号对于确定高位组的进位情况至关重要。
成组进位传递函数 P用于传递低位组的进位信号到高位组。在四位先行进位加法器中,Pg可以表示为:
将低位组的进位信号传递到高位组。通过Pg,低位组的进位可以影响到高位组的计算,从而实现整个加法器的快速运算。
接下来是C1~C4进位输出链的逻辑表达式
接下来也就是根据逻辑表达是连线了,需要注意的就是与或门的引脚数。 (这里连线建议自己按照上述的逻辑电路关系自己来连,下面的连线可能看得比较花)。
4位快速加法器设计
实验目的
帮助学生掌握快速加法器中先行进位的原理,能利用相关知识设计4位先行进位电路,并利用设计的4位先行进位电路构造4位快速加法器,能分析对应电路的时间延迟。
将上一个实验完成后,得到所有的进位信号,各位就可以并行求和了,求和公式如下:
所以求和只在上一个实验后加了一级异或门就能得到,所以整个电路的延迟就是三级门电路延迟。
16位快速加法器设计
实验目的
帮助学生理解成组进位产生函数,成组进位传递函数的概念,熟悉 Logisim 平台子电路的概念,能利用前述实验封装好的4位先行进位子电路以及4位快速加法器子电路构建16位、32位、64位快速加法器,并能利用相关知识分析对应电路的时间延迟,理解电路并行的概念。
这个实验就是针对上个实验的一个组合电路的设计思想,已经有4位的快速加法器那么16的快速加法器只需要连接4个4位的快速加法器就行了,这里就不多做介绍。
32位快速加法器设计
实验目的
帮助学生理解成组进位产生函数,成组进位传递函数的概念,熟悉 Logisim 平台子电路的概念,能利用前述实验封装好的4位先行进位子电路以及4位快速加法器子电路构建16位、32位、64位快速加法器,并能利用相关知识分析对应电路的时间延迟,理解电路并行的概念。
这里的思路和上一个实验大致差不多,其实也可以用2个16位的快速加法器来连接实现,但是这里的题目只提供了4位快速加法器,所以就得连接8个4位快速加法器来实现,也不多赘述了。
MIPS运算器设计
实验内容:
利用前面实验封装好的32位加法器以及 Logisim 平台中现有运算部件,构建一个32位算术逻辑运算单元(禁用 Logisim 系统自带的加法器,减法器),可支持算术加、减、乘、除,逻辑与、或、非、异或运算、逻辑左移、逻辑右移、算术右移运算,支持常用程序状态标志(有符号溢出 OF 、无符号溢出 UOF ,结果相等 Equal ),ALU 功能以及输入输出引脚见后表,在主电路中详细测试自己封装的 ALU ,并分析该运算器的优缺点。
解释:
这里我们看到会有三个输入,输入S表示要进行的操作类型,所以我们就需要根据上表来组织电路。(这里它说不能用自带的加法器和减法器,那我们就用我们之前做的32位快速加法器来构造就行了),接下来我们一个一个操作来讲解一下(我们先把所有的结果都算出来再根据ALU_OP来选择需要的输出即可):
当s=0,Result = X << Y 逻辑左移 (Y 取低五位) Result2=0:
这里Y取低五位是因为该X只有32位,所以左移的最大,所以Y只需要5位就可以表示0~32之间的数。
端口数表示为输出的分线数,这里改5或者4都可以,主要是把下面的前5位的数让他们在第一个端口输出,而其他的不能在第一个端口输出即可。
在运算器中找到移位器,设置位宽和左移类型,加入输出0的隧道引脚。
Result = X >>>Y 算术右移 (Y 取低五位) Result2=0:
同上述一样,但注意这里是算数右移。
Result = X >> Y 逻辑右移 (Y 取低五位) Result2=0:
注意这个是逻辑右移,输出标签为3.
Result = (X * Y)[31:0]; Result2 = (X * Y)[63:32] 无符号乘法:
这里使用自带的乘法器,设置位宽32,且结果的高位为输出标签为3',结果为标签3。
Result = X/Y; Result2 = X%Y 无符号除法:
除法运算和上一个差不多,使用自带的除法器,设置位宽为32,和输出标签。
Result = X + Y (Set OF/UOF):
有符号加法溢出OF+:看最高位进位和次高位进位是否一致
无符号加法溢出UOF+:最高位与sub异或,加法的话sub是0,而当最高位为1时表示溢出。
再输出标签5.
Result = X - Y (Set OF/UOF):
使用求补器讲Y转化成补码,所以sub还是为0,在计算无符号溢出时就得加一个取反。
Result = X & Y 按位与,按位或,按位异或,按位或非:
这四个比较简单,找到对应得逻辑门,并设置位宽为32即可。
Result = (X < Y) ? 1 : 0 符号比较
这里我们需要用到比较器即红色部分(类型选择2的补码,表示有符号比较),我们输出得答案是32位的数,而比较器返回的只是一位的数,所以我们使用分线器的端口0来接受比较结果(如黄色部分的设置,位宽32,端口数2,除了第一个是0号端口其余都是1号端口),再引入一个位宽为31的0的常量(如蓝色部分)来组合成一个32的满足输出要求的数。
之后再接一个Equal。
Result = (X < Y) ? 1 : 0 无符号比较:
这里我们需要用到比较器即红色部分(类型选择无符号),同上一个一样,我们使用分线器的端口0来接受比较结果(如黄色部分的设置,位宽32,端口数2,除了第一个是0号端口其余都是1号端口),再引入一个位宽为31的0的常量(如蓝色部分)来组合成一个32的满足输出要求的数。
接下来是输出结果的选择:
使用多路选择器(如红色部分,设置位宽为32,端位宽为4)来根据输入的s来指定输出结果,注意输出Result2的含义,表示
即操作三和四的3'和4',接到第二个的多路选择器的输入3和4(如黄色部分), 其余都接一个位宽为32的常量0(如蓝色部分)。
溢出判断:
这里我们使用比较器(位宽为4)来看是否操作为5、6,再引入位宽为4的常量5、6,通过与门和或门来合理规划电路。
测试:
编写好后可以根据其自带的测试电路来进行测试(如红色部分),按Ctrl+k开始测试,如果成绩为100表示全部通过没有问题;如果有误的话下面可以看是哪个运算错误就会在其指示灯报红。
全部电路一览:
(希望你能顺利通过)
(有帮助请点赞支持,有疑问也可评论指出)