基于MIPS指令集的32位RISC处理器逻辑设计 - 图文

更新时间:2024-04-05 21:31:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

科 生 毕 业 论

题 目: 基于MIPS指令集的32位

RISC处理器逻辑设计 院 系: 信息科学与技术学院 专 业: 计算机科学与技术 学生姓名: 李玮超 学 号: 05373024 指导教师: 李国桢 副教授

二〇〇九 年 四 月

文本

摘 要

CPU是计算机系统的核心部件,在各类信息终端中得到了广泛的应用。处理器的设计及制造技术也是计算机技术的核心之一。MIPS是世界上很流行的一种RISC处理器。MIPS的意思是“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。

本文在详细研究32位MIPS处理器体系结构的基础之上,在Quartus II 7.2环境中,完全依靠自己的研发设计能力,采用硬件描述语言VHDL完成了拥有自主知识产权的基于MIPS指令集的32位RISC处理器的逻辑设计。共开发出单周期、多周期、五级流水线等3个不同版本的32位RISC处理器,均通过Quartus II进行了时序仿真和性能比较分析。

本文的首先概述了MIPS指令集的重要特征,为讨论CPU的具体设计奠定基础。本文设计的3个版本的CPU均实现了一个共包含59条指令的32位MIPS指令子集。

本文的主体部分首先详细描述了处理器各个独立功能模块的设计,为后续的整体设计实现提供逻辑功能支持。随后按照单周期、多周期、流水线的顺序,循序渐进的围绕着指令执行过程中需经历的五个阶段,详细描述了3个版本的处理器中各阶段的逻辑设计。在完成了各个版本的CPU的整体逻辑设计后,通过Quartus II时序仿真软件在所设计的CPU上运行了测试程序,测试输出波形表明了处理器逻辑设计的正确性。

本文还通过Quartus II 7.2中的Quartus II Time Quest Timing Analyzer软件,基于Altra公司的FPGA器件比较分析了所设计的3个版本CPU的性能。其中单周期CPU基于Altra公司的Cyclone III系列EP3C120F484C7器件综合的频率可达10.417MHz,而多周期CPU的综合频率可达12.935MHz,五级流水线CPU的综合频率可达12.376MHz。

关键词: MIPS,处理器,单周期,多周期,流水线,VHDL

- i -

Abstract

CPU is a core component of computer system, which has been widely used in a variety of information devices in different areas of industry. Processor design and manufacturing technology is also one of the most important computer technologies nowadays. MIPS is one of the world-wide popular RISC processor. MIPS means “microprocessor without interlocked piped stages”. Its mechanism is to make full use of software to solve the data-related problem in the pipeline.

Based on a detailed study of MIPS instruction set architecture, this paper describes the logic design of a MIPS-based 32-bit RISC processor in detail, which is developed with hardware description language VHDL in Quartus II 7.2. The design includes the following three versions of 32-bit RISC processor, the single-cycle version, the multi-cycle version and the 5-pipeline version. All the three versions have been tested in the Quartus II timing simulation software environment. A performance analysis of the three versions is given by the paper according to the timing simulation test results.

First of all, the paper provides an overview of the important features of the MIPS instruction set, including the instruction format, instruction classification and the addressing mode, which lays the foundation of the following discussion about the

specific logic design. A 59-instruction subset of 32-bit MIPS instruction set has been implemented on all of the three processor versions discussed in the paper.

The main body of the paper first describes in detail the logic design of the independent functional modules in the processors, providing functional support for the follow-up overall design. Next, the article describes the most important logic designs of the five instruction execution stages of the three processor versions, in accordance with the step-by-step sequence of the single-cycle version, the multi-cycle version and the 5-pipeline version. Upon the completion of the overall logic design of each processor version, the correctness of the logic design is proved by the waveform output of timing simulation in Quartus II Timing Simulation Software.

- ii -

The paper also gives a comparative performance analysis of the three processor versions according to the analysis data of Quartus II Time Quest Timing Analyzer. Based on the Altra Cyclone III series EP3C120F4847 FPGA device, the instruction execution frequency of the single-cycle processor is 10.417 MHz, while the multi-cycle processor’s is 12.935 MHz and the 5-pipeline processor’s is 12.376 MHz.

Keywords: MIPS, CPU, single-cycle, multi-cycle, pipeline, VHDL

- iii -

目 录

第一章

绪论 .............................................................................................................................................. 1

1.1 1.2

处理器概述 ................................................................................................................ 1 处理器的设计过程与目标 ........................................................................................ 2

1.2.1 1.2.2

处理器的设计过程 ......................................................................................... 2 处理器的设计目标 ......................................................................................... 2

1.3 1.4

第二章

本文的主要成果 ........................................................................................................ 3 本文章节说明 ............................................................................................................ 4

MIPS体系结构概述 ..................................................................................................................... 5

2.1 2.2 2.3

复杂指令集与精简指令集的比较 ............................................................................ 5 MIPS处理器简介 ....................................................................................................... 6 MIPS体系结构概述 ................................................................................................... 7

2.3.1 2.3.2

MIPS指令集简介 ............................................................................................ 7 基于MIPS指令集进行设计的原因 ............................................................. 12

2.4

第三章

本设计实现的指令集系统 ...................................................................................... 12

处理器独立功能模块的设计 .................................................................................................... 16

3.1 辅助逻辑模块的设计 .............................................................................................. 16

3.1.1 3.1.2 3.1.3

译码器 ........................................................................................................... 16 数据选择器 ................................................................................................... 17 时序节拍发生器 ........................................................................................... 18

3.2 逻辑运算器的设计 .................................................................................................. 19

3.2.1 3.2.2 3.2.3 3.2.4

逻辑与 ........................................................................................................... 19 逻辑或 ........................................................................................................... 20 逻辑或非 ....................................................................................................... 20 逻辑异或 ....................................................................................................... 20

3.3 算术运算器的设计 .................................................................................................. 21

3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7

加减法器 ....................................................................................................... 21 乘法器 ........................................................................................................... 21 除法器 ........................................................................................................... 22 数据比较器 ................................................................................................... 22 移位器 ........................................................................................................... 23 首1、首0计数器 ........................................................................................ 24 乘加、乘减器 ............................................................................................... 25

- iv -

3.4 算术逻辑单元ALU的设计 ...................................................................................... 26

3.4.1 3.4.2

算术逻辑单元ALU的功能编码 ................................................................... 27 算术逻辑单元ALU的实现 ........................................................................... 28

3.5

第四章

寄存器堆的设计 ...................................................................................................... 29

控制逻辑与数据通道的设计 .................................................................................................... 32

4.1 单周期CPU的控制逻辑与数据通道设计 .............................................................. 32

4.1.1 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8

取指令逻辑的设计 ....................................................................................... 32 指令译码逻辑的设计 ................................................................................... 36 指令执行逻辑的设计 ................................................................................... 40 存储器访问逻辑的设计 ............................................................................... 41 结果写回逻辑的设计 ................................................................................... 42 单周期CPU的总成 ....................................................................................... 43 单周期CPU的时序仿真 ............................................................................... 44 单周期CPU性能分析 ................................................................................... 45

4.2 多周期CPU的控制逻辑与数据通道设计 .............................................................. 45

4.2.1 4.2.2 4.2.3 4.2.4

指令周期的分配 ........................................................................................... 46 多周期CPU有限状态机的建立 ................................................................... 48 多周期CPU的时序仿真 ............................................................................... 49 多周期CPU性能分析 ................................................................................... 50

4.3 流水线CPU的控制逻辑与数据通道设计 .............................................................. 52

4.3.1 4.3.2 4.3.3 4.3.4 4.3.5 4.3.6 4.3.7 4.3.8 4.3.9

流水线CPU的总体设计思路 ....................................................................... 52 流水线CPU指令相关问题的解决方案 ....................................................... 53 流水线CPU取指令阶段(IF)的设计 ....................................................... 55 流水线CPU指令译码阶段(ID)的设计 ................................................... 58 各流水线阶段之间数据缓冲逻辑的设计 ................................................... 61 流水线CPU指令执行阶段(EXE)的设计 ................................................. 62 流水线CPU访问存储器阶段(MEM)的设计 ............................................. 63 流水线CPU寄存器写回阶段(WB)的设计 ............................................... 64 流水线CPU的总成 ....................................................................................... 65

4.3.10 流水线CPU的时序仿真 ............................................................................... 65 4.3.11 流水线CPU性能分析 ................................................................................... 67

第五章

结论 ............................................................................................................................................ 68

致谢 ................................................................................................................................................................. 70 参考文献 ......................................................................................................................................................... 71 附录A:单周期、多周期CPU中CTRLUNIT的VHDL源代码 ............................................................. 72 附录B:CPU运行的测试程序 ..................................................................................................................... 76

- v -

附录C:单周期CPU中TIMESEQ的VHDL源代码 ................................................................................ 76 附录D:多周期CPU中TIMESEQ的VHDL源代码 ............................................................................... 77 附录E:5级流水线CPU中CTRLUNIT的VHDL源代码 ...................................................................... 78 附录F:5级流水线CPU中FORWARDLOGIC的VHDL源代码 ........................................................... 85

- vi -

第一章 绪论

1.1 处理器概述

CPU(Central Processing Unit)又叫中央处理器,是计算机的核心部件。其主要功能是进行运算和逻辑运算,内部结构大概可以分为控制单元、算术逻辑单元和存储单元等几个部分。它从存储器中读取指令和数据,根据指令对数据进行处理,并把结果存入存储器。CPU按照其处理信息的字长可以分为:8位微处理器、16位微处理器、32位微处理器以及64位微处理器等等。处理器的设计及制造也是计算机技术的核心之一。

从第一块微处理器芯片Intel 4004(1971年)诞生以来,处理器设计及制造技术一直保持着强劲的快速发展势头,其发展历程大致遵从摩尔定律,单个芯片上所集成的电路的数目,每隔18个月就翻一番,如图1-11所示。

图1-1:集成电路集成度实际发展状况与摩尔定律的比较图表

1

数据来源:http://zh.wikipedia.org/wiki/摩尔定律

- 1 -

“从1946年计算机诞生以来,大约每隔五年运算速度提高10倍,可靠性提高10倍,成本降低10倍,体积缩小10倍。计算机的生产数量以每年25%的速度递增。”

[1]

短短几十年的时间,计算机的应用从无到有,已经悄然渗透到各个行业领域,深刻

影响着人类的日常生活。而处理器技术的不断发展,使得更高速的计算成为可能,成为支撑计算机技术不断向前发展的中流砥柱。随着我国信息化进程的不断推进,计算机技术还将对我国的生产力的发展产生日益深远的影响。因此,微处理器设计能力的高低将直接影响我国计算机技术的发展,并进而影响我国的信息安全和国防工业的发展。

1.2 处理器的设计过程与目标

1.2.1 处理器的设计过程

“现代高端微处理器的设计过程包括三个基本的抽象层次:体系结构、逻辑实现和物理实现。”[2]

体系结构通常指的是指令集体系结构(ISA2)。它对处理器的指令集合进行说明,并定义处理器的功能性行为。它是我们在设计过程中所遵循的设计规范。为了能被处理器执行,所有软件都必须与指令集匹配。

逻辑实现就是体系结构的具体设计,也称为微体系结构。某种指令集体系结构在它的生命周期内可以有许多逻辑实现形式。对于在同一指令集体系结构上编写的任何程序,所有的逻辑实现都可以执行。逻辑实现或微体系结构的特征通常在硬件中实现,对软件是透明的,主要包括流水线设计、cache存储器和分支预测等技术。

物理实现是设计的具体物理表现形式。对微处理器表现为芯片的时钟频率、cache容量、总线接口和封装等形式。对于一个已经完成逻辑设计的微处理器,根据客户的不同需要提供相应的物理实现,以达到系统功能、成本、功耗以及可靠性等目标。

1.2.2 处理器的设计目标

体系结构的优劣直接关系到整个处理器性能,以至决定其成功与否。所以在设计

2

Instruction System Architecture

- 2 -

新的体系结构时根据实际情况制定出设计目标,以及为此而采用的主要策略。

计算机体系结构所关注的主要设计目标如下: (1)高性能[2]

高性能是体系结构中最主要的设计目标,而要提高计算机性能,最根本的途径是缩短程序执行时间。因为“程序执行时间=程序中的指令数×执行每条指令的平均周期CPI×机器周期单位时间”,因此在程序指令数确定的情况下我们只能通过改变其余两个参数来改善处理器性能。缩短机器周期时间,也就是提高机器时钟频率,主要依靠改进半导体工艺解决,同时在设计过程中减少指令通路和数据通路中关键路径的长度,也可缩短机器周期时间;而提高CPI最有效的办法就是使得数据不经计算地在寄存器和存储器之间传输,而全部计算均在寄存器之间进行,在实现上必须采用流水线、分支预测等技术。

(2)持久性[2]

微处理器体系结构的另外一个主要目标就是持久性,尽量延长所设计的体系结构的生存期,因此必须在设计时就努力避免不良的设计要素。对体系结构最普遍的设计限制就是存储器的地址位数。除此之外,微处理器应在结构上保持一定的改进和扩充性,在其指令系统设计中有意识保留供扩展的操作码和功能字以及寄存器,这样才能使得设计尽可能长久。

(3)跨代兼容性[2]

体系结构的跨代兼容性是新一代体系结构与上一代之间的软件兼容性,这样不但可以减少用户的投资,同时也可以缩短研制周期,降低开发成本。

(4)软件移植性[2]

软件移植性是指体系结构对流行的操作系统软件的可移植能力。当今开放式操作系统成为操作系统的主流,一个体系结构如果得不到软件的支持尤其是操作系统的支持,该体系结构的生命是不长久的,要顺应开放系统的发展潮流,必须考虑运行开放的操作系统。

1.3 本文的主要成果

本文在详细研究32位MIPS处理器体系结构的基础之上,在Quartus II 7.2环境中,用VHDL进行了基于MIPS指令集的32位RISC处理器的逻辑设计。

- 3 -

共开发出单周期、多周期、五级流水线等3个不同版本的32位RISC处理器,均通过Quartus II进行了时序仿真。

本文还通过Quartus II 7.2中的Quartus II Time Quest Timing Analyzer软件,基于Altra公司的FPGA器件比较分析了所设计的3个版本CPU的性能。其中单周期CPU基于Altra公司的Cyclone III系列EP3C120F484C7器件综合的频率可达10.417MHz,而多周期CPU的综合频率可达12.935MHz,五级流水线CPU的综合频率可达12.376MHz。

1.4 本文章节说明

第二章针对本文设计的32位RISC处理器,阐明了MIPS体系结构中的若干概念,并确定本设计将要实现的指令集系统,为下文描述奠定基础。

第三章主要介绍包括ALU在内的处理器主要独立功能模块的设计实现方法,为接下来控制逻辑和数据通道的设计奠定基础。

第四章按照单周期、多周期、流水线的顺序,循序渐进的围绕着指令执行过程中需经历的五个阶段,详细描述了3个版本的处理器中各阶段的逻辑设计,并对逻辑设计产品进行了时序仿真和性能比较分析。

- 4 -

第二章 MIPS体系结构概述

2.1 复杂指令集与精简指令集的比较

复杂指令集(CISC3)是指令集架构(ISA)的一种形式,它的设计目的是要用最少的机器语言指令来完成所需的计算任务。通常每个指令可执行若干低阶操作,诸如读写内存、读写寄存器和计算等操作,全部集于单一指令之中。CISC的指令复杂,ISA中每条指令字长并不相等,通常有多种寻址模式,这增加了硬件设计的复杂度,但却简化了编译器设计,且有助于生成较短的代码。属于CISC的处理器有Intel x86、AMD x86等。

与CISC相对应,精简指令集(RISC4),是ISA的另一种设计模式。其特点是指令数目多但结构规整;大量使用寄存器操作;每条指令都采用标准字长、执行时间短;易于使用流水线等高级技术等等。由于RISC单一指令功能简单,因此需要借助编译器等软件设备组合RISC指令完成复杂之功能。通常来讲,同一运算RISC比CISC需要更多的指令,也即占用更多的存储空间。常见的精简指令集微处理器包括ARM、MIPS、ARC、AVR、SPARC、Power PC等。

RISC和CISC各有优势,而且界限趋于模糊。现代的CPU往往采用CISC的外围,内部加入了RISC的特性,比如将复杂的CISC指令简化成一系列微操作,每个操作完成一条RISC指令的功能,Intel IA-32就具有这样的特征[6]。

目前,高性能通用微处理器如Intel系列和AMD系列CPU均为CISC结构。Intel于上世纪70年代推出的8086,是典型的CISC结构;其后续的系列处理器,考虑到商业运作都保持前向兼容性,Intel在桌面处理器市场的霸主地位决定了CISC在PC市场的霸主地位,AMD系列CPU为了和x86保持兼容,也都是CISC架构。在高端服务器和嵌入式处理器市场,RISC结构占据主导地位。

34

Complex Instruction Set Computer Reduced Instruction Set Computer

- 5 -

2.2 MIPS处理器简介

MIPS是世界上很流行的一种RISC处理器。MIPS的意思是“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。它最早是在80年代初期由斯坦福(Stanford)大学Hennessy教授领导的研究小组研制出来的。MIPS公司的R系列就是在此基础上开发的RISC工业产品的微处理器。这些系列产品为很多计算机公司采用构成各种工作站和计算机系统。

MIPS技术公司是美国著名的芯片设计制造公司,它采用精简指令系统计算结构(RISC)来设计芯片。和Intel采用的复杂指令系统计算结构(CISC)相比,RISC具有设计更简单、设计周期更短等优点,并可以应用更多先进的技术,开发更快的下一代处理器。MIPS是出现最早的商业RISC架构芯片之一,新的架构集成了所有原来MIPS指令集,并增加了许多更强大的功能。

MIPS技术公司于1986年推出R2000处理器,1988年推出R3000处理器,1991年推出第一款64位商用微处理器R4000。之后,又陆续推出R8000(于1994年)、R10000(于1996年)和R12000(于1997年)等型号。1999年,MIPS公司发布MIPS 32和MIPS 64架构标准。2000年,MIPS公司发布了针对MIPS 32 4Kc的新版本以及未来64位MIPS 64 20Kc处理器内核。

在通用方面,MIPS R系列微处理器用于构建SGI的高性能工作站、服务器和超级计算机系统。在嵌入式方面,MIPS K系列微处理器是目前仅次于ARM的用得最多的处理器之一(1999年以前MIPS是世界上用得最多的处理器),其应用领域覆盖游戏机、路由器、激光打印机、掌上电脑等各个方面。和Intel相比,MIPS的授权费用比较低,也就为除Intel外的大多数芯片厂商所采用。过去,MIPS架构的产品多见于工作站领域,而现在则广泛应用在嵌入式系统中,索尼PS2游戏机所用的“Emotion Engine”也采用MIPS指令,这些MIPS处理器的性能都非常强劲,而龙芯TM2也属于这个阵营,在软件方面与上述产品完全兼容。

在MIPS芯片的发展过程中,SGI公司在1992年收购了MIPS计算机公司,1998年,MIPS公司又脱离了SGI,成为MIPS技术公司;MIPS32 4KcTM 处理器是采用MIPS技术特定为片上系统(System-On-a-Chip)而设计的高性能、低电压 32位MIPS

- 6 -

RISC 内核。MIPS32 4KcTM 处理器采用MIPS32TM体系结构,并且具有R4000存储器管理单元(MMU)以及扩展的优先级模式,使得这个处理器与目前嵌入式领域广泛应用的R3000和R4000系列(32位)微处理器完全兼容。

2.3 MIPS体系结构概述

2.3.1 MIPS指令集简介

处理器的指令集体系结构(ISA)由指令集和一系列相应的寄存器约定构成。基于相同ISA编写的程序,都能够在对应ISA的处理器上运行。

MIPS的系统结构及设计理念比较先进,其指令系统经过通用处理器指令体系MIPS I、MIPS II、MIPS III、MIPS IV到MIPS V,嵌入式指令体系MIPS16、MIPS32到MIPS64的发展已经十分成熟。在设计理念上MIPS强调软硬件协同提高性能,同时简化硬件设计。

MIPS指令从诞生之日起至今,已经从32位发展到64位。为了确保程序的向下兼容性,MIPS指令的每一代产品都是在原有指令集的基础上直接扩展新的指令而不舍弃任何指令,即使是64位的指令集的MIPS处理器仍然可以执行32位指令。本节介绍MIPS指令及其特点,使得我们理解MIPS体系结构,进而完成对MIPS处理器的设计。

(1)MIPS指令集总体特点

MIPS指令集具有以下特点:①简单的LOAD/STORE结构。所有的计算类型的指令均从寄存器堆中读取数据并把结果写入寄存器堆中。只有LOAD和STORE指令访问存储器。②易于流水线CPU的设计。MIPS32TM指令集5的指令格式非常规整,所有的指令均为32位,而且指令操作码在固定的位置上。③易于编译器的开发。MIPS指令的寻址方式非常简单,每条指令的操作也非常简单。

(2)MIPS指令集的寄存器设置

5

本文中MIPS32是指MIPS Technologies Inc.发布的32位MIPS架构规范[3][4][5]

- 7 -

MIPS32TM有32个通用寄存器,编号从0到31,其中寄存器0的内容总是0,这些通用寄存器的成为寄存器堆(register file)。MIPS32TM还定义了32个浮点寄存器。另外还有一些通用寄存器,PC(program counter)就是其中的一个,CPU使用它从存储器中取指令。

(3)MIPS指令集支持的数据类型

MIPS32TM支持的数据类型有整数和浮点数。整数包括8位字节、16位半字、32位字和64位双字。浮点数包括32位单精度和64位双精度。

(4)MIPS指令集的指令格式

MIPS32TM的指令格式只有3种,如图2-1所示。R(register)类型的指令从寄存器堆中读取两个源操作数,计算结果写回寄存器堆。I(immediate)类型的指令使用一个16位的立即数作为源操作数。J(jump)类型的指令使用一个26位立即数作为跳转的目标地址(target address)。

R类型31 2625 2120 1615 1110 0605 00oprsrtrdsafunc6位5位5位5位5位6位31 2625 2120 1615 1110 0605 00immediateoprsrt16位6位5位5位31 2625 2120 1615 1110 0605 00targetop26位6位

图2-1:MIPS32TM指令格式

I类型J类型

指令格式中的op(opcode)是指令操作码。rs(register source)是源操作数的寄存器号。rd(register destination)是目的寄存器号。rt(register target)即可作为源寄存器号,又可作为目的寄存器号,有具体的指令决定。func(function)可被认为是扩展的操作码。sa(shift amount)由移位指令使用,定义移位位数。immediate是16位

- 8 -

立即数,使用之前由指令进行0扩展或符号扩展。26位target由jump指令使用,用于产生跳转的目标地址。

(5)MIPS指令集的指令分类

CPU的指令类型根据其操作的不同,可以分为下面七类。 (1)计算类指令(Computational)

计算类指令用于执行算术操作,乘/除,逻辑操作和对寄存器进行移位操作。这些指令有两种类型:寄存器类型和立即数类型。寄存器类型的指令使用两个源寄存器的值作为源操作数,立即数类型使用一个寄存器和立即数作为源操作数。根据操作的不同,这些指令分为下面4种:

1)ALU立即数指令

31 2625 2120 1615 1110 0605 00immediateoprsrt16位6位5位5位

2)3操作数指令

31 2625 2120 1615 1110 0605 00oprsrtrd00000func6位5位5位5位5位6位

3)移位指令

31 2625 2120 1615 1110 0605 00oprsrtrdsafunc6位5位5位5位5位6位

4)乘/除法指令

31 2625 2120 1615 1110 0605 0000 0000 0000oprsrtfunc10位6位5位5位6位

(2)Load/Store指令

Load和Store指令都为立即数(I-type)类型,用来在存储器和通用寄存器之间的储存和装载数据。值得一提的是MIPS指令集只有该类指令访问内存,而其他指令都在寄存器之间进行,所以指令的执行速度较高。该类指令只有基址寄存器的值加上扩展的16位有符号立即数一种寻址模式,数据的存取方式可以是字节(byte)、字(word)和双字(Double word)。

指令格式:

- 9 -

31 2625 2120 1615 1110 0605 00offsetopbasert16位6位5位5位

(3)跳转/分支指令(jump & branch)

跳转和分支指令改变程序流。所有的跳转和分支指令都会产生的一个延迟槽(delay slot)。紧跟着跳转/分支指令后的指令(delay slot中的指令)也被执行,然后在跳转目的的第一条指令从存储器中取出并执行,这是在指令的流水线执行时获得更高效率。

Jump指令格式:

31 2625 2120 1615 1110 0605 00targetop26位6位 31 2625 2120 1615 1110 0605 00oprs0000000000hintfunc6位5位5位5位5位6位

Branch指令格式:

31 2625 2120 1615 1110 0605 00immediateoprsrt16位6位5位5位

(4)寄存器传送指令

寄存器传送指令用来在系统的通用寄存器(GPR)、乘除法专用寄存器(HI、LO)之间传送数据,这些指令分为有条件传送和无条件传送2种类型。

(5)专用指令

专用指令用来产生软件中断,当执行这类指令的时候,CPU产生异常并转入中断处理程序。这些指令有系统调用(Syscall),暂停(Break)和Trap指令等,主要用于软件的异常处理。

(6)协处理器指令

协处理器指令对协处理器进行操作。协处理器的Load和Store指令是立即数类型,每个协处理器指令的格式依协处理器不同而不同。

(7)系统控制协处理器(CP0)指令

系统控制协处理器(CP0)指令执行对CP0寄存器的操作来控制处理器的存储器并执行异常处理。

- 10 -

(6)MIPS指令集的寻址方式

MIPS的寻址方式有以下几种(见图2-2): (1) 寄存器寻址——操作数在寄存器堆中。

(2) 立即数寻址——操作数是一个常数,包含在指令中。

(3) 基址偏移量寻址——操作数在存储器中,存储器地址由一个寄存器的内容

与指令中的常数相加得到。

(4) PC相对寻址——转移指令计算转移地址时使用。PC的相对值是指令中的

一个常数。

(5) 伪直接寻址——跳转指令形成转移地址时使用。指令中的26位目标地址

值与PC的高4位拼接,形成30位的存储器“字地址”。

1.寄存器寻址oprsrtrdsafunc寄存器寄存器2.立即数寻址oprsrt立即数存储器3.基址偏移量寻址oprsrt寄存器地址+字节 半字 字存储器4.PC相对寻址oprsrtPC地址+字存储器5.伪直接寻址op地址:PC图2-2:MIPS32TM指令寻址方式

字 - 11 -

2.3.2 基于MIPS指令集进行设计的原因

CPU的研发不但要突破技术瓶颈,同时还要考虑先入为主的事实标准,。自主研发全新的指令系统不但面临技术困难,还可能脱离市场需求,丧失实用性。因此,研发与主流指令集兼容的CPU是一种将研究与应用同时兼顾的务实选择。因此,国内很多科研机构(如中科院计算研究所)都选择走兼容路线,龙芯令集与MIPS指令集部分兼容6。

本设计选择基于MIPS指令集而并非ARM等其它系列RISC处理器的指令集进行设计,有如下几个原因:

首先,目前由MIPS32TM架构规范所定义的指令都是开放的。MIPS科技公司曾经申请专利7的4条未对齐访存(Unaligned Memory Access)指令(lwl、lwr、swl、swr)已于2006年12月23日过期。

其次,MIPS得到了广泛的应用,在业界的地位类似Linux在操作系统领域的地位[7],更具开放性和包容性。目前已经有110家国际半导体公司取得MIPS授权设计MIPS兼容的产品[8]

更为重要的是,MIPS是典型的RISC处理器,它的指令格式规整,大量使用寄存器操作[9],易于进行流水线设计。和CISC相比,具有易于设计实现、设计周期短和适用于更多先进的技术(如流水线)等特点。

TM

系列处理器的指

2.4 本设计实现的指令集系统

本文设计的32位RISC处理器只是实现MIPS32TM指令集中的一个子集(共计59条指令),实现了所有的计算类指令(35条)、部分Load/Store指令(2条)、所有的跳转/分支指令(14条)、大部分寄存器传送指令(6条)、空操作指令(2条)。本设计没有实现MIPS32TM指令集中的浮点协处理器(FPU)和系统控制协处理器(CP0)指令。

这59条指令分别属于3种MIPS指令类型。 (1) R类型指令格式为:

67

龙芯指令集没有实现MIPS公司的专利指令,有自主研发的用户态、核心态和媒体处理指令 美国专利号4814976,可查询美国专利网www.uspto.gov

- 12 -

R类型31 2625 2120 1615 1110 0605 00oprsrtrdsafunc6位5位5位5位5位6位 31 2625 2120 1615 1110 0605 00immediateoprsrt16位6位5位5位

(2) I类型指令格式为:

I类型(3) J类型指令格式为:

J类型31 2625 2120 1615 1110 0605 00targetop26位6位

表2-1为这59条指令的格式编码。表2-2为这59条指令的详细说明。

表2-1:本设计实现的59条指令的编码格式[4]

Name

ADD ADDI ADDIU ADDU CLO CLZ DIV DIVU MADD MADDU MSUB MSUBU MUL MULT MULTU SLT SLTI SLTIU SLTU SUB SUBU AND ANDI LUI NOR OR ORI XOR XORI SLL SLLV SRA

31 26 25 21 20 16 15 11 10 6 5 0 000000 S rs rt rd 00000 100000 001000 rs rt immediate 001001 rs rt immediate 000000 S rs rt rd 00000 100001 011100 S2 rs rt rd 00000 100001 011100 S2 rs rt rd 00000 100000 000000 S rs rt 00 0000 0000 011010 000000 S rs rt 00 0000 0000 011011 011100 S2 rs rt 00 0000 0000 000000 011100 S2 rs rt 00 0000 0000 000001 011100 S2 rs rt 00 0000 0000 000100 011100 S2 rs rt 00 0000 0000 000101 011100 S2 rs rt 00 0000 0000 000010 000000 S rs rt 00 0000 0000 011000 000000 S rs rt 00 0000 0000 011001 000000 S rs rt rd 00000 101010 001010 rs rt immediate 001011 rs rt immediate 000000 S rs rt rd 00000 101011 000000 S rs rt rd 00000 100010 000000 S rs rt rd 00000 100011 000000 S rs rt rd 00000 100100 001100 rs rt immediate 001111 00000 rt immediate 000000 S rs rt rd 00000 100111 000000 S rs rt rd 00000 100101 001101 rs rt immediate 000000 S rs rt rd 000000 100110 001110 rs rt immediate 000000 S 00000 rt rd sa 000000 000000 S rs rt rd 00000 000100 000000 S 00000 rt rd sa 000011 - 13 -

SRAV SRL SRLV B BAL BEQ BGEZ BGEZAL BGTZ BLEZ BLTZ BLTZAL BNE J JAL JALR JR NOP SSNOP LW SW MFHI MFLO MOVN MOVZ MTHI MTLO 000000 S 000000 S 000000 S 000100 BEQ 000001 REGIMM 000100 BEQ 000001 REGIMM 000001 REGIMM 000111 000110 000001 REGIMM 000001 REGIMM 000101 000010 000011 000000 S 000000 S 000000 S 000000 S 100011 101011 000000 S 000000 S 000000 S 000000 S 000000 S 000000 S rs 00000 rs 00000 00000 rs rs rs rs rs rs rs rs rt rt rt 00000 10001 rt 00001 10001 00000 00000 00000 10000 rt rd rd rd 00000 sa 00000 offset offset offset offset offset offset offset offset offset offset 000111 000010 000110 instr_index instr_index rs 00000 rd hint rs 00 0000 0000 hint 00000 00000 00000 00000 00000 00000 00000 00001 base rt offset base rt offset 00 0000 0000 rd 00000 00 0000 0000 rd 00000 rs rt rd 00000 rs rt rd 00000 rs 000 0000 0000 0000 rs 000 0000 0000 0000 001001 001000 000000 000000 010000 010010 001011 001010 010001 010011

表2-2:本设计实现的59条指令的功能说明

指令 ADD ADDI ADDIU ADDU CLO CLZ DIV DIVU MADD MADDU MSUB MSUBU MUL MULT MULTU SLT SLTI SLTIU 格式 ADD rd, rs, rt ADDI rt, rs, immediate ADDIU rt, rs, immediate ADDU rd, rs, rt CLO rd, rs CLZ rd, rs DIV rs, rt DIVU rs, rt MADD rs, rt MADDU rs, rt MSUB rs, rt MSUBU rs, rt MUL rd, rs, rt MULT rs, rt MULTU rs, rt SLT rd, rs, rt SLTI rt, rs, immediate SLTIU rt, rs, immediate 说明 rd <- rs + rt;有符号加 rt <- rs + immediate;有符号加 rt <- rs + immediate;无符号加 rd <- rs + rt;无符号加 rd <- rs 首1计数 rd <- rs 首0计数 (HI, LO) <- rs / rt;有符号除 (HI, LO) <- rs / rt;无符号除 (HI,LO) <- (HI,LO) + (rs × rt);有符号运算 (HI,LO) <- (HI,LO) + (rs × rt);无符号运算 (HI,LO) <- (HI,LO) - (rs × rt);有符号 (HI,LO) <- (HI,LO) - (rs × rt);无符号 rd <- rs × rt (只存储结果低位) (HI, LO) <- rs × rt;有符号 (HI, LO) <- rs × rt;无符号 rd <- (rs < rt);判断结果为真,则rt置1,否则rt置0;有符号比较 rt <- (rs < immediate);判断结果为真,则rt置1,否则rt置0;有符号比较 rd <- (rs < rt);判断结果为真,则rt置1,否则rt置0;无符号比较 - 14 -

SLTU SUB SUBU AND ANDI LUI NOR OR ORI XOR XORI SLL SLLV SRA SRAV SRL SRLV B BAL BEQ BGEZ BGEZAL BGTZ BLEZ BLTZ BLTZAL BNE J JAL JALR JR NOP SSNOP LW SW MFHI MFLO MOVN MOVZ MTHI MTLO SLTU rd, rs, rt SUB rd, rs, rt SUBU rd, rs, rt AND rd, rs, rt ANDI rt, rs, immediate LUI rt, immediate NOR rd, rs, rt OR rd, rs, rt ORI rt, rs, immediate XOR rd, rs, rt XORI rt, rs, immediate SLL rd, rt, sa SLLV rd, rt, rs SRA rd, rt, sa SRAV rd, rt, rs SRL rd, rt, sa SRLV rd, rt, rs B offset BAL rs, offset BEQ rs, rt, offset BGEZ rs, offset BGEZAL rs, offset BGTZ rs, offset BLEZ rs, offset BLTZ rs, offset BLTZAL rs, offset BNE rs, rt, offset J target JAL target rd <- (rs < rt);判断结果为真,则rt置1,否则rt置0;无符号比较 rd <- rs - rt;有符号减 rd <- rs - rt;无符号减 rd <- rs AND rt rt <- rs AND immediate;0扩展立即数 rt <- immediate || 0^16;低位串接16个0 rd <- rs NOR rt rd <- rs or rt rt <- rs or immediate;0扩展立即数 rd <- rs XOR rt rt <- rs XOR immediate;0扩展立即数 rd <- rt << sa;逻辑左移sa位 rd <- rt << rs;逻辑左移rs位 rd <- rt >> sa (算术右移sa位) rd <- rt >> rs (算术右移rs位) rd <- rt >> sa (逻辑右移sa位) rd <- rt >> rs (逻辑右移rs位) 无条件转移到PC + sign_extend(offset||00) 无条件转移到PC + sign_extend(offset||00);GPR[31] <- PC + 8 if rs = rt then branch if rs >= 0 then branch if rs >= 0 then branch;GPR[31] <- PC + 8 if rs > 0 then branch if rs <= 0 then branch if rs < 0 then branch if rs < 0 then branch;GPR[31] <- PC + 8 if rs != rt then branch 在当前指令附近256MB的范围内跳转 在当前指令附近256MB的范围内跳转;GPR[31] <- PC + 8 JALR rd, rs 或 JALR rd(默认rs rd <- return_addr;PC <- rs =GPR[31]) JR rs PC <- rs NOP SSNOP LW rt, offset(base) SW rt, offset(base) MFHI rd MFLO rd MOVN rd, rs, rt MOVZ rd, rs, rt MTHI rs MTLO rs 空操作 空操作 rt <- memory[base+offset];Load全字 memory[base+offset] <- rt rd <- HI rd <- LO if rt != 0 then rd <- rs if rt = 0 then rd <- rs HI <- rs LO <- rs

- 15 -

第三章 处理器独立功能模块的设计

在CPU中,主要的算术运算和逻辑运算都要在算术逻辑单元ALU(Arithmetic Logic Unit)中完成,例如加法、减法、逻辑与、逻辑或等等。

本章主要介绍包括ALU在内的处理器主要独立功能模块的设计实现方法。在本文中,各种算术运算(加、减、乘、除、算术移位等)使用的操作数都用补码表示。本文讨论的处理器设计的开发环境是Quartus II 7.2 sp3。

3.1 辅助逻辑模块的设计

处理器中数据通路的构建、逻辑功能组合等设计,离不开一些基本的辅助逻辑模块,例如译码器、数据选择器、触发器、节拍发生器等。本节介绍本文用到的几种重要辅助逻辑模块的实现方式。

3.1.1 译码器

译码器的功能是接受一个二进制数值,然后将该数值进行译码,把二进制代码转换成特定的信号输出。若译码器有n位2进制数值,则有2n个输出。每一个输出对应一个二进制编码。

在本文所描述的处理器设计中,译码器主要用于寄存器堆的写入。在写寄存器时,要根据目的寄存器编号生成译码信号,置相应触发器的写使能端,在寄存器时钟上升沿将数据写入制定的寄存器。

由于MIPS寄存器堆中有25=32个通用寄存器,因此要设计一个5位译码器。本设计采用了Quartus II中提供的参数化解码器模块LPM_DECODE定义了5位译码器lpm_decode5,图3-1给出了lpm_decode5的逻辑设计图。

- 16 -

图3-1:5位译码器lpm_decode5的逻辑设计图

3.1.2 数据选择器

数据选择器又称多路选择器或多路器。数据选择器的功能是从多个输入数据中选择一个为输出。

在本文描述的处理器设计中,应用数据选择器的地方很多,例如寄存器堆的设计就要用到2个32路32位数据选择器,供寄存器堆的两个读端口选择指定寄存器输出。现以该32路32位数据选择器为例,介绍数据选择器的设计。

本设计采用了Quartus II中提供的参数化数据选择器模块LPM_MUX定义了32路32位数据选择器lpm_mux32x32,图3-2给出了lpm_mux32x32的逻辑设计图。

- 17 -

图3-2:32路32位数据选择器lpm_mux32x32的逻辑设计图

3.1.3 时序节拍发生器

在CPU设计中,一条指令的执行需要经历取指令(IF)、指令译码(ID)、指令执行(EXE)、存储器访问(MEM)、写回寄存器(WB)中的某几个阶段。为了实现在不同的阶段实施相应的控制,需要建立一个有限状态机,有限状态机的表现形式之一就是时序节拍发生器。本文设计的有限状态机的输入是一个全局的公共时钟脉冲输入,输出端则连接各个系统模块的独立时钟,根据状态机的当前状态,按一定次序给出各模块的时钟信号,协调调度各个模块有序工作。

本文在单周期处理器模型中,使用VHDL8定义了一个包含4个状态的有限状态

8

VHDL(Very-High-Speed Integrated Circuit Hardware Description Language)即超高速集成电路硬件描述语言。本文的VHDL采用IEEE Std 1076-2002标准。

- 18 -

机TimeSeq。

TimeSeq的VHDL实体定义为: LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY TimeSeq IS PORT ( clock : IN STD_LOGIC; SeqOut : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ); END ENTITY TimeSeq; TimeSeq的详细VHDL代码请参看附录C。

图3-3给出了4状态时序节拍发生器TimeSeq的逻辑设计图。

图3-3:4状态时序节拍发生器TimeSeq的逻辑设计图

3.2 逻辑运算器的设计

在逻辑运算中,操作数被视为逻辑数。所谓的逻辑数就是没有符号,每个位的地位都相同的数。“1代表”逻辑真,“0”代表逻辑假。在MIPS中,定义了逻辑与(AND)、逻辑或(OR)、逻辑或非(NOR)和逻辑异或(XOR)。

3.2.1 逻辑与

逻辑与的操作为两个操作数的按位与。图3-4给出了32位逻辑与的逻辑电路图。

- 19 -

图3-4:32位逻辑与的逻辑电路图

3.2.2 逻辑或

逻辑或的操作为两个操作数的按位或。图3-5给出32位逻辑或的逻辑电路图。

图3-5:32位逻辑或的逻辑电路图

3.2.3 逻辑或非

逻辑或的操作为两个操作数的按位或然后非。图3-6给出了32位逻辑或非的逻辑电路图。

图3-6:32位逻辑或非的逻辑电路图

3.2.4 逻辑异或

逻辑或的操作为两个操作数的按位异或。图3-7给出了32位逻辑异或的逻辑电路图。

图3-7:32位逻辑异或的逻辑电路图

- 20 -

3.3 算术运算器的设计

3.3.1 加减法器

加减法器是执行二进制加法运算和减法运算的逻辑部件,它是处理器中的基本逻辑部件。

本设计采用了Quartus II中提供的参数化加减法器模块LPM_ADD_SUB定义了32位加减法器lpm_add_sub32,图3-8给出了32位加减法器lpm_add_sub32的逻辑电路图。

图3-8:32位加减法器lpm_add_sub32的逻辑电路图

3.3.2 乘法器

乘法器是执行二进制乘法运算的逻辑部件。

而MIPS指令集中定义有符号乘法和无符号乘法2种运算,为此需要实现2种乘器。本设计采用了Quartus II中提供的参数化乘法器模块LPM_MULT定义了32位无符号数乘法器lpm_mult32和32位有符号数乘法器lpm_mult32_signed,图3-9给出了32位无符号数乘法器lpm_mult32和32位有符号数乘法器lpm_mult32_signed的逻辑电路图。

- 21 -

图3-9:32位乘法器lpm_mult32和lpm_mult32_signed的逻辑电路图

3.3.3 除法器

除法器是执行二进制除法运算的逻辑部件。

而MIPS指令集中定义有符号除法和无符号除法2种运算,为此需要实现2种除法器。本设计采用了Quartus II中提供的参数化除法器模块LPM_DIVIDE定义了32位无符号数除法器lpm_divide32和32位有符号数除法器lpm_divide32_signed,图3-10给出了32位无符号数除法器lpm_divide32和32位有符号数除法器lpm_divide32_signed的逻辑电路图。

图3-10:32位除法器lpm_divide32和lpm_divide32_signed的逻辑电路图

3.3.4 数据比较器

数据器是执行二进制数据大小比较运算的逻辑部件,常用于转移条件信号的生成。

- 22 -

而MIPS指令集中定义有符号数比较和无符号数比较2种运算,为此需要实现2种比较器。本设计采用了Quartus II中提供的参数化比较器模块LPM_COMPARE定义了32位无符号数比较器lpm_compare32和32位有符号数比较器lpm_compare32_signed,图3-11给出了32位无符号数比较器lpm_compare32和32位有符号数比较器lpm_compare32_signed的逻辑电路图。

图3-11:32位比较器lpm_compare32和lpm_compare32_signed的逻辑电路图

3.3.5 移位器

移位器是执行二进制数据移位运算的逻辑部件。

而MIPS指令集中定义有2种移位操作:逻辑移位和算术移位,逻辑移位中又分为逻辑右移和逻辑左移两种。为此需要实现2种移位器。本设计采用了Quartus II中提供的参数化比较器模块LPM_CLSHIFT定义了32位逻辑移位器lpm_clshift32_logical和32位算术移位器lpm_clshift32_arith,图3-12给出了32位逻辑移位器lpm_clshift32_logical和32位算术移位器lpm_clshift32_arith的逻辑电路图。

图3-12:32位移位器lpm_clshift32_logical和lpm_clshift32_arith的逻辑电路图

- 23 -

3.3.6 首1、首0计数器

首1计数器(Count Leading Ones,CLO)的功能是从高位到低位扫描操作数,计算操作数字首有多少个连续的1.如果操作数中每一位都为1,则扫描结果为32。

由此可见,如果把首1计数器的操作数取反,然后对结果做首1计数,则得到结果就是原来操作数首0计数的结果。

本设计通过VHDL实现了了首1计数器clo32。

clo32的VHDL实体定义为: LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY clo32 IS PORT ( data : IN STD_LOGIC_VECTOR (31 DOWNTO 0); result : OUT STD_LOGIC_VECTOR (5 DOWNTO 0) ); END ENTITY clo32; clo32的VHDL构造体定义为: USE ieee.numeric_std.all; ARCHITECTURE SelectResult OF clo32 IS BEGIN result <= \ \ \ \ (以此类推……) \END ARCHITECTURE SelectResult;

图3-13给出了32位首1计数器clo、转换成首0计数器的逻辑电路图。

- 24 -

图3-13:32位首1计数器clo、转换成首0计数器的逻辑电路图

3.3.7 乘加、乘减器

MIPS指令集定义了乘加、乘减运算,如表3-1所示。

表3-1:MIPS乘加、乘减运算指令的定义

MADD MADDU MSUB MSUBU MADD rs, rt MADDU rs, rt MSUB rs, rt MSUBU rs, rt (HI,LO) <- (HI,LO) + (rs × rt);有符号运算 (HI,LO) <- (HI,LO) + (rs × rt);无符号运算 (HI,LO) <- (HI,LO) - (rs × rt);有符号 (HI,LO) <- (HI,LO) - (rs × rt);无符号

为此,要设计乘加、乘减器来实现这些指令的计算。

在上述已经实现的加法器lpm_add_sub32和lpm_mult32、lpm_mult32_signed的基础上,我们可以组合设计出乘加、乘减器。图3-14给出了32位乘加、乘减器的逻辑电路图。

- 25 -

图3-14:32位乘加、乘减器的逻辑电路图

3.4 算术逻辑单元ALU的设计

在完成了各种算术运算部件和逻辑运算部件的设计之后,就可以设计算术逻辑单元ALU。

算术逻辑单元ALU集成了各种算术运算和逻辑运算部件的功能,包括加、减、乘、除等数值运算、逻辑运算、移位运算等。把这些功能集成在一个逻辑部件ALU之中,使得ALU具有算术运算和逻辑运算功能。这种设计方法可以使得功能比较紧凑,简化对逻辑运算部件和算术运算部件的使用。同时还能最大限度的复用某些逻辑部件,从而减少逻辑电路的使用。

- 26 -

3.4.1 算术逻辑单元ALU的功能编码

设计ALU首先要对各种算数逻辑运算进行编码。表3-2为本文设计的处理器实用的ALU功能编码表。

表3-2:ALU功能编码表

CONTROL[4..0]0000000001逻辑指令00010000110010000101加减运算指令0011000111比较指令0100001001加载指令0101001011移位指令011000110101110首0、1计数指令0111110000乘法指令100011001010011乘加减指令101001010110110除法指令10111指令类型功能A AND BA OR BA NOR BA XOR BA减B,有符号A加B,有符号A减B,无符号A加B,无符号A

3.4.2 算术逻辑单元ALU的实现

图3-15:算术逻辑单元ALU的内部详细设计

- 28 -

图3-16:算术逻辑单元ALU的整体逻辑电路图

3.5 寄存器堆的设计

寄存器堆由一组寄存器组成。CPU在运算过程中,将一些数据保存在寄存器中。寄存器堆中的寄存器分为两种,一种为通用寄存器GPR,另一种为专用寄存器。在MIPS中,定义了32个32位的通用寄存器和3个专用寄存器[3]。如图3-17[3]所示。

r0r1r2r3r4r5r6r7r8r9r10r11r12r13r14r15r16r17r18r19r20r21r22r23r24r25r26r27r28r29r30r3131 0031 0HILO31 0PC

[3]

图3-17:MIPS CPU寄存器

32个通用寄存器中,有两个被赋予了特殊的功能:

1)r0被硬连线到0。当读r0时,将始终得到0;当写r0时,将不会产生任何影

- 29 -

响。这样,如果某些指令需要丢弃运算结果,就可以把r0作为保存结果的目的寄存器。如果某些指令需要以0为操作数,就可以把r0作为源数据寄存器。

2)r31为指令JAL、BLTZAL、BGEZAL在没有指定目的寄存器时的默认目的寄存器。r31也可被用作通用寄存器。

3个专用寄存器为: ① PC,程序计数寄存器。

② HI,乘法指令的高位结果寄存器、除法指令的余数寄存器。 ③ LO,乘法指令的低位结果寄存器、除法指令的商寄存器。

由于3个专用寄存器的用途比较特殊,所以不把它们放在寄存器堆当中。 MIPS指令集中R类型指令有3个操作数,其中两个操作数需要从寄存器堆中读出,作为算术逻辑单元ALU的输入,另一个操作数是算术逻辑单元ALU的输出,需要写入到寄存器堆中。因此,寄存器堆需要1个写通道、2个读通道。在寄存器对读操作中,需要给出寄存器的编号,寄存器堆将所给编号表示的寄存器中的数据输出到读通道。在寄存器堆写操作当中,需要给出写入寄存器的寄存器号和要写入的数据。

寄存器堆输入信号:

① N0[4..0]:读通道0的寄存器编号; ② N1[4..0]:读通道1的寄存器编号; ③ ND[4..0]:写通道的寄存器编号; ④ DI[31..0]:写通道的输入数据; ⑤ CE:写使能信号。 寄存器堆输出信号:

① RESULT[0]:读通道0的输出结果; ② RESULT[1]:读通道1的输出结果。

图3-18是产生写使能信号的5位译码器(采用前述的lpm_decode5)和2个读端口(采用前述的lpm_mux32x32)的逻辑电路图。

图3-19显示了31个寄存器(不是32个是由于0号不需要寄存器,硬连接到0)与图3-18的2个读端口和写使能译码器信号的连接方式。

图3-20显示了寄存器堆的整体逻辑电路图。

- 30 -

图3-18:寄存器堆的写使能译码器(左1)和两个多路器读端口(右1、2)

图3-19:31个通用寄存器连线方式举例

图3-20:寄存器堆的整体逻辑电路图

- 31 -

第四章 控制逻辑与数据通道的设计

在上一章设计的各种独立功能模块的基础上,本章开始讨论如何设计处理器的控制逻辑与数据通道,即通过设计控制器及其辅助逻辑电路,把独立的功能模块结合成有机的整体,实现MIPS指令的正确执行。

4.1 单周期CPU的控制逻辑与数据通道设计

CPU在处理指令时需要经过以下几个步骤:

1)取指令(IF):根据程序计数器PC中的指令地址,从存储器中取出一条指令,转到译码状态。同时,在PC中产生下一条指令的地址。

2)指令译码(ID):对取指令操作中得到的指令进行译码,确定该指令需要完成的操作,从而产生相应的控制信号,驱动执行状态中的各种动作。

3)指令执行(EXE):根据指令译码得到的控制信号,具体执行指令动作,转入下一个状态。

4)存储器访问(MEM):所有需要访问存储器的操作都将在这个步骤中执行,该步骤给出访问存储器的地址,从存储器的指定地址读取数据,或者将指定数据写入指定地址。

5)结果写回(WB):该步骤把指令执行的结果或者访问存储器所得到的数据写入到相应的目的寄存器中。

图4-1显示了单周期CPU中5个指令处理步骤的执行顺序。

取指令 IF 指令译码 ID 指令执行 EXE 存储器访问 MEM 结果写回 WB

图4-1:单周期CPU指令处理过程

4.1.1 取指令逻辑的设计

CPU执行指令时,第一步要把指令从存储器中取出来。这个动作由(IF)步骤

- 32 -

完成。

如图4-2所示,IF步骤需要完成以下几个操作:

1)给出需要取得的指令的存储器地址。因为指令保存在程序计数器PC中,所以只需要把PC中的地址输出到地址总线上即可。

2)从存储器读取指令字。 3)计算下一条指令的地址。

下条指令地址 计算逻辑 PC Clock PC Data Out 指令存储器 指令

图4-2:取指令操作示意图

(1)指令地址的保存

在MIPS体系结构中,计算机指令保存在一个32位的专用寄存器PC中。本设计使用一个32位的寄存器来实现程序寄存器PC,如图4-3所示。

图4-3:程序计数器PC

(2)指令存储器

计算机指令保存在指令存储器中。在本节的设计中,使用ROM来实现指令存储器。本节实现的指令存储器能够保存256条指令字。如图4-4所示。

- 33 -

指令存储器输入信号:ADDR[31..0](指令地址)。实际使用的是ADDR [9..0](字节地址),输入存储器的实际地址是字地址,故输入了ADDR[9..2]。

指令存储器输出信号:INSTOUT[31..0](指令字)。

(具体实现)

(整体逻辑电路图)

图4-4:指令存储器的实现及整体逻辑电路图

(3)下一条指令地址的计算

在计算下一条指令地址时,有如下几种情况:

1)如果当前指令不是分支或跳转指令,则可以简单的在当前指令的基础上加4,就得到了下一条指令的地址,保存到程序计数器PC中(如图4-6 A所示)。

2)当前指令为分支或者跳转指令时,则需要根据当前指令来计算跳转地址。 具体而言,在计算分支指令时,首先需要把分支指令中的16位立即数进行符号扩展;然后把符号扩展后的立即数向左移2位,把结果加到当前指令的指令地址上,从而产生分支转移地址(如图4-6 B所示)。

16位立即数为INSTOUT[15..0],符号位是INSTOUT[15],如图4-5所示,可将INSTOUT[15]扩展到高16位。

图4-5:符号扩展的实现

- 34 -

在计算跳转指令时,将PC+4的高4位与指令字中的低26位串接,后补2个0,即得到跳转地址(如图4-6 C所示)。

A: (PC+4)

B:

C:

图4-6:下一条指令地址的3种计算方式

(分支地址计算)

(跳转地址的生成)

在MIPS体系结构中,对于分支和跳转指令,要求在分支延迟槽中的指令(即分支或跳转指令的下一条指令)执行完成后才产生跳转,而在分支和跳转指令执行完成后并不立即跳转。因此,必须保存当前的跳转指令字以及跳转指示信号(如图4-7所示),以便在下一条指令执行时可以获得正确的跳转目标地址。

(保存跳转指示信号)

(保存跳转指令字)

图4-7:保存跳转指令字以及跳转指示信号的实现

由此可得到计算下一条指令地址的数据选通电路,如图4-8所示。

- 35 -

(选择Branch或Jump)

(选择PC+4或分支、跳转)

图4-8:计算下一条指令地址的数据选通电路的实现

由于BGEZAL、BLTZAL、JAL指令需要GPR[31] ? PC + 8 的操作,所以在计算下一条指令的逻辑电路中,还要实现PC+8的运算逻辑;而JALR指令需要PC ? rs的操作,因此要提供将rs数据输出到PC的逻辑。综合上述机制,我们可以得出如图4-9所示的计算下一条指令地址的逻辑电路。

图4-9:计算下一条指令地址的逻辑电路图

4.1.2 指令译码逻辑的设计

在得到了指令字之后,将转入指令译码阶段。 指令译码操作步骤完成如下的功能: 1)识别指令;

2)根据不同的指令给出各种控制信号;

3)根据指令从相应的源数据寄存器中取出操作数,为下一步的指令执行做好准备。

指令译码动作由控制部件CtrlUnit完成。

- 36 -

CtrlUnit的VHDL实体定义为: LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY CtrlUnit IS PORT ( instOP : IN instFUNC : IN instRT : IN AEB : IN AGB : IN ALB : IN IsRtZero : IN aluOP : OUT JUMP : OUT BRANCH : OUT WRITEREG : OUT REGDES : OUT WRITEMEM : OUT MEMTOREG : OUT ALUSRCB : OUT SE : OUT WRITEHILO : OUT SETBZ : OUT PCPLUS82GPR31 : OUT PCPLUS82RD : OUT RS2PC : OUT aluOutSelect : OUT RS2HI : OUT RS2LO : OUT ); END ENTITY CtrlUnit; STD_LOGIC_VECTOR (5 DOWNTO 0); STD_LOGIC_VECTOR (5 DOWNTO 0); STD_LOGIC_VECTOR (4 DOWNTO 0); STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC_VECTOR (4 DOWNTO 0); STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC_VECTOR (2 DOWNTO 0); STD_LOGIC; STD_LOGIC 其中CtrlUnit的输入instOP、instFUNC、instRT分别对应指令字的INST[31..26]、INST[5..0]、INST[20..16],这些输入的组合可用于识别指令。输入AEB、AGB、ALB为ALU中数据比较器的即时输出,用于计算跳转的条件是否成立。

(1)控制信号的产生

- 37 -

下面举例介绍本节设计的CPU中的控制信号的具体生成逻辑,具体信号的VHDL构造代码请参看附录A。

1)aluOP[4..0]

该信号控制ALU做何种运算。ALU功能的具体编码见表3-2。

根据表3-2的ALU功能编码以及MIPS指令格式,可以得出CtrlUnit的aluOP[4..0]的产生逻辑,可用VHDL描述如下:

aluOP[4..0]的VHDL信号构造代码(举例): aluOP <= \ (instOP = \ or (instOP = \ ) else -- …… 以此类推,剩余VHDL代码请参看附录A …… -- 2)JUMP

该信号影响取指令操作的下一条指令地址的产生。 3)BRANCH

该信号影响取指令操作的下一条指令地址的产生。‘1’指示需要转移。 4)WRITEREG

该信号影响取指令操作的下一条指令地址的产生。‘1’指示当前指令需要写回操作。

5)REGDES

该信号指示使用哪一个寄存器作为目的寄存器。‘0’指示使用rt作为目的寄存器,‘1’指示使用rd作为目的寄存器。

6)WRITEMEM

该信号为‘1’表示当前指令要把数据写入存储器。 7)MEMTOREG

该信号表明寄存器写入数据的来源。‘0’指示数据来源为ALU计算结果,‘1’只是数据来源为存储器输出。

8)ALUSRCB

该信号指示了ALU运算的第二个操作数的来源。‘0’指示ALU运算的第二个操作数的来源为rt,‘1’只是ALU运算的第二个操作数的来源是立即数。

- 38 -

9)SE

该信号指示了对立即数进行位数扩展的方式。‘0’指示立即数扩展方式为0扩展,‘1’只是立即数扩展方式为符号扩展。

10)WRITEHILO

该信号指示当前指令是否需要写乘除法专用寄存器。‘1’指示要写乘除法专用寄存器,‘0’指示不写乘除法专用寄存器。

11)SETBZ

该信号指示当前指令是否要将ALU运算的第二个操作数置0,用于分支转移时与0比较。‘1’指示将ALU运算的第二个操作数置0,‘0’则不产生影响。

12)PCPLUS82GPR31

该信号指示是否将PC+8的结果写入通用寄存器GPR31。‘1’指示将PC+8的结果写入通用寄存器GPR31,‘0’则不产生影响。

13)PCPLUS82RD

该信号指示是否将PC+8的结果写入通用寄存器rd。‘1’指示将PC+8的结果写入通用寄存器rd,‘0’则不产生影响。

14)RS2PC

该信号指示是否将rs中储存的数值写入程序计数器PC。‘1’指示将rs中储存的数值写入程序计数器PC,‘0’则不产生影响。

15)aluOutSelect[2..0]

该向量信号指示alu的输出值来源,以供写回操作使用。 “000”指示ALU输出值为ALU的计算所得值; “001”指示ALU输出值为乘除法专用寄存器HI的值; “010”指示ALU输出值为乘除法专用寄存器LO值; “011”和“100”指示ALU输出值为通用寄存器rs的值;

“101”指示ALU输出值为immediate || 016(立即数后串接16个0)。 16)RS2HI

该信号指示是否在写回操作时将通用寄存器rs中的值写入乘除法专用寄存器HI。

- 39 -

17)RS2LO

该信号指示是否在写回操作时将通用寄存器rs中的值写入乘除法专用寄存器LO。

控制器CtrlUnit的逻辑电路图如4-10所示。

图4-10:控制器CtrlUnit的逻辑电路图

4.1.3 指令执行逻辑的设计

经过指令译码操作,正在处理的指令需要使用算术逻辑单元执行何种操作已经由信号ALUOP[4..0]确定下来。经过去操作数操作,ALU需要使用的操作数也已经准备好。这样,就可以进行指令执行操作。

ALU的第一个操作数为寄存器rs中的数据。而ALU中的第二个操作数有2个选择,一个是使用寄存器rt中的数据,另一个是使用指令字中的立即数。ALU第二操作数使用哪一个来源由信号ALUSRCB来确定。执行步骤的逻辑电路图如图4-11所示。

- 40 -

图4-11:指令执行逻辑电路图

4.1.4 存储器访问逻辑的设计

在指令执行阶段(EXE)之后,CPU指令处理将进入到存储器访问阶段。 在MIPS体系结构中定义了两种当问存储器的指令:Load和Store指令。CPU能且仅能通过这两种指令来访问存储器。这是RISC架构处理器通用的做法。在本节设计的CPU中,Load指令为lw,Store指令为sw。在指令执行阶段(EXE)完成之后,将要进行存储器访问操作。在访问存储器的时候,CPU需要给出以下几种控制信号和数据:

1)访问存储器的方式:读还是写,由CtrlUnit的信号WRITEMEM来确定。 2)访问存储器的地址。无论是lw还是sw,都需要使用ALU把寄存器rs和指令字中的立即数相加得到数据地址。所以ALU的计算结果R[31..0]即为需要访问数据的数据地址。

3)如果是写存储器,则还需要给出写入的数据。写入存储器的数据来源为寄存器rt。在指令译码步骤中,寄存器rt从寄存器堆中读出的内容为REGDATA1[31..0],该数据即为存储器的写入数据。

存储器访问操作的逻辑电路如图4-12所示。

- 41 -

图4-12:存储器访问操作的逻辑电路图

4.1.5 结果写回逻辑的设计

完成了指令执行阶段(EXE)和存储器访问阶段(MEM)后,进入到结果写回阶段(WB)。所涉及到的数据和信号如下:

1)要写入的数据。寄存器堆中要写入的数据来源有2种,一种是ALU计算的结果ALUOUT[31..0],另一种是来自存储器的数据MEMDATAIN[31..0],该数据由外部输入到CPU中。在指令译码过程(ID)中,控制部件CtrlUnit给出了控制信号MEMTOREG来区分两种不同的数据来源。

2)寄存器堆写信号WRITEREG。该信号控制寄存器堆是否执行写入操作。图4-13为结果写回逻辑电路图。

图4-13:结果写回逻辑电路图

- 42 -

4.1.6 单周期CPU的总成

在完成了图4-1所示的5个阶段的控制逻辑与数据通道的设计后,就可以将各个部分集成在一起,组成单周期的CPU。总成的关键在于时序信号的控制。

图4-14:时序节拍发生器逻辑电路图

如图4-14所示的时序节拍发生器TimeSeq将伴随CLK的输入,在S[3..0]输出端循环产生“0001”、“0010”、“0100”、“1000”的输出。将S[3..0]的4个信号依次接到不同模块的时钟上,即可实现不同模块之间的协调工作。

四个时钟信号的连接方式如表4-1所示:

表4-1:节拍时钟信号的连接方式

节拍输出 S[0] S[1] S[2] S[3] 连接模块时钟 PCCLK(将下条指令的地址置入)、instMemCLK(根据刚置入的下地址读出指令字) ALUCLK(锁存ALU输出)、NXTPCCLK(计算下条指令地址) dataMemCLK(访问存储器) WriteRegCLK(写寄存器堆) 指令执行阶段 IF ID、EXE MEM WB

注意到S[1]时钟到达时,ID和EXE阶段同时完成。可合并两个指令执行阶段的原因是,ID阶段实际上是在IF阶段的时钟S[0]到达后,在读出指令字后的瞬间完成的,在S[1]到达时,不但ID已经完成,而且ALU所需的所有数据也都已在IF时钟S[0]到达后的瞬间取得,S[1]到达时已经输出结果,故S[1]可同时作为ID和EXE阶段完成的标志。

连接好各个时钟之后,即可完成本节所设计的单周期CPU,如图4-15左所示。将CPU与指令存储器和数据存储器连接好后,即可得到图4-15所示的单周期CPU系统逻辑电路。

- 43 -

本文来源:https://www.bwwdw.com/article/ajor.html

Top