青翼

CSDN 地址 GitHub 地址
文章 分类

verlog简单CPU设计

2022-12-13

简单处理器设计

 

处理器的指令集

 

数据计算操作指令

指令操作数1操作数2操作数3操作
NOP   等待
HALT   停机
LOADr1r2val3gr[r1] <-m[r2+val3]
STOREr1r2val3m[r2+val3] <-r1
MULr1r2r3r1 <-r2 * r3
ADDr1r2r3r1 <-r2+r3
ADDIr1val2val3r1 <-r1+{val2,val3}
ADDCr1r2r3r1 <-r2+r3+CF
SUB    
SUBI    
SUBC    
CMP r2r3r2-r3 : set CF,ZF,NF

 

逻辑运算

指令操作数1操作数2操作数3操作
ANDr1r2r3r1 <- r2 & r3
OR    
XOR    
SLLr1r2val3逻辑左移r1 <- r2 <<val3
SRLr1r2val3 
SLAr1r2val3算数左移r1 <- r2 <<val3
SRAr1r2val3 

 

跳转指令

指令操作数1操作数2操作数3操作
JUMP val2val3跳转到{val2,val3}
JMPRr1val2val3跳转到r1+{val2,val3}
BZr1val2val3ZF=1 跳转 r1+{val2+val3}
BNZr1val2val3ZF=0…
BN   NF=1
BNN    
BC   CF=1
BNC    

注:BZ(branch zf)当zf为真则跳过,其余BN,BC同理

 

顶层设计模块

image-20221213210950618

总设计框架如上,由五层流水级构成,分别是IF(取指令阶段),ID(指令译码阶段),EX(执行指令阶段),MEM(访存取数),WB(结果写回),实现表示数据流向,虚线表示控制指令如何控制处理器运行。主体部分分别是,指令内存模块,通用寄存器,以及数据内存模块。

 

 

冒险现象

指令只有在执行到EX阶段才会得出结果,结果到了MEM阶段才会写回寄存器,到了WB阶段才会写回内存,在流水线CPU中,往往会出现前面的指令还未执行完成将结果写回寄存器,后面的指令就需要读取该寄存器的值来进行执行,那就出现了相关现象。在处理器工作过程中也需要注意该现象发发生。

 

处理器的工作状态

处理器一共有两个工作状态分别为:idle(闲置状态)、exec(工作状态)。

处理器在这两个状态之间切换。

image-20221213212008340

 

代码部分

 

top顶层模块设计

主要是模块拼接在一起,在此不过多赘述。

 

分频模块

将系统时钟分频得到整体系统不同部分的控制时钟,主要有三个时钟,显示模块时钟,输入模块时钟,以及工作时钟,此处分频只针对上述前两种时钟。

 

处理器工作频率

这里实现该图中的状态机。

image-20221213213044297

Stop状态和Inc指令运行状态,当按下Botton时则输出信号,此处Trap为防抖装置,当安置时间过长时也不会多次触发,而是进入循环状态。

 

 

显示模块

这里用于七段数码管显示

 

 

数据存储

该部分主要由256个8位宽寄存器组成,用于存储数据,其中dwe是使能端,当使能端为1才能存取数。

 

 

指令内存

在该模块存放预设的指令,之后运行将按照该指令顺序运行

 

 

核心部件

在该部分中主要完成各部分的连接以及功能阐述。

首先实现工作与闲置状态转换

image-20221213214912544

 

 

IF阶段

这里出现冒险现象的第一种情况,当前周期无法获取寄存器的值,读取的时候还在计算,读取数还在计算,没进行到WB写回阶段

image-20221213215033951

接着是跳转指令因为影响PC计数,所以单列

image-20221213215138861

 

 

ID阶段

根据不同的指令,从通用寄存器中取出相应的值出来作运算或者存储到Data Memory中,如果为Branch指令且标志位为true则需要Flush掉当前内容;否则如果冲突出现,则需要根据不同的运算指令从不同的地方取出内容。

 

冒险现象

读写竞争冒险,同时设计对于内存的修改,一方面数据安全问题,另一方面BUS同时间只能服务于一组数据

image-20221213215543129

image-20221213220028345

 

对于跳转或者操作数有非地址的A寄存器情况

image-20221213220130546

 

对于B寄存器

image-20221213221238888

 

 

EX阶段

对于有运算标志的运算,置相应的zf与nf值

image-20221213221800001

 

ALU计算模块

在此处写入命令

image-20221213222136276

 

上述涉及到的乘法模块,采用移位乘法器。

 

MEM模块

image-20221213222303224

 

WB模块

image-20221213222406164

最后是显示

image-20221213222422918

 

核心部分整体代码如下:

 

 

在看代码写代码的时候有很多想法,但是正真写blog时又不知道要写些什么了,等之后又有想法了再继续加好了。