标题:
数字电路设计之五级流水线设计(CPU)
[打印本页]
作者:
look_w
时间:
2017-11-4 12:37
标题:
数字电路设计之五级流水线设计(CPU)
本帖最后由 look_w 于 2017-11-4 12:51 编辑
现在看起来确实很简单,代码风格也不是很好,没有模块化,而且这些指令也不是严格的mips的所有指令,是自己定义的一些。但是放在博客里也算是对自己过去的一个总结吧!
现在再看这个代码,我觉得写得太恶心了,没有注释,没有说清楚关键的地方。我自己都忘了为什么这么写~~
后来发现有非常坑爹的Bug!!!!祝好!!!我没有改过来了~~~
• 实验步骤
1.先写好CPU的指令集。
2.根据指令集先把一些基本的指令实现,比如LOAD,STORE等,把大概的流水线先画出框图。画出框图后,把基本指令实现。调试,仿真。
3.在2的基础上加入别的指令,考虑好hazard的问题
4.优化代码代码,调试,simulation。
• 实验原理
流水线是数字系统中一种提高系统稳定性和工作速度的方法,广泛应用于高档CPU的架构中。根据MIPS处理器的特点,将整体的处理过程分为取指令(IF)、指令译码(ID)、执行(EX)、存储器访问(MEM)和寄存器会写(WB)五级,对应多周期的五个处理阶段。一个指令的执行需要5个时钟周期,每个时钟周期的上升沿来临时,此指令所代表的一系列数据和控制信息将转移到下一级处理。
流水线寄存器负责将流水线的各部分分开,共有IF/ID、ID/EX、EX/MEM、MEM/WB四组。根据前面的介绍可知,四组流水线寄存器要求不完全相同,因此设计也有不同考虑。
(1)EX/MEM、MEM/WB两组流水线寄存器只是普通寄存器。
(2)当流水线发生数据跳转时,需清空ID/EX流水线寄存器而插入一个气泡,因此ID/EX流水线寄存器是一个带同步清零功能的寄存器。
需要注意的是,由于仿真对初始值的要求,上述寄存器都应考虑有reset信号的接入,以提供仿真时各寄存器的初值。
流水线:
取址:处理器从指令存储器中读取指令
译码:处理器从寄存器文件中读取源操作数并对指令译码产生控制信号
执行:处理器使用ALU
执行计算
存储器访问:处理器从数据存储器中读取或者写入数据
写回:若是
LOAD
指令,将结果写回寄存器文件。
>>加、减电路的设计考虑
减法、比较及部分分支指令(
B
N、
BNE
等)均可用加法器和必要的辅助电路来实现。对
ALU
来说,它的两个操作数输入时都已经是补码形式,当要完成两个操作数的减法时,即
A
补
-B
补,可将减法转换为加法,利用加法器来实现:
›A
补
-B
补
= A
补
+(-B
补
)= A
补
+(B
补
)
补
= A
补
+
(
B
补)反
+1
加法器完成的功能为:
sum=A+~B+1
。
即可完成加减运算。
由于
32
位加法器的运算速度影响着
CPU
频率的高低,因此设计一个高速加法器尤为重要,本实验采用
的是超前进位加法器,不过弄出来的速度比不过描述级语言写出的加法,所以后来加法就改成直接加了。
比较电路的设计考虑
对于比较运算,如果最高为不同,即
A[31]
≠
B[31]
,则根据
A[31]
、
B[31]
决定比较结果,但应注意有符号数和无符号数比较运算的区别。
①在有符号数比较
SLT
运算中,判断
A<B
的方法为:
若
A
为负数、
B
为
0
或正数:
A[
15]&&(~B[15])
若
A
、
B
符号相同,
A-B
为负:
(A[
15]~^B[15]) && sum[15]
则
SLTResult=(A[
15]&&(~B[15])) ||( (A[15]~^B[15]) && sum[15])
②在无符号数比较
SLT
运算中,判断
A<B
的方法为:
若
A
最高位为
0
、
B
最高位为
1
:
(~A[
15] )&&B[15]
若
A
、
B
最高位相同,
A-B
为负:
(A[
15]~^B[15]) && sum[15]
则
SLTResult=((~A[
15] )&&B[15]) ||( (A[15]~^B[15]) && sum[15])
算术右移运算电路的设计考虑:
Verilog HDL
的算术右移的运算符为“
<<<
”。要实现算术右移应注意,被移位的对象必须定义为
reg
类型,但是在
SRA
指令,被移位的对象操作数
B
为输入信号,不能定义为
reg
类型,因此必须引入
reg
类型中间变量
B_reg
,相应的
Verilog HDL
语句为:
reg signed [31:0] B_reg;
always @(B) begin
B_reg = B; end
引入
reg
类型的中间变量
B_reg
后,就可对
B_reg
进行算术右移操作。
逻辑运算:
与、或、或非、异或、逻辑移位等运算较为简单,只是要注意一点,
AND
、
XOR
、
OR
三条指令的立即数为
16
位无符号数,应“
0
扩展”为
32
位无符号数,在运算的同时完成
“0
扩展
”。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0