CPU模型机控制信号整理

CPU模型机控制信号整理

前言:

我们的数字逻辑大作业的控制信号是一个最大最大的难点,于是我就在制作CPU的时候一边做一边整理了这份控制信号文档

*注:

如果没有特别注明SM=0,那么默认是在SM=1的”执行”的时候(即时钟下降沿)的真值表

SM为0取地址SM为1执行
因此,当SM为0的时候,实际上控制信号产生逻辑输出的是“取出指令”的控制信号

从单个元件的视角查看控制信号

通用寄存器组WE

WE (不要再给WE取反了!!!就之间WE)允许BUS上的数据进入通用寄存器组
MOVA,MOVC,ADD,SUB,OR,NOT,RSR,RSL,IN,SM=0(debug取地址周期为WE必须为1)
RAA[1,0]为IR[3 downto 2] 控制A口输出的控制信号
RWBA[1,0]为IR[3 downto 2] 控制B口输出 以及 写入操作

指令计数器PC

CPU模型机控制信号整理
IN_PC: SM=0 (SM=0的时候PC需要进行自加操作)
LD_PC: JMP,JZ,JC的第二个周期的执行时间

选择器selector

CPU模型机控制信号整理

RAM

DL: SM=0,MOVC,JMP,JC,JZ (jmp,jc,jz指令的地址读出阶段(也就是jmp系列指令的第二个周期)需要读)
XL: MOVB0

指令寄存器IR

LD_IR: SM=0

移位逻辑

F-BUS: MOVA,MOVB,ADD,SUB,OR,NOT
FRL-BUS: RSL
FRR-BUS: RSR

ALU

CPU模型机控制信号整理
S[0]:ADD OR
S[1]:SUB NOT
S[2]:SUB OR
S[3]:ADD OR NOT
M:ADD SUB OR NOT
CPU模型机控制信号整理

联合调试验证–从”事件”的视角

取指令周期

事件:
一条地址从 PC->选择器->RAM->IR
时间:
CPU模型机控制信号整理

控制信号:
LD_PC 0
IN_PC 1
MADD 00
DL 1
XL 0
/CS 0(我决定cs直接拿去连接时钟)
LD_IR 1(我决定这个直接由SM控制)

MOVA

MOVA R1,R2是三个寄存器之间的互相移动,把数据从R1移动到R2
“执行周期”与此指令相关的控制信号

移位逻辑
F-BUS 1
FL-BUG 0
FR-BUS 0
ALU
S[3…0] 1111
M 0
通用寄存器组
RAA 不固定
RWBA 不固定
/WE 0

MOVC

MOVC R1,M是把RAM中数据移动到寄存器中的命令,其中M是C寄存器中存储的地址
“执行周期”与此指令相关的控制信号
其中,M走寄存器组的A口输出送给RAM,所以在我的图里面,selector选择器需要选取相应的寄存器A口的输出送给RAM的地址入口

移位逻辑
F-BUS 1
FL-BUG 0
FR-BUS 0
ALU
ALU不参与这个指令的过程
S[3…0] 1111
M 0
通用寄存器组
RAA 11
RWBA 不固定
/WE 0(执行周期)(只在乎下降沿的前一瞬间)
选择器(易错)
选择器需要选择寄存器组A口的输出
MADD[1…0] 01(执行周期)
RAM(基本与取地址的过程相似)
RAM需要把selector送过来的那个地址的存储单元中的值送到总线上
addr[7…0] 应该由selector输送过来
DL 1
XL 0

ADD

移位逻辑
移位逻辑直接放行ALU的输出值
F-BUS 1
FL-BUG 0
FR-BUS 0
ALU
ALU需要进行运算…得仔细检查ALU的两个输入口和寄存器的两个输出口有没有错误连接
S[3…0] 1001
M 1
通用寄存器组
RAA 不固定
RWBA 不固定
/WE 0

SUB

移位逻辑
F-BUS 1
FL-BUG 0
FR-BUS 0
ALU
S[3…0] 0110
M 1
通用寄存器组
RAA 不固定
RWBA 不固定
/WE 0

RSR

移位逻辑
F-BUS 0
FL-BUG 0
FR-BUS 1
ALU
不进行运算直接放行,并且是放行寄存器组B输出口送出的值(寄存器组的B口其实就是RWBA控制信号所控制的,而且RWBA也控制着”总线来的数据该写入哪个寄存器里面”)
S[3…0] 1010
M 0
通用寄存器组
RAA 不固定
RWBA 不固定
/WE 0

JMP

JMP指令的意义在于,”取地址周期”从RAM取出本条指令,”执行周期”再从RAM取出一个8位地址,然后把这个8位地址塞进PC里面(这样下一次PC就会把这个地址送给RAM,实现”跳转”)
RAM
DL 1
XL 0
addr 由选择器selector提供
选择器
MADD 00
PC
LD_PC 1(执行周期)
IN_PC 0(执行周期)

MOVB

MOVB M R2是把寄存器里面的值送进ram里面
“执行周期”的控制信号
ALU
ALU需要直接放行寄存器中输出的值(寄存器中的值由A口输出)(又需要修改ALU这个元件的逻辑了)
移位逻辑
移位逻辑也是直接放行
F-BUS 1
FL-BUS 0
FR-BUS 0
WE
RAA 除了”11”以外任意值
RWBA 11
Selector选择器
选择器在执行周期需要给RAM的addr地址入口送入来自寄存器C(将会从寄存器B输出口(因为这条命令是MOVB 11 R2,而”11”所在的位对应RWBA控制信号)读出)的地址值
MADD[1…0] 10 (注意!!MADD(1) 是高位,MADD(0)是 低位)(这个要看自己电路图的selector和寄存器组的接法灵活确定)
RAM
RAM在执行周期需要被写入,所以XL=1
DL 0
XL 1

OUT指令

WE寄存器组
送出要输出到”输出设备”OUTPUT的值
WE 1(此时不需要写入所以WE必须为1)
RAA 无效,随便写啥都行
RWBA 任意值,你想显示哪个寄存器的值就写在这里
ALU
ALU需要直接放行来自寄存器B输出口的值
S[3…0] 0100
M 0
移位逻辑
移位逻辑也是直接放行
F-BUS 1
FL-BUS 0
FR-BUS 0

HALT

HALT的实现方式就是让SM停止工作,我用了一个异或门就搞定了