# CPU指令的硬件实现
> 利用Verilog语言,设计并实现一个支持MIPS指令子集:Lui,Addiu,Add,Lw,Sw,Beq,J,以及一条随机抽取的指令的单周期CPU,
>
> 给出详细的测试程序,完成实验报告以及提交物
## 指令设计
MIPS指令集的定义规范,通用寄存器的名称:[在此](https://www.dsi.unive.it/~gasparetto/materials/MIPS_Instruction_Set.pdf)
其中我要实现的七条标准指令如下:
| Instruction | Example | Meaning | Comments |
| ---------------------- | ------------------ | ----------------------------- | ------------------------------------------------------------ |
| **算术指令** | | | |
| add | add `$`1,`$`2,`$`3 | `$`1=`$`2+`$`3 | |
| add immediate unsigned | addiu`$`1,`$`2,100 | `$`1=`$`2+100 | Values are treated as unsigned integers, not two's complement integers |
| **数据转移指令** | | | |
| load upper immediate | lui `$`1,100 | `$`1=100x2^16 | Load constant into upper 16 bits. Lower 16 bits are set to zero. |
| load word | lw `$`1,100(`$`2) | `$`1=Memory[`$`2+100] | Copy from memory to register |
| store word | sw `$`1,100(`$`2) | Memory[`$`2+100]=`$`1 | Copy from register to memory |
| **条件分支指令** | | | |
| branch on equal | beq `$`1,`$`2,100 | if(`$`1==`$`2) go to PC+4+100 | Test if registers are equa |
| **无条件跳转指令** | | | |
| jump | j 1000 | go to address 1000 | Jump to target address |
我还抽到了一条拓展指令` xor `,异或
| 逻辑运算指令 | | | |
| ------------ | ------------------ | ---------------- | -------------------------------------------------------- |
| xor | xor `$`1,`$`2,`$`3 | `$`1=`$`2 ^ `$`3 | rd <- rs xor rt ;其中rs=`$`2,rt=`$`3, rd=`$`1(异或) |
{与,或,非}可以构成完备集,**异或**可以使用**与**,**或**,**非**来实现:`x^y=(x&~y)|(y&~x)`
即 $ C = A \; xor \; B =A \bigoplus B = A\overline{B}+\overline{A}B $ ,这种方式需要5个门电路。
{与非门}也可以构成完备集,{或非门}也可以。所以芯片中的逻辑门电路常常只用与非门,或者只用或非门。
其完备性证明如下:
> 与非---------------------------------------
>
> *X* NAND *Y*=(*X*⋅*Y*)′=*X*′+*Y*′
>
> ⇒
>
> \1. *X* NAND 1=*X*′+0=*X*′
>
> \2. (*X* NAND *Y*) NAND 1=((*X*⋅*Y*)′)′=*X*⋅*Y*
>
> \3. (*X* NAND 1) NAND (*Y* NAND 1)=*X*′ NAND *Y*′=*X*+*Y*
![只用与非门实现异或](https://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/XOR_from_NAND.svg/300px-XOR_from_NAND.svg.png)
因此我们可以只用与非门实现异或,进而实现**所有的逻辑运算指令**
## 参考
> 往届学生的实现:
>
> https://zanpu.spencerwoo.com/2_SingleCycle/2-1_Basic.html
>
> https://blog.csdn.net/qq_45288566/article/details/103656372
单周期CPU指令的实现