32位cpu设计报告.docx
《32位cpu设计报告.docx》由会员分享,可在线阅读,更多相关《32位cpu设计报告.docx(10页珍藏版)》请在冰豆网上搜索。
![32位cpu设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/11/c77be4a7-0853-40e3-a84c-17ead627db37/c77be4a7-0853-40e3-a84c-17ead627db371.gif)
32位cpu设计报告
CPU
设
计
报
告
姓名:
学号:
学院:
信息科学与工程学院
指导老师:
2013-01-12
一、设计目的
(1)学习设计CPU的基本步骤和方法,提高应用集成电路的基本技能,培养和提高独立设计计算机的工作能力。
(2)熟悉32位CPU各模块的工作原理,熟悉流水线数据通路和控制单元的工作原理从而熟悉CPU的工作机理。
(3)熟练地使用Quartus软件,做一些中等难度的课题,增加自己的一些实践经验,熟练VHDL编程。
(4)强化自身的系统设计能力,了解系统设计中的一般步骤。
了解VHDL仿真和综合工具的潜力。
二、实验方法
实验要完成的工作主要包括:
指令系统的设计,FPGA-CPU的整体结构设计及其细化,逻辑设计的具体实现(VHDL语言编写),软件模拟,以及硬件调试。
这几部分的工作之间是先行后续的关系,也就是只有前一个步骤完成了下一个步骤才可以开始进行,不存在并行完成的情况。
实验主要流程如下图所示:
三、数据格式
数据字长是32位,采用32位二进制有符号补码表示。
四、寻址方式
RSCI的四种寻址模式分别是寄存器寻址,存器间接寻址,立即寻址,相对寻址。
这些寻址模式都是由操作码而不是单独的模式字段指定的。
因此,对于某种给定操作来说,它的寻址模式是固定的,不能变动。
三操作数数据处理指令采用寄存器寻址模式。
寄存器间接寻址仅仅用于load和store这两个唯一能够访问数据存储器的指令。
采用两寄存器格式的指令使用一个立即数取代寄存器地址SB。
相对寻址专门用于分支和跳转指令,其产生的地址只用于指令存储器。
五、数据通路结构
下图中的流水线数据通路是我们即将设计的数据通路的基础,我们只需要做一些改进。
这些改进涉及寄存器文件、功能单元和总线结构。
数据通路中有32个32位寄存器。
同样,读寄存器R0将得到常数0。
如果试图写R0,则所写的数据会丢失。
所有的数据输入输出都是32位。
为了满足对32个寄存器寻址的要求,所有的地址输入都是5位的。
R0中固定为0的值将R0的各个存储元件的输入设为开路,并使其输出全为常数0来实现。
数据通路的寄存器文件采用锁存器来实现,且在时钟上升沿之前就完成写入操作。
我们采用特殊的时钟信号允许寄存器文件能够在时钟周期的前半拍写入,在后半拍读出。
特别地,我们可以再时钟周期的后半拍读出在同一时钟周期的前半拍写入到寄存器文件中的数据,这就是写后读(read-after-write)寄存器文件,它既避免了处理阻塞时额外逻辑的复杂性,又能够降低寄存器文件的成本。
六、控制结构
多路复用器MUXC从三个不同的源地址中为PC选择下一个值,计算机根据更新后的PC值按顺序执行某段程序。
分支目标地址BrA由分支指令的新PC值加上经过符号扩展的目标偏移量得到,R[AA]的值用于寄存器跳转,这些值的选择由BS字段控制。
如果BS0=0,那么BS1=0时选择更新后的PC的值,BS1=1时选择R[AA]。
如果BS0=1且BS1=1,那么将无条件地选择BrA。
如果BS0=1且BS1=0,那么PS=0且Z=1时分支转移到BrA,PS=1且Z=0时也分支转移到BrA。
这样就实现了两种分支指令BZ和BNZ。
为了使分支和跳转指令到达执行段时能获得新的PC值,我们增加了两个流水线寄存器PC-1和PC-2。
控制单元的核心是指令寄存器,它是一个组合电路,能够将IR中的操作码转化为数据通路和控制单元所需的控制信号。
下表,每条指令都列出了相应的助记符、寄存器传输表达式和操作码。
七、总体设计的说明
1、试探法的设计思想
至今还没有找到设计数据通路的恰当的数学方法,这是因为整个计算机系统的硬件组成是一个相当复杂的系统。
因此设计时主要还是依据设计者的经验,按照指令系统的要求,以及参考现有机器数据通路,采用试探法完成的。
试探法的主要步骤如下:
(1)首先对定义的指令系统中的各条指令进行分析,得出所需要的操作序列,已决定各部件的类型和数量。
(2)使用第一步所选用的部件,构成一个总体框图进行各部分之间的互相连接,即初步确定数据通路,使得由指令系统所泛函的数据通路均能实现,并尽可能降低成本。
(3)分析全部操作序列的框图,确定所需的控制点和控制信号。
(4)检查所设计的线路,尽可能地删去重复的部分,简化线路。
2、设计步骤
CPU本身是一个极其复杂的数字系统,设计整体由12个基本模块构成:
分别是时钟发生器(clock)、算术逻辑单元(ALU)、通用寄存器(GeneralRegister)、状态控制单元(ControlUnit)、寄存器(Register)、指令寄存器(InstuctionRegister)、程序计数器(ProgrammCounter)、RAM、ROM、移位寄存器(Shifter)、三态寄存器(Trireg)。
系统采用自顶向下的方法进行设计。
顶层设计由微处理器和存储器通过一组双向数据总线连接,它们由一组地址总线和一些控制总线组成。
处理器从外处理器中读取指令,并通过执行这些指令来运行程序。
这些指令储存在指令寄存器中,并由控制单元译码,控制单元使得相应的信号相互作用,并使处理单元执行这些指令。
3、各模块设计
(1)顶层模块:
顶层模块的功能是对CPU各部分通过例话语句进行连接,使所有模块形成一个整体系统,通过各模块协同作用实现CPU功能。
CLK:
为输入时钟脉冲;
RESET:
为复位键;
Start:
遇到halt指令后,需要按一下此键让测试程序继续运行;
INSTIN[31..0]:
从地址寄存器中输入数据;
MEMDATAIN[31..0]:
从数据寄存器中输入数据;
wrData[31..0]:
将数据写入数据寄存器;
wrEN:
写使能端;
BUSD[31..0]:
总线上的数据输出;
(2)数据寄存器ROM
数据寄存器,包含32个32位的寄存器组,R0-R31,其中R0是一个特殊的寄存器。
它们用来暂时存放计算过程中所用到的操作数、结果和信息。
数据寄存器是存放操作数、运算结果和运算的中间结果,以减少访问存储器的次数,或者存放从存储器读取的数据以及写入存储器的数据的寄存器。
(3)地址寄存器RAM
地址寄存器用来保存当前CPU所访问的内存单元的地址。
由于在内存和CPU之间存在着操作速度上的差别,所以必须使用地址寄存器来保持地址信息,直到内存的读/写操作完成为止。
(4)指令译码器
指令译码器是控制器中的主要部件之一。
计算机能且只能执行"指令"。
指令由操作码和操作数组成。
操作码表示要执行的操作性质,即执行什么操作,或做什么;操作数是操作码执行时的操作对象,即对什么数进行操作。
计算机执行一条指定的指令时,必须首先分析这条指令的操作码是什么,以决定操作的性质和方法,然后才能控制计算机其他各部件协同完成指令表达的功能。
这个分析工作由译码器来完成。
(6)指令计数器PC
指令计数器用于提供指令地址,以便读取指令,一共有三个,分别在不同阶段保存指令地址。
(7)下一指令地址
用于保存当前指令的下一条将要执行的指令的地址。
(8)指令寄存器IR
指令寄存器用于存储指令,当reset信号有效时,指令寄存器被清零;然后在clock的上升沿触发下,将数据总线送来的指令存入到寄存器中去。
但并非每个上升沿寄存器都来自数据总线的数据,这由来自状态控制器的load_ir信号决定。
这时因为数据总线上有时传输指令,有时传输数据。
只有当指令寄存器的使能端有效时,才可以进行存储数据操作。
(9)算术逻辑运算单元ALU
算术逻辑运算单元根据输入的操作控制码分别实现相应的加、减、与、赋值等基本操作运算。
利用这几种基本运算可以实现很多种其它运算以及逻辑判断等操作。
八、CPU仿真与测试
在对各个模块的组建完成之后,首先对此设计的32位CPU进行了时序仿真测试,以便了解经过计算机编译和综合以后的电路结构和设计是否满足设计要求。
时序仿真测试通过之后将其进行硬件测试,本实验采用的芯片是EPF10K20TC144-4,配置好端口后进行下载测试,所有的测试程序都是通过ROM写入的,利用这一模块进行测试。
为了验证设计的正确性,本实验做了一个查找在一组输入数据中大于某个特定数值的数的个数的测试,测试指令如下:
010*********
010*********
010*********
010*********
00100000010100001000000000000000
00100000011000010000000000000000
00010100011100101001100000000000
00001010100000101001100000000000
010*********
010*********
仿真的波形图如下:
其中BUSD为总线输出结果,经验证结果正确。
九、实验心得
这次设计完全是按照老师的设计要求进行了一个32位CPU的设计,从对CPU具体原理和机构都知之甚少,到一步步的了解,然后学习VHDL语言进行设计,整个过程中都获益匪浅。
不仅知道了整个CPU各个模块之间是如何配合进行工作,也了解了其数据处理的环节。
通过测试,其实现了所要求的27条指令的大部分功能。
虽然只是一个简单的32位CPU,但对于一个本来对其了解甚少的我来说,确实是一个相当艰巨的任务,但整个过程的收获不仅仅是了解了计算机的一个部件,也不仅仅是了解了一门语言,更重要的是学会了一种思考方式,这也是本学期的最大收获!
感谢跟我一起讨论题目研究学习的同学们,感谢邝老师对我们的严格要求。