因为需要完成计组的实验一,简单来说就是一个ALU的设计,实现对两个32位数的算数和逻辑运算。
设计思路,根据输入的指令的不同,进行case的判断。
- 需要执行的是16种操作,而输入的指令是5位的,远远超出需要,因而我将指令的最高位默认为0,指令按照顺序为5’b00000-5’b01111。 前八位指令完成的是算术运算,后八位完成的是逻辑运算。
第一位加法运算,容易产生的问题就是,溢出。
溢出的检测和判断方法有三种。
适用于补码的加法。
第一种是,检测输入的两个32位数的符号位xf,yf,和运算结果的符号位zf
- 如果xf=yf=0,即两个数都是正数的时候,zf=1,结果符号位为负数,负溢出。
- 当出现xf=yf=1,两个输入数均为负数的时候,结果zf的符号位=0,正溢出。
第二种是,Cs表示符号位的进位,Cp表示最高数值位进位,
- 当 Cs⊕Cp = 0 ,无溢出。
- 当 Cs⊕Cp = 1 ,有溢出。
第三种方法,用变形补码进行双符号位位运算,正数符为00,负数符号为11
- 若运算结果为 10 ,负溢出
- 若运算结果为 01 ,正溢出
- 若运算结果为00 或 11,无溢出