基于fpga的微处理器设计毕业设计(论文)(编辑修改稿)内容摘要:

度,其中操作码占用 16 位指令字的高 4 位。 所有的指令码都很容易译码。 对两个寄存器的指令, d 选择目的寄存器, :r 选择源寄存器, 4 位可以寻址 16 个寄存器,这种指令格式包括 ADD, SUB, AND, OR。 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 r r r r d d d d 对于仅需要一个寄存器的指令, d 用来寻址目标寄存器。 这种指令格式包括 LD, LSL, LSR 指令。 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 d d d d 对于立即数指令 ,指令中间 8 位是 8 位常数,其中 H 代表常数的高四位,L 代表常数 的低四位, d 用来寻址目的寄存器。 这种指令格式包括 MOV, SD。 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 L L L L H H H H d d d d 指令编码 确定了指令的格式,就可以对指令进行编码,这样指令就有唯一的身份识别。 指令编码结果如表 2 所示。 表 2 指令编码 指令类型 指令机器码 ADD 0001 0000 r r r r d d d d SUB 0010 0000 r r r r d d d d AND 0011 0000 r r r r d d d d OR 0100 0000 r r r r d d d d LSL 0101 0000 0000 d d d d LSR 0110 0000 0000 d d d d MOV 0111 LLLL HHHH d d d d ST 1000 0000 0000 d d d d LD 1001 0000 0000 d d d d SLEEP 1011 0000 0000 0000 山东大学威海分校毕业设计(论文) 8 指令时序分析 RISC 与流水线 指令的执行分成两个阶段:取指阶段和执行阶段。 在取指阶段,指令机器码被取到指令寄存器,控制单元通过译码知道这是个什么样的指令,需要执行什 么样的操作,需要什么操作数;在执行阶段当前指令以及 取指完毕, 上一条 指令被执行。 这样按顺序第 1 条指令执行完再取第 2 条指令,第 2 条执行完在取第 3条指令的顺序执行方式执行一条指令最少需要两个时钟周期,如果执行 10 条指令那么就得需要 10 个时钟周期,显然这样指令的执行效率不高。 为了解决这个问题,本次设计中引入了流水线 (pipeline)操作。 8 位 CPU 采用两级流水 线 技术,指 令的流水线可以用图 24 来简单的示意: 图 24 流水线指令执行 由图可以看出,尽管每条指令的完成需要两个周期的时间,但是在流水线结构中,当前指令的取值周期和上一条指令的执行周期在时间上是重叠的,对于这种并行操作,从平均角度来看,相当于一个周期内完成一条指令,因此可以大大提高指令的运行速度 [15]。 RISC架构的处理器,每条指令有固定的长度,指令格式只有简单的几种,指令功能不交叉,寻址方式也简单,所以更加有利于实现流水结构。 为了降低执行每条指令所需时钟数,本文也采用两级流水,其功能分别定义为:第一级 ,取指;第二级,时钟前半周期控制器译码、发出控制信号,时钟后半周期进行对寄存器堆 TRAM进行读操作、 ALU计算。 这样,很显然也能降低执行指令所需的时钟数,取指、执行只用了一个时钟。 在时钟上升沿 PC产生进入PCRAM的地址,由于 PCRAM 有反应时间,经过一段很短的时间读出指令,在下一个时钟上升沿到来时,指令寄存器锁存指令,然后开始对指令进行译码,并产生操作数、目的存储器/寄存器地址、写信号及各种控制信号。 程序计数器与流水线 程序计数器( PC)是程序中寻址取得指令的特殊单元。 正是靠 PC的移动,CPU才能一条一条的执行指令。 同时,程序计数器也是和流水线密切相关的单元。 在程序开始执行前, CPU将它的起始地址送入 PC,当指令执行时, CPU 将自动修改 PC 的内容,所以 PC中的内容总是下一条指令的地址。 由于指令通常是顺序执行的,所以修改的过程通常只是简单的 PC加 1。 表 2说明了在引入流水线后 PC的具体工作情况: 山东大学威海分校毕业设计(论文) 9 表 3 指令执行中 PC 值的变化情况 时钟周期 Reset 周期 1 周期 2 周期 3 周期 4 PC 0 1 2 3 4 第一条指令 读取指令 0 执行指令 0 第二条指令 读取指令 1 执行指令 1 第三条指令 读取指令 2 执行指令 2 表 3 表明,在系统复位时, PC 内的值清 0,第一个时钟周期,指令寄存器取 PC 为 0 的地址的指令,同时 PC 的值加 1;第二个时钟周期,执行 0 地址的指令,同时读取地址 1 的指令,同时 PC 的值加 1;第三个时钟周期,重复这样的过程。 这样可以得到结论:如果当前 CPU 正在执行的是第 N 条指令,那么指令寄存器正在读取的是 N+1 条指令,此时 PC 的值应该是 N+2。 CPU 整体结构即设计思想 在设计 CPU 之前整个结构的特性及由哪些模块组成,这些模块之间的 互连关系以及整个 CPU 的最后输出信号等都是要事先定义好的 .。 CPU 的外部引脚规划 从 CPU 外部看整个输入输出如图 25 图 25 CPU 外部引脚信号 该 CPU 有 5 个输入引脚, 1 个结果输出端口以及一个运算溢出信号。 系统的时钟信号将直接驱动驱动整个 CPU。 WR 信号是系统的异步指令输入信号,高电平有效。 当 WR 信号有效时,整个 CPU 进入指令输入状态,当 WR 低 电平时CPU 进入指令读取并完成指令操作的状态,当 CPU 完成全部输入指令时进入停机状态,此时 Start 信号重新启动 CPU,使其进入等待状态。 山东大学威海分校毕业设计(论文) 10 CPU 的整体框图 系统的顶层结构模块图如图 26 图 26 系统的顶层结构模块图 该模块包含了系统的主要模块及它们之间的连接关系。 图中的一个一个的模块代表了各个功能模块,将在下面的章节中分别做详细的设计说明。 每个模块都将按照 EDA设计中自下而上的设计原则分别独立设计。 有些模块是比较简单的像指令寄存器 (IR),有些模块则是比较难的像 ALU模块和控制单元模块。 在设计微处理器的功能模块之前,需要决定如何逻辑实现和处理器锁存数据。 微处理器中有两种不同的逻辑元件: ( 1) ALU、 MUX、 CONCROL单元的元件都是组合逻辑电路。 它们的输出仅仅依赖于当前的输入状态,没有内部存储功能; ( 2) 寄存器堆、临时寄存器都是状态单元,它的输出不仅依赖于输入,还有其自身内部的状态。 时钟用来决定状态何时被写入,一个状态可以在任意时刻读取。 微处理器的时钟采用边沿触发的方式,整个系统采用单时钟电路,即提供一个系统时钟,每当时钟边沿到来的时候,向状态单元写入数据。 整个系统可以分为两个单元 :取指单元,执行单元。 取指单元负责取下条指令,执行单元负责执行当前指令。 取指单元和执行单元共同构成了 CPU 的微控制单元。 取指单元的第一个模 块是程序计数器 (PC), PC 中是下条要执行的指令的地址,它是指向程序存储器单元 (PROM)来寻址指令的。 控制模块是对从指令寄存器 (IR)送出指令进行译码从而发出适当的控制信号执行程序的。 系统中包括了很多寄存器的设计包括指令寄存器 (IR),程序计数器 (PC),这些寄存器大都在我们顶层可见的模块的内部,系统的工作也可以看作就是数据在这些寄存器之间的“迁移”,也即寄存器内容的迁移。 微处理器的功能就是体山东大学威海分校毕业设计(论文) 11 现在这些这些数据是如何传递的,在传递前的处理是如何处理的,所有这一系列寄存器数据之间的迁移转换就组成了微处理器。 CPU 结构的层次划分 正确合理的划分系统是所有数字系统设计成功的关键。 子系统的划分过程就是把总体任务划分程若干分任务的过程。 本设计将 CPU 分解为两大子系统:数据通路和控制通路。 这种划分将 CPU 的运算、执行单元与控制部件分离开,是非常合理、自然的。 数据通路和控制通路这两大部分又可以细化为更小的模块,ALU 模块(算术逻辑单元)、 PC_RAM 模块(程序存储器)和 IR(指令寄存器)、TRAM(寄存器堆)属于数据通路部分 , ALU 内部又包含更小的模块(加、减、与、或、移位模块);控制模块属于控制通路部分, 其中控制模块又由 FSM(状态机)和 CONTROL( 控制器)构成。 具体的模块功能实现将在下面两章中详细介绍。 山东大学威海分校毕业设计(论文) 12 第三章 CPU 数据通路设计 从这一章开始将详细介绍整 个 CPU 的 细化设计模块。 通过上一章对 CPU 的结构划分,已 经知道 CPU 的整个设计分为两个部分:数据通路和控制单元。 在这一章中将细分数据通路模块,数据通路是 CPU 中 的执行部件,数据传输、存储、处理都是在数据通路中完成的。 在整个 CPU 的结构框图中,除了控制单元部分,其余部分都是数据通路部分,包括程序计 数器 PC、程序存储器 PC_RAM、指令寄存器 IR、寄存器堆 TRAM、数据选择器 ALUMUX 和算术与逻辑单元 ALU。 设计数据通路,有两种不同的设计方案。 第一种是在所有需要传送数据的部件创建一条直接通路,采用多路选择器或者缓冲器为那些有多个数据源的寄存器从多个可能的输入中选择一个,这种方案适用于规模比较小的微处理器设计。 另一种方案是在微处理器内部创建一条总线,并且在各个部件之间使用总线传数据。 本设计采用的是第一种方案的设计方法。 下面将一一介绍数据通路的各个模块功能及其实现。 程序计数器模块 PC 程序计 数器 (PC)作为指向指令地址“指针”,决定着下一条要执行的指令。 正是有了 PC 的移动和变化, CPU 才能按一定的顺序或预想的情况进行指令的执行。 程序计数器 PC 中存放指令存储器的地址,当一条指令被执行时,程序计数器存放下一条指令的地址。 在正常工作的条件下,控制信号选择 PC+1 作为下一个 PC 的值输出;当执行 JMP 指令时,选择来自指令中的跳转地址决定新的 PC值,但是在本次设计中没有涉及到。 图 31 PC 模块外部接口信号 图 31 所示是从外部看的 PC 模块的接口。 其中输出的 PC 是 8BitS 宽的,因此 PC 模块可以寻 址独立的 256 个单元。 PC_OUT 地址输出信号是直接与程序存储器 PCRAM 相连的。 PC_INC 控制信号来自控制单元,若 PC_INC 有效则 PC将执行加 1 操作。 EN 信号是程序计数器 PC 的使能控制信号,只有当该信号有效时 PC 的相应才能操作才能执行。 山东大学威海分校毕业设计(论文) 13 程序存储器 PC_RAM 程序存储器是存储微处理器程序,即能执行特定功能的一组指令组合。 图32 显示了程序存储器的结构图。 图 32 程序存储器示意图 在设计程序存储器模块时,本文是自行设计寄存器堆型的存储器,直接使用一个数组存放二进制数据,通过 VHDL 编写一个一定长度的数组实现。 因为程序计数器可以寻址到 256条指令,所以程序存储器也必需可以至少存放 128 条 16 位的指令 ,这样只需申请一个变量 Ram,有 256个元素 ,每个元素 16 位即可。 第一个数组元素下标表示存贮器的 0 号地址,第二个数组元素下标表示 1 号地址 ,以此类推至第 256个数组元素的下标 ,即 11111111 号存贮器地址。 程序存储器是一个可读可写的模块,其输入端口接入外围程序和地址输入端口,由 WR 异步控制其读写状态, WR 高电平有效。 当 WR 有效时,程序存储器为写状态,即将输入程序 存入其输入地址对应的存储单元中 , 即执行操作 ram(conv_integer(waddr)) = wdata;当 WR 为低电平时,程序存储器处于读状态,其将程序计数器输出地址 PC_OUT上 对应的存储单元中的指令输出,即执行操作 instruction = ram(conv_integer(pc_in))。 这样就可以通过存贮器数组元素和输入地址间的相互赋值实现“读存储器”,“写存储器”,既简单又容易实现。 图 33 程序存储器外部接口信号 程序存储器模块的外部接口信号如图 33 所示,其中读状态地址 来自 PC 模块,输出指令直接送往指令寄存器模块,写状态地址来自 CPU 输入地址,写入指令存储到对应地址单元中。 山东大学威海分校毕业设计(论文) 14 指令寄存器模块 指令寄存器在时钟上升沿锁入从程序存储器 PC_RAM中读取的指令,并保持到时钟的下一个上升沿,一条指令的执行从指令寄存器锁入指令开始。 所以指令寄存器的作用是暂时存放取到的指。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。