使用数字电路实现一个简单的CPU

本文记录使用电子电路实现一个简单的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]则跳转 |

根据设计参数,我们可以得知几个关键信息:

  1. ROM地址位宽是4
  2. 寄存器的序号位宽为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搞混了

根据设计参数,我们可以将之前的指令翻译成以下二进制代码:

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上继续。

✍️ 作者:𝓜.𝓦𝓱𝓲𝓽𝓮

📄 共享协议: CC 4.0协议

🔗 原文链接: https://allomaker.com/archives/Implementing-CPU-using-digital-circuits

评论