本文记录使用电子电路实现一个简单的CPU,以下简称sCPU(simple CPU),sCPU将支持指令的取指,译码,执行,以及更新寄存器。
取指
取值首先需要考虑的便是PC存储器,它用于存储指令的在存储器中的地址,并在一个指令执行完成之后给出下一个指令的位置。可以看作是一个指定位宽的寄存器。然后便是要实现一个ROM存储器,因为不需要修改存储器的内容,所以不需要RAM。
以下是具体设计参数:
- PC位宽为8位, 初值为
0 - GPR有4个, 位宽均为8位
- 支持如下3条指令
| 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|-----|----|----|----|----|----|----|----|----|
| 00 | rd | rs1 | rs2 | R[rd]=R[rs1]+R[rs2] | add指令,寄存器相加 |
| 10 | rd | imm | R[rd]=imm | li指令,装入立即数,高位补0 |
| 11 | addr | rs2 | if (R[0]!=R[rs2]) PC=addr | bner0指令,若不等于R[0]则跳转 |
根据设计参数,我们可以得知几个关键信息:
- ROM地址位宽是4
- 寄存器的序号位宽为2
这里我们要求使用ROM存储1到10的序列求和的指令,然后通过PC存储器调用。
首先需要写出序列求和的指令,如下所示:
li r0, 10
li r1, 0
li r2, 1
li r3, 1
add r1, r1, r2
add r2, r2, r3
bner0 r2, 4
一共需要6条指令,因此需要2^3=8个存储空间。ROM可以设计成8x8结构。
踩坑记录
这里把简单的东西想复杂了,脑筋抽了才想到用寄存器和时钟实现只读ROM。而且把之前学的缓存那一套的tag和index搞混了
这里把简单的东西想复杂了,脑筋抽了才想到用寄存器和时钟实现只读ROM。而且把之前学的缓存那一套的tag和index搞混了
根据设计参数,我们可以将之前的指令翻译成以下二进制代码:
10 00 1010
10 01 0000
10 10 0001
10 11 0001
00 01 01 10
00 10 10 11
11 0100 10
- 8x8ROM以及PC存储器实现
##完整sCPU结构
尝试过,努力过,但是却是复杂的电路还是得用logism,网页版的falstad功能和操作上还是比不上logism。之后在logism上继续。