搜档网
当前位置:搜档网 › 5级流水cpu实验

5级流水cpu实验

5级流水cpu实验
5级流水cpu实验

摘要

基于现场可编程( FPGA) 技术和硬件描述语言VHDL 的设计和综合,通过自顶向下的设计方法和模块化设计思想, 在Quartus Ⅱ环境下能定制、下载验证和实现五级流水线CPU的简单功能。通过VHDL 语言定制了取指部分(IF),译码部分(ID),执行部分(EX),前向部分(FU)访存部分(MA),回写部分(WB),冲突检测部分(HD),介绍了基于FPGA 的CPU 设计方法,并通过初始化程序进行验证,实现了基于FPGA 的CPU 功能,表明基于FPGA 技术在设计CPU 核和大规模集成电路设计方面可根据实际情况定制,具有灵活性、可靠性和可扩展性。

关键词: FPGA CPU Quartus Ⅱ流水 vhdl

Abstract

CPU design can be made and tested on Quartus Ⅱby means of a top - down method and modular design based on the integration of FPGA and VHDL. Introduces the design of CPU which applies module IF、ID、EX、FU、MA、WB、HD based on VHDL and the test of the design by the initialization program. The result suggests that the FPGA - based CPU design is custom- made with flexibility , reliability and easiness for extension.

Key words: FPGA CPU Quartus Ⅱpipelining vhdl

目录

一、引言 (3)

1.1实验目的 (3)

1.2实验环境 (3)

二、设计报告 (4)

2.1五级流水CPU (4)

2.1.1系统级设计 (4)

2.1.1.2概念设计 (6)

2.1.1.3时序设计 (6)

2.1.2结构级设计 (12)

2.1.2.1 总体逻辑结构计 (12)

2.1.2.2 关键分模块结构设计 (14)

三、测试报告 (15)

3.1测试方法 (15)

3.2测试程序 (15)

3.3测试结果 (18)

3.4性能分析 (20)

四、总结 (21)

4.1实验总结 (21)

4.2取得的收获 (21)

五、总结 (21)

一、引言

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:

FPGA-CPU测试平台总体结构

图1 FPGA-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指令系统

ADDI DR,IMM(立即数和寄存器相加),

SUB DR,IMM(寄存器和立即数相减),

STORE2 DR,OFFSET,SR (SR→[DR+OFFSET]) , LOAD2 DR,SR,OFFSET ([SR+OFFSET]→DR)

2.1.1.2概念设计

指令流水的基本思路是把每条指令划分为几个执行步骤,这些步骤在执行过程中使用不同的资源从而在时间上能重叠起来,提高了整体工作负载的吞吐率。我们将每条指令划分为“取指”、“译码”、“执行”、“访存”、“写回”这五个执行步骤。

五级流水概念图

图2 五级流水概念图

2.1.1.3时序设计

五级流水的时序设计相对复杂。五级流水单凭时序安排是无法解决所有相关问题的,必须综合考虑各种情况。

结构相关的处理

由于我们的设计中不包含缓存,因此会有取指和访存的冲突,即结构相关(见下图)。

图3 五级流水结构相关示意图

当冲突发生时,必须先“访存”,将“取指”延后一个时钟周期,这样才能保证指令的正确执行。处理结构相关需要做两项工作:1)冲突检测 2)取指延后。

1)冲突检测

只有执行访存指令(LOAD/STORE)时,才会出现冲突。因此,我们在译码时产

通过检查“访存阶段”的m_wrMem就可确定是否冲突。

2)取指延后

在每次取指时,若有冲突,则往IR中写入空指令(NOP),并保持PC不变,使取指延后一个节拍。

数据相关的处理

数据相关是指在执行本条指令的过程中,如果用到的操作数是前面指令的执行结果,则必须等待前面的指令执行完成,并把结果写回寄存器或主存之后,本条指令才能继续执行[3]。我们采用设置专用数据通路(即傍路技术)来解决数据相关问题。但旁路技术并非一劳永逸。

若前一指令为LOAD,而后一指令和它数据相关,如下图所示,当下一指令的执行阶段需要数据时,上一指令尚未给出,这种情况是无法用旁路技术来解决的。

图4 五级流水LOAD数据相关示意图

针对上述情况的一般处理方法是通过插入bubble使LOAD之后的两条指令拖后一个节拍执行[4]。但我们感觉这种处理过于繁琐。我们发现,如果在LOAD译码时,后面自动加一条空指令,即增加冗余,就可以避免上述情况的出现。在这种简化处理后,我们将数据相关划分为以下三种情况。

1.相邻指令数据相关

举例: INC R0

INC R0

在此情形下,将上一指令的ALU输出经缓存后直接送回,作为ALU多路选择器的入口

之一,如下图所示。

图5 五级流水相邻指令数据相关示意图

2.中间隔1条指令的两指令数据相关

举例: INC R0

INC R1

INC R0

在此情形下,将第1条指令的回写数据送回作为ALU多路选择器的入口之一供第3条指令使用,如下图所示。

图6 五级流水相隔1条指令的两指令数据相关示意图

3.中间隔2条指令的两指令数据相关

举例: INC R0

INC R1

INC R2

INC R0

第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个信号就可作出是否跳转的决定:

若e_setFlag 要写状态寄存器,则说明前一条指令会影响状态位,这时根据tFlag 决定是否跳转;若e_setFlag 要保持状态寄存器,则说明前一条指令不会影响状态位,这时根据Flag 决定是否跳转。

JR×前一条指令

后一条指令

图8 五级流水处理控制相关示意图

2.PC 更新的时机

在最初设计时,我们考虑将PC 放在时钟上升沿更新。若如此,不论JRX 转移与否,都会顺序取下一指令。因此,在发生跳转时要清除已读取的指令。处理方法是,在译码时判断上一条指令是否要跳转,若是则产生doNothing 信号。这样就清除了已读取的指令。如果把PC 更新放在下降沿(若上图所示),则不存在上述问题。但我们担心这种处理在时间上可能会比较紧张。不过,实践表明这种处理是可行的。 PC 控制的总结:

按照我们的设计,PC 是在取指之后的第一个时钟下降沿更新。但当访存和取指冲突时需要特殊处理,分两种情况讨论。

1.访存指令不接连出现

访存时更新PC,执行空指令时保持PC不变,见下图。

访存指令不接连出现时的PC更新时序图

图9 五级流水访存指令不接连出现时的PC更新示意图

2.访存指令接连出现

除第一个访存阶段外,其余访存阶段PC都保持不变。

访存指令接连出现时的PC更新时序图

图10 五级流水访存指令接连出现时的PC更新示意图

在解决了结构相关、控制相关、数据相关后,五级流水时序图最终设计如下:

图11 五级流水时序图

2.1.2结构级设计

2.1.2.1 总体逻辑结构计

[注]五级流水CPU设计过程中参考了文献[4]。

五级流水CPU结构图

图12 五级流水整体结构图

整个CPU由以下几个模块组成:

●取指模块(IF):给出内存地址,读取指令并送入指令寄存器,为下一级

准备数据。

由于PC控制模块处于取指模块中,因此控制相关的检测也置于取指模块。

●译码模块(ID):读取寄存器值和指令译码。我们采取一次译码,逐级传

递的方式,译出后几级流水所需的控制信号和数据(如立即数等),在每

次时钟上升沿到来时送入下一级。实际上,结构相关、控制相关、数据相

关的检测都可归入译码部分。考虑到“相关检测”涉及到的信号分属不同阶段以及整体结构的清晰性,我们将“相关检测”独立出来。

●执行模块(Ex):完成算术逻辑运算、计算有效地址和提供数据通道。

●访存模块(Ma):选择地址线的数据来源和数据线的流向。访存和取指在

功能上是独立的,但CPU 对外只有一条地址线和数据线的事实决定了访存和取指是相互联系的。当执行LOAD/STORE 指令时,地址线由ALU 送入“访存段”的值提供;取指时,则由PC 提供。当写内存时,CPU 内部数据送数据线;当需要读内存时,CPU 往数据线送高阻。

● 写回模块(Wb ):选择回写数据源和根据写使能信号wRegEn 将数据回写到

寄存器堆;

● HazardDetectUnit 模块:检测结构相关; ● ForwardingUnit 模块:检测数据相关。

2.1.2.2 关键分模块结构设计

访存部分(MA )

模块功能:选择地址线的数据来源和数据线的流向。

输入端: PC PC 输入 输出端: 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.Test1 8位×8位乘法运算

3.3 测试结果

Test1 测试结果:

R2 = 0X96

Test2 测试结果

内存单元0X11F~0X100 数据:

内存单元0X20F~0X200 数据:

相关主题