《2022年2022年开放性实验FPGA实现流水线式CPU文档-大连理工大学》由会员分享,可在线阅读,更多相关《2022年2022年开放性实验FPGA实现流水线式CPU文档-大连理工大学(16页珍藏版)》请在金锄头文库上搜索。
1、计算机系统开放实验(创新实验)1 大连理工大学计算机系统设计开放实验结课论文4 位原型计算机的设计与实现学院:软件学院专业:软件工程(日语强化)姓名与学号:班级:软日 1101 完成时间:2013.12.25 大连理工大学Dalian University of Technology 摘要我们之所以选择了这门计算机系统设计开放实验课,是因为感到在计算机组成原理的实验课上对FPGA 的学习和理解都远远不够,同时也想通过自己设计计算机系统来加深对计算机系统的理解和认识。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -
2、 - - - - - - 第 1 页,共 16 页 - - - - - - - - - 计算机系统开放实验(创新实验)2 本次实验是基于 TEC-XP 实验计算机系统的,采用的是 spartan-II 型号的 FPGA芯片, 使用的是 VHDL语言。在本篇结课论文中分析了采用FPGA 芯片实现一个支持指令流水的实验计算机系统的方法,主要介绍各个模块的设计以及。 在实际设计过程中, 每实现一个模块都需要进行仿真验证,通过观察仿真波形来确定程序设计的正确性。,最终得到了一个完成了基本功能并实现了指令流水的4 位原型计算机。目录摘要2 1引言1.1 TEC-XP 教学计算机系统 .错误!未定义书签。
3、名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 16 页 - - - - - - - - - 计算机系统开放实验(创新实验)3 1.2 课程目标 52流水线 CPU的实现2.1指令集系统 .6 2.2变量的定义 .7 2.3指令的设计实现2.3.1预处理8 2.3.2指令集实现 8 2.4流水线的设计实现2.4.1取指.13 2.4.2译指.13 2.4.3执行.13 2.4.4流水实现 .14 3仿真3.1仿真流程 14 3.2仿真波形 15 4结论.15 参考文献 .
4、16 致谢16 1引言1.1 TEC-XP教学计算机系统TEC-XP 是 16位的教学实验系统,由清华大学科教仪器厂、清华大学计算机系联合研制。 适用于本科、硕士研究生的计算机组成原理和计算机系统结构课程的教学实验。该系统有自己的指令系统和监控程序,能够与终端或 PC机相连(可名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 16 页 - - - - - - - - - 计算机系统开放实验(创新实验)4 以通过键盘输入程序执行,结果可以通过终端或者显示器显示),可以进行联机
5、操作和执行比较完整的程序。 实验系统分成主要的两个部分: 一部分采用模块化的结构 ( 运算器、控制器、主存储器、 I/O 接口和中断 )构成一台完整的模型计算机, 支持组合逻辑控制器和微程序控制器两种控制器方案,两种控制器紧凑合理,完成教学实验方便高效;另一部分采用先进的FPGA芯片,选择的是Xilinx 公司的 SPARTAN-II 系列芯片 (型号是 XC2S200) ,20 万门容量,其内部有2352 个CLB ,14 个 4Kb 的 RAM 块,208 脚的 PQFP 封装形式。用户可自行设计CPU( 流水和 CACHE) 。系统的软硬件配置完整,技术资料齐全,支持的实验项目多、水平高
6、,实验手段先进。主要技术指标:(1) 机器字长 16 位, 即运算器、主存、数据总线、地址总线均是16 位。(2) 基本指令系统支持多种基本寻址方式。其中部分指令已实现 , 用于设计监控程序和用户的常规汇编程序, 尚保留多条指令供用户自己实现。(3) 主存最大寻址空间是18K字, 可进行主存储器扩展实验。(4) 运算器由 4 片位片结构器件 AM2901 级联而成 , 片间用串行进位方式传递进位信号。ALU实现 8 种算术与逻辑运算功能 , 内部包括 16个双端口读出、单端口写入的通用寄存器, 和一个能自行移位的乘商寄存器。设置C、Z、 V、S四个状态标志位。运算器实验可以有脱机和联机两种实验
7、方式。(5) 控制器采用微程序和组合逻辑两种控制方案实现。组合逻辑控制器用的是 LATTICE公司的 CPLD 的芯片。在做控制器实验时,用户可按基本指令的格式和流程扩展指令,编写程序使新老指令同时运行。(6) 主机上安装有一路 INTEL8251串行接口,可直接接计算机终端 , 或接入一台 PC机作为自己的仿真终端。另保留一路为用户扩展用,可完成串口初始化,双机通讯等实验。(7) 主机可完成三级中断实验和中断嵌套实验。(8) 实验箱有自己的监控程序(操作系统) ,支持多种实验方式(如:单步/ 连续,手动置指令 / 从内存读指令等),监控源码开放,用户可以修改。(9) 配有简单的逻辑笔电路,可
8、以测量板上各个信号的电压。(10)用作组合逻辑控制器的MACH 芯片和实验箱上的XILINX 的 FPGA 芯片名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 16 页 - - - - - - - - - 计算机系统开放实验(创新实验)5 也可用于实现各种时序电路和组合逻辑电路实验。(11)实验箱上 XILINX 的 FPGA 芯片可以实现流水和非流水两种CPU 方案,还可完成高速缓冲存储器(cache)的教学实验。(12) 实验箱支持比较正规的汇编语言设计。(13) 实
9、验箱配套指令级和微指令级的仿真软件。1.2 课程目标此次课程的目标, 是以 TEC-XP教学计算机系统的FPGA 部分为平台, 设计开发出一套 4 位的计算机系统。 要求是重新设计指令集, 实现三级指令流水线, 完成预存指令的流水操作, 包括取指、 译指和执行, 通知设计中还要包括4 位寄存器、内存以及对立即数的操作 (包括 4 位二进制立即数与十进制立即数之间的转换) 。总体来说,本次课程的目的就是借助计算机组成原理等课的基础,在老师的指导下,通过组内成员的讨论研究,独立地设计出一个基于TEC-XP教学计算机系统的全新计算机系统。2流水线 CPU的实现2.1指令集系统名师资料总结 - - -
10、精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 16 页 - - - - - - - - - 计算机系统开放实验(创新实验)6 我们所实现的是16 位计算机,下面对其指令格式做具体说明:15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Undefined Flag Instruction Data1 Data2 高三位( Undefined ) ,也就是15 到 13 位,未进行定义,用于以后的扩展,第 12 位( Flag) ,是标志位,0 标示第二操作数为立即数,1
11、 标示第二操作数为寄存器第 11 位到第 8 位,指令位,具体如下注1:操作码指令功能0000 nop 空指令0001 add Rd,#n/Rs 加法指令0010 sub Rd,#n/Rs 减法指令0011 mul Rd,Rs (Rd,Rs)-Rd*Rs 乘法指令0100 div Rd,Rs (RdRd/Rs),RsRd%Rs 除法指令0101 and Rd,#n/Rs 与操作指令0110 or Rd,#n/Rs 或操作指令0111 not Rd,#n/Rs 非操作指令1000 xor Rd,#n/Rs 异或操作指令1001 ldr Rd,#n/Rs 加载指令1010 str Rd,#n/Rs
12、 存储指令1011 asl Rd,#n/Rs 算数左移1100 asr Rd,#n/Rs 算数右移1111 mov Rd,#n/Rs 转移指令注 1:所有指令(除空指令)的第一操作数必须是寄存器。注 2:乘法与除法运算第二操作数必须是寄存器。注 3:理论上指令0000,指令 1101 与指令 1110 均为空指令,但考虑到以后的扩展,便把0000 设为空指令,而另外两个作为以后的拓展使用。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 16 页 - - - - - - -
13、 - - 计算机系统开放实验(创新实验)7 2.2变量的定义Instruct / 指令Rnum / 寄存器, num 表示寄存器编号Memory / 内存C / 进位标志位(加法进位或减法借位时C=1.否则 C=0)TPort / 中间指令寄存器Ins / 指令类别Data1 / 第一操作数寄存器Rd Data2 / 第二操作数(立即数或寄存器)Flag / 标志位,标志第二操作数(0-立即数, 1-寄存器)Num / 指令计数器AllNum / 总指令数量D / 把 Data1 转变为整形S / 把 Data2 转变为整形temp / 加减运算中间变量c0,c1,c2,c3 / 乘法运算中间
14、变量tempx / 乘法运算结果变量3 级流水线:TPort(0) / 流水线中前一条指令TPort(1) / 流水线中当前指令Ins(1) / 当前指令类别部分Data1(1) / 当前指令第一操作数Data2(1) / 当前指令第二操作数Flag(1) / 当前指令标志位Ins(0) / 前一条指令类别部分Data1(0) / 前一条指令第一操作数Data2(0) / 前一条指令第二操作数Flag(0) / 前一条指令标志位2.3指令的设计实现2.3.1 预处理在指令的结构设计部分我们提到过Flag 用来标记参与运算的指令中的74位和 30 位是立即数( 0)还是寄存器( 1) 。如果参与
15、运算的是寄存器的时候,考虑的将在计算过程中多处用到寄存器的标号,且寄存器标号为十进制数字, 所以我们在译指阶段编写了两段语句将Rd, Rs的 4位二进制数转换成十进制数字,分别存储到 D,S 中。由于 Rd默认只使用寄存器,所以将Rnum(d)赋值给 Data1。Rs使用时要先判断是寄存器还是操作数。当Flag 为 1 时代表使用的是寄存器,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 16 页 - - - - - - - - - 计算机系统开放实验(创新实验)8 这时
16、要将 Rnum(s)赋值给 Data2;当 Flag 为 0 时代表使用的是操作数, 那么就保持 Data2 为 ins(3 downto 0)不变。2.3.2 指令集实现1.MOV指令MOV 指令的指令格式为:MOV Rd , operand2 其中 operand2 既可以为立即数也可以为寄存器指令功能:将第二操作数 operand2 表示的数据传送到目标寄存器Rd中实现方式:Rnum(D)=Data2(0); 实现原理:将 Data2 中经过判断是立即数还是寄存器的数据赋给Rnum(D) ,完成传送操作2.ADD指令ADD 指令的指令格式为:ADD Rd , operand2 其中 op
17、erand2 既可以为立即数也可以为寄存器指令功能:将 operand2 中的数值与 Rd的值相加,并将结果传送到目标寄存器Rd 实现方式:temp= (0&Data1(0) + (0&Data2(0); Rnum(D) = temp(3 downto 0); C = temp(4); 实现原理:在两个四位的二进制运算数前添加一位空白位,构造两个五位二进制数,再将两 个运算数相加,由于原来的数据只有四位,所以相加的结果不会产生超过五位的数 据, 两个五位数的运算结果的低四位作为加法的结果存回Rd寄存器,最高位作为 进位位存放在进 / 借位标识变量 C中。3.SUB指令SUB指令的指令格式为:S
18、UB Rd , operand2 其中 operand2 既可以为立即数也可以为寄存器指令功能:从 Rd的值中减去 operand2 中的数值,并将结果传送到目标寄存器Rd 实现方式:temp= (0&Data1(0) - (0&Data2(0); Rnum(D) = temp(3 downto 0); C = temp(4); 实现原理:在两个四位的二进制运算数前添加一位空白位,构造两个五位二进制数,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 16 页 - - -
19、- - - - - - 计算机系统开放实验(创新实验)9 再将两 个运算数相减,由于原来的数据只有四位,所以相减的结果不会产生超过五位的数 据, 两个五位数的运算结果的低四位作为加法的结果存回Rd寄存器,最高位作为 借位位存放在进 / 借位标识变量 C中。4.MUL指令MUL 指令的指令格式为:SUB Rd , Rs 指令功能:将 Rd的值与 Rs的值做乘法运算后将结果的高四位存放到Rd ,低四位存放到 Rs 实现方式:IF(Data1(0)(0)=0)THEN c0=0000; ELSE c0=Data2(0); end if; IF(Data1(0)(1)=0)THEN c1=0000;
20、ELSE c1=Data2(0); end if; IF(Data1(0)(2)=0)THEN c2=0000; ELSE c2=Data2(0); end if; IF(Data1(0)(3)=0)THEN c3=0000; ELSE c3=Data2(0); end if; tempx = (0000&c0) + (000&c1&0) + (00&c2&00) + (0&c3&000); Rnum(D)=tempx(7 downto 4); Rnum(S)=tempx(3 downto 0); 实现原理:参考乘法的运算规则以Data1 为乘数, Data2 为被乘数。首先Data1 按位与
21、 Data2 相乘,预先创建4 个信号量 c0,c1,c2,c3用来存放 Data1 中每一位与 Data2 相乘后的结果,其实现方式为上方四个连续的if语句;然后将四个乘法结果分别按照对应乘数所用位的高低,拼接成4 个八位的二进制数,再进行相加,存放到临时存储变量tempx中, 最后将 tempx的高四位赋值给 Rd ,低四位赋值给 Rs,完成传送操作。5.DIV 指令DIV 指令的指令格式为:DIV Rd , Rs 指令功能:将 Rd的值与 Rs的值做除法运算后,将结果的商存放到Rd ,余数存放到Rs 实现方式:c0Data2(0) loop 名师资料总结 - - -精品资料欢迎下载 -
22、- - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 16 页 - - - - - - - - - 计算机系统开放实验(创新实验)10 Data1(0)= Data1(0) - Data2(0); c0= c0 + 0001; end loop; Rnum(D)=c0; Rnum(S)=Data1(0); 实现原理:依据除法的定义,采取循环减法的方式,用被除数去循环的减掉除数,直至被除数 剩余的值小于除数,并且每次进行减法运算时都对统计减法次数的变量 c0 加一, 这样当结束循环时, 统计的减法次数即为商, 被减数剩余的值
23、即为余数,最后将c0 赋给 Rd,Data1 的剩余值赋给 Rs,完成传送操作。6.AND指令AND 指令的指令格式为:AND Rd , operand2 其中 operand2 既可以为立即数也可以为寄存器指令功能:将 Rd的值与 operand2 中的值按位做逻辑与运算,并将结果传送到目标寄存器 Rd 实现方式:Data1(0)= Data1(0) and Data2(0); Rnum(D) = Data1(0); 实现原理:Data1 与 Data2 两个数据按位做与操作,结果赋给Data1,再将 Data1中数据赋给 Rnum(D) ,完成传送操作。7.OR指令OR指令的指令格式为:O
24、R Rd , operand2 其中 operand2 既可以为立即数也可以为寄存器指令功能:将 Rd的值与 operand2 中的值按位做逻辑或运算,并将结果传送到目标寄存器 Rd 实现方式:Data1(0)= Data1(0) or Data2(0); Rnum(D) = Data1(0); 实现原理:Data1 与 Data2 两个数据按位做或操作,结果赋给Data1,再将 Data1中数据赋给 Rnum(D) ,完成传送操作。8.NOT指令NOT 指令的指令格式为:NOT Rd , operand2 其中 operand2 既可以为立即数也可以为寄存器指令功能:名师资料总结 - - -
25、精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 16 页 - - - - - - - - - 计算机系统开放实验(创新实验)11 将 operand2 中的值按位取反,并将结果传送到目标寄存器Rd 实现方式:Data1(0)= not(Data2(0); Rnum(D) = Data1(0); 实现原理:Data2 的数据做按位取反操作, 结果赋给 Data1,再将 Data1 中数据赋给Rnum(D) ,完成传送操作。9.XOR指令XOR 指令的指令格式为:XOR Rd , operand2
26、 其中 operand2 既可以为立即数也可以为寄存器指令功能:将 Rd的值与 operand2 中的值按位做逻辑异或运算,并将结果传送到目标寄存器Rd 实现方式:Data1(0)= Data1(0) xor Data2(0); Rnum(D) S S S S S S S S S S S S S S S S=15; END CASE; Rnum(D) S S S S S S S S S S S S S S S S=15; END CASE; Memory(S)=Rnum(D); 实现原理:将 Data2 中的 4 为二进制数转换为10 进制数后存放在变量S中,将 Rd中的值存进 内存中,完成写
27、入操作。12.ASL 指令ASL指令的指令格式为:ASL Rd , operand2 其中 operand2 既可以为立即数也可以为寄存器指令功能:将 operand2 中的值进行算数左移一位,并将结果传送到目标寄存器Rd 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 16 页 - - - - - - - - - 计算机系统开放实验(创新实验)13 实现方式:Data1(0) = (Data2(0)(2 downto 0)&0); Rnum(D) = Data1(0)
28、; 实现原理:将 Data2 中数据的低三位与0 相拼接,拼接结果赋给 Data1,再将 Data1中数据赋给 Rnum(D) ,完成传送操作。13.ASR指令ASR指令的指令格式为:ASR Rd , operand2 其中 operand2 既可以为立即数也可以为寄存器指令功能:将 operand2 中的值进行算数右移一位,并将结果传送到目标寄存器Rd 实现方式:Data1(0) = (Data(0)(3)&Data2(0)(3 downto 1); Rnum(D) = Data1(0); 实现原理:将 Data2 中数据的最高位与高三位相拼接,拼接结果赋给Data1,再将Data1 中数
29、据赋给 Rnum(D) ,完成传送操作。2.4流水线的设计实现2.4.1 取指从预存指令内存数组中取出下一条指令Instruct(Num )放入指令寄存器TPort (1)中。2.4.2 译指将指令寄存器中的16 位指令 TPort (0) 分解提取出操作码和操作数等数据,放在中间寄存器Ins (1) 、Data1(1) 、Data2(1) 、Flag(1)中,从而完成对指令的翻译。2.4.3 执行根据中间寄存器 Ins (0) 、Data1(0) 、Data2(0) 、Flag (0)执行指令。2.4.4 流水实现由 2.4.1 、 2.4.2 、 2.4.3 可看出,已一个上升沿到下一个上
30、升沿为一个周期,每个周期内分别执行3 个操作,取指、译指、执行,其中通过以数组实现的二维两行寄存器来完成取指、 译指、执行的分别是前后3 条指令,即实现了三级指令流水。3仿真3.1仿真流程名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 16 页 - - - - - - - - - 计算机系统开放实验(创新实验)14 在实现了流水线CPU后,实际上可能任何一个子模块都需要仿真。笔者选择 ISE自带的仿真器进行仿真。使用起来也很方便。首先需要理解什么是仿真,所谓仿真就是模拟
31、实际的条件。一个真实的CPU在运行时需要哪些条件,仿真要做的事就是提供那些条件,让CPU看起来就像是在真实的环境中运行。而它需要的条件已经写在CPU的实体部分了, 该实体部分所有的输入信号都是需要的条件。显然需要一个时钟,一个复位信号。 除此之外还需要两个存储器的地址和数据总线,还有控制信号。下面说说仿真的流程,大致可以分成如下三步:第一步:调整模式,因为在设计CPU的时候,当前处在Synthesis/Implementation模式,如果转为仿真,需要选择Behavioral Simulation 模式。调整的地方是在ISE左上角 Sources for中选择,如图2.2 所示:图 2.2
32、调整模式第二步:创建仿真文件,也就是提供真实环境中的条件,这和平时创建VHDL源文件没有什么区别,都是在Sources区域右键点击,然后New Source。不过这里在选择文件类别的时候不再是 VHDL Module,而是选择 VHDL Test Bench ,如图 2.3 所示。然后点击Next,进入下一步。在这里选择需要仿真的源文件,如图2.4 所示。选上CPU,当然也可以仿真子模块。这样仿真文件就创建成功了。图 2.3 创建仿真文件名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第
33、 14 页,共 16 页 - - - - - - - - - 计算机系统开放实验(创新实验)15 图 2.4 选择需要仿真的源文件第三步: 编写仿真文件, 然后运行。 在编写仿真文件的时候需要自己写激励信号,包括 reset和 clock。其中 reset 信号可以直接赋值就行了。但是clock 信号需要周期性的赋值,可以这样实现: clock = NOT clock after half_clock;当然还要例化指令内存和数据内存,后面有介绍具体实现方法。编写完成后,可以在Processes区域运行,如图2.5 所示:图 2.5 运行仿真器3.2 仿真波形4结论通过小组 5 个组员几个星期的
34、努力,由开始的学习和练习VHDL语言,接着是查资料和设计规划, 到组员分工详细设计与编写代码,最后完成整个程序并调试,我们小组最终完成了课程。虽然最后实现的计算机系统还远远不够完善,而且还可能有一些问题还没有测试发现出来, 但是我认为我们在这次开放性实验课程中,不仅仅是学习和实践到了很多关于 FPGA 可编程门队列的相关知识,更重要的是体会到了一个软件产品从需求分析到实现的过程以及团队合作的方式方法,学会了怎样和开发团队的其他队友一起合作工作。 同时作为文档的编者和小组的组长,通过整个过程我领会到了应该怎样将队友很好的联合到一起,将团队的力量发挥到最大, 我认为这是我收获到的最珍贵的东西。名师
35、资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 16 页 - - - - - - - - - 计算机系统开放实验(创新实验)16 参考文献黄高敏:大连理工大学本科毕业设计(论文)-16 位原型计算机的设计与实现致谢感谢迟宗正学长对我们的细心知道;感谢其他和我们一起讨论共同完成的小组的成员;最后感谢我们组的其他4 名成员,和我一起完成了这次课程。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 16 页 - - - - - - - - -