电子科技大学CPU设计《单周期CPU的设计与实现》实验指导书.docx
- 文档编号:13104240
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:51
- 大小:745.07KB
电子科技大学CPU设计《单周期CPU的设计与实现》实验指导书.docx
《电子科技大学CPU设计《单周期CPU的设计与实现》实验指导书.docx》由会员分享,可在线阅读,更多相关《电子科技大学CPU设计《单周期CPU的设计与实现》实验指导书.docx(51页珍藏版)》请在冰点文库上搜索。
电子科技大学CPU设计《单周期CPU的设计与实现》实验指导书
电子科技大学计算机科学与工程学院
单周期CPU的设计与实现实验指导书
[计算机组成原理实验]
张建
2013-12-13
前言
《计算机组成原理》是计算机科学专业的一门重要专业基础课。
在该课程中的理论学习中系统地阐述了计算机各组成部件的工作原理、逻辑实现和设计方法及将各部件连接成整机的方法,计算机硬件与底层软件的接口,培养了学生对计算机硬件系统的分析、开发与设计的基本技能能力。
本实验开设的目的是让学生通过设计一个单周期的CPU,加深对计算机各组成部件功能的理解和掌握,更好地理解计算机的基本工作原理,培养和锻炼学生掌握计算机硬件设计的基本方法和技能。
本实验是计算机硬件系列实验的重要实验,是后续计算机系统实验的基础。
本实验的先修课程:
《数字逻辑》及《VerilogHDL硬件描述语言》。
对于未修先修课程的学生实验指导教师应对其进行相关知识的培训,培训建议4学时。
本实验所针对的教材:
《计算机组成与设计-硬件/软件接口》第4版,(美)DavidA.Patterson、JohnL.Hennessy著,机械工作出版社,2012.1
1.实验内容与要求
1.1实验内容
1.本实例所设计CPU的指令格式的拟定;
2.基本功能部件的设计与实现;
3.CPU各主要功能部件的设计与实现;
4.CPU的封装;
5.仿真测试及板级测试。
1.2实验要求
1.设计的CPU能够执行20条整数指令,每条指令的编码长度均为32位;
2.指令类型应有:
计算类型、访问存储器类型、条件转移类型和无条件转移类型;
3.操作数应有:
寄存器操作数、立即数;
4.测试程应不少于10条,将设计成果仿真测试并起先板级验证。
2.实验环境
2.1硬件平台
本实验所需的硬件主要有:
PC计算机和FFPEG实验开发板,具体要要求如下:
1.IBMPC及兼容计算机:
内存≥1GB,硬盘空间≥30GB
2.FPGA开发套件,本实验采用的是AnvylSpartan6/XC6SLX45
3.USB连接线
AnvylSpartan6/XC6SLX45
的主要特点:
Ø通用输入接口
14个LED:
8个红色,2组“红绿灯”模式
8个滑动开关
4个按键
6个7段数码管
2组拨码开关(一组4个)
Ø音频接口:
I2SCodec接口
Ø视频接口
HDMI输出接口
12比特VGA接口(800×600),使用无源电阻网路
ØUSB接口
USB1:
JTAG编程及UART
USB2/3:
USB设备接口,可接HID设备或U盘
Ø片外存储器
DDR2:
256MBSRAM:
2MBQSPIFalsh:
32MB
ØOLED:
128×32蓝色显示
ØLCD液晶屏:
480×272全彩色液晶触摸屏
ØClock:
100MHz单端CMOS晶振
2.2软件平台
1.操作系统:
WindowsXP、Win7;
2.开发平台:
XilinxISEDesignSuite13.4集成开发系统;
3.编程语言:
VerilogHDL硬件描述语言。
2.3实验主要仪器设备连接框图
实验主要仪器设备的连接框图如图2-1所示。
图2-1主要实验仪器设备连接图
通过USB连接线将实验开发板与PC计算机连接,USB线的一端接在计算机上任一USB接口上,另一端接在实验板的JTAG(JointTestActionGroup;联合测试行动小组)接口上。
3.实验原理
3.1概述
单周期(SingleCycle)CPU是指CPU从取出1条指令到执行完该指令只需1个时钟周期。
一条指令的执行过程包括:
取指令→分析指令→执行指令→保存结果(如果有的话)。
对于单周期CPU来说,这些执行步骤均在一个时钟周期内完成。
3.2单周期CPU的总体电路
本实验所设计的单周期CPU的总体电路结构如图3-2所示。
本实验所设计的CPU主要组成部分有:
运算器(ALU)、控制器(ControlUnit)、寄存器堆(RegisterFiles)、取指电路及相关基础部件(如选择器)等构成。
3.3MIPS指令格式
MIPS指令系统结构有MIPS-32和MIPS-64两种。
本实验的MIPS指令选用MIPS-32。
以下所说的MIPS指令均指MIPS-32。
MIPS的指令格式为32位。
图3-3给出了MIPS指令的3种格式。
图3-3MIPS指令格式
本实验只选取了20条典型的MIPS指令来描述CPU逻辑电路的设计方法。
表3-1列出了本实验的所涉及到的20条MIPS指令。
表1本实验所涉及的20条MIPS指令
R型指令
指令
[31:
26]
[25:
21]
[20:
16]
[15:
11]
[10:
6]
[5:
0]
功能
Add
000000
rs
rt
rd
000000
100000
寄存器加
Sub
000000
rs
rt
rd
000000
100010
寄存器减
And
000000
rs
rt
rd
000000
100100
寄存器与
Or
000000
rs
rt
rd
000000
100101
寄存器或
Xor
000000
rs
rt
rd
000000
100110
寄存器异或
Sll
000000
00000
rt
rd
sa
000000
左移
Srl
000000
00000
rt
rd
sa
000010
逻辑右移
Sra
000000
00000
rt
rd
sa
000011
算术右移
Jr
000000
rs
rt
rd
000000
001000
寄存器跳
I型指令
Addi
001000
rs
rt
immediate
立即数加
Andi
001100
rs
rt
immediate
立即数与
Ori
001101
rs
rt
immediate
立即数或
Xori
001110
rs
rt
immediate
立即数异或
Lw
100011
rs
rt
offset
取数据
Sw
101011
rs
rt
offset
存数据
Beq
000100
rs
rt
offset
相等转移
Bne
000101
rs
rt
offset
不等转移
Lui
001111
00000
rt
immediate
设置高位
J型指令
J
000010
address
跳转
Jal
000011
address
调用
R型指令的op均为0,具体操作由func指定。
rs和rt是源寄存器号,rd是目的寄存器号。
移位指令中使用sa指定移位位数。
I型指令的低16位是立即数,计算时需扩展到32位,依指令的不同需进行零扩展和符号扩展。
J型指令的低26位是地址,是用于产生跳转的目标地址。
3.4数据路径设计
CPU的电路包括数据路径(Datapath)和控制部件(ControlUnit)两大部分。
下面介绍路径的设计。
3.4.1下一条指令地址的选择
下一条指令的地址有4种情况:
1.程序不转移时下一条指令的地址为PC+4;
2.执行beq和bne指令发生转移时,下一条指令的地址是PC加4,再加上符号扩展的偏移量左移2位的和;
3.执行jr指令时转移的目标地址就是rs寄存器中的内容;
4.执行j和jal指令时转移的目标地址是指令中的低26位地址左移2位,再与PC+4的高4位拼接在一起。
下一条指令地址的产生和选择电路如图3-3所示。
在图3-3中控制器(ControlUnit)根据op、func和zero(对于beq和bne指令)信号产生相应的转移控制选择信号pcsource。
3.4.2ALU的输入端
ALU的输入端有2个:
A输入端和B输入端。
A、B输入端分别有2种输入情况。
对于A输入端,有寄存器堆的A_data和移位数sa输入。
对于B输入端,有寄存器堆的B_data和符号扩展后的立即数imm输入。
其输入数据路径如图3-4所示
ALU的A、B端具体输入哪路数据由控制器(ControlUnit)根据指令译码产生控制信号shift和aluimm来选择。
3.4.3寄存器堆的输入端
寄存器堆的A_addr和B_addr的输入来自指令,分别只有一种输入,W_addr有2种,而Data有4种输入,具体输入见图3-5。
寄存器堆的W_addr和Data端的输入信号由控制器(ControlUnit)根据指令译码产生的控制信号reget、jal和m2reg来选择。
在图3-5中模块f的输入为5位的寄存器号reg_dest和jal,输出为W_addr,其VerilogHDL语句为:
AssignW_addr=reg_dest|{5{jal}};
4.基本功能部件的设计与实现
一个CPU主要由ALU(运算器)、控制器、寄存器堆、取指部件及其它基本功能部件等构成。
在本实验中基本功能部件主要有:
32位2选1多路选择器、32位4选1多路选择器、5位2选1多路选择器、D触发器、移位器及32位加/减法器。
4.132位2选1选择器的设计与实现
多路选择器是计算机逻辑电路设计中最重要的基本逻辑电路之一,也是基于数据选择通路CPU的重要部件。
32位2选1选择器的逻辑框图如图4-1所示。
1.设计步骤
ØStep1:
新建工程
启动ISE软件,然后选择菜单File→NewProject,弹出NewProjectWizard对话框,在对话框中输入工程名Single_Cycle_CPU,并指定工作路径D:
\Single_Cycle_CPU(注:
工程名并不需要和工作路径同名),如图4-2所示。
图4-2NewProjectWizard对话框
输入完工程名和工作路径后点击Next进入下一页:
ProjectSettings,设置设备和工程属性,选用Spartan6XC6SLX45芯片,采用CSG484封装,这是本实验开发板所用的芯片,如图4-3所示。
图4-3ProjectSettings对话框
在图4-3中点击Next进入下一页:
ProjectSummary,这里显示了新建工程的信息,确认无误后,点击Finish就可以建立一个新的工程了,如图4-4所示。
图4-4ProjectSummary对话框
ØStep2:
模块(Module)设计
在ISE集成开发环境中(如图4-5所示),在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择NewSource命令,会弹出如图4-6所示的NewSourceWizard对话框:
SelectSourceType。
图4-5ISE集成开发环境
图4-6SelectSourceType对话框
在图4-6中选择VerilogModule,并输入Verilog文件名:
MUX32_2_1,代码存放位置(Location)改为D:
\Single_Cycle_CPU\Code。
将代码放在D:
\Single_Cycle_CPU\Code文件夹中主要是为了方便管理。
然后点击Next按钮进入端口定义对话框:
DefineModule,如图4-7所示。
图4-7DefineModule对话框
在图4-7中,Modulename栏用于输入模块名,这里是MUX32_2_1,下面的列表框用于端口的定义。
PortName表示端口名称,Direction表示端口方向(可选择为input、output或inout),MSB表示信号最高位,LSB表示信号最低位,对于单信号的MSB和LSB不用填写。
端口定义这一步略过,在源程序中自行添加。
定义完端口后,点击Next按钮进入下一步,然后点击Finish按钮完成模块创建。
输入模块代码:
moduleMUX32_2_1(
input[31:
0]A,
input[31:
0]B,
inputSel,
output[31:
0]O
);
assignO=Sel?
B:
A;
endmodule
代码输入完成后,首先检查VerilogHDL语法:
在工程管理区选中要检查的模块,在过程管理区双击Synthesize–XST→CheckSyntax。
如果有语法错误,会在信息显示区给出指示,请检查调试。
如果没有语法错误,在模拟仿真前要进行VerilogHDL代码综合。
ØStep3:
综合(Synthesize)
所谓综合,就是将HDL语言、原理图等设计输入翻译成由与、或、非门和RAM、触发器等基本逻辑单元的逻辑连接(网表),并根据目标和要求(约束条件)优化生成的RTL(RealTimeLogistics)层连接。
完成了设计输入及语法检查后就可以进行综合。
在工程管理区的View中选择Implementation,并选中要综合的模块MUX32_2_1,然后在过程管理区双击Synthesize-XST,就开始综合过程,如图4-8所示。
图4-8Running:
Synthesis
综合错误会在信息显示区给出指示,如果代码过于行为化而不能转换成电路,称为不可综合代码,表示ISE无法转换成对应的电路,需要修改你的设计代码。
如果综合通过,表示你设计的代码可以转换成RTL层描述,称为可综合代码。
你可以通过ViewRTLSchematic查看综合后的RTL层电路,如图4-9所示。
图4-9模块MUX32_2_1综合结果
ØStep4:
仿真(Simulation)
在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择NewSource命令,会弹出如图4-10所示的NewSourceWizard对话框:
SelectSourceType。
在图4-10选择VerilogTestFixture,输入测试文件名:
MUX32__2_1_tb,单击Next按钮,进入下一个对话框,如图4-11所示。
图4-10创建仿真模块
(1)
图4-11创建仿真模块
(2)
在图4-11中工程中所有的模块名都会显示出来(由于目前工程中只有一个模块,故只显示了一个模块名),选择要测试的模块MUX32_1,点击Next按钮,再点击Finish按钮,ISE会在源代码编辑区自动生成测试模块的代码,如图4-12所示。
图4-12VerilogTestFixture–MUX32_1
在图4-12中示了刚生成的MUX32_1_tb模块,在该模块中添加如下测试代码:
…
//Addstimulushere
A<=32'haaaa0000;
B<=32'hbbbb1111;
Sel<=1'b0;
#100;
Sel<=1'b1;
end
endmodule
完成测试文件编辑后,确认工程管理区中View选项设置为Simulation,并选中MUX32_2_1_tb模块。
这时在过程管理区会显示与仿真有关的进程,如图4-13中Processes栏所示。
图4-13选择仿真行为
在图4-13中右键单击其中的SimulateBehavioralModel项,选择弹出菜单中的ProcessProperties项,会弹出如图4-14所示的属性设置对话框,其中SimulationRunTime就是仿真时间的设置,可将其修改为任意时长。
图4-14ProcessProperties对话框
仿真参数设置完后,就可以进行仿真。
首先在工程管理区选中测试代码,然后在过程管理区双击SimulateBehavioralModel,ISE将启动ISESimulator,可以得到仿真结果,如图4-15所示。
图4-15模块MUX32_1仿真效果
ØStep5:
约束(Constraints)与实现(Implementation)
要实现设计,还需要为模块中的输入/输出信号添加管脚约束,这就需要在工程中添加UCF(UserConstraintsFile)文件。
在工程管理区单击鼠标右键,点击NewSource,弹出如图4-6所示对话框,在类型中选择ImplementationConstraintsFile,输入文件名:
MUX32_2_1_ucf,选择关联模块:
MUX32_2_1。
系统会生成一个空白的约束文件并打开。
我们就可以为设计添加各种约束。
本实验中用Anvyl中的8个Switch对应2组4位二进制输入,用4个LED发光二极管对应输出,BTN0按钮对应选择信号Sel。
因为是组合电路,不需要时钟。
具体约束内容如下:
NETSelLOC=E6;
#switches
NETA<0>LOC=V5;
NETA<1>LOC=U4;
NETA<2>LOC=V3;
NETA<3>LOC=P4;
NETB<0>LOC=R4;
NETB<1>LOC=P6;
NETB<2>LOC=P5;
NETB<3>LOC=P8;
#Leds
NETO<0>LOC=W3;
NETO<1>LOC=Y4;
NETO<2>LOC=Y1;
NETO<3>LOC=Y3;
约束完成后,下一个步骤就是实现(Implementation)。
所谓实现,是指将综合输出的逻辑网表翻译成所选器件的底层模块和硬件原语,将设计映射到器件结构上,进行布局布线,达到在选定器件上实现设计的目的。
在ISE中,执行实现过程,会自动执行翻译、映射和布局布线过程:
也可单独执行。
在过程管理区双击ImplementationDesign选项,就可以自动完成实现的3个步骤,如图4-16所示。
图4-16RunningSynthesis
完成Place&Route后,在图4-16中双击GenerateProgrammingFile项生成二进制比特文件mux32_2_1.bit。
ØStep5:
流代码生成与下载
完成Place&Route后,在图4-16中双击GenerateProgrammingFile项生成二进制比特文件mux32_2_1.bit。
将Anyvl开发板与计算机通过USB线连接好,开发板加电,启动DigilentAdept软件,系统开始自动连接FPGA设备,成功检测到设备后,会显示出JTAG链上所用芯片,如图4-17所示。
图4-17DigilentAdept软件
在图4-17中点击Browse按钮,找到刚才生成的二进制比特文件mux32_1.bit,然后点击Program按钮开始下载,下载成功后会在图4-17下面的状态栏中显示ProgrammingSuccessful。
同学们可在开发板上拨动开关SW0S~SW7和按钮BTN0,并观察LED0~LED3的显示,思考一下观察的结果与设计是否一致。
4.232位4选1选择器的设计与实现
32位4选1选择器的逻辑框图如图4-18所示。
32位4选1选择器的模块设计步骤可参考32位2选1选择器的设计步骤,下面给出32位4选1选择器的模块代码。
moduleMUX32_4_1(
input[31:
0]A,
input[31:
0]B,
input[31:
0]C,
input[31:
0]D,
input[1:
0]Sel,
output[31:
0]O
);
assignO=(Sel==2'b00)?
A:
(Sel==2'b01)?
B:
(Sel==2'b10)?
C:
D;
Endmodule
4.35位2选1选择器的设计与实现
5位2选1选择器的逻辑框图如图4-19所示。
5位2选1选择器的模块设计步骤可参考32位2选1选择器的设计步骤,下面给出5位2选1选择器的模块代码。
moduleMUX5_2_1(
input[4:
0]A,
input[4:
0]B,
inputSel,
output[4:
0]O
);
assignO=Sel?
B:
A;
Endmodule
4.4带有异步清零的32位D触发器的设计与实现
异步是指清零与时钟无关,只要有效就清零。
其设计步骤可参考32位2选1选择器的设计步骤,下面给出其模块Verilog实现代码:
moduledff32(
input[31:
0]D,
inputClock,
inputReset,
outputreg[31:
0]Q
);
always@(posedgeClockornegedgeReset)begin
if(Reset==0)Q<=0;
elseQ<=D;
end
endmodule
4.5移位器的设计
移位器的功能是将一个数进行逻辑左移、逻辑右移或算术右移。
其设计步骤可参考32位2选1选择器的设计步骤,下面给出其模块Verilog实现代码:
moduleShifter(
input[31:
0]D,
input[4:
0]Sa,
inputRight,
inputArith,
outputreg[31:
0]O
);
always@(*)begin
if(!
Right)O=D< elseif(! Arith)O=D>>Sa; elseO=$signed(D)>>>Sa; end endmodule 4.632位加/减法器的设计与实现 32位加/减法器的功能是完成32位的加法/减法运算。 由于: 故可以用加法器实现减法操作。 下面给出其模块Verilog实现代码: moduleaddsub32( input[31: 0]A, input[31: 0]B, inputsub, output[31: 0]Result ); cla32as32(A,B^{32{sub}},sub,Result); endmodule modulecla32( input[31: 0]a, input[31: 0]b, inputc, output[31: 0]s ); assigns=a+b+c; endmodule 5.运算器(ALU)的设计与实现 运算器ALU是CPU组成的核心部件之一,其实现方法主要有2种: 一种是以加法器为核心,通过改变进位函数实现;另一种是运算部件并行多路选择实现。 本实验采用运算部件并行多路选择实现。 综合表3-1的指令,ALU只需完成9种运算即可,具体完成的功能如表5-1所示。 表5-1: ALU功能真值表 ALU_Operation 功能描述 x000 Add(加) x100 Sub(减) x001 And(与) x101 Or(或) x010 Xor(异或) x110 Lui(设置高位) 001
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单周期CPU的设计与实现 电子科技大学 CPU 设计 周期 实现 实验 指导书