电子信息工程基于FPGA的MIPS指令设计与实现.docx
《电子信息工程基于FPGA的MIPS指令设计与实现.docx》由会员分享,可在线阅读,更多相关《电子信息工程基于FPGA的MIPS指令设计与实现.docx(34页珍藏版)》请在冰点文库上搜索。
![电子信息工程基于FPGA的MIPS指令设计与实现.docx](https://file1.bingdoc.com/fileroot1/2023-5/24/09988919-56be-4787-9402-a8c2dc558427/09988919-56be-4787-9402-a8c2dc5584271.gif)
电子信息工程基于FPGA的MIPS指令设计与实现
基于FPGA的MIPS指令设计与实现
摘要
本文将设计一个具有MIPS体系结构的五级流水线32位CPU,并包含MIPS指令集, 流水线的结构将分为五个部分:
指令、解码、执行、反写和存储。
并尽可能对数据冲突、控制冲突和结构冲突提出合理的解决方案,实现MIPS指令集中的部分指令。
本次设计将使用verilog-HDL(硬件描述语言),该语言用于每个模块实现,简单提出并解决流水线中出现的一些有关数据的阻塞问题,并使用ModelSim进行分析仿真和验证以完成CPU的设计。
关键词:
流水线MIPSCPUverilog-HDL指令集ModelSim
ABSTRACT
Inthispaper,wewilldesignafivelevelpipelined32-bitCPUwithMIPSarchitecture,whichcontainsMIPSinstructionset.Thepipelinedarchitecturewillbedividedintofiveparts:
instruction,decoding,execution,writebackandstorage.Atthesametime,wetrytoputforwardreasonablesolutionstodataconflicts,controlconflictsandstructureconflicts.ImplementsomeinstructionsinMIPSinstructionset.
Thisdesignwilluseverilog-HDL(hardwaredescriptionlanguage),whichisusedtoimplementeachmodule,simplyputforwardandsolvesomedatablockingproblemsinthepipeline,anduseModelsimtoanalyze,simulateandverifytocompletetheCPUdesign.
Keywords:
AssemblylineMIPSverilog-HDLModelSimInstructionset
第一章绪论
1.1课题研究背景和意义
CPU是中央进行处理工作单元CENTRAL PROCESSING UNIT的缩写,是一个信息系统的核心,就如同人的大脑,能够时时刻刻对信息进行处理,并且控制每个外围模块的工作。
如今电子设备早已深入到每个人的生活中,而这些电子设备离不开CPU的管理和控制。
自世界上第一台计算机出现,陆续通过计算机电子管,晶体管,集成电路,大规模集成电路四个时代。
直至今天,计算机的无论是性能还是性价比方面日渐上升,市面上的电子产品无一离不开计算机的发展。
而CPU作为各类电子产品以及计算机的核心,其性能是衡量各类电子产品以及计算机的性能好坏的标准之一。
如今的CPU技术广泛地应用了并行执行指令的技术,广泛地取代了以往低效率的串行执行指令的CPU技术,流水线技术和超标量技术就是并行执行指令的体现,分别是CPU在执行工作指令的时候,在时间上和空间上实现了并行指令。
MIPS( millions instsper second):
:
单位秒执行百万指令的缩写,精简指令集计算机是20世纪80年代提出的一种结构精简指令集,RISC处理器和“锁处理器内部没有水的水平”,是用软件编程尽可能解决一些相关的流水线数据的处理问题的方法。
如今的各式各样的电子产品中,都看得到许许多多的具有MIPS体系进行结构的CPU。
中国对于CPU的研发相对于国外,开始研发晚于国外一些国家。
如今在国内有那么一群专门研究CPU技术的公司及实验室,如“龙芯”等由我国自主研发的CPU日渐出现在了国内的一些电子产品中,但相比与国外的CPU研制水平还有很大的差距。
在信息化时代的今天,信息化不断飞速发展,如我国不能加大对于CPU技术的研发,过于传统落后CPU技术的先进文化水平,那么我们国家的众多行业甚至国家政府部门等的信息安全问题会面临威胁,更有可能国家的信息安全受到威胁。
本文设计的CPU结构具有MIPS CPU架构,包含34条指令,优势在于指令简洁方便编程调试,在许多的需要工业控制、娱乐控制等场所中均可使用,并拥有很大的指令调整优化的空间,具有很大的发展前景。
1.2国内外发展现状与趋势
早在1971年,英特尔就开发了4004微处理器。
Intel公司便处于世界通用CPU的主导地位,从上个世纪CPU的发展历史来看,几乎全都是Intel公司的产品的发展历程:
1978年Intel推出8086处理器、1985年推出80386、1993年推出Penitium系列的CPU等等。
时至今日,Intel公司仍然不断推出一代比一代优质的产品,市场上的台式计算机和笔记本电脑几乎都被其产品所占据。
该公司生产的英特尔处理器,它们的 cpu 架构都是复杂指令集系统计算机 cisc (复杂指令集计算机) ,复杂的指令体系主要体现于指令的多样复杂,以及长度不一,因此其复杂性完全不能用于需要精简编程的嵌入式设计系统。
为了解决这一问题,在上个世纪80年代,MIPS公司问世,并提出了RISC的理念,其固定的指令长度,和加载/存储架构大大提高了指令的执行效率,在这发展之后R嵌入式系统处理器的设计都主要研究采用RISC结构。
相比国外早早的就开始了CPU的研发,我国开始研发CPU的时间就比较晚,但至今有着很大的成果且发展迅速,日渐减小与世界先进CPU技术的先进水平。
我国的CPU研发成就巨大,其中“龙芯”就是最典型的代表之一。
从2001年至今,我国陆陆续续不断地研发出一款又一款的通用设计高性能CPU,2001年至2009年,中科院先后研发出龙芯一号、龙芯二号、龙芯2F/2G、龙芯3等优质芯片。
之后中国“龙芯”为了进一步扩大市场,购买了MIPS的结构授权。
如今我国的各行各业的各个领域中,都能看见“龙芯”的身影,相信在今后的不断深入研究,我国的CPU技术将不断赶上世界先进CPU技术水平甚至超越。
1.3论文研究内容和目标
本论文将会完成具有MIPS体系结构的CPU设计,实现MIPS指令以及流水线等的设计与分析,其中实现最典型的5级流水线,实现部分指令,提出并解决流水线中出现的一些有关数据冲突导致阻塞的问题。
在MedelSim上验证并分析,通过编写TestBench文件在MedelSim上执行所生成的仿真过程图,加以分析,得出结论,验证结果。
第二章MIPS指令系统
本章将对于MIPS指令进行简单的概述并分析,介绍MIPS指令应该具备什么特征,以及MIPS指令集有哪些指令。
2.1指令应具备的性能
一个CPU功能取决于怎么样的指令,良好的性能也离不开成熟的指令。
CPU能够在多少时间实现什么功能就是由其指令系统决定的,而一个成熟的指令系统不能缺少以下性能:
(1)完备性:
不应在指令系统的前提下由软件来实现对应功能,具体体现于指令足以满足汇编编程。
(2)规整性:
指令系统中的指令需要有一定的对称,指令的格式以及数据的格式需要一致。
(3)高效性:
要求指令能高效的高效执行、占据少量的存储空间。
(4)兼容性:
各个计算机可通用由该指令系统编写的程序。
MIPS32就是具有以上性能的流行指令集,因其成熟性以及优秀的性能而被我国龙芯采用。
本文设计的CPU基于MIPS指令系统,实现其中的部分算术运算指令和逻辑运算指令组成简单的精简MIPS指令集。
2.1.1MIPS指令的类型和格式
Mips 指令集可分为三种主要指令:
:
R类型、J类型、I类型,如图2.1。
图2.1MIPS指令格式
rs、rt、rd为32位的通用数据寄存器,sa位位移指令中的位移数,func为扩展指令码、imm为16位立即数、addr为26位的地址。
R类型 FUNC的不同用于每个指令的指令不同的功能之间进行区分,其中大多数指令的rs、rt寄存器用于存放源操作数,两个操作数进行计算之后,将结果存入rd寄存器。
sa用于存放移位位数。
J类型的指令的opcode位位于前6位,用于存放操作码;后26位用于存放转移的目标地址。
I类型的指令的后面的16位数值为立即数,opcode为前6位,用于存放操作数。
按照不同的功能,将31条指令划分为具有以下几个不同类型:
(1)逻辑运算类:
逻辑运算类的指令:
xori、or、ori、and和and指令;对源操作数进行(与、或、非)逻辑运算。
(2)算术运算类:
算术运算类的指令:
addi、add、sub;其功能为基本的整数加减运算,实现运算整数类的源操作数。
(3)数据传送类:
对于整数数据类型进行取存的指令有lw、sw;对于浮点型数据类型进行取存的指令有:
sw.f、lw.f。
(4)位移操作类:
位移操作的指令有:
sra、srl、sll;其功能是对源操作数进行逻辑位移、运算位移。
(5)浮点运算类:
指令有:
mul.f、sub.f、add、f;对源操作数进行浮点运算。
(6)转移类:
转移类的指令有:
jal、jr、j、bne、beq;两种转移类指令:
无条件的和有条件的分支类型传输类型。
(7)其他类:
进行系统控制等;指令有:
syscall、eret、tlbwi、tlbwr、mtc0、mfc0、lui。
第三章MIPS流水线设计
MIPS指令集的流水线是5级流水线,5级体现于:
回写(WB)、存储(MEM)、执行(EXE)、译码(IF)、取指(ID),而本次设计就是使用这样字流水线结构,流水线通过这种细分,以确保完成在一个时钟周期内每个级别,以及使多数的指令不需要历经MEM,确保了不会出现两条或两条以上的指令同一个时间要访问MEM的这种复杂的情况发生,如图2.2所示。
图2.2具有MIPS结构的5级流水线
最终可以实现OpenMIPS(开源的MIPS五级流水线),如图2.2.1。
图2.2.1OpenMIPS五级流水线结构图
3.1取值阶段
取值阶段是从指令寄存器取出指令,通过具有加法器PC模块的功能,使PC寄存器的值不断地递减,同时为下一条指令的取指做好对应需要完成准备。
其中包含了PC、IF_ID两个模块。
3.1.1PC模块
PC模块是为指令寄存器提供即将取出的地址。
当指令寄存器启用时,每个时钟周期连续增加4个PC寄存器的值,以给出下一个要执行的指令,指令寄存器取出的指令所在的地址。
其接口图3.1.1所示。
图3.1.1PC模块接口
实施方法载于图3.1.1-1。
图3.1.1.1-1
PC寄存器会进行以下的操作:
先判断芯片是否使能,如果使能了,在每次时钟上升沿加4,指向下一条指令的地址,给译码阶段提供指令的地址;若没有使能,则PC寄存器的值初始化。
同样的,还需判断复位信号有没有被触发,如果没有被触发,该模块正常执行工作;若被触发,则将PC寄存器中的值进行初始化。
3.1.2IF_ID模块
IF_ID模块的功能进行保存自己从前从指令控制寄存器中取得的指令,和该指令所在的地址,在下一步一个工作时钟周期时把该地址信息提供给译码阶段。
当有复位信号时,将PC寄存器的值初始化,否则进行地址的传递。
其接口图3.1.2所示。
图3.1.2
图3.1.2-1
该模块的作用是在时钟的上升沿时,将取指阶段的PC寄存器所指向的指令的地址,传递到译码阶段,如果复位信号有效,则PC寄存器的指向初始化的地址的值。
3.2译码阶段
将从上一个取指令的阶段中,获得指令,并判断指令的类型,指令执行需要进行什么类型的运算或操作。
其中包含了Regflie、ID_EX、ID三个模块。
3.2.1Regflie模块
REGFILE模块寄存器文件,的主要实现读取两个寄存器,寄存器写操作。
其接口图3.2.1所示。
图3.2.1Regflie模块接口
其中具有3个操作:
(1)复位信号无效且写接口有使能信号以及写操作的目的寄存器的值不为0时,则把写操作的输入端口的数据保存至目的寄存器。
(2)当已经实现了第一个读寄存器的端口的时候,将依次判断几种情况:
复位进行有效,第一个读寄存器的输出一个端口的值始终为0;当复位信号无效时,如果读取到的值为0,则输出也为0;第一个要读取的寄存器和要写的寄存器是相同的寄存器的时候,将要写的值当作中国第一个要读取的寄存器的端口可以作为输出的端口;若是我们都不能够满足通过以上的情况,那么就输出我国第一个要读的寄存器的地址以及对应的值;若是实现第一个读端口之间没有进行使能,则输出0。
(3)和
(2)的操作类似,对第二个读寄存器的端口进行操作。
其具体实现方法如图3.2.1-1所示。
图3.2.1-1
3.2.2ID模块
ID模块解码模块,所述指令以获得各种信息进行解码:
子类型,该源操作数,操作的类型,所述地址将被写入到目的寄存器等。
其接口图3.2.2-1和图3.2.2-2所示。
图3.2.2-1ID模块接口
图3.2.2-2ID模块的接口
其中有3大操作:
(1)判断指令的类型。
(2)给执行阶段提供一个即将执行操作的第一个操作数的值,且在下一个时钟周期开始时提供。
(3)给执行阶段提供一个即将执行操作的第二个操作数的值,且在下一个时钟周期开始时提供。
3.2.3ID_EX模块
该模块主要是用于传递数据,在下一个时钟周期,将ID模块中的数据传递到EX模块。
其接口图3.2.3所示。
图3.2.3ID_EX模块接口
具体实现方法如图3.2.3-1.
图3.2.3-1
3.3执行阶段
此阶段会依据从译码阶段可以得到的各个通过译码所得到的结果,依据得到的结果对于两个操作数进行对应的运算操作,并将结果送至访存的阶段。
其中包含了EX、EX_MEM、MEM三个模块。
3.3.1EX模块
EX模块会依据ID_EX模块传递传递过来的数据进行判断数据类型,以及依据数据类型进行计算,其接口如图3.3.1所示。
图3.3.1EX模块接口
其操作分为两部分:
(1)首先确定要被执行运算操作的操作的类型。
(2)运算出结果,判断是否要写入要写入的目的寄存器。
3.3.2EX_MEM模块
在下进行一个系统时钟工作周期,将EX模块的运算分析结果,传递至MEM模块则传递至流水线的访存阶段,其接口如图3.3.2所示。
图3.3.2EX_MEM模块接口
3.4访存阶段
3.4.1MEM模块
该模块为组合逻辑电路,直接将输入作为输入结果,如果复位有效则输出初始化。
其接口如图3.4.1。
图3.4.1
MEM模块接口
3.4.2MEM/WB模块
该模块是在下一个时钟周期将内存访问阶段获得的数据传递给写回阶段。
其接口如图3.4.2。
图3.2.4MEM/WB模块接口
其具体实现方法为:
在时钟处于上升沿的时候进行判断复位信号,如果无效,则将数据传递至回写阶段,否则数据初始化。
3.5回写阶段
回写阶段主要在Regfile模块中实现,数据的获取阶段写回,写回解码阶段。
再部分阶段实现数据的回写。
3.6流水线的实现并验证
3.6.1TOP顶层模块建立
上述已经完成了流水线各个模块,现在建立TOP顶层模块,将上述的各个模块连接建立成流水线,TOP模块的接口如下:
图3.6.1TOP模块接口
将各个模块例化如下:
图3.6.1-1MIPS_TOP模块
建立了MIPS_TOP模块的接口及流水线的接口,用于和指令寄存器连接,相互之间的连接,构成流水线,如图3.6.1-1。
(1)
PC模块例化
(2) 图3.6.1-2PC模块例化
pc寄存例化后,pc寄存器的的值一直传递,给指令寄存器提供指令的地址。
如图3.6.1-2。
(3)IF_ID模块例化,如图图3.6.1-3。
图3.6.1-3IF_ID模块例化
(4)ID模块例化,如图3.6.1-4。
图3.6.1-4ID模块例化
(5)Regflie模块例化,如图3.6.1-5。
图3.6.1-5Regflie模块例化
(6)
ID_IE模块例化,如图3.6.1-6。
图3.6.1-6ID_IE模块例化
(7)EX模块例化,如图3.6.1-7。
图3.6.1-7EX模块例化
(8)MEM模块例化,如图3.6.1-8。
图3.6.1-8MEM模块例化
(9)MEM_WB模块例化,如图3.6.1-9。
图3.6.1-9MEM_WB模块例化
通过例化,实现了简陋单周期的五级流水线途径,但仍然不能进行流水线的验证,仍需要进行一个重要提供指令的指令寄存器提供指令,然后通过编写测试文件进行仿真,观察指令所涉及的寄存器的值,才能验证自己设计的流水线。
3.6.2指令存储器ROM的实现
指令寄存器的的接口如图3.6.2-1、图3.6.2-2。
图3.6.2-1指令寄存器模块
图3.6.2-2指令寄存去接口
其具体实现方法如图3.6.2-3。
图3.6.2-3
指令寄存器的作用是如果芯片使能有效,向流水线提供指令;提供的指令为流水线的取值阶段的pc寄存器的值所指向的地址的指令;如果芯片使能无效的话,不向流水线的取值阶段提供指令。
3.6.3SOPC的实现
为了方便验证五级流水线的实现,建立了一个SOPC模块,其中包含了MIPS_TOP模块和ROM指令寄存器。
其实现方法如下:
modulemips_sopc(
inputwireclk,
inputwirerst
);
wire[`InstAddrBus]inst_addr;
wire[`InstBus]inst;
wirerom_ce;//例化处理器MIPS_TOP
MIPS_TOPMIPS_TOP0(.clk(clk),.rst(rst),.rom_addr_o(inst_addr),.rom_data_i(inst),.rom_ce(rom_ce));//例化指令存储器
ROMinst_rominst_rom0(.ce(rom_ce),.addr(inst_addr),.inst(inst));
Endmodule
该模块的功能主要是将流水线和指令寄存器连接起来,通过指令寄存器不断向流水线的译码阶段提供指令;反之,流水线不断向指令寄存器提供指令所在的地址,使得流水线不断执行。
3.6.4编写测试程序
在测试文件里编写测试程序,为了方便测试与验证,编写ori指令,MIPS指令进行集中ori $1,$0,0x1100指令数据格式设计如图3.6.4-1。
图3.6.4-1ori$1,$0,0x1100指令格式
按照ori指令格式,在inst_rom.data文件中编写4条ori指令,如图3.6.4-2。
图3.6.4-2
获得的结果示于图3.6.4-3。
图3.6.4-3
3.6.5建立SOPC的TestBench文件
其TestBench文件如图3.6.5。
图3.6.5
建立一个50MHZ的时钟信号clk,每20ns翻转一次,复位使能,执行单周期流水线,在单周期流水线中执行ori指令;建立的TestBench文件将用于仿真,在ModelSim平台上可以达成ori指令的验证。
3.6.6使用ModelSim验证流水线的实现
前面已经实现 了并且验证了ORI指令,也编写了SOPC的测试文件,接下来就是在ModelSim上进行仿真与分析,一共执行了4条ori指令,为了方便观察与分析,仿真结果只截取了以$1寄存器为观察的对象及第一条ori指令执行的仿真结果,并且除去了其他的指令执行的过程,将所获得的模拟结果示图3.6.6-1。
图3.6.6-1ModelSim的仿真结果
在第一个进行复位控制信号使能之后和第二个时钟输入信号的上升沿,芯片使能信号有效及指令寄存器得到使能,ori指令进入了取值阶段并开始取指,并将指令中的值传送给了IF_ID模块的输入端口,紧接着在下一个时钟上升沿时,第一条ori进入了译码阶段。
在译码阶段中:
指令为第一条ori指令的值3401100,pc寄存器的值为初始,在ID模块中得到了指令的运算类型为逻辑运算类型为001(参照MIPS指令集,逻辑运算类型的判断值为001),得到了运算的子类型为或运算,其值为00100101(参照MIPS指令集,或运算运算的判断值为00100101),两个源操作数分为00000000、00001100,正式$0寄存器和指令中的立即数经过扩展之后的值。
目的寄存器的写操作使能, 写入目标寄存器的值$1寄存器中的值。
在执行阶段中:
要写入的目的寄存器的值为00001100,且目的寄存器写操作使能,目的寄存器的写操作使能,且要写入目的寄存器的值时$1寄存器中的数值。
在访存阶段中:
写入目的寄存器的值,是执行阶段要写入目的寄存器的值00001100,目的寄存器的写操作使能, 写入目标寄存器的值$1寄存器中的值。
在回写阶段中:
写入目的寄存器的值,是访存阶段要写入目的寄存器的值00001100,目的寄存器的写操作使能, 写入目标寄存器的值$1寄存器中的值。
所有阶段结束后,按照ori指令的要求,要写的目的寄存器$1的值正是第一条指令ori$1,$0,0x1100中$0与0x1100(1|0x1100=0x1100)的结果00001100。
正确的运算结果和数据传送,证明了五级流水的初步实现。
此时五级流水线的实现,但存在一些有关数据冲突等流水线的阻塞问题,比如在译码和回写阶段时,可能存在两个指令之间的译码和回写发生冲突,例如第一条指令回写时,某些寄存器的值,会传递至第二条指令的译码阶段且被第二条指令执行时使用,因此发生流水线的数据冲突,造成流水线的阻塞。
3.6.7解决流水线阻塞问题
在上述对流水线的验证的时候,拿出第一条ori指令(ori$1,$2,1100)和第二条ori指令(ori$1,$2,0020)进行仿真,会出现寄存器数据错误的问题,具体错误如图3.6.7-1。
图3.6.7-1
可知第一条指令和第二条指令分别在回写阶段、译码阶段发生了在寄存器$1数据的冲突,对于这种数据的冲突,主要用了两种方式解决方法。
当检测到有发生类似于数据冲突的情况的时候,让指令在执行的过程中,让其在接下来的几个时钟周期不干事情,来避免数据的冲突。
解决方案如图3.6.7-2。
图3.6.7-2
另外对于不想停止流水线的进程,还有一种解决方法,就是在产生计算结果的时候,将其中发送所需的计算结果,如需要的地方执行该指令。
如图3.6.7-3。
图3.6.7-3
而本次设计大多是采用了后者的解决方案,那么为了解决这种问题的发生,要在ID模块进行如下判断:
译码阶段进行执行指令后的运算处理结果,加以一些判断;取指令执行的阶段的操作结果,加以一些判断;具体可以实现个人的方法如图3.6.7-4。
图3.6.7-4
为了方便测试验证解决的数据问题,基于两条ori指令进行仿真:
ori$1,$0,1100
ori$1,$1,0020
如图3.6.8-5。
图3.6.8-5两条ori指令的仿真
可见,两条ori指令没有在此发生数据上的冲突,因此解决了