1. 课程设计概述

1.1 课程目的

计算机组成原理是计算机专业的核心基础课。该课程力图以“培养学生现代计 算机系统设计能力”为目标,贯彻“强调软/硬件关联与协同、以 CPU 设计为核心/ 层次化系统设计的组织思路,有效地增强对学生的计算机系统设计与实现能力的培养”。课程设计是完成该课程并进行了多个单元实验后,综合利用所学的理论知识, 并结合在单元实验中所积累的计算机部件设计和调试方法,设计出一台具有一定规 模的指令系统的简单计算机系统。所设计的系统能在 LOGISIM 仿真平台和 FPGA 实验平台上正确运行,通过检查程序结果的正确性来判断所设计计算机系统正确性。 课程设计属于设计型实验,不仅锻炼学生简单计算机系统的设计能力,而且通过进行中央处理器底层电路的实现、故障分析与定位、系统调试等环节的综合锻炼, 进一步提高学生分析和解决问题的能力

1.2 设计任务

本课程设计的总体目标是利用 FPGA 以及相关外围器件,设计五段流水 CPU,要 求所设计的流水 CPU 系统能支持自动和单步运行方式,能正确地执行存放在主存中的程序的功能,对主要的数据流和控制流通过 LED、数码管等适时的进行显示,方便监控和调试。尽可能利用 EDA 软件或仿真软件对模型机系统中各部件进行仿真分析和功能验证。在学有余力的前提下,可进一步扩展相关功能。

1.3 设计要求

(1) 根据课程设计指导书的要求,制定出设计方案;

(2) 分析指令系统格式,指令系统功能。

(3) 根据指令系统构建基本功能部件,主要数据通路。

(4) 根据功能部件及数据通路连接,分析所需要的控制信号以及这些控制信

号的有效形式;

(5) 设计出实现指令功能的硬布线控制器;

(6) 调试、数据分析、验收检查;

(7) 课程设计报告和总结。

1.4 技术指标

(1) 支持下表基本 32 位 MIPS 指令;

(2) 支持指定的 4 条扩展指令;

(3) 支持多级嵌套中断,利用中断触发扩展指令集测试程序;

(4) 能运行由自己所设计的指令系统构成的一段测试程序,测试程序应能涵盖所有指令,程序执行功能正确。

(5) 能运行教师提供的标准测试程序,并自动统计执行周期数

(6) 能自动统计各类分支指令数目,如不同种类指令的条数、冒险冲突次数、

插入气泡数目、load-use 冲突次数、动态分支预测流水线能自动统计预测成功与失败次数。

序号指令描述符号表达
1SLL逻辑左移
2SRA算术右移
3SRL逻辑右移
4ADD有符号加法
5ADDU无符号加法
6SUB有符号减法
7AND按位与
8OR按位或$R[rs]~
9NOR按位或非$\sim(R[rs]~
10SLT比较
11SLTU比较无符号
12JR寄存器跳转
13SYSCALL系统调用
14J无条件跳转
15JAL跳转链接
16BEQ相等跳转
17BNE不等跳转
18ADDI加立即数
19ANDI与立即数
20ADDIU加无符号立即数
21SLTI立即数比较
22ORI或立即数$R[rs]~
23LW加载全字
24SW保存全字
25SUBU无符号减
26LUI高位无符号数
27LHU加载无符号半字
28BGEZ大于等于0跳转
29ERET中断返回
30MFC0读取CP0
31MTC0存储CP0

2. 简易 MIPS CPU 设计与实现

2.1 单周期MIPS

首先明确各个寄存器的名称

应题目要求,单周期MIPS采用硬布线控制,大致线路布置如下图所示。

其逻辑如下:

  • 对于跳转指令:如果是指令*()*且成功执行,则。如果是或者,则。如果是,则。 对于非跳转指令

  • 寄存器负责存储当前指令的地址,从指令存存储器中取出当前指令

  • 指令被进行解析,分别提取出字段送入硬布线控制器,字段作为寄存器输入堆地址,字段作为执行输入,字段分别进行立即数处理

  • 对于寄存器堆输入地址:当指令为的时候,调用号存在寄存器中。号系统调用为,因此将寄存器中值与比较,如果为真,则执行一次

  • 对于寄存器堆输入地址:当指令为的时候,需要从中接受参数,因此,这时候多路选择器选择寄存器地址。当指令为时,需要将进行比较,因此取出寄存器的

  • 对于寄存器堆输入地址:当写寄存器为而不是的时候,需要选路。当指令为的时候需要将写入,因此写寄存器地址为

  • 对于寄存器写入数据来自的计算数据或者从内存中取出的数据

  • 对于立即数扩展:当指令为时,需要拓展为高16位;所有需要的指令(算术指令)会激活信号;和*(这里是)*会传回供选择

  • 两个数据输入端,端链接端通过信号选择或者立即数。一个参数输入端链接从中解析出来的。一个指令输入端,接受来自硬布线控制器的。一个数据输出端,负责输出计算的数据。一个比较输出端,如果则被激活。

  • 对于主存,其地址来自的数据输出,存储数据来自。当指令为时,直接将地址取出的数据输出;当指令为时,为了判断高低半字,需要对地址第1位进行判断,如果为1则为高半字,无论高低半字取出后都需要经过符号拓展并输出。其他情况下直接输出计算结果

其中硬布线控制器电路如下图所示。

硬布线控制器中的运算器控制器,控制信号生成电路都是由下表生成,为了实现额外四条指令的效果,需要新增三个信号,分别为,他们分别负责相应三条指令的独特行为。

2.2 单级中断

单级中断逻辑

  • 三种中断通过第一级触发器来进行输入缓存,并通过第二级触发器来进入中断等待队列。
  • 中断等待队列中的中断信号通过优先选择器来选择中断信号队列中优先级最高的中断信号,并将中断队列总被选中的信号清除。
  • 一旦中断队列不为空,优先选择器就会选择信号并将中断使能寄存器,并将相应的中断入口地址动人并保存
  • 当指令为中断返回指令的时候,中断使能寄存器被清空,并且将送入
  • 其中中断地址通过汇编单级中断测试程序得到

2.3 多级中断

这是一个用用硬件实现堆栈的多级中断。

多级中断逻辑:

  • 左侧大部分结构同单级中断一致,但是有多个终端号存储器和中断返回地址寄存器,它们构成一个栈结构,每触发一次中断都会进行一次压栈,每中断返回一次都会出一次栈
  • 在中断队列逻辑中,不再是一个优先级高中断进入其他中断被阻塞。而是直接由高级中断打断低级中断,并触发一次中断
  • 负责控制当前中断等级是否会激活中断信号。
  • 与单级中断不一样,多级中断的中断入口地址通过多级中断测试程序得到。

2.4 理想流水

理想流水线逻辑

  • 在单周期MIPS上新增四段流水缓存器。

2.5 气泡流水

对于气泡流水线,当检测到分支指令时会插入气泡来防止接下里的指令被错误执行

起泡流水线的逻辑如下:

  • 对于数据相关处理,首先检测段时候用到了,其中检测电路由下表生,如果用到了再检测段是否用到了相同的寄存器,如果用到并且要写而且非0号寄存器则抛出一个数据相关信号。

  • 如果收到的了数据相关信号,两段寄存器会清空内容,防止其执行影响结果。

2.6 重定向流水

重定向流水在数据相关的基础上还考虑到了相关s

2.7 流水线中断

2.8 动态分支预测

3. 设计总结与心得

  • 对于单周期MIPS需要注意生成表(Excel)的逻辑,我是先大致写好一个电路图,然后对照着Excel修改,修改后的电路图又会导致Excel表格被修改,循环渐进修改得到了一个相对完善的版本。
  • 对于单级中断,一是要注意入口地址,要通过汇编找到,二是要注意的进入和取出逻辑,这个真的很搞心态,得多试几次
  • 对于多级中断,一是入口地址和单级中断不一样,第一次直接拿单级中断的用,结果跑不通,后来发现是不一样,得重新用看一遍;二是栈的实现,与软件不一样,硬件对栈的实现就是环路反向一格;三是没有高太懂,后来通过前人的工作才逐渐弄懂
  • 对于理想流水线,主要难点在于寄存器的设计,各个接口需要对齐,还需要很多接口,搞得人心态崩溃,非常考验耐心