这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战
写在前面
- 实验在不用 [+,-, *,>,<] 符号的基础之上实现有符号数的加法、减法、乘法,逻辑运算、比较 功能。【计算机组成与设计】实验—-PS: 今天是安装 vivido 的第六天,几乎从零开始的,太痛苦了。
- 因为代码太长了,下面只放了部分代码,完整代码我放在了 另外一篇博客 了哈。
1、实验任务
- 本次实验需要实现一个 CPU 的运算器。简易运算器由三个 8 位寄存器 R0、R1、R2 和一个算术逻辑单元(ALU)构成,其中 ALU 应该至少支持加法、减法、乘法,按位与、按位或、按位异或、逻辑非运算。
- 输入由开关控制;每一步运算后,相应标志位(标志位设置同实验四)的情况通过 LED灯表示;运算结果以十进制通过数码管显示。读取数据的结果以十进制通过数码管显示。时钟信号、复位信号等控制信号允许用开关控制。
- 注:1. 本次实验涉及的数据皆为补码。2. 实验说明给出的默认指令集由定长指令构成,其中指令的操作码为变长操作码。
2、实验说明
- 实验使用八位二进制串( b7b6b5b4b3b2b1b0)表示指令,与开发板上的八个开关对应。实验使用四位二进制补码作为输入,与开发板上的四个开关对应。三个寄存器 R0,R1,R2 分别对应二进制地址码 00、01、10。
- 注:运算结果始终默认存放至寄存器 R2 因此不在指令中显式指出。有符号乘法的结果若超过 8 比特应当解释为溢出。
1、运算指令格式
- 高四位(b7b6b5b4)为操作码,次低两位(b3b2)为地址码指明存放第一个操作数的寄存器,最低两位(b1b0)为地址码指明存放第二个操作数的寄存器。
- 运算指令的操作码(b7b6b5b4): 运算操作
- 0000 ——-> A + B
- 0001 ——-> A + 1
- 0010 ——-> A - B
- 0011 ——-> A - 1
- 1100 ——-> A * B
- 0100 ——-> 按位与
- 0101 ——-> 按位或
- 0110 ——-> 按位异或
- 0111 ——-> A >= B ?
2、存储指令格式
- 最高两位(b7b6)为操作码置 10,次高两位(b5b4)为写入寄存器的地址码,低四位(b3b2b1b0)为待写入数据的二进制补码。
3、读取指令格式
- 最高六位(b7b6b5b4b3b2)为操作码置 111100,最低两位(b1b0)为地址码置 10。要求该指令可读取寄存器 R2 的值并以十进制通过数码管显示。
3、主要实验代码以及注解
1 | ini复制代码module adder( |
4、遇到的坑
- assign 类型后面的连续赋值 等号左边 必须是 wire 类型的,等号右边可以是 reg 类型或者 wire 类型都可以。
- always 块里面 等号左边 必须是 reg 类型的,等号右边 可以是 reg 类型或者 wire 类型。
- 每个 alway 块里面的代码是并发的,当敏感列表发生变化,就会执行一次,所以在使用时要格外小心。
vivido ! bye!
本文转载自: 掘金