5级流水cpu实验.docx
- 文档编号:16608316
- 上传时间:2023-07-15
- 格式:DOCX
- 页数:25
- 大小:547.19KB
5级流水cpu实验.docx
《5级流水cpu实验.docx》由会员分享,可在线阅读,更多相关《5级流水cpu实验.docx(25页珍藏版)》请在冰点文库上搜索。
5级流水cpu实验
摘要
基于现场可编程(FPGA)技术和硬件描述语言VHDL的设计和综合,通过自顶向下的设计方法和模块化设计思想,在QuartusⅡ环境下能定制、下载验证和实现五级流水线CPU的简单功能。
通过VHDL语言定制了取指部分(IF),译码部分(ID),执行部分(EX),前向部分(FU)访存部分(MA),回写部分(WB),冲突检测部分(HD),介绍了基于FPGA的CPU设计方法,并通过初始化程序进行验证,实现了基于FPGA的CPU功能,表明基于FPGA技术在设计CPU核和大规模集成电路设计方面可根据实际情况定制,具有灵活性、可靠性和可扩展性。
关键词:
FPGACPUQuartusⅡ流水vhdl
Abstract
CPUdesigncanbemadeandtestedonQuartusⅡbymeansofatop-downmethodandmodulardesignbasedontheintegrationofFPGAandVHDL.IntroducesthedesignofCPUwhichappliesmoduleIF、ID、EX、FU、MA、WB、HDbasedonVHDLandthetestofthedesignbytheinitializationprogram.TheresultsuggeststhattheFPGA-basedCPUdesigniscustom-madewithflexibility,reliabilityandeasinessforextension.
Keywords:
FPGACPUQuartusⅡpipeliningvhdl
目录
一、引言1
1.1实验目的1
1.2实验环境1
二、设计报告2
2.1五级流水CPU2
2.1.1系统级设计2
2.1.1.2概念设计4
2.1.1.3时序设计4
2.1.2结构级设计10
2.1.2.1总体逻辑结构计10
2.1.2.2关键分模块结构设计11
三、测试报告12
3.1测试方法12
3.2测试程序12
3.3测试结果15
3.4性能分析17
四、总结18
4.1实验总结18
4.2取得的收获18
五、总结18
一、引言
1.1实验目的
1.本实验以计算机硬件为主,兼顾计算机软件和计算机应用技术。
在教师指导下,灵活运用所学到的基础知识和主要专业知识,自己设计、制作、调试,完成一个综合性、研究型的大型教学实验——16位微处理器研制。
2.本实验需要自己设计并最终用FPGA实现一个CPU芯片。
需要自己设计指令系统、指令格式、寻址方式、寄存器结构、数据表示方式、存储器系统,自己设计运算器、控制器和流水线结构等。
用VHDL硬件语言进行逻辑设计,采用先进的工具软件进行模拟和测试,测试通过之后下载到FPGA芯片中,并在测试平台上通过规定测试程序的测试。
3.在完成实验的过程中锻炼和提高实际动手能力、创新思维、团队合作精神等方面的能力。
4.本实验作为一个重要的教学实践环节,安排在本科生在课程教学基本完成之后,在综合论文训练之前,具有承上启下的作用。
5.可能的应用前景:
由于我们实现的是通用CPU,故大部分需使用CPU的场合都有可能使用,只不过目前只能用于对速度要求不高、对特殊指令要求不多(非专用CPU)的场合下。
但由于其成本比较低,在低端市场也许有一定的竞争力。
1.2实验环境
1.总体描述
FPGA-CPU设计平台能够支持下载到FPGA中的CPU的单步调试和连续运行。
用户用VHDL编写的CPU代码通过编译之后,可以下载到设计平台上的FPGA芯片中。
FPGA-CPU的运行通过执行预先写到外部存储器中的程序来实现。
使用DebugController程序对外部存储器进行读写操作,并能监控FPGA-CPU的状态和通过设置断点调试FPGA-CPU正在执行的程序。
这套实验环境为实验者提供了最大的自由度来写出具有自己风格的CPU软核,并在测试运行平台上调试和运行。
2.硬件环境
整个硬件平台主要有PC监控系统、外部程序存储器、FPGA-CPU及其下载相关电路,以及控制电路组成。
其中PC监控系统主要是由监控软件DebugController及相关通信接口等构成,提供一整套的运行和调试功能。
见图1:
图1FPGA-CPU设计平台总体结构图
3.软件环境
1)监控程序DebugController
使用该软件对外部存储器进行读写操作,并能监控FPGA-CPU的状态和通过设置断点调试FPGA-CPU正在执行的程序。
2)Active-HDL4.2
我们用该软件做功能仿真。
该软件编译时间短,并可以查看中间信号,因此模拟、调试十分方便。
这对于检测并纠正逻辑错误是很有利的。
美中不足的是,它无法进行有效的时序模拟。
3)Quartus-5.0
我们使用该软件完成编码工作,并在active-hdl功能模拟通过后,进行有效的时序模拟。
最终烧片等都用该软件。
二、设计报告
2.1五级流水CPU
2.1.1系统级设计
2.1.1.1指令系统
ADDIDR,IMM(立即数和寄存器相加),
SUBDR,IMM(寄存器和立即数相减),
STORE2DR,OFFSET,SR(SR[DR+OFFSET]),
LOAD2DR,SR,OFFSET([SR+OFFSET]DR)
汇编语句
操作码
功能描述
指令类型
ADDDR,SR
00000000
DR+SRDR
算术逻辑指令
SUBDR,SR
00000001
DR-SRDR
DECDR
00000010
DR-1DR
INCDR
00000011
DR+1DR
CMPDR,SR
00000110
DR-SR比较
ANDDR,SR
00000111
DRandSRDR逻辑与
ORDR,SR
00001000
DRorSRDR逻辑或
XORDR,SR
00001010
DRxorSRDR异或
TESTDR,SR
00001011
DRandSR,测试
SHLDR
00001100
逻辑左移,最低位补0,最高位移入C
SHRDR
00001101
逻辑右移,最高位补0,最低位移入C
SARDR
00001110
算术右移,最高位右移,同时再用自身的值填入
MOVDR,SR
00001111
SRDR
数据传送指令
LOADDR,SR
01000001
[SR]DR
STOREDR,SR
01000010
SR[DR]
MOVIDR,IMM
01000011
IMMDR(双字指令)
PSHF
01000100
FLAG入栈
POPF
01000101
FLAG出栈
PUSHSR
01000110
SR入栈
POPDR
01000111
出栈DR
JRADR
00010000
无条件跳转到ADR,ADR=原PC值+OFFSET
控制转移指令
JRCADR
00010001
当C=1时,跳转到ADR,ADR=原PC值+OFFSET
JRNCADR
00010010
当C=0时,跳转到ADR,ADR=原PC值+OFFSET
JRZADR
00010011
当Z=1时,跳转到ADR,ADR=原PC值+OFFSET
JRNZADR
00010100
当Z=0时,跳转到ADR,ADR=原PC值+OFFSET
JMPAADR
01010000
无条件跳转到ADR
RET
01010001
子程序返回
CALLADR
10000000
调用首地址在ADR的子程序(双字指令)
NOP
11000000
空操作
其他
HALT
00010000
11111111
停机(JR0XFFFF)
2.1.1.2概念设计
指令流水的基本思路是把每条指令划分为几个执行步骤,这些步骤在执行过程中使用不同的资源从而在时间上能重叠起来,提高了整体工作负载的吞吐率。
我们将每条指令划分为“取指”、“译码”、“执行”、“访存”、“写回”这五个执行步骤。
图2五级流水概念图
2.1.1.3时序设计
五级流水的时序设计相对复杂。
五级流水单凭时序安排是无法解决所有相关问题的,必须综合考虑各种情况。
●结构相关的处理
由于我们的设计中不包含缓存,因此会有取指和访存的冲突,即结构相关(见下图)。
图3五级流水结构相关示意图
当冲突发生时,必须先“访存”,将“取指”延后一个时钟周期,这样才能保证指令的正确执行。
处理结构相关需要做两项工作:
1)冲突检测2)取指延后。
1)冲突检测
只有执行访存指令(LOAD/STORE)时,才会出现冲突。
因此,我们在译码时产生一个标志是否访存的信号wrMem。
含义如下:
wMem
意义
00
写内存(STORE)
01
读内存(LOAD)
1×
不占用内存
表1wMEM控制信号
通过检查“访存阶段”的m_wrMem就可确定是否冲突。
2)取指延后
在每次取指时,若有冲突,则往IR中写入空指令(NOP),并保持PC不变,使取指延后一个节拍。
●数据相关的处理
数据相关是指在执行本条指令的过程中,如果用到的操作数是前面指令的执行结果,则必须等待前面的指令执行完成,并把结果写回寄存器或主存之后,本条指令才能继续执行[3]。
我们采用设置专用数据通路(即傍路技术)来解决数据相关问题。
但旁路技术并非一劳永逸。
若前一指令为LOAD,而后一指令和它数据相关,如下图所示,当下一指令的执行阶段需要数据时,上一指令尚未给出,这种情况是无法用旁路技术来解决的。
图4五级流水LOAD数据相关示意图
针对上述情况的一般处理方法是通过插入bubble使LOAD之后的两条指令拖后一个节拍执行[4]。
但我们感觉这种处理过于繁琐。
我们发现,如果在LOAD译码时,后面自动加一条空指令,即增加冗余,就可以避免上述情况的出现。
在这种简化处理后,我们将数据相关划分为以下三种情况。
1.相邻指令数据相关
举例:
INCR0
INCR0
在此情形下,将上一指令的ALU输出经缓存后直接送回,作为ALU多路选择器的入口
之一,如下图所示。
图5五级流水相邻指令数据相关示意图
2.中间隔1条指令的两指令数据相关
举例:
INCR0
INCR1
INCR0
在此情形下,将第1条指令的回写数据送回作为ALU多路选择器的入口之一供第3条指令使用,如下图所示。
图6五级流水相隔1条指令的两指令数据相关示意图
3.中间隔2条指令的两指令数据相关
举例:
INCR0
INCR1
INCR2
INCR0
第1和第4条指令数据相关,有两种处理方法。
方法1:
在第4条指令的译码阶段作旁路处理,将第1条指令的回写数据作为运算器的输入送入下一级,如下图所示。
方法2:
考虑到读写寄存器的时间较短,因此将写寄存器的时机改在时钟下降沿。
这样1、4指令就没有数据相关了。
图7五级流水相隔2条指令的两指令数据相关示意图
由于方法2处理较简洁,因此我们在实现时使用了后者。
以上均是在已知数据相关的前提下,讨论旁路数据通道。
接下来,讨论如何检测数据相关。
我们知道,只有在后面的指令开始执行时,才能察觉它是否与前面的若干条指令是否相关。
为此,需要在数据相关可能发生的最大时域内保留一定的信息。
这就是我们将寄存器A,B口选择信号保留至“回写阶段”的原因。
我们还是按照上述1、2情况进行论述,所有数据相关的检测都置于“执行阶段”。
信号wRegEn是寄存器写使能,SA,SB是寄存器组A,B口选择信号。
信号前缀表示信号所处的阶段。
如e_SA表示处于执行阶段的SA。
1.相邻指令数据相关的检测
若m_wRegEn=’1’,则表示前一指令要回写寄存器。
此时,若e_SA或e_SB等于m_SA,则必然数据相关,这是因为我们规定,若回写寄存器,则寄存器A口选择信号所指定的即为目的寄存器。
否则无关。
2.中间隔1条指令的两指令数据相关的检测
若w_wRegEn=’1’,则表示第一条指令要回写寄存器。
此时,若e_SA或e_SB等于w_SA,则必然数据相关。
否则无关。
当然,上述两种情况可能会一同出现。
这时,我们就按情况1处理。
因为情况2可以理解为
接连出现情况1。
●控制相关的处理
控制相关是指因为程序的执行方向可能改变而引起的相关。
当执行跳转指令时,就会发生这种情况。
除JR外,JRZ等条件跳转需要根据当前状态位来决定是否跳转,而当前状态位是由前面最近的会影响状态位的指令(如算术指令)决定。
常规的也是比较简单的做法是在碰到JRX之类的跳转指令时,延迟后边流水线的进入。
但我们通过分析,认为可以一点都不必延迟,通过旁路处理把控制相关转为数据相关来处理。
这样处理,不必延迟,可以提高流水线的性能。
按我们的方式解决控制相关需要做两项工作:
1)通过旁路,提供状态寄存器的值和临时状态位的值,为判断是否跳转作准备;
2)选择PC更新的时机
1.旁路处理
在每条指令译码时,会产生一个信号setFlag,它决定了在执行阶段是否根据ALU计算结果改变状态位。
从下面的时序图中可以发现,只要我们在JRX指令译码时提供以下3个信号就可作出是否跳转的决定:
信号
含义
tFlag
ALU计算出的临时状态位,
Flag
状态寄存器输出,
e_setFlag
状态寄存器写使能
表2处理控制相关信号
若e_setFlag要写状态寄存器,则说明前一条指令会影响状态位,这时根据tFlag决定是否跳转;若e_setFlag要保持状态寄存器,则说明前一条指令不会影响状态位,这时根据Flag决定是否跳转。
图8五级流水处理控制相关示意图
2.PC更新的时机
在最初设计时,我们考虑将PC放在时钟上升沿更新。
若如此,不论JRX转移与否,都会顺序取下一指令。
因此,在发生跳转时要清除已读取的指令。
处理方法是,在译码时判断上一条指令是否要跳转,若是则产生doNothing信号。
这样就清除了已读取的指令。
如果把PC更新放在下降沿(若上图所示),则不存在上述问题。
但我们担心这种处理在时间上可能会比较紧张。
不过,实践表明这种处理是可行的。
●PC控制的总结:
按照我们的设计,PC是在取指之后的第一个时钟下降沿更新。
但当访存和取指冲突时需要特殊处理,分两种情况讨论。
1.访存指令不接连出现
访存时更新PC,执行空指令时保持PC不变,见下图。
图9五级流水访存指令不接连出现时的PC更新示意图
2.访存指令接连出现
除第一个访存阶段外,其余访存阶段PC都保持不变。
图10五级流水访存指令接连出现时的PC更新示意图
在解决了结构相关、控制相关、数据相关后,五级流水时序图最终设计如下:
图11五级流水时序图
2.1.2结构级设计
2.1.2.1总体逻辑结构计
[注]五级流水CPU设计过程中参考了文献[4]。
图12五级流水整体结构图
整个CPU由以下几个模块组成:
●取指模块(IF):
给出内存地址,读取指令并送入指令寄存器,为下一级准备数据。
由于PC控制模块处于取指模块中,因此控制相关的检测也置于取指模块。
●译码模块(ID):
读取寄存器值和指令译码。
我们采取一次译码,逐级传递的方式,译出后几级流水所需的控制信号和数据(如立即数等),在每次时钟上升沿到来时送入下一级。
实际上,结构相关、控制相关、数据相关的检测都可归入译码部分。
考虑到“相关检测”涉及到的信号分属不同阶段以及整体结构的清晰性,我们将“相关检测”独立出来。
●执行模块(Ex):
完成算术逻辑运算、计算有效地址和提供数据通道。
●访存模块(Ma):
选择地址线的数据来源和数据线的流向。
访存和取指在功能上是独立的,但CPU对外只有一条地址线和数据线的事实决定了访存和取指是相互联系的。
当执行LOAD/STORE指令时,地址线由ALU送入“访存段”的值提供;取指时,则由PC提供。
当写内存时,CPU内部数据送数据线;当需要读内存时,CPU往数据线送高阻。
●写回模块(Wb):
选择回写数据源和根据写使能信号wRegEn将数据回写到寄存器堆;
●HazardDetectUnit模块:
检测结构相关;
●ForwardingUnit模块:
检测数据相关。
2.1.2.2关键分模块结构设计
访存部分(MA)
模块功能:
选择地址线的数据来源和数据线的流向。
输入端:
PCPC输入
输出端:
wr内存读写控制'1':
读,'0':
写
addr输出到内存地址线
回写部分(WB)
功能:
选择回写数据源和根据写使能信号将数据回写到通用寄存器组。
冲突检测部分(HD)
模块功能:
检测结构相关
三、测试报告
3.1测试方法
我们采取了“先软后硬”的测试方法。
具体做法是:
先用vhdl编写内存模块,通过元件的例化配置,将内存模块和已有的CPU模块连接起来,构成一个完整的计算机系统。
这样就可以用软件模拟CPU的运行过程。
我们使用了active-HDL4.2和quartus4.1进行模拟、测试。
在“实验环境”部分,我们已提到,active-HDL4.2有两大优点:
1)编译时间短,修改程序十分方便;2)可以任意查看内部信号,这对于检测并纠正逻辑错误是很有利的。
美中不足的是,它无法进行有效的时序模拟。
而quartus4.1正好相反,它可以很好地模拟时序,但由于无法查看内部信号,调试起来需要往外引信号,十分不便。
因此,我们在软件模拟时,扬长避短,先用active-HDL模拟,确保CPU功能正确;再用quartus模拟,解决时序问题。
在软件测试通过后,我们将程序下载到FPGA芯片中进行硬件测试。
应该说,如果软件测试通过,CPU的设计就没什么大问题了。
但考虑到软件测试是必要但非充分的,我们编写了多个程序对FPGA-CPU进行片上测试。
这些程序涵盖了我们设计的整个指令系统。
3.2测试程序
1.Test18位×8位乘法运算
;8bitx8bitmultiplier
;所测试指令:
置立即数,AND,条件跳转,左移,右移,加法,自减
MAIN:
MOVIR0,25;被乘数
MOVIR1,6;乘数
MOVIR2,0;结果
MOVIR3,8;循环次数
LOOP:
MOVIR4,1
ANDR4,R1
JRZ1F;r4=0时跳转
ADDR2,R0;否则加到部分积
1:
SHLR0
SHRR1
DECR3;r3减1
JRNZLOOP
HALT;停机指令
2.Test2内存读写测试
;MEMORYCOPY
;内存读写测试
MAIN:
MOVIR0,0XFF;源地址
MOVIR1,0X1FF;目的地址
MOVIR2,32
1:
MOVR3,R0
ADDR3,R2
STORER3,R2;r2数据,r3地址
DECR2
JRNZ1B
MOVIR2,16
1:
MOVR3,R0
ADDR3,R2
LOADR4,R3
MOVR3,R1
ADDR3,R2
STORER3,R4
DECR2
JRNZ1B
HALT
3Test3查找1~64之间的质数
;PRIME,NUMBERS,BETWEEN,0-64
MAIN:
MOVIR0,0X200
MOVIR1,64
MOVIR2,0XFFFF
MOVIR9,0
1:
STORER0,R2;R2,DATA,R0,ADDR
INCR0
DECR1
JRNZ1B
MOVIR2,0
MOVIR1,2
3:
MOVIR0,0X200
ADDR0,R1
LOADR3,R0
ADDR3,R9
JRZ2F
1:
ADDR0,R1
MOVIR4,0XC0
ANDR4,R0
JRNZ2F
STORER0,R2
JR1B
2:
INCR1
MOVIR4,0XC0
ANDR4,R1
JRZ3B
MOVIR2,2
MOVIR1,0X300
1:
MOVIR4,0XC0
ANDR4,R2
JRNZFINISH
MOVIR0,0X200
ADDR0,R2
LOADR3,R0
ADDR3,R9
JRZ2F
STORER1,R2
INCR1
2:
INCR2
JR1B
FINISH:
1:
HALT
3.3测试结果
Test1测试结果:
R2=0X96
Test2测试结果
内存单元0X11F~0X100数据:
内存单元0X20F~0X200数据:
Test3测试结果
内存单元0X300~0X311数据:
3.4性能分析
在串行CPU中,采用顺序执行方式执行n条指令,所用时间为
。
由于是一个时钟周期完成一个步骤,所以每段的时间都相等(不妨设为T,下同)则t=3nT。
串行CPU具有控制简单的优点,但其执行指令的速度慢,功能部件的利用率低。
在五级流水CPU中,指令是按二次重叠方式执行的。
执行n条指令所用的时间为t=(2+n)T。
五级流水较串行能够使指令的执行时间缩短近三分之二。
由于流水处理使得不同指令的不同执行步骤在时间上重叠,这就可能产生相关问题,需要相应的硬件结构来检测并处理相关,因此控制过程较串行要复杂。
四、总结
4.1实验总结
我们在完成本实验时,遵循的基本方法原则是从简单到复杂。
在没有任何经验的时候,我们决定从模拟计算机组成原理实验(也就是最初那个串行指令版本)入手,增长经验值。
我们的实验做到了软硬结合,先用硬件描述语言VHDL对CPU的结构和功能做了设计描述,然后先进的工具软件(Quartus4.1,ACTIVE-HDL4.2)功能模拟仿真,最后烧到了FPGA上进行硬件的测试,锻炼了软件硬件两方面的能力。
整个过程下来,收获非常大。
4.2取得的收获
1.做项目的经验。
我们在开发CPU时,都采用了一种做工程、做项目的方法。
先从撰写需求分析开始,然后按照TOP-DOWN的原则进行系统的概要及详细设计,接下来按照工程项目的要求编写代码,调试仿真(包括写详细注释,编写修改记录及调试记录等,详见调试报告),最后是测试,编写完备的测试例,进行全面测试。
整个过程给人的感觉就是极为稳妥踏实,有板有眼。
通过这次实验,做项目的能力提高不少。
2.对硬件的亲切感。
实话实说,在做这个实验之前,对硬件的东西都非常的头疼。
但这次实验之后,对硬件有了一种全新的感觉,不再像以前那么听到就发怵了。
这是非常了不起的一个进步。
五、总结
[1]《计算机组成与设计》P144~P150王诚,刘卫东
[2]《RISC处理器设计》P15胡伟武
[3]《计算机系统结构》P207~P20
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 流水 cpu 实验
![提示](https://static.bingdoc.com/images/bang_tan.gif)