描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302528418丛书名: 计算机系列教材
本书可作为高等院校计算机、软件工程专业高年级本科生、研究生的教材,也可作为对UML比较熟悉并且对软件建模有所了解的开发人员、相关科技工作者和研究人员的参考用书。
第1篇环境篇
第1章实验软件环境的安装与配置3
1.1ModelSim的安装配置3
1.2Vivado的安装配置7
1.3Vivado和ModelSim关联13
第2篇工具软件篇
第2章工具软件的主要功能19
2.1Xilinx FPGA器件19
2.2Vivado设计流程20
2.2.1利用Vivado进行功能仿真22
2.2.2设计综合25
2.2.3工程实现27
2.3ModelSim基本使用29
2.3.1新建ModelSim库30
2.3.2创建工程31
第3篇应用篇
第3章单周期CPU的设计与实现35
3.1实验介绍35
3.2总体设计35
3.2.1指令格式35
3.2.2总体数据通路38
3.3主要模块设计40
第4章简单的流水线CPU设计47
4.1实验内容47
4.2实现目标47
4.3流水线CPU介绍与设计47
4.3.1CPU顶层视图47
4.3.2指令集47
4.3.3五级流水线49
第5章静态流水线的设计、分析与验证64
5.1静态流水线的基本原理64
5.2实验介绍65
5.3实验设计66
5.3.1静态流水线的总体结构66
5.3.2总体架构部件的解释说明68
5.3.3实验仿真过程波形图及某时刻寄存器值的物理意义87
5.4实验验证88
5.4.1算法流程图88
5.4.2汇编程序89
5.5流水线的性能指标定性分析(包括吞吐率、加速比、效率及
相关与冲突分析)90
第6章动态流水线的设计、分析与验证94
6.1动态流水线的基本原理94
6.2实验介绍95
6.3实验设计95
6.3.1动态流水线的总体结构96
6.3.2实验仿真过程波形图及某时刻寄存器值的物理意义116
6.4实验验证116
6.4.1算法流程图116
6.4.2汇编程序118
6.5流水线的性能指标定性分析(包括吞吐率、加速比、效率及
相关与冲突分析)119
第4篇综合应用篇
第7章三级存储结构的设计、实现与验证127
7.1三级存储的基本原理127
7.2实验描述127
7.2.1总体框架127
7.2.2实验具体要求128
7.3系统设计与实现129
7.3.1系统设计整体模块图129
7.3.2三级存储子系统设计130
7.3.3系统工作数据流说明131
7.3.4具体模块实现132
7.4实验验证153
7.4.1验证程序153
7.4.2从U盘下板153
7.4.3SD卡写入程序测试154
7.4.4中途更换SD卡测试155
参考文献156
随着计算机技术的发展,国内各个高校基本都开设了计算机专业或者与其紧密相关的专业,然而,在该专业的学生培养方案和课程设置方面出现了一些偏颇——过多开设了计算机相关的理论课程,而缺少了实践课程的开设,同时,对已开设的实践课程也没有贴近实际、相互贯通、整体综合的系统性提高。
本书建立在同济大学计算机专业已有的硬件综合实践培养方案的基础上,进行再扩展、再拔高、再实践。同济大学计算机专业的本科生已经在“数字逻辑”“计算机组成原理”这两门课程中完成了在FPGA开发板上对基本硬件电路、CPU各个基础模块、单周期CPU以及多周期CPU的实现,然而现实应用中的CPU大多都是流水线CPU,因为流水线CPU技术能够极大地提高CPU的处理效率。因此,本书是在已经完成的单周期和多周期CPU的基础上,按照课程培养目标进行CPU的优化实验,设计流水线CPU,依次实现多功能静态流水线CPU和多功能动态流水线CPU,并实现完备的三级存储体系,使学生具备自己设计、开发、实现计算机系统的能力。
“计算机系统结构”课程实验项目的具体任务包括多个CPU设计的基本实验和一个三级存储体系设计的综合性实验。具体包括:
首先以FPGA开发板、Vivado和ModelSim软件作为实验开发平台,引导学生设计自己的54条MIPS指令的单周期CPU,掌握CPU的组成部件及基本工作原理。
基本实验二以FPGA开发板、Vivado和ModelSim软件作为实验开发平台,引导学生设计一个自己的8条MIPS指令的五级静态流水线CPU,初步建立流水线的基本概念与流水线的设计方法。
基本实验三以FPGA开发板、Vivado和ModelSim软件作为实验开发平台,设计自己的不少于31条MIPS指令流水的CPU,实现多功能的静态流水线,使学生更深入地理解静态流水线的工作机理和冲突解决机制。
基本实验四以FPGA开发板、Vivado和ModelSim软件作为实验开发平台,设计自己的不少于31条MIPS指令流水的CPU,实现多功能的动态流水线,使学生更深入地理解动态流水线的工作机理和冲突解决机制。
三级存储体系设计的综合性实验以FPGA开发板、Vivado和ModelSim软件作为实验开发平台,设计与优化Cache高速缓冲存储、SDRAM或DDR与SD存储卡的三级存储方案,并对不同的路数与块大小的命中与失效情况进行定量化分析,以确定较优的Cache部署方案。
通过这四项基本实验,构建出自己的中央处理器,结合FPGA开发板的外围接口,形成综合实验的物理环境。综合实验是利用两个基本实验的成果和FPGA开发板的外围接口,研制开发一个基于FPGA开发板的完整的计算机系统,为操作系统的构建与移植提供充分的硬件与软件环境。
通过多个基本实验和一个综合实验,使学生加深对理论知识的理解和掌握,完成对计算机系统设计与优化所需要的根本动手能力的训练。
“计算机系统结构”课程实验项目中安排了4个基本实验项目和1个综合实验项目。
4个基本项目包括: 54条MIPS指令的单周期CPU设计、简单8条MIPS指令的五级静态流水线CPU设计、多条指令集的多功能静态流水线CPU设计与优化、多条指令集的多功能动态流水线CPU设计与优化。
综合实验项目综合运用4个基本项目的成果,设计和实现一个三级存储体系,包括高速存储器Cache的优化与仿真分析、主存储器的设计与优化、虚拟存储器的设计与优化的三级存储架构。
本书具有以下特点:
(1) 遵照教育部高等学校教学指导委员会(教指委)最新计算机科学与技术和软件工程专业及相关专业的培养目标和培养方案,合理安排计算机系统结构开发技术知识体系,结合FPGA开发板、Vivado开发软件以及ModelSim仿真软件的应用,组织相关知识点与内容。本项目的课程实验全部在Vivado硬件开发软件上使用Verilog语言进行程序设计,使用ModelSim仿真软件进行模拟与仿真,最终形成bit型文件在Nexys 4开发板上进行下板运行。
(2) 注重理论和实践的结合,教材融入面向对象软件开发过程和工程实践背景的项目案例,使得学生在掌握理论知识的同时,提高在程序设计过程中分析问题和解决问题的实践动手能力,启发学生的创新意识,使学生的理论知识和实践技能都得到全面发展。
(3) 知识内容层层推进,使得学生易于接受和掌握相关的知识内容。以开发过程为主线,将知识点有机地串联在一起,便于学生掌握与理解。
(4) 教材在章节中提供一定数量的课外实践题目,采用课内外结合的方式,培养学生进行软件开发的兴趣,提高学生的工程实践能力,使得学生能够适应当前社会对软件开发人员的需求。
(5) 教材提供配套的课件、综合案例的源码。
本书由秦国锋撰写,王力生、陆有军、郭玉臣共同承担实验教学改革任务,同济大学计算机国家示范中心和计算机系统结构教研组进行监督与核查。
由于作者水平有限,书中难免有不妥和疏漏之处,恳请各位专家、同仁和读者批评指正,并与作者讨论,作者邮箱[email protected]。
作者
2019年1月
图5.1ASC多功能流水线
静态流水线要求在同一时间内,多功能流水线中的各段只能按同一种功能的连接方式工作。只有当输入的是一串相同的运算任务时,流水的效率才能得到充分发挥,如图5.2所示。
图5.2多功能静态流水线时空图
例如,采用静态流水线实现加减法和乘法运算,流水线的输出可以直接返回输入端或暂存于相应的流水寄存器中,如图5.3所示,计算:∏4i=1(Ai Bi)图5.3加减法和乘法运算组合流水线
计算过程:
(1) 先计算A1 B1、A2 B2、A3 B3和A4 B4。
(2) 再计算(A1 B1)×(A2 B2)和(A3 B3)×(A4 B4)。
(3) 最后求总的乘积结果。
加减法和乘法运算静态流水线时空图如图5.4所示。
图5.4加减法和乘法运算静态流水线时空图
5.2实 验 介 绍
通过本次实验,了解静态流水线的实现原理,并学习如何实现一个静态流水线模型,本次实验将验证给出的数学模型,并设计算法程序完成实验。
需验证的数学模型如下。int a[m],b[m],c[m];
a[i]=a[i-1] 2;
b[i]=b[i-1] i;
m=60;a[0]=1;b[0]=0;
if(0<=i<=19)
c[i]=a[i];
if(20<=i<=39)
c[i]=b[i];
if(40<=i<=59)
c[i]=a[i] b[i];5.3实 验 设 计
静态流水线指在同一时间内,多功能流水线中的各段只能按同一种功能的连接方式工作的流水线。当流水线要切换到另一种功能时,必须等前面的任务都流出流水线之后,才能改变连接。
(1) 首先将流水线分为多段,考虑每一段的基本功能和部件,得到一个基本可以工作的流水线。将每条指令分为5个阶段执行,分别为取指(IF)、译码(ID)、执行(EXE)、存储器访问(MEM)、寄存器写回(WB)。各指令将自己需要用到的数据和控制信号通过流水线寄存器一级接着一级往下传,每个阶段执行相应的操作(若指令不需要执行当前阶段的操作,则只将数据和控制信号传给下一级即可),以此实现流水线方式执行。
(2) 考虑可能出现的相关和冲突,思考解决方案。静态流水线实验中,对于数据相关的冲突,一律采用暂停流水线的解决方法;对于控制相关的冲突,采用提前分支判断与延迟槽的解决方法。
指令集: add;addu;sub;sub;subu;and;or;xor;nor;slt;sltu;sll;srl;sra;sllv;srlv;srav;jr;addi;addiu;andi;ori;xori;lw;sw;beq;bne;slti;sltiu;lui;j;jal;mult;mfhi;mflo。
按照数据通路连接方式对指令进行分类,见表5.1。表5.1指令集和对应的类编号
指令集类编号add;addu;sub;subu;and;or;xor;nor;slt;sltu;sll;srl;sra;sllv;srlv;srav;addi;addiu;andi;ori;xori;slti;sltiu0000jr0001lw0010sw0011beq;bne0100lui0101j0110jal0111mult1000mfhi1001mflo10105.3.1静态流水线的总体结构
多功能静态流水线的总体结构包括执行部件与段间的流水寄存器(或称流水锁存器),由执行部件与段间的流水寄存器形成相应的数据通路,如图5.5所示。5.3.2总体架构部件的解释说明1. PC寄存器模块PC寄存器如图5.6所示。
图5.6PC寄存器
1) 接口定义module Reg(
input clk, //1位输入,寄存器时钟信号,上升沿时为PC寄存器赋值
input rst, //1位输入,重置信号,高电平时将PC寄存器清零
input wena, //1位输入,写信号
input [31:0] data_in, //32位输入,输入数据将被存入寄存器内部
output reg [31:0] data_out //32位输出,工作时始终输出PC寄存器内部存储的值
);2) Verilog代码描述module Reg(
input clk, //1位输入,寄存器时钟信号,上升沿时为PC寄存器赋值
input rst, //1位输入,重置信号,高电平时将PC寄存器清零
input wena, //1位输入,写信号
input [31:0] data_in, //32位输入,输入数据将被存入寄存器内部
output reg [31:0] data_out //32位输出,工作时始终输出PC寄存器内部存储的值
);
always @(posedge clk,posedge rst)
if(rst)
data_out<=0;
else if(wena)
data_out<=data_in;
endmodule2. PipeIF模块
IF级部件包含指令存储器、累加器和多路选择器,如图5.7所示。
图5.7 PipeIF模块
输入: PC的各类来源,以及PC多路选择器的控制信号。
输出: 下一条PC和当前PC对应的指令以及PC 4。
1) 接口定义module PipeIF(
input [31:0]pc,cpc,bpc,rpc,jpc,
input [2:0] pcsource,
output [31:0]npc,pc4,instruction
);2) Verilog代码描述module PipeIF(
input [31:0]pc,cpc,bpc,rpc,jpc,
input [2:0] pcsource,
output [31:0]npc,pc4,instruction
);
MUX6_1 next_pc(32’h4,cpc,rpc,bpc,jpc,pc4,pcsource,npc);
Adder pc_plus4(pc,32’h4,pc4);
IMEM_ip imem(pc[11:2],instruction);
Endmodule3. PipeIR模块
IF/ID级间的流水寄存器如图5.8所示。
图5.8IF/ID级间的流水寄存器该模块用于存放取出的指令并执行PC 4的操作。
1) 接口定义module PipeIR(
input clk,rst,
input [31:0]pc4,instruction,
input nostall,
output [31:0]Dpc4,Dinstruction
);2) Verilog代码描述module PipeIR(
input clk,rst,
input [31:0]pc4,instruction,
input nostall,
output [31:0]Dpc4,Dinstruction
);
Reg dpc4(clk,rst,nostall,pc4,Dpc4);
Reg ir(clk,rst,nostall,instruction,Dinstruction);
Endmodule4. PipeID模块
ID级部件包含控制单元(CU)、寄存器堆、CP0寄存器组、Hi寄存器、Lo寄存器、用于分支指令的比较器、用于立即数扩展的扩展器、用于计算转移地址的加法器以及多路选择器,如图5.9所示。
输入: 从WB级传回的写信号、写地址和写数据,IF级传递的值。
输出: 各类控制信号、向EXE级传递的各类寄存器读出的值。
1) 接口定义module PipeID(
input clk,rst,
input [31:0]pc4,inst,
input [4:0]Ern,Mrn,
input Ew_rf,Mw_rf,Ew_hi,Ew_lo,
input [31:0]Wdata_rf,Wdata_hi,Wdata_lo,
input [4:0]Wrn,
input Wena_rf,Wena_hi,Wena_lo,
input EisGoto,
output [31:0] cpc,rpc,bpc,jpc,Rsout,Rtout,imm,Dpc4,CP0out,Hiout,Loout,
output [4:0]rn,
output sign,div,
output [3:0]aluc,
output w_hi,w_lo,w_rf,w_dm,
output asource,bsource,
output [1:0]cuttersource,hisource,losource,
output [2:0]rfsource,pcsource,
output stall,
output isGoto,
output [31:0]reg28
);图5.9ID级部件
2) Verilog代码描述module PipeID(
input clk,rst,
input [31:0]pc4,inst,
input [4:0]Ern,Mrn,
input Ew_rf,Mw_rf,Ew_hi,Ew_lo,
input [31:0]Wdata_rf,Wdata_hi,Wdata_lo,
input [4:0]Wrn,
input Wena_rf,Wena_hi,Wena_lo,
input EisGoto,
output [31:0] cpc,rpc,bpc,jpc,Rsout,Rtout,imm,Dpc4,CP0out,Hiout,Loout,
output [4:0]rn,
output sign,div,
output [3:0]aluc,
output w_hi,w_lo,w_rf,w_dm,
output asource,bsource,
output [1:0]cuttersource,hisource,losource,
output [2:0]rfsource,pcsource,
output stall,
output isGoto,
output [31:0]reg28
);
( MARK_DEBUG=”true”)wire [5:0]op,func;
( MARK_DEBUG=”true”)wire [4:0] rsc,rtc,rdc,mf;
( MARK_DEBUG=”true”)wire [15:0] ext16;
//wire[1:0] fwda,fwdb;
( MARK_DEBUG=”true”)wire sign_ext;
( MARK_DEBUG=”true”)wire mfc0,mtc0,eret, teq,bre,sys,beq,bne,bgez;
( MARK_DEBUG=”true”)wire isBranch;
( MARK_DEBUG=”true”)wire [4:0]ex_cause;
assign func=inst[5:0];
assign op=inst[31:26];
assign mf=inst[25:21];
assign rsc=inst[25:21];
assign rtc=inst[20:16];
assign rdc=inst[15:11];
assign ext16=inst[15:0];
assign jpc={pc4[31:28],inst[25:0],2’b00};
wire[31:0]ext_18;
reg [1:0]stallcount;
wire [1:0]count;
SignExt_18 signext_forbpc({ext16,2’b00},ext_18);
Adder bpc_adder(pc4,ext_18,bpc);
assign rpc=Rsout;
assign cpc=CP0out;
assign Dpc4=pc4;
Ext_16 ext_imm(ext16,sign_ext,imm);
Regfile regfile(clk,rst,Wena_rf,rsc,rtc,Wrn,Wdata_rf,Rsout,Rtout,reg28);
CP0 cp0reg(
clk,rst,
mfc0,mtc0,eret,teq,bre,sys,
wcau,wsta,wepc,woth,
rsc,ex_cause,
Rtout,
CP0out
);
Reg hireg(clk,rst,Wena_hi,Wdata_hi,Hiout);
Reg loreg(clk,rst,Wena_lo,Wdata_lo,Loout);
wire [1:0]count_in;
Comparer_ID compare(Rsout,Rtout,beq,bne,bgez,teq,isBranch);
PipeControlUnit CU(
count_in,
rsc,rtc,rdc,func,op,mf,isBranch,
EisGoto,
Ern,Mrn,
Ew_rf,Mw_rf,Ew_hi,Ew_lo,
rn,sign,div,mfc0,mtc0,sys,eret,bre,teq,beq,bne,bgez,aluc,
wcau,wsta,wepc,wotr,w_hi,w_lo,w_rf,w_dm,
ex_cause,
asource,bsource,cuttersource,hisource,losource,rfsource,pcsource,
stall,isGoto,count
);
always @(posedge stall)
begin
stallcount<=count;
end
always@(posedge clk,posedge rst)
if(rst)
begin
stallcount<=2’b00;
end
else begin
if(stallcount!=2’b00) begin
stallcount<=stallcount-1;
end
end
assign count_in=stallcount;
endmodule5. PipeDEreg模块
ID/EXE级间的流水寄存器传递ID级输出的控制信号和读出的数据,如图5.10所示。
评论
还没有评论。