头歌计算机组成原理实验—运算器设计(11)第11关:MIPS运算器设计

第11关:MIPS运算器设计

实验目的

学生理解算术逻辑运算单元(ALU)的基本构成,掌握 Logisim 中各种运算组件的使用方法,熟悉多路选择器的使用,能利用前述实验完成的32位加法器、 Logisim 中的运算组件构造指定规格的 ALU 单元。

视频讲解

实验内容

利用前面实验封装好的32位加法器以及 Logisim 平台中现有运算部件,构建一个32位算术逻辑运算单元(禁用 Logisim 系统自带的加法器,减法器),可支持算术加、减、乘、除,逻辑与、或、非、异或运算、逻辑左移、逻辑右移、算术右移运算,支持常用程序状态标志(有符号溢出 OF 、无符号溢出 UOF ,结果相等 Equal ),ALU 功能以及输入输出引脚见后表,在主电路中详细测试自己封装的 ALU ,并分析该运算器的优缺点。

电路框架

alu.circ

电路引脚

信号输入/输出位宽说明
X输入32 位操作数 X
Y输入32 位操作数 X
ALU_OP输入4 位运算器功能码,具体功能见下表
Result输出32 位ALU 运算结果
Result2输出32 位ALU 结果第二部分,用于乘法指令结果高位或除法指令的余数位,其它运算时值为零
OF输出1 位有符号加减运算溢出标记,其它运算时值为零
UOF输出1 位无符号加减运算溢出标记,其它运算时值为零,溢出条件(加法和小于加数,减法差大于被减数)
Equal输出1 位Equal=(x==y)?1:0, 对所有运算均有效
ALU_OP十进制运算功能
00000Result = X << Y 逻辑左移 (Y 取低五位) Result2=0
00011Result = X >>>Y 算术右移 (Y 取低五位) Result2=0
00102Result = X >> Y 逻辑右移 (Y 取低五位) Result2=0
00113Result = (X * Y)[31:0]; Result2 = (X * Y)[63:32] 无符号乘法
01004Result = X/Y; Result2 = X%Y 无符号除法
01015Result = X + Y (Set OF/UOF)
01106Result = X - Y (Set OF/UOF)
01117Result = X & Y 按位与
10008Result = X or Y 按位或
10019Result = X⊕Y 按位异或
101010Result = ~(X orY) 按位或非
101111Result = (X < Y) ? 1 : 0 符号比较
110012Result = (X < Y) ? 1 : 0 无符号比较

电路测试

电路框架提供了自动测试子电路,也可以自行评分,具体测试电路如下图所示:

完成实验后,利用文本编辑工具打开 alu.circ ,将所有文字信息复制粘贴到 Educoder 平台的 alu.circ 文件中,再点击评测按钮即可进行本关测试。平台会对你设计的电路进行自动测试,为方便测试,请勿修改子电路封装,本关测试用例如下:

 
  1. CNT X Y AluOp Result Result2 OF UOF EQ
  2. 00 ff00ffff 00000007 0 807fff80 00000000 0 0 0
  3. 01 ff00ffff ff00ffff 0 80000000 00000000 0 0 1
  4. 02 ff000000 00000018 1 ffffffff 00000000 0 0 0
  5. 03 ff00ffff 00000018 2 000000ff 00000000 0 0 0
  6. 04 7fffffff 00000010 3 fffffff0 00000007 0 0 0
  7. 05 fffffffe 00000010 4 0fffffff 0000000e 0 0 0
  8. 06 0000ffff 00000080 5 0001007f 00000000 0 0 0
  9. 07 ffffffff ffffffff 5 fffffffe 00000000 0 1 1
  10. 08 7fffffff 0000000c 5 8000000b 00000000 1 0 0
  11. 09 80000000 80000000 5 00000000 00000000 1 1 1
  12. 0a 7ff00000 0000007c 6 7fefff84 00000000 0 0 0
  13. 0b 0000007c 7ff00000 6 8010007c 00000000 0 1 0
  14. 0c 80000000 00000001 6 7fffffff 00000000 1 0 0
  15. 0d 7fffffff fffffffe 6 80000001 00000000 1 1 0
  16. 0e ff00ffff 00000018 7 00000018 00000000 0 0 0
  17. 0f 7fffffff 00000074 8 7fffffff 00000000 0 0 0

开始你的闯关任务吧,升级打怪中....

参考答案:

直接复制代码,字数太多,发不了,后续会上传文件

参考电路图

如果对你有所帮助,感谢点赞加收藏!

### 32位MIPS运算器设计方案 #### 宏观设计 为了实现一个完整的32位MIPS算术逻辑单元(ALU),需要综合考虑其功能需求和硬件资源分配。根据已有的实验基础,可以利用之前封装好的32位加法器作为核心模块之一,并结合Logisim平台中的其他运算组件来扩展功能[^1]。 具体来说,整个ALU的设计应满足以下几点: - **基本运算支持**:提供算术操作(加、减、乘、除)以及逻辑操作(与、或、非、异或)的支持。 - **移位操作**:包括逻辑左移、逻辑右移和算术右移等功能。 - **状态标志管理**:能够检测并设置常见的程序状态标志,如有符号溢出 (OF) 和无符号溢出 (UOF),以及结果相等 (Equal)[^2]。 #### 微观结构 ##### 加法/减法实现 由于题目明确规定不允许使用Logisim系统自带的加法器和减法器,因此可以通过手动构建全加器阵列的方式来自定义32位加法器。对于减法,则可通过补码机制转换成加法处理[^3]: ```python def adder(a, b): result = [] carry_in = 0 for i in range(len(a)): sum_bit = a[i] ^ b[i] ^ carry_in carry_out = (a[i] & b[i]) | ((a[i] ^ b[i]) & carry_in) result.append(sum_bit) carry_in = carry_out return result[::-1], carry_in ``` 上述代码片段展示了如何通过逐位计算实现简单的二进制加法器逻辑[^4]。 ##### 溢出检测改进措施 针对可能出现的溢出误判情况,需特别注意区分不同类型的数值表示形式下的特殊情况。例如,在进行无符号数之间的减法时,不能单纯依赖于最终结果的状态位来进行判定;而应该依据实际参与运算的操作数大小系作出决定。 此外还需强调的是,当涉及到带符号整型数据间的四则运算过程中产生的潜在越界现象时,必须分别考察正向溢出与负向溢出两种情形下各自对应的条件表达式。 #### 测试验证流程 完成初步搭建后的下一步便是全面细致地检验所开发出来的ALU能否正常运作。这一步骤通常包含但不限于以下几个方面的工作内容: - 验证每种独立的功能模式是否都能按照预期给出正确的响应; - 对特殊边界情况进行额外注,比如最大值加上最小正值等情况是否会触发相应的异常信号; - 记录每次运行过程中的中间变量变化轨迹以便后续排查可能存在的隐患问题所在位置等等. --- ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值