




免费预览已结束,剩余89页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学 士 学 位 论 文论文题目: 基于MIPS多周期微处理器的设计与实现 专 业: 计算机科学与技术 1目 录中文摘要IAbstractII第一章 绪论11.1 研究背景11.2 研究意义11.3 研究目标1第二章 设计思路与实现工具22.1 硬件设计22.1.1设计工具与开发语言22.1.2实现设备:42.1.3 硬件系统整体结构:92.2 监控程序设计102.2.1设计思想与设计目的102.2.2基本功能112.2.3设计工具112.3 用户终端设计112.4 高级语言支持12第三章 指令集介绍133.1 MIPS指令集的优势133.2 MIPS指令种类133.3 MIPS各类指令详细介绍14第四章 数据通路的设计与实现154.1数据通路设计思路154.2数据通路的主要组件164.2.1寄存器堆(Register File)164.2.2 ALU(算术逻辑运算单元):Arithmetic and Logic Unit184.3 CPU内部总线(Internal Bus)244.3.1设计方法244.3.2 CPU内部的多路复用器254.3.3 CPU内部总线264.4 专用寄存器与锁存器(Dedicated Registers and Latches)274.5其他特殊功能部件27第五章 控制器部件的设计与实现295.1 概述295.2 将指令的执行分到各个时钟周期315.3 41条MIPS指令的下状态函数设计(NextState Function)345.3.1 R型指令的状态函数345.3.2 I型指令的状态函数355.3.3 数据传送指令的状态函数365.3.4 J型指令的状态函数375.3.5 系统调用指令的状态函数375.4 输出函数的实现(Output function)395.5 机器时序设计42第六章 CPU的时序仿真436.1 各类指令的在模拟器下运行情况436.2 CAD软件综合后的网表图46第七章 改进与展望507.1 改进之处507.1.1 硬件的改进之处507.1.2 监控程序的改进之处507.1.3 通信程序的改进之处507.1.4 汇编器的改进之处507.1.5 编译器的改进之处517.2 展望51第八章 结论51附录A 数据通路图52附录B CPU设计源代码53致 谢88参考文献89II基于MIPS多周期微处理器的设计与实现 摘要:基于MIPS体系结构的多周期CPU设计与实现。从指令集入手,一步一步的构架数据通路,然后设计并实现了微处理器控制器。不仅工程性的实现了多周期微处理器的各个部分,而且对实验型计算机的最终目标系统做了支持。最后提出了对整个系统的改进方案。我们在设计出一个可以稳定运行的整机后,又逐步搭建了监控程序、汇编系统、编译系统,使这个设计变成了一个基本完整的计算机系统。我们这样做的目的是为了将各个计算机核心课程融合起来,通过实现,深入体会硬件软件接口对于计算机系统的重要性。这对于我们自身将计算机专业知识融会贯通大有裨益。在具体实现中大量的使用HDL(硬件描述语言)与大规模可编程逻辑电路来进行硬件系统的开发,符合当前硬件开发趋势。关键词:MIPS,多周期,CPU,FPGA,VHDLIIThe Design and Implementation of MIPS basedMulticycle Central Processing Unit Abstract: This paper describes the design and implementation of MIPS architecture based multicycyle CPU. This article starts from the instruction set, build the structure of data paths step by step, then introduces the implementation method of microprocessor control unit. Article not only introduces how to realize each part of this microprocessor, and expounds the design method of each part and the reason why we use this method. Finally, the article puts forward the improvement plans for the whole system. After We achive the stable operation of the machine, and gradually build monitoring procedures, assembly systems, compilation system, making the design into a basic complete computer system. Our purpose is to combine each computer core curriculum and experience the importance of hardware and software interface to a computer system by implementing the whole sytem in-depth. This benefits for our own understanding of computer professional knowledge greatly.Key Words: MIPS, Multicycle,CPU,FPGA,VHDL 学士学位论文第一章 绪论1.1 研究背景当前国内的计算机组成原理教学多使用清华大学的TEC系列,这个系列十分成功。但是TEC系列的设计方法已经落后于时代。这是因为,TEC这种使用很多专用电路芯片与定制印刷版来组织计算机的方式不能模拟真正CPU内部的执行逻辑;而且现在的硬件设计方法已逐步朝着软件化的方向发展,大量的使用HDL(硬件描述语言)与大规模可编程逻辑电路来进行硬件系统的开发。在国外,很多知名高校的计算机组成原理的课程,已经潜移默化的灌输可编程逻辑概念和硬件描述语言知识。由于硬件描述语言与一般高级语言的类似性,便于计算机科学与技术专业的学生使用,使得本来只有电子工程系的了解的复杂电路设计,变得较易于理解。另外,使用硬件描述语言开发硬件系统,还有开发时间短,便于模拟查错,实验费用少的诸多优点,已经越来越被业界认可。2006年Sun公司在OpenSparc开源项目公开了UltraSparc T2 8核处理器的Verilog源代码,这从一个侧面说明了未来硬件开发的方法必然是使用硬件描述语言与FPGA CAD工具。这种先进的设计理念在我们国内的教学中还未得到应有的重视与推广。1.2 研究意义为了不落伍于硬件系统设计的大潮流,我们决定使用VHDL硬件描述语言,与FPGA(现场可编程逻辑阵列)来设计一个基于MIPS的多周期CPU。涉及它的意义在于:将我们本科阶段几乎所有学习到理论知识应用于实践,体会理论、设计与实现中的区别,是自身获得提高。对于别的不太了解硬件设计新趋势的同学,我们希望通过我们简单的设计与实现,使更多的同学们知道这种硬件的设计方法。我们在设计出一个可以稳定运行的整机后,又逐步搭建了监控程序、汇编系统、编译系统,使这个设计变成了一个基本完整的计算机系统。我们这样做的目的是为了将各个计算机核心课程融合起来,通过实现深入体会硬件软件接口对于计算机系统的重要性。这对于我们自身将计算机专业知识融会贯通大有裨益。1.3 研究目标我们在一开始定下的研究目标是:实现一个基于MIPS体系结构的多周期CPU,将其扩展成为可以稳定运行的整机,然后再硬件提供的接口上一层一层搭建汇编系统、监控程序系统、编译系统,以期实现基本完整的简单计算机系统。我们的系统名称为HCL 2011 BLCU。第二章 设计思路与实现工具2.1 硬件设计2.1.1设计工具与开发语言2.1.1.1 VHDL我们使用VHDL作为硬件部分的设计语言。VHDL是VHSIC Hardware Description Language (VHSIC 硬件描述语言)的缩写,而VHSIC又是Very High-Speed Integrated Circuit(超高速集成电路)的缩写。VHDL的语法简单,结构明晰,可以满足工程设计的各种需求。它的优势有:1.用编程的方式描述设计的功能VHDL的程序设计方法与其他编程语言十分类似,编写者完全可以使用程序设计思想完成FPGA的设计。这对于我们熟悉编程语言的计算机系毕业生相当方便。2.VHDL支持工程设计的结构化描述VHDL提供两种硬件工程的设计模式:自顶向下的设计方式与自底向上的设计方式。程序编写者可以先设计编写硬件系统的各个组成模块,然后将多个模块连接起来构成完整的硬件系统;也可以先从整体开始设计,先确定硬件系统需要完成的功能,对顶层模块进行描述。然后将顶层模块划分为几个二级功能模块,分别进行设计描述。这样跟符合一般人的设计思路。3.VHDL支持多层次抽象FPGA电路设计一般分为四个抽象层次,即行为层次(Behavior),寄存器传输层(Register Transfer Level,RTL),逻辑门层次(Logic)以及布线层次(Layout)。抽象的层次越高,设计与仿真所花花费的时间就越少,但对电路细节描述也越少;抽象层次越低,与器件相关的细节描述越多,但是设计与仿真难度越大,设计时间也越长。通常做FPGA的设计,只需要用VHDL语言设计RTL以上层次的实现,电路的FPGA底层实现通过综合工具和实现工具完成。3.VHDL支持强大的仿真工具进行软件模拟仿真是硬件系统设计中的不要步骤,VHDL语言有专用的仿真工具,可以对FPGA设计的各个层次进行仿真验证。这样在对FPGA进行编程之前,就可以发现设计中逻辑、时序的错误,也可以使实际硬件中不便于观察的信号变化变得可见,极大地方便了编程人员。2.1.1.2 FPGA CAD工具 Xilinx ISE 12.4在FPGA CAD工具方面,我们没有太多选择。这是因为,各个厂家发布的FPGA 设计工具均只能支持自家生产的芯片。我们选用的是Xilinx公司的 Spartan3E开发版,所以就只能继续使用Xilinx公司的CAD工具进行开发。Xilinx公司的CAD设计软件为Xilinx ISE (Integrated Software Environment)我们使用的版本号位12.4。在这一软件中可以完成系统级CPLD与FPGA的开发流程,集成的功能包括输入、逻辑综合、仿真验证、布局布线以及FPGA配置(FPGA编程)等。一个开发软件的使用完全是学习与个人实践的过程,我们这里不谈如何使用这个软件。对硬件系统设计最为重要的是一般的FPGA设计实现流程。FPGA的设计实现流程一般包括设计输入、综合、功能仿真、实现(布局布线),时序仿真、生成配置文件和配置FPGA等步骤,整体流程如下图: 图2.1 FPGA的一般设计流程设计输入就是用户对于硬件系统进行逻辑上的描述,使用高层次抽象的方法,借助硬件描述语言,采用自顶向下或是自底向上的设计思路,进行逻辑功能描述。综合相当于一般高级语言的编译过程,这一步CAD软件自动完成。CAD软件中的综合器可以将设计输入编译成网表文件(相当于一种中间代码,描述门电路的连接关系)。网表文件实际是在逻辑门层次对这个硬件系统的描述。实现则是将生成好的网表文件匹配到特定的FPGA型号中,对网表中每一个逻辑门在FPGA中进行实现,并确保互联关系不变。时序仿真是使用仿真器模拟特定型号FPGA在特定设计中的时序逻辑情况,也也称为后仿真。用户可以在实现一步之前通过时序仿真,检查出逻辑错误与危险的电路竞争。当配置FPGA后,未能得到预期效果时,也可以回到时序仿真这一步,仔细检查。生成FPGA配置文件与配置FPGA编程就是将实现后的设计转换成FPGA可识别的编程文件,然后对FPGA进行编程。FPGA原理见后文2.1.2.1节。这就是FPGA上硬件系统的一般设计与实现流程。2.1.2实现设备:我们使用的是Xilinx公司的 Spartan3E开发版进行硬件电路的设计,这块开发版主要的特性和组件是:Xilinx XC3S500E FGG320 Spartan3E FPGA(现场可编程逻辑器件)最多支持232个用户输入输出引脚320个引脚的芯片封装超过10000个逻辑单元Xilinx 4Mbit 平台Flash用于配置FPGAXilinx 64宏逻辑单元 XC2C64A CoolRunner CPLD(复杂可编程逻辑设备)512 Mbit (32M x 16) Micron Technology(美光公司) DDR SDRAM (MT46V32M16),16位数据,100MHz以上工作频率128Mbit的并行 NOR Flash (Intel StrataFlash)16Mbit的串行Flash(STMicro 意法半导体)2行16字符的LCDPS/2接口VGA显示器接口10/100以太网物理层芯片2个9引脚RS-232串行接口(DCE与DTE各有一个)50MHz的时钟晶振器8个LED灯4个滑动开关4个按钮下面对于我们这个硬件系统使用到的部分进行详细介绍。2.1.2.1 Xilinx XC3S500E FGG320 Spartan3E FPGAFPGA使我们的硬件系统中最为核心的设备,我们的硬件设计写成VHDL语言后,经过综合、翻译、映射、布线后,生成的可编程文件就是下载到这个芯片中。我们编写的硬件描述语言程序是通过它实现了硬件功能。FPGA的特点:FPGA采用了逻辑单元阵列(LCA,Logic Cell Array)这样一个概念,内部包括可配置逻辑模块(CLB,Configurable Logic Block)、输入输出模块(IOB,Input,Output Block)和内部连线(Interconnect)三个部分。CLB是FPGA的基本逻辑单元,具有相对独立的组合逻辑阵列。每个CLB由4个Slices(切片)组成(Spartan3E中),每个Slices由两个4个或6个输入的查找表,一些可配置的多路复用器和两个触发器组成的可配置开关矩阵。开关矩阵是高度灵活的,可以进行配置一边组成组合逻辑、移位寄存器或是RAM。可以说Slices是实现逻辑功能的主要组件。每个芯片包含上千个CLB,互相通过互联布线进行连接。CLB提供了灵活的逻辑功能,互联布线则提供了极为丰富的CLB组合方式。CLB在FPGA芯片中的位置。下图是Spartan3E FPGA的粗略结构图,它展示了CLB在FPGA中的位置及布局情况。 图2.2 FPGA的粗略结构图中可以看到,FPGA最外围的是一圈IOB(输入输出模块),里面的是CLB阵列,4个DCM(数字时钟管理单元)以及4个静态内存。这个包含了现代FPGA大多数组件。FPGA中还提供数字时钟管理单元(Xilinx的全部FPGA芯片中均有这个单元)。它的主要组件是一个延迟相位环路锁定器。它可以提供精确的时钟信号操作,例如:分频、倍频、调整时钟相位,且能降低抖动。一般使用它对全局时钟进行配置管理,十分方便且提高了时钟信号的精确度,增强了电路稳定性。我们使用的Spartan3E XC3S500E FGG320 FPGA的主要参数见下表:表2.1 XC3S500E FPGA的具体参数设备名系统门数 CLB阵列块内存大小用户I/O数时钟管理单元DCM行数列数CLB数Slices数XC3S500E500K463411644656360K232 4CLB的基本结构:FPGA实现同步时序逻辑电路与组合逻辑电路的主要逻辑资源是CLB(Configurable Logic Blocks)。每一个CLB包含个Slices,每一个Slices包含两个查找表(Look-Up Tables ,LUTs)用于实现逻辑表达式,以及可被用作触发器或锁存器的专用存储单元。大量的CLB在FPGA中以阵列的方式安排,下图展示了FPGA中CLB的布局情况:图2.3 CLB阵列查找表本质上是一个RAM,每一个查找表都可以看做有一个4位输入(或6位输入)地址线的RAM。当用户通过原理图或是语言描述了一个电路后,PLDFPGA开发区按键会自动的将用户描述编程逻辑表达式,在计算出逻辑表达式所有可能的结果,并在下载FPGA时将所有可能的结果写入查找表中,所以4为输入信号(或6位输入信号)进行逻辑运算就相当于对RAM输入4位(或6位)地址进行查表,找出对应地址的内容,然后输出即可。FPGA就是通过这种方式来实现硬件组合逻辑的。查找表只能实现组合逻辑,要实现时序逻辑电路就必须要触发器。查找表再加上几个可配置的多路复用器以及两个触发器就组成了一个Slices。下图是Spartan3E中的一个Slices的结构图。它有两个查找表(图中GLUT 与FLUT ),两个触发器(FFY,FFX),以及很多多路复用器。可根据选择据决定是否使用触发器。一个查找表加上一个触发器就可以实现简单的时序逻辑电路。对于单个Slices不能实现的逻辑功能,FPGA使用内部互联线将多个Slices按一定结构相连,这样就可以实现很复杂的逻辑功能。Slices是FPGA中实现逻辑的最基本单元。 图2.4 Slices的内部结构2.1.2.2 16Mbit的串行Flash(STMicro 意法半导体)我们使用这个16Mbit的串行Flash来存放我们机器的操作系统,因为必须保证机器掉电后操作系统信息不能丢失,多以它可以很好满足我们的目的。它的逻辑框图如下:图2.5 串行Flash的引脚图具体型号是M2P16,它的所有引脚功能见下表: 表2.2 Flash的引脚定义引脚名功能信号方向C芯片工作时钟输入D串行数据输入 输入Q串行数据输出 输出/S 片选信号 输入/W 写保护 输入/HOLD 保持信号 输入Vcc 电源Vss 接地信号 它在Spartan3E 开发板上与FPGA芯片直接相连,也就是说只要我们使用硬件描述语言写出合适的控制程序,就可以直接控制这个Flash芯片。实际机器工作时,有一个专用的组件Os_loader,在机器初始化状态下,将串行Flash中的数据读取到机器内存。读取完成后机器开始从内存0地址连续执行。为了下载文件进入这个Flash,我们还专门用VHDL编写了一个串行Flash下载器。它被配置到FPGA芯片后,使用一根串口连接线将一台PC机与我们的开发板相连。Flash下载器从RS-232DCE串行接口读取串行数据,再将这些数据写入Flash中,完成对操作系统的下载。这个Flash芯片与FPGA芯片互联的逻辑图如下:图2.6 Flash与FPGA的连接图中SPI_MOSI对应Flash的D引脚,SPI_MISO对应Flash的Q引脚,SPI_SCK对应Flash的C引脚,SPI_SS_B对应Flash的/S引脚。FPGA框中的(T4)之类符号代表FPGA与Flash相连的引脚物理名称2.1.2.3 2行16字符的LCD我们使用这个LCD显示屏来显示机器名称和版本信息。LCD也与FPGA芯片直接相连,我们可以通过VHDL语言编写LCD控制的方式正确的控制LCD显示(详见参考文献1)。FPGA通过3位控制线控制LCD状态、功能,通过4位信号向LCD发送写数据。粗略的链接情况见下图: 图2.7 LCD与FPGA的连接这个LCD显示的字符编码与ASCII码相同,可很方便的在程序中设置。LCD内部有两个存储器:显示数据RAM(Display Data RAM,DD RAM)与字符生成ROM(Character Generator ROM)。DD RAM 用于存放当前用于当前显示字符的ASCII编码,CG ROM用于存放所有支持字符的ASCII编码。使用LCD显示字符,实现就是通过前面介绍的LCD控制线正确操作这两个存储单元。2.1.2.4 2个9引脚RS-232串行接口(DCE端)一个能够运行的计算机系统必须有可靠地输入输出设备,但是大多数现代输入输出设备的控制芯片实现都十分复杂。所以为了简化设计,降低难度,我们使用一个RS-232 DCE串行通信接口作为最主要的输入输出设备,并通过FPGA内部的通用串行收发器(UART)来控制RS-232 DCE口。这个串行接口另一端与一台PC机相连,利用PC的显示器、键盘、鼠标输入数据,再通过串行接口传送至Spartan 3E开发板,使我们的计算机系统能够方便的被人操作。RS-232与FPGA的链接情况如下图: 图2.8 RS-232与FPGA的连接2.1.2.5 8个LED灯我们使用这些开发板提供的LED灯来显示机器的状态,目前用到的只有一个LED灯LED0,它与FPGA的F12引脚相连,用于表示操作系统是否已经正确加载入内存。2.1.2.6 4个滑动开关我们使用4个开关来选择机器的运行模式并控制机器状态,目前用到有两个:SW0与SW1,它们分别于FPGA的L13,L14引脚相连。SW0处于高电平时,阻止指令的执行,这是机器停止运行;SW0处于低电平时,指令连续正常执行。SW1处于高电平时,机器进入单步执行模式;SW1处于低电平时,机器进入指令连续执行模式。2.1.2.7 4个按钮我们使用3个按钮用于发送硬中断脉冲,来模拟硬中断中断源,主要用于中断系统中。这三个按钮是:BTN_WEST, BTN_NORTH, BTN_EAST,分别对应着硬件的第0级,第1级,第2级中断源,分别于FPGA引脚D18,V4,H13相连。剩余一个按钮BTN_SOUTH我们用它作为,机器的复位按钮。机器一旦出错,按它发出脉冲就可以使机器重新初始化并从内存0地址开始重新运行。它与FPGA引脚K17相连。2.1.3 硬件系统整体结构:使用以上这些设备,我们就可以构架出一个简单的计算机系统中的硬件子系统。这个子系统主要由多周期CPU,协处理器,总线控制器,主存储器机器接口控制器,通用串行收发器,LCD控制器和操作系统加载器构成,它们的连接方式与整体结构见下图: 图2.9 硬件系统的整体结构2.2 监控程序设计2.2.1设计思想与设计目的为目标计算机配备相应的软件系统,是为彻底摆脱计算机组成原理课程属于“纯粹的”硬件范畴的错误观念,更好地与当今世界发达国家的教学安排相接轨的而做出的努力。如果说使用一个仅有硬件而不配备软件的“裸机”系统完成计算机组成原理的实验,在二三十年前的还属于先进水平的话,到了相关技术高度发展和计算机高度普及的今天就显得太过时了。在教学计算机系统中,实现一个简单精巧的监控程序是重要的,完全脱离软件单纯地讲解硬件系统,是过时、陈旧的认识和做法,30多年前国外就已经明确认识到这个问题,并采取了有效的应对措施。在我国,目前仍有很大一部分计算机科学与技术专业的同学,对计算机硬件知识的理解程度,主要局限于书本上的知识,缺乏设计和实现真正意义上的计算机系统的实践过程。我们期望我们实现的计算机系统,能够为这一部分同学补上所缺知识,增强实践能力(包括硬件和软件两个领域)。在我们的计算机系统中提供操作系统,就是为实现这个目标所做出的努力之一。作为典型的系统软件,监控程序的重要性不言而喻,对于目标机器,脱离了一个监控程序的软件平台,无法验证设计的正确性,也不能很好发挥极其的功能,所以必须设计一个可以简单的,完成管理、命令解释、异常中断处理的监控程序。但是,操作系统的设计与实现十分复杂,设计一个完善的监控程序工程量过于庞大。鉴于时间进度吃紧,我们决定将监控程序的典型功能进行裁剪,对于我们需要的功能进行设计实现,并且预留出功能扩展接口,用于以后对监控程序进行功能完善。2.2.2基本功能目标机的简单监控程序是用MIPS32汇编语言实现的,运行在目标机的硬件系统之上。它的主要功能是支持把计算机终端或PC机仿真终端接入目标机系统,使用这样的设备执行输入/输出操作,中断异常的处理,以及基本的硬件管理功能,以更方便直观的形式支持目标机上的各项功能。监控程序系统使用32位地址寻址,支持实地址模式与保护模式,对中断异常进行处理,对主存、外围设备进行简单的管理与保护,可以运行单道用户程序2.2.3设计工具MIPS汇编器开发一个简单监控程序,使用高级语言与少部分的汇编语言是最佳的方式。但是我们缺少成熟的编译软件(我们实现的编译器功能还不能支持监控程序编写),硬件实现的指令集也较小(41条常用指令)。所以我们决定使用MPIS汇编语言编写(就是硬件实现的4条指令)。汇编语言仍然不能被机器识别,为了使用汇编语言,我们用Perl编写了一个面向这41条指令的汇编器,以供用户使用。监控程序的编写就主要使用这个汇编器。2.3 用户终端设计通信程序概述由于Xilinx实验板上的CPU缺少直接与外界通信的接口和设备,无法给人一种直观的表现去验证CPU的运行结果。因此,开发一个连接MIPS CPU和外部输入输出设备的通信程序显得很重要。这个通信程序有两个主要功能:1.从PC的输入输出获得数据并将这些数据打包,通过RS-232串行接口发送至FPGA。2.监听PC机的RS-232串行接口,用于接收FPGA内机器返回的数据包,解析数据包判断消息类型,然后做成正确处理,并在中断界面内向用户做出正确回显或提示。由C#开发的wimForm程序提供GUI基本界面。提供给用户基本的命令去操作CPU并实现数据的回显,并提供了相应的编译功能,相当于一个基本的MIPS汇编综合开发平台IDE。用户对目标机器的大部分操作是在其实是对这个通信程序的操作,它实际相当于一个用户终端,方便机器的开发、调试、演示与使用。2.4 高级语言支持类C编译器的实现在汇编器的基础上,我们编写了一个类C语言的编译器,实现了一个简单的编译系统。对于一个简单的类C语言(参见Compilers: Principles,Techniques,and Tools中的相关语法规定)的编译,我们通过三个相互独立的模块进行完成。如图所示,一个类C语言源代码,通过编译器的前端compiler-front.jar,进行词法和语法分析,生成相应的三地址代码(TAC.txt)和符号表(SymbolTable.txt),然后这两个文件作为translator.jar的输入,生成真正的MIPS指令(src.txt)和相应的调试日志。最后通过Link.pl生成assembler.pl接受的汇编格式,通过assembler.pl进行汇编解释变为二进制码(asmcode.data)和程序的程度等信息(textlength.data)供后来使用。我们的编译器前段主要参考了Compilers: Principles,Techniques,and Tools(2006版) 中附录的编译器前端(源代码公开),并在此基础上进行了一定的修改加工,增加了符号表输出的功能,对一个类C语言文法进行了实现。在经过了调试后,生成了一个可执行java程序:compiler_front.jar,直接作为实验系统的编译器的一个组件编译器中端概述编译器中端实现的功能是:中间代码向MIPS指令编译。中间代码向MIPS指令翻译这一步主要要完成的工作是通过前端编译器提供的符号表(SymbolTable.txt)和三地址代码(TAC.txt)两个文件,生成本实验机器可执行的MIPS指令文件(src.txt)和相应的日志(log.txt)用于调试前后端之用。翻译器主要由三个模块组成,他们是用于识别各种三地址代码指令的识别和整理程序(Recognition),和将三地址码和符号表进行中间表示和处理的程序(Code Represent Base),包括将程序分成基本段,将符号表导入,将所有语句表示成标准的条目(SentenceListEntry)。这个标准的条目包括语句的标签(label)、编号(No.)、类型(type)、参数数组(args)等内容。最后的代码生成程序(Code Generator)根据整理好的代码形成最后的MIPS指令。它需要完成寄存器分配、跳转和保证寄存器和内存内容在逻辑上的一致性。编译器后端概述编译器后端,即汇编器。汇编器功能:将一定格式的MIPS汇编代码段翻译为特定目标机所能识别的二进制码。在整个系统层面来看,汇编器提供了软硬件交互的接口;并且在这个工程中,作为监控程序的开发工具使用。第三章 指令集介绍3.1 MIPS指令集的优势MIPS是精简指令集计算机(Reduced Instruction Set Computer)体系结构中最优雅的一种。MIPS是一个双关语:即是Microcomputer without Interlocked Pipeline Stages(无互锁流水线微处理器)的缩写,同时又是Millions of Instructions Per Second(每秒执行百万条指令)的缩写。简单来源于规整:MIPS的处理单元是一个五级流水线:Instruction Fetch, Instruction Decoder & Read Register, Execution, Memory以及Write back。一如其他的RISC处理器,MIPS的每条指令长度是固定的32bit。MIPS有32个通用寄存器,编程者可以使用其中除$0外的所有寄存器暂存数据。$0寄存器,在硬件上被设计为永远读出0。我们可以用$0寄存器的此特性,实现一些技巧性的编程,譬如实现NOP操作。MIPS本没有NOP指令,但由于对$0寄存器的写入实际上无意义,可以作为空操作使用。一如所有的RISC处理器,MIPS没有CISC那样复杂多变的寻址方式,统一为Load/Store寻址。任何载入和存储操作,都可写为如下形式:lw $x, offset ($y)这条指令的操作符可以为Load或Store,一次Load/Store操作的范围可以为字/半字/字节。偏移量是一个带符号的16bit整数。两个作为操作数的寄存器可以是任何通用寄存器。规整性导致MIPS指令集有很多特点:所有指令长度单一、算数运算指令总是需要三个寄存器操作数和每条指令格式中寄存器字段都在相同的位置。越少越快:对速度的要求是MIPS有32个寄存器而不是由更多寄存器的原因。加速执行常用操作:MIPS体系结构加速执行常用的条件分支、PC相对寻址和常操作数立即寻址因为MIPS体系结构设计的简单、高效,指令集长度固定、格式统一,所以实现起来较为简单,这样既降低了研究的难度,减少了开发时间,又可以快速熟悉一种与Intel x86 风格迥异的体系结构,达到了事半功倍的效果。3.2 MIPS指令种类MIPS的指令格式只有3种:1、R(register)类型的指令。该类型指令从寄存器堆(register file)中读取两个源操作数,计算结果写回寄存器堆。2、I(immediate)类型的指令。该类型指令使用一个16位的立即数作为一个源操作数。3、J(jump)类型的指令。该类型指令使用一个26位的立即数作为跳转的目标地址(target address)MIPS的指令种类有:1、算术逻辑运算。2、数据传送。3、转移指令。4、例外指令。5、协处理器指令。3.3 MIPS各类指令详细介绍1、算术逻辑运算。R(register)类型的指令。该类型指令从寄存器堆(register file)中读取两个源操作数,计算结果写回寄存器堆。表3.1 R型指令的格式OpRs RtRdShamtFunct655556指令中的RS、RT字段为两个源操作数寄存器的编号,RD为目的寄存器编号,R型指令Op字段全部为0,不同指令间通过Funct(功能字段)用于区分。不同的Funct字段决定了不同R型指令使用的ALU功能。2、数据传送。I(immediate)类型的指令。该类型指令使用一个16位的立即数作为一个源操作数。表3.2 I型指令的格式OpRsRtConstant or address65516指令中的RS、RT字段为寄存器的编号,I型指令没有RD字段,I型指令通过Op字段进行区分。不同的Op字段决定了不同I型指令使用的ALU功能。注意,I型指令的两个操作数是:RS寻址的寄存器和16位进过符号或无符号扩展的立即数。RT字段位目的寄存器编号。3、转移指令。J(jump)类型的指令。该类型指令使用一个26位的立即数作为跳转的目标地址(target address)。表3.1 J型指令的格式Opaddress626J型指令中没有的RS、RT、RD字段,不同的J型指令通过Op字段进行区分。不同的Op字段决定了不同J型指令的功能。注意,J型指令的一个操作数是:26位地址。这个地址经过作为两位后与PC(程序计数器)的高四位进行连接,然后用这个值重置PC。4、例外指令。与R型指令格式相同,区别是,三个寄存器编号均为0,funct字段也为0,ALU通过funct字段解码。5、协处理器指令。与R型格式相同,唯一的区别是ALU操作码始终为加法,有一个寄存器位0,另一个寄存器是协处理器的寄存器。第四章 数据通路的设计与实现4.1数据通路设计思路我们的数据通路支持41条MIPS标准指令多周期指令执行功能,使用较少的硬件原件,结构很清晰,设计图如下:图4.1 数据通路图4.2数据通路的主要组件:4.2.1寄存器堆(Register File)寄存器堆的逻辑框图如下: 图4.2 寄存器堆输入:5位A读端口读取地址Read Address A ,5位B读端口读取地址Read Address B,5位写端口写地址Write Address , 32 位写端口数据输入 Data In,1位写允许输入,1位时钟信号输入,读取不需要控制信号。输出:32 位A读端口数据输出 Data Out A,32 位B读端口数据输出 Data Out B提供寄存器堆(图中Register File)作为通用寄存器组。寄存器堆中有32个32位同用寄存器。编号范围是0-31。0号寄存器较为特殊,它的值恒定位0,写保护(不允许写),用于提供常数0,其余寄存器均可正常读写。MIPS汇编语言使用这些通用寄存器时,使用符号代码,符号代码与数字编号的对应值如下:表4.1 寄存器名 NAME NUMBER USE $zero 0The Constant Value 0 常值0 $at 1Assembler Temporary 汇编器临时寄存器 $v0-$v1 2-3Values for Function Results and Expression Evaluation函数返回值与表达式求值 $a0-$a3 4-7Arguments 寄存器传参 $t0-$t7 8-15Temporaries 临时寄存器 $s0-$s7 16-23Saved Temporaries 函数调用时需要保存 $t8-$t9 24-25Temporaries 临时寄存器 $k0-$k1 26-27Reserved for OS kernel 操作系统内核调用 $gp 28Global pointer 全局指针 $sp 29Stack pointer 堆栈指针 $fp 30Frame pointer 帧指针 $ra 31Return Address 函数调用返回地址Register File寄存器堆是时序逻辑单元,读取寄存器时不需要读取控制信号,A口数据输出直接与A口地址相关,A口地址一旦改变,A口数据就会随之改变,B读取端口亦然。写寄存器时,执行时钟下降沿写操作逻辑,时钟下降沿到来时,若写信号有效,对写地址指示的寄存器进行写操作($zero寄存器除外)。VHDL实体代码如下:entity RegFiles is port (initialize: in std_logic;RegWrite:in std_logic;CLK : in std_logic;Read_registerNumber1: in std_logic_vector(4 downto 0);Read_registerNumber2: in std_logic_vector(4 downto 0);Write_registerNumber: in std_logic_vector(4 downto 0);Write_data: in std_logic_vector(31 downto 0); Read_data1: out std_logic_vector(31 downto 0); Read_data2: out std_logic_vector(31 downto 0) );end RegFiles;4.2.2 ALU(算术逻辑运算单元):Arithmetic and Logic Unit4.2.2.1 ALU概述算术逻辑运算单元的逻辑图如下:图4.3 ALU输入:两路32位数据输入A、B,4位ALU操作码,5位移位值输出:一路32位数据输出ALU result,一位溢出标志Overflow,一位零标志ALU Zero。对于ALU功能选择,我们使用4位二进制编码,支持16中ALU操作,具体见下表:表4.2 ALU操作码编码编码(Decimal)编码(Hex)ALU功能 0000 0and (与操作) 0001 1or (或操作) 0010 2add (有符号加) 0011 3sll(逻辑左移) 0100 4srl(逻辑右移) 0101 5sltu(无符号小于置1) 0110 6sub(有符号减) 0111 7slt(有符号小于置1) 1000 8sra(算术右移) 1001 9xor(异或操作) 1010 10subu(无符号减) 1011 11addu(无符号加) 1100 12nor(或非) 1101 13sllv(寄存器逻辑左移) 1110 14srlv(寄存器逻辑右移) 1111 15srav(寄存器算数右移)ALU为组合逻辑电路,它根据ALU操作码选择当前执行功能,对S、R两路数据进行操作并从ALU result输出。运算结束后根据运算结果输出零标志ALU Zero 与溢出标志 OverflowVHDL实体代码如下:ENTITY ALU ISport (S : in std_logic_vector(31 downto 0);R : in std_logic_vector(31 downto 0);opcode : in std_logic_vector(3 downto 0);shamt : in std_logic_vector(4 downto 0);reset : in std_logic;alu_zero_sig : out std_logic;alu_output_sig : out std_logic_vector(31 downto 0);alu_overflow_sig: out std_logic);end ALU
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论