《基于FPGA的微处理器设计毕业设计(论文).doc》由会员分享,可在线阅读,更多相关《基于FPGA的微处理器设计毕业设计(论文).doc(44页珍藏版)》请在三一办公上搜索。
1、毕业设计(论文)设计(论文)题目 基于FPGA的微处理器设计摘 要本文使用结构化编程方法,将微处理器内核按照功能划分为不同的模块,采用VHDL语言设计每一个模块的内部功能和外围接口,设计实现了一种基于FPGA芯片的微处理器系统。该微处理器主要由控制器、运算器和寄存器组成,具有指令控制、操作控制、时间控制和数据加工等基本功能,可实现四位操作数的各种运算,其指令长度为16位定长,采用了直接寻址方式。最后采用QUARTUSII对设计进行了仿真测试,结果表明设计实现了微处理器的主要功能。关 键 字:FPGA,微处理器,VHDLABSTRACTA microprocessor on FPGA is re
2、alized by using structured programming. This microprocessor core is divided into several different function modules which are designed using VHDL.The microprocessor consists of controller, arithmetic unit and registers. It realizes the instruction control, operation control, time sequence control an
3、d data processing functions. The direct addressing mode is adopted. The various operations for 4bit operand can be achieved. Its instruction length is 16 bit.The design is simulated by using QUARTUSII, and the results show that the main functions of a microprocessor are achieved.Key Words: FPGA, CPU
4、, VHDL目 录摘 要IABSTRACTII第1章 绪论11.1 背景11.2 微处理器的概况11.3 课题研究方法及技术背景11.3.1 研究方法11.3.2 技术背景21.4 课题工作内容3第二章 微处理器体系结构42.1 CPU的功能和构成42.2 指令系统分析52.2.1 RISC 与总线结构52.2.2 指令系统62.3 指令时序分析82.3.1 RISC与流水线82.3.2 程序计数器与流水线82.4 CPU整体结构即设计思想92.4.1 CPU的外部引脚规划92.4.2 CPU的整体框图102.4.3 CPU结构的层次划分11第三章 CPU数据通路设计123.1 程序计数器模块
5、PC123.2 程序存储器PC_RAM133.3 指令寄存器模块143.4 时钟发生器模块143.5 寄存器堆TRAM153.6 ALU模块16第四章 CPU控制单元的设计184.1 控制器Control模块184.2 有限状态机FSM模块194.2.1 有限状态机194.2.2 利用的VHDL语言进行状态机描述19第五章 RISC CPU的仿真验证215.1 各模块的组合215.2 综合RTL电路图215.3 RISCCPU的功能仿真验证245.3.1 算术运算类指令验证245.3.2 逻辑运算类指令验证255.3.3 移位类指令验证255.3.4 LD数据输出指令仿真265.3.5 ST运
6、算数据存储仿真265.4 总结27第六章 总结和展望28参考文献29致谢错误!未定义书签。附录30第1章 绪论1.1 背景随着数字通信和工业控制领域的高速发展,超大规模集成电路的集成度和工艺水平不断提高,要求专用集成电路(ASIC)的功能越来越强,功耗越来越低,生产周期越来越短,这些都对芯片设计提出了巨大的挑战,传统的芯片设计方法已经不能适应复杂的应用需求了,将整个应用电子系统集成在一个芯片中(SOC), 已成为现代电子系统设计的趋势。简单来说,SOC是一种将多个独立的VLSI设计拼合在一起,来形成某一应用所需的全部功能的集成电路,以其高集成度、低功耗等优点越来越受欢迎1。中国的电子信息产业现
7、在增长迅速,主要集中在移动通信设备、数据通信设备、计算机及消费产品领域。考虑到我国电子信息市场的特殊性,即巨大的移动通信和数字家电市场的核心芯片主要依赖进口的状况。巨大的市场的需求决定了开发SOC的必要性,现在数字家电的片上系统研究己经成为研究的热点之一。研究SOC的设计方法和验证方法具有很大的现实意义2-3。其中CPU是SOC的重要组成部分,可以完成简单的数据处理,内存的调度,中断处理等操作。随着百万门级的FPGA芯片、功能复杂的IP核、可重构的嵌入式处理器核以及各种强大EDA的开发工具的迅速发展,使得设计者在EDA工具的帮助下完成整个系统从行为算法级到物理结构级的全部设计,并最终将一个电子
8、系统集成到一片FPGA中,即SOPC。可见,SOPC是基于FPGA解决方案的SOC,是SOC发展的新阶段。1.2 微处理器的概况微处理器是计算机系统中非常之重要的核心组成部分,它用来控制计算机的各种操作过程,通常也被称为CPU,即中央处理器。随着科学技术的迅速发展,微处理器的发展也是非常迅速,它的处理能力已经由过去的4位发展到现在的64位,运算能力和处理能力大大提高,应用领域也从计算机系统扩展到各个相关领域,例如通信、航天和工业控制等。通常,微处理器按照处理能力可以划分为4位、8位、16位、32位和64位微处理器,它的处理能力是逐步提高的。但是,在微控制器的发展过程中,8位机始终是嵌入式低端应
9、用的主要机型4。现今市场上流行的典型的8位微控制器,可以在各种FPGA上实现,设计灵活方便而且易于进行功能扩展。因此研究8位CPU内核具有广泛的现实意义,由于其具有较高的处理性能和较少的资源占用,故具有更加广泛的应用前景。1.3 课题研究方法及技术背景1.3.1 研究方法本课题使用硬件描述语言VHDL采用自顶向下的设计方法设计一个满足要求的8位CPU内核及外部接口,使用EDA软件QUARTUSII软件完成编码、仿真验证。自顶向下的设计方法就是设计者首先从整体上规划整个系统的功能和性能,然后利用功能分割手段对系统进行划分,分解为规模较小、功能较简单的局部模块,并确立它们之间的相互关系,将设计由上
10、至下进行层次化和模块化,即分层次、分模块地对电子系统进行设计和仿真。不难看出,采用自顶向下的设计方法实际上就是基于芯片的系统设计方法,这种方法有助于在设计早期发现结构设计中的错误,提高设计成功率。1.3.2 技术背景 1. 硬件描述语言VHDL 如今,大多数的EDA工具都采用VHDL作为主要的硬件描述语言,这主要源于VHDL强大的自身功能和特点,下面介绍一下VHDL的优点。(1) 具有强大的描述能力VHDL既可以描述系统级电路,也可以描述门电路;既可以采用行为描述、寄存器描述或者结构描述,可以方便地建立电子系统模型。(2) 具有共享与复用能力VHDL采用基于库的设计方法,从而大大减少了工作量,
11、缩短了开发周期。(3) 具有独立于器件和工艺设计的能力VHDL独立于器件的特点可以使设计人员集中精力来进行电子系统的设计和性能优化,而不需要考虑其他问题。(4) 具有良好的可移植能力。VHDL的可移植性源于它是一种标准化得硬件语言,因此同一个设计描述可以被不同的工具所支持。(5) 具有向ASIC移植的能力。2. CISC指令集和RISC指令集CISC是一种为了便于编程和提高内存访问效率的芯片设计体系。早期的计算机使用汇编语言编程,由于内存速度慢且价格昂贵,使得CISC体系得到了用武之地。它的设计目的是要用最少的机器语言指令来完成所需的计算任务。后来 功能需求越来越丰富,因此越来越多的复杂指令被
12、加入到指令系统中,但是还必须保持着前向的兼容性。内容的不断扩充和兼容性的考虑,导致庞大的CISC指令系统形成了。在20世纪90年代中期之前,大多数的微处理器都采用CISC体系包括Intel的80x86和Motorola的6sK系列等6。CISC 体系结构几乎没有考虑流水线的因素,使得指令执行起来耗时而且寻址复杂。1975年,IBM的设计师提出了一种新的体系结构和指令集设计方案,这就是RISC体系结构。典型的RISC处理器具有以下特点:(1) 指令功能简单,各指令的复杂度分布均衡,有利于形成流水线;(2) 控制电路简单,多采用硬连线方式来实现。因为不需要额外的存取微程序存储器来完成指令的执行,因
13、此可以直接使用硬连线方式来设计;(3) 指令定长,指令格式简单,指令编码固定。这样字段固定,使操作码得译码与操作数的存取可以同时执行,使得控制单元的设计简单化;(4) ALU指令和访存指令分开,并且访存种类很少。(5) 以寄存器对寄存器的运算为主。寄存器对寄存器的运算有助于减少对存储器的访问次数,提高数据的存取速度7-8。1.4 课题工作内容本文一共分为七章。各章节内容安排如下:第一章 绪论。第二章 微处理器的体系结构。研究了CPU的整体设计,指令系统和时序分析以及流水线的实现。第三章 CPU数据通路设计。详细介绍了通路模块中的程序计数器、指令寄存器、程序存储器等的具体设计和功能实现。第四章
14、CPU控制单元的设计。详细介绍了控制单元中的控制器和状态机的设计和功能实现。第五章 CPU的仿真验证。验证CPU的部分功能。第六章 总结和展望。第二章 微处理器体系结构2.1 CPU的功能和构成CPU是计算机的核心组成部分。计算机进行信息处理可分为以下两个步骤9。(1) 将数据和程序(即指令序列)输入到计算机的存储器中;(2) 从第一条指令的地址开始执行该程序,得到所需的结果,结束运行。 CPU的作用是协调和控制计算机的各个部件,并执行程序的指令序列,使其有条不紊的进行,因此必须具备以下基本功能:取指令:当程序已在存储器中时,首先根据程序入口地址取出一条程序,为此要发出指令的地址及相关的控制信
15、号;分析指令:即指令译码,既对当前所取的指令进行分析,指出它要求什么操作,并产生相应的操作所需要的控制命令;执行指令:根据分析指令时产生的“操作命令”形成相应的操作控制序列,通过运算器、存储器及输入输出的执行,实现每条指令的功能,其中包括对运算结果的处理及下条指令地址的形成。将CPU的功能进一步细化,可以概括如下。(1) 能对指令进行译码并执行规定动作;(2) 可以进行算术和逻辑运算;(3) 能与存储器和外设交换数据;(4) 提供整个系统所需的控制。尽管各种CPU的性能指标和结构细节各不相同,但它们所能完成的基本功能相同,简化CPU内部结构如图2-1所示。图2-1 简化CPU内部结构2.2 指
16、令系统分析指令系统结构是微处理器体系结构的一个重要部分,是微处理器设计的基础。指令格式、寻址方式和指令系统是指令系统结构的重要方面。目前主流CPU指令可以分为RISC和CISC,由上节介绍可知,RISC微处理器指令系统的指令种类少而经,寻址方式简单,指令格式固定,所以本次设计采用RISC指令系统2.2.1 RISC 与总线结构早期的计算机一般都采用冯.诺依曼(Von Neumann)结构,CISC架构的微处理器常采用这种结构。它是在同一个存储空间取指令和数据,采用单地址总线结构,即程序存储器和数据存储器共用一条地址总线,限制了工作带宽,使得控制电路复杂,功耗较大10-11。结构见图2-2所示:
17、图 2-2 冯.诺依曼结构图 这种结构有两个明显的缺点:(1) CPU中控制器和运算器的速度必须与存储器的速度相匹配;(2) 指令和数据的流动都通过同一条总线,使指令和数据的独立性消弱;目前,RISC架构的微处理器都采用哈佛结构,这种结构具有分离地址总线的两个存储器,其中一个放程序,另一个放数据,其指令和数据空间完全分开,可以同时访问,且一次读出,简化控制电路,提高数据的吞吐率12。结构如图2-3所示。 图2-3 哈佛结构图这种结构的优点是:(1) 允许数据从程序存储器传递到SRAM,该功能也允许从程序存储器 中读取数据表。这对现代微控制器应用十分重要,因为为了使掉电 后数据表不丢失,就要将它
18、放在程序存储器中,RISC架构很好地解 决了这个问题。(2) 读取指令和存储器数据交换可以在多步流水线中同时进行,这在冯. 诺依曼单地址总线结构中很难实现。基于以上两种体系结构特点的比较,本文设计的微处理器器采用了哈佛结构的体系结构。首先,哈佛结构的指令总线和数据总线分开,可以使用不同位宽的指令和数据,还有一个最大好处就是可以预取指令,这样对流水线是很有用的。其次,该微处理器实现了两级指令流水线,采用哈佛结构可使流水实现的难度大为降低,在采用流水线后,能够有效地提高指令的执行速度。再次,该微处理器采用了硬布线逻辑代替微程序控制的方法,提高了指令的执行速度和效率。2.2.2 指令系统本文设计的微
19、控制器采用两级流水线、指令长固定、指令密度适中、控制单元简单的类似RISC指令集,本文自定义指令集,该指令集仅有20条指令,寻址方式简单。每条指令的字长都是16位,包含足够的信息:指令操作码,源操作数地址,目的操作数地址,立即数13-14。1、 指令集表1 是本文所涉及的CPU所有指令的一个集合指令名称指令操作影响标志位周期算术与逻辑类指令ADD R1,R2Add Two RegisterC1SUB R1,R2Sub Two RegisterZ1AND R1,R2And Two RegisterZ1OR R1,R2Or Two RegisterZ1位操作指令LSL R1Logical Shif
20、t LeftNone1LSR R1Logical Shift RightNone1数据传送类指令MOV R1,#IIMove Between RegisterNone1LD R1Load Immediate from RegisterNone1SD R1Store Result to RegisterNone1停机指令SLEEPSleep(Wait for )NoneAny2、寻址方式本文指令系统的寻址方式为下面两种直接寻址方式:(1) 单一寄存器寻址。操作数在目的寄存器;(2) 双寄存器寻址。操作数分别在目的寄存器和源操作寄存器中。3、指令格式定义正如以前所提到的,RISC总是有固定长度以便
21、于译码。对设计的微处理,每个指令都是固定的16位长度,其中操作码占用16 位指令字的高4 位。所有的指令码都很容易译码。对两个寄存器的指令,d选择目的寄存器,:r选择源寄存器,4位可以寻址16个寄存器,这种指令格式包括ADD,SUB,AND,OR。1514131211109876543210rrrrdddd对于仅需要一个寄存器的指令,d用来寻址目标寄存器。这种指令格式包括LD,LSL,LSR指令。1514131211109876543210dddd对于立即数指令,指令中间8位是8位常数,其中H 代表常数的高四位,L代表常数的低四位,d用来寻址目的寄存器。这种指令格式包括MOV,SD。15141
22、31211109876543210LLLLHHHHdddd4、指令编码 确定了指令的格式,就可以对指令进行编码,这样指令就有唯一的身份识别。指令编码结果如表2所示。 表2 指令编码指令类型指令机器码ADD0001 0000r r r rd d d dSUB0010 0000r r r rd d d dAND0011 0000r r r rd d d dOR0100 0000r r r rd d d dLSL0101 00000000 d d d dLSR011000000000d d d dMOV0111LLLLHHHHd d d dST100000000000d d d dLD1001000
23、00000d d d dSLEEP10110000000000002.3 指令时序分析2.3.1 RISC与流水线指令的执行分成两个阶段:取指阶段和执行阶段。在取指阶段,指令机器码被取到指令寄存器,控制单元通过译码知道这是个什么样的指令,需要执行什么样的操作,需要什么操作数;在执行阶段当前指令以及取指完毕,上一条指令被执行。这样按顺序第1条指令执行完再取第2条指令,第2条执行完在取第3条指令的顺序执行方式执行一条指令最少需要两个时钟周期,如果执行10条指令那么就得需要10个时钟周期,显然这样指令的执行效率不高。为了解决这个问题,本次设计中引入了流水线(pipeline)操作。8位CPU采用两级
24、流水线技术,指令的流水线可以用图2-4来简单的示意:图2-4 流水线指令执行由图可以看出,尽管每条指令的完成需要两个周期的时间,但是在流水线结构中,当前指令的取值周期和上一条指令的执行周期在时间上是重叠的,对于这种并行操作,从平均角度来看,相当于一个周期内完成一条指令,因此可以大大提高指令的运行速度15。RISC架构的处理器,每条指令有固定的长度,指令格式只有简单的几种,指令功能不交叉,寻址方式也简单,所以更加有利于实现流水结构。为了降低执行每条指令所需时钟数,本文也采用两级流水,其功能分别定义为:第一级,取指;第二级,时钟前半周期控制器译码、发出控制信号,时钟后半周期进行对寄存器堆TRAM进
25、行读操作、ALU计算。这样,很显然也能降低执行指令所需的时钟数,取指、执行只用了一个时钟。在时钟上升沿PC产生进入PCRAM的地址,由于PCRAM 有反应时间,经过一段很短的时间读出指令,在下一个时钟上升沿到来时,指令寄存器锁存指令,然后开始对指令进行译码,并产生操作数、目的存储器寄存器地址、写信号及各种控制信号。2.3.2 程序计数器与流水线程序计数器(PC)是程序中寻址取得指令的特殊单元。正是靠PC的移动,CPU才能一条一条的执行指令。同时,程序计数器也是和流水线密切相关的单元。在程序开始执行前,CPU将它的起始地址送入PC,当指令执行时,CPU 将自动修改PC 的内容,所以PC中的内容总
26、是下一条指令的地址。由于指令通常是顺序执行的,所以修改的过程通常只是简单的PC加1。表2说明了在引入流水线后PC的具体工作情况:表3 指令执行中PC值的变化情况时钟周期Reset周期1周期2周期3周期4PC0 1234第一条指令读取指令0执行指令0第二条指令读取指令1执行指令1第三条指令读取指令2执行指令2表3表明,在系统复位时,PC内的值清0,第一个时钟周期,指令寄存器取PC为0的地址的指令,同时PC的值加1;第二个时钟周期,执行0地址的指令,同时读取地址1的指令,同时PC的值加1;第三个时钟周期,重复这样的过程。这样可以得到结论:如果当前CPU正在执行的是第N条指令,那么指令寄存器正在读取
27、的是N+1条指令,此时PC的值应该是N+2。2.4 CPU整体结构即设计思想在设计CPU 之前整个结构的特性及由哪些模块组成,这些模块之间的互连关系以及整个CPU的最后输出信号等都是要事先定义好的.。2.4.1 CPU的外部引脚规划从CPU外部看整个输入输出如图2-5图2-5 CPU外部引脚信号该CPU有5个输入引脚,1个结果输出端口以及一个运算溢出信号。系统的时钟信号将直接驱动驱动整个CPU。WR信号是系统的异步指令输入信号,高电平有效。当WR信号有效时,整个CPU进入指令输入状态,当WR低电平时CPU进入指令读取并完成指令操作的状态,当CPU完成全部输入指令时进入停机状态,此时Start信
28、号重新启动CPU,使其进入等待状态。2.4.2 CPU的整体框图系统的顶层结构模块图如图2-6图2-6 系统的顶层结构模块图该模块包含了系统的主要模块及它们之间的连接关系。图中的一个一个的模块代表了各个功能模块,将在下面的章节中分别做详细的设计说明。每个模块都将按照EDA设计中自下而上的设计原则分别独立设计。有些模块是比较简单的像指令寄存器(IR),有些模块则是比较难的像ALU模块和控制单元模块。 在设计微处理器的功能模块之前,需要决定如何逻辑实现和处理器锁存数据。微处理器中有两种不同的逻辑元件:(1) ALU、MUX、CONCROL单元的元件都是组合逻辑电路。它们的输出仅仅依赖于当前的输入状
29、态,没有内部存储功能;(2) 寄存器堆、临时寄存器都是状态单元,它的输出不仅依赖于输入,还有其自身内部的状态。时钟用来决定状态何时被写入,一个状态可以在任意时刻读取。微处理器的时钟采用边沿触发的方式,整个系统采用单时钟电路,即提供一个系统时钟,每当时钟边沿到来的时候,向状态单元写入数据。整个系统可以分为两个单元:取指单元,执行单元。取指单元负责取下条指令,执行单元负责执行当前指令。取指单元和执行单元共同构成了CPU的微控制单元。取指单元的第一个模块是程序计数器(PC),PC中是下条要执行的指令的地址,它是指向程序存储器单元(PROM)来寻址指令的。控制模块是对从指令寄存器(IR)送出指令进行译
30、码从而发出适当的控制信号执行程序的。系统中包括了很多寄存器的设计包括指令寄存器(IR),程序计数器(PC),这些寄存器大都在我们顶层可见的模块的内部,系统的工作也可以看作就是数据在这些寄存器之间的“迁移”,也即寄存器内容的迁移。微处理器的功能就是体现在这些这些数据是如何传递的,在传递前的处理是如何处理的,所有这一系列寄存器数据之间的迁移转换就组成了微处理器。2.4.3 CPU结构的层次划分正确合理的划分系统是所有数字系统设计成功的关键。子系统的划分过程就是把总体任务划分程若干分任务的过程。本设计将CPU分解为两大子系统:数据通路和控制通路。这种划分将CPU的运算、执行单元与控制部件分离开,是非
31、常合理、自然的。数据通路和控制通路这两大部分又可以细化为更小的模块,ALU模块(算术逻辑单元)、PC_RAM模块(程序存储器)和IR(指令寄存器)、TRAM(寄存器堆)属于数据通路部分,ALU内部又包含更小的模块(加、减、与、或、移位模块);控制模块属于控制通路部分,其中控制模块又由FSM(状态机)和CONTROL(控制器)构成。具体的模块功能实现将在下面两章中详细介绍。第三章 CPU数据通路设计从这一章开始将详细介绍整个CPU的细化设计模块。通过上一章对CPU的结构划分,已经知道CPU的整个设计分为两个部分:数据通路和控制单元。在这一章中将细分数据通路模块,数据通路是CPU中的执行部件,数据
32、传输、存储、处理都是在数据通路中完成的。在整个CPU的结构框图中,除了控制单元部分,其余部分都是数据通路部分,包括程序计数器PC、程序存储器PC_RAM、指令寄存器IR、寄存器堆TRAM、数据选择器ALUMUX和算术与逻辑单元ALU。设计数据通路,有两种不同的设计方案。第一种是在所有需要传送数据的部件创建一条直接通路,采用多路选择器或者缓冲器为那些有多个数据源的寄存器从多个可能的输入中选择一个,这种方案适用于规模比较小的微处理器设计。另一种方案是在微处理器内部创建一条总线,并且在各个部件之间使用总线传数据。本设计采用的是第一种方案的设计方法。下面将一一介绍数据通路的各个模块功能及其实现。3.1
33、 程序计数器模块PC程序计数器(PC)作为指向指令地址“指针”,决定着下一条要执行的指令。正是有了PC的移动和变化,CPU才能按一定的顺序或预想的情况进行指令的执行。程序计数器PC中存放指令存储器的地址,当一条指令被执行时,程序计数器存放下一条指令的地址。在正常工作的条件下,控制信号选择PC+1作为下一个PC的值输出;当执行JMP指令时,选择来自指令中的跳转地址决定新的PC值,但是在本次设计中没有涉及到。图3-1 PC模块外部接口信号图3-1所示是从外部看的PC模块的接口。其中输出的PC是8BitS宽的,因此PC模块可以寻址独立的256个单元。PC_OUT地址输出信号是直接与程序存储器PCRA
34、M相连的。PC_INC控制信号来自控制单元,若PC_INC有效则PC将执行加1操作。EN信号是程序计数器PC的使能控制信号,只有当该信号有效时PC的相应才能操作才能执行。3.2 程序存储器PC_RAM程序存储器是存储微处理器程序,即能执行特定功能的一组指令组合。图3-2显示了程序存储器的结构图。图3-2 程序存储器示意图在设计程序存储器模块时,本文是自行设计寄存器堆型的存储器,直接使用一个数组存放二进制数据,通过 VHDL 编写一个一定长度的数组实现。因为程序计数器可以寻址到256条指令,所以程序存储器也必需可以至少存放 128 条16 位的指令,这样只需申请一个变量 Ram,有256个元素,
35、每个元素16 位即可。第一个数组元素下标表示存贮器的0 号地址,第二个数组元素下标表示1 号地址,以此类推至第256个数组元素的下标,即11111111 号存贮器地址。程序存储器是一个可读可写的模块,其输入端口接入外围程序和地址输入端口,由 WR 异步控制其读写状态,WR 高电平有效。当 WR 有效时,程序存储器为写状态,即将输入程序存入其输入地址对应的存储单元中, 即执行操作 ram(conv_integer(waddr) = wdata;当 WR 为低电平时,程序存储器处于读状态,其将程序计数器输出地址 PC_OUT上 对应的存储单元中的指令输出,即执行操作instruction = ra
36、m(conv_integer(pc_in)。这样就可以通过存贮器数组元素和输入地址间的相互赋值实现“读存储器”,“写存储器”,既简单又容易实现。图3-3程序存储器外部接口信号程序存储器模块的外部接口信号如图3-3所示,其中读状态地址来自PC模块,输出指令直接送往指令寄存器模块,写状态地址来自CPU输入地址,写入指令存储到对应地址单元中。3.3 指令寄存器模块指令寄存器在时钟上升沿锁入从程序存储器PC_RAM中读取的指令,并保持到时钟的下一个上升沿,一条指令的执行从指令寄存器锁入指令开始。所以指令寄存器的作用是暂时存放取到的指令,是从程序存储器到控制单元和ALU模块中的中间缓冲模块。通过上一章的
37、流水线分析部分、指令时序分析部分和程序存储器模块分析部分可以得到,在指令寄存器模块中,当前存放的并不是CPU正在执行的指令,而是下一条指令。同样道理可知,送入控制单元并进行指令译码也是下一条指令。这是由两级流水线的架构决定的,在两级流水线中,CPU在执行当前指令的同时指令寄存器取到下一条指令,并且控制器将下一条指令进行译码。图3-4指令寄存器外部接口图3-4所示,指令寄存器的指令流向是:4位操作码IR指令送往控制单元已做译码使用,而根据不同指令分离出来的要操作的立即数DATA、源操作寄存器RR、目的操作寄存器RD送到寄存器堆TRAM模块。指令寄存器外部输入控制信号en是来自控制单元的输入信号,
38、En高电平有效,与PC模块的使能en信号功能上基本一致,它控制着指令寄存器是否可以从程序存储器中加载指令。当en有效时指令寄存器才能更新来自程序存储器的指令。3.4 时钟发生器模块时钟发生器TIME_CTRL利用时钟信号CLK生成从时钟信号CLKR,并送往CPU的寄存器堆TRAM中,作为其进行读写操作的时钟信号。CLKR是将CLK延迟半个周期产生的,有利于流水线的完成。时钟发生器的外部接口如图3-5。图3-5 时钟发生器的外部接口3.5 寄存器堆TRAM 寄存器堆与程序存储器设计相同,都是直接使用一个数组存放二进制数据,通过 VHDL 编写一个一定长度的数组实现,同样可以通过集成器数组元素和输
39、入地址间的相互赋值实现“读存储器”,“写存储器”。在本次CPU设计中TRAM模块用以完成以下几个操作:1、 将立即数写入指定寄存器中。2、 将指定目的操作寄存器地址中的数据读出并输出。3、 将指定源操作寄存器地址中的数据读出。 图3-6 寄存器堆TRAM外部接口 如图12所示,fclkr时钟信号是来自时钟发生器,控制寄存器是否能进行读写操作。在CPU时钟的前半周期,控制器进行译码并发出控制信号,为操作的施行铺好路,在时钟的后半周期,也就是从时钟信号fclkr的上升沿,TRAM在控制信号ram _ctrl、load、store的控制下进行读写操作。If (rising_edge(fclkr) t
40、hen If (fstore =1) then ram (conv_integer(fromrd)=fR0 /存储上条指令运算得到的结果 elsif (fromram_ctrl = 11) thentoreg_rr=ram(conv_integer(fromrr); toreg_rd=ram(conv_integer(fromrd); /将指定寄存器的值输出 elsif (fromram_ctrl = 01) then ram (conv_integer(fromrd)=value2; / 存储立即数到目的寄存器从这段代码可以看出,当控制信号store有效时,TRAM可以完成将运算器的结果写入
41、目的操作寄存器中,若无效,则判断控制信号ram_ctrl的值,根据不同的控制值可以将寄存器的储存值分别写入目的操作寄存器和源操作寄存器中,可以将立即数写入目的操作寄存器中,可以读出指定寄存器的值并输出。3.6 ALU模块ALU单元即算术运算单元,是CPU的核心处理的单元,不但能完成算术和逻辑运算,而且很多数据都要通过ALU送出到输出端口并输出。在ALU中还可以细化成两个功能单元:取操作数单元、执行运算单元。取操作数单元负责对ALU的两个操作数A和B的取值,执行运算单元负责将取到的操作数进行相应的操作。ALU整体框图如图37所示。图3-7 ALU整体结构图算术逻辑单元ALU 是绝大多数指令必须经
42、过的单元,所有的运算都在ALU 中完成。取操作数单元在数据选择的控制信号控制下,可以选取一个或者两个操作数输入执行单元。在执行运算单元中,根据指令的类型对两个或一个8位输入数据进行运算。4 位算术控制输入信号alu_ctrl决定两个输入数据的算术操作类型,可以有16 种不同的功能组合。2位逻辑控制输入信号Logic决定一个输入数据的逻辑操作类型,可以有4种不同的功能组合。在ALU的设计中主要还是根据指令来的,ALU所能执行的指令是很多的,基本的指令可以分为4类,即ADD,SUB,LOGIC,LSL、LSR。指令ADD分为不带进位和带进位加法操作:SUB指令组分为执行不带进位和带进位减法操作;L
43、OGIC指令组分为或和与的逻辑操作;LSL指令组分为带进位的循环右移和不带进位的算术右移操作; LSR指令组分为带进位的循环左移和不带进位的算术左移操作;在本次设计中只完成加法、减法、与、或、不带进位的左移和不带进位的右移的运算功能,并输出溢出信号。Process (a1, b1, fromalu_ctrl , fromlogic) Begin case fromalu_ctrl is end case; case fromlogic is end case;end process;Process (clk) begin if (rising_edge(clk) then if fouten
44、=0 then R=ZZZZZZZZ; elsif fload =0 then R=r1(7 downto 0); else R=a1(7 downto 0); 由这段代码可以看出ALU模块是双进程模块,操作数运算是不受时钟控制的,由控制信号直接控制并计算。但是结果输出是在下一个时钟信号的上升沿进行的,这样可以控制输出的时间,保证其输出正确,而且输出控制信号outen控制CPU是否输出数据,若outen控制信号有效,则再判断需要输出何种类型的数据,若load控制信号有效则将输入数据直接输出,完成从指定寄存器读出数据的操作,若无效则将算术或逻辑运算的结果输出。ALU模块外部接口如图3-9所示。图3-11 ALU模块外部接口第四章 CPU控制单元的设计在CPU中还有一个重要的模块,即控制单元模块,其功能是得到当前指令,得到需要的数据,在正确的时间、用正确的值设置所有相关的控制信号,控制CPU的取指、译码和指令执行等操作。因此这个模块在整个CPU的设计中是最关键的也是最难精准实现的模块。流水线操作和数据通路各个模块的所有控制信号都是来自控制单元。控制单元的作用就是对指令译码,在不同的状态发出不同的控制信号来处理流水线过程,另一方面在合适的时间对数据通路发出