基于VHDL语言的8位RISCCPU的设计 终稿.docx
- 文档编号:5292812
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:37
- 大小:368.79KB
基于VHDL语言的8位RISCCPU的设计 终稿.docx
《基于VHDL语言的8位RISCCPU的设计 终稿.docx》由会员分享,可在线阅读,更多相关《基于VHDL语言的8位RISCCPU的设计 终稿.docx(37页珍藏版)》请在冰点文库上搜索。
基于VHDL语言的8位RISCCPU的设计终稿
毕业设计说明书
基于VHDL语言的8位RISC-CPU的设计
学院:
专业:
学生姓名:
学号:
指导教师:
201年月
摘要
RISC即精简指令集计算机(ReducedInstructionSetComputer)的缩写。
RISC-CPU与一般的CPU相比,通过简化指令系统使计算机的结构更加简单合理,从而提高了运算速度。
本文对RISC-CPU的架构进行了分析,并使用VHDL语言设计了8位RISC-CPUIP软核。
RISC-CPU由八大基本模块构成:
时钟发生器、指令寄存器、累加器、算术逻辑单元、数据输出控制器、地址多路器、程序计数器、状态控制器。
本设计中借助MAX+PLUSⅡ软件平台对各模块进行时序仿真,并最终给出了指令执行的仿真波形,验证了CPU的功能。
设计仿真结果表明,该8位RISC-CPU能够完成既定的任务指标,而且在运行效率上有一定程度改善。
关键词:
RISC-CPU、VHDL、MAX+PLUSⅡ、IP软核、时序仿真
Abstract
RISCreducedinstructionsetcomputerthat(ReducedInstructionSetComputer)acronym.RISC-CPUandCPUingeneralcomparedtoinstructionbysimplifyingthestructureofthecomputerismoresimpleandreasonable,therebyincreasingprocessingspeed.Inthispaper,RISC-CPUarchitectureisanalyzed,andbyusingtheVHDLlanguage,Idesignedan8-bitRISC-CPUIPsoftcore.
RISC-CPUisbasedon8modules:
clockgenerator,instructionregister,accumulator,arithmeticlogicunit,dataoutputcontroller,addressmultiplexer,programcounter,statecontroller.Inthedesign,eachmodulearetimingsimulatedonMAX+PLUSⅡsoftwareplatform,andfinallythesimulatedwaveformofinstructionexecutionthatverifiestheCPUfeaturesisgiven.
Designandsimulationresultsshowthatthe8-bitRISC-CPUcancompletethetasks,andalsohasacertaindegreeofimprovementonoperationalefficiency.
Keywords:
RISC-CPU,VHDL,MAX+PLUSⅡ,IPsoftcore,TimingSimulation
第一章引言
1.1题背景与发展现状
1.1.1课题背景
CPU是CentralProcessingUnit——中央处理器的缩写,它是计算机中最重要的一个部分。
CPU由运算器和控制器组成,其内部结构归纳起来可以分为控制单元、逻辑单元和存储单元三大部分,这三个部分相互协调,便可以进行分析,判断、运算并控制计算机各部分协调工作。
CPU从最初发展至今已经有几十年的历史了,这期间,按照其处理信息的字长,CPU可以分为:
四位微处理器、八位微处理器、十六位微处理器、三十二位微处理器以及六十四位微处理器。
而RISC处理器的出现标志着计算机体系结构中的一个根本性变革。
RISC即精简指令集计算机(ReducedInstructionSetComputer)的缩写。
从实现的途径看,RISC-CPU与一般的CPU的不同处在于:
它的时序控制信号形成部件是用硬布线逻辑实现的而不是采用微程序控制的方式。
所谓硬布线逻辑也就是用触发器和逻辑门直接连线所构成的状态机和组合逻辑,故产生控制序列的速度比用微程序控制方式快得多,因为这样做省去了读取微指令的时间。
1.1.2RISC-CPU的发展现状
IBM公司在1975年成功开发出第一款RISC处理器,从此RISC架构开始走进超级计算机中。
由于指令高度简约,RISC处理器的晶体管规模普遍都很小而性能强大,深受超级计算机厂商所青睐。
很快,许多厂商都开发出了自己的RISC指令系统,除了IBM的Power和PowerPC外,还有DEC的Alpha、SUN的SPARC、HP的PA-RISC、MIPS技术公司的MIPS、ARM公司的ARM等。
它的应用范围也远比X86来得广泛,大到各种超级计算机、工作站、高阶服务器,小到各类嵌入式设备、家用游戏机、消费电子产品、工业控制计算机,都可以看到RISC的身影。
1.2RISC-CPU优势与现实意义
1.2.1RISC-CPU具备的优势
RISC有一套优化过的指令架构,它是根据著名的80/20法则所订立。
早在上个世纪60年代,计算机科学家们发现,计算机中80%的任务只是动用了大约20%的指令,而剩下20%的任务才有机会使用到其他80%的指令。
如果对指令系统作相应的优化,就可以从根本上快速提高处理器的执行效率。
RISC与CISC(一般指普通的X86CPU)比较,有以下优势:
指令简单而且少;指令系统选用那些使用频度高的简单指令和一些实用的但不十分复杂的指令,一般指令不超过100条;指令字长固定,寻址方式一般不超过四种,指令格式也不超过四种;所有指令(几乎所有指令)均在单指令周期完成;指令系统中只允许存(STORE)和取(LOAD)指令访问主存,其它指令均在寄存器之间进行;CPU中设置大量的寄存器,称作寄存器堆;指令的运行采用高效的流水线方式;以硬布线控制逻辑为主,不用或少用微码;优化的编译程序,简单有效地支持高级语言;超低功耗。
1.2.2本课题的现实意义
本课题的设计具有重要的意义:
(1)从IP设计技术层面看,本课题按照自顶向下(Top-Down)的设计方法,从系统级结构和模块划分到硬件描述、综合、仿真灯,研究了Altera公司的MAX+plusII工具的使用,掌握了IP正向设计的基本方法,积累了宝贵经验。
(2)从RISC-CPU设计技术层面看,通过本课题的设计过程,了解掌握了MIPS指令系统CPU体系结构设计的关键技术。
(3)从嵌入式系统设计技术层面看,集成电路发展已进入IPcore复用的SoC时代,8位嵌入式微处理器发展的一个重要特点是片上系统SoC化。
本课题也为基于IP核的嵌入式系统设计积累了宝贵经验。
(4)从市场应用层面看,8位RISC-CPU是目前市场上同类产品占市场份额最大的一块,符合我国集成电路当前的设计水平,以它作为参与市场竞争的突破口,来提高企业的市场竞争能力和技术创新能力,是一个切实可行的方案。
1.3本设计的主要内容
本文对RISC-CPU的架构进行了探讨,介绍了如何设计RISC-CPU,并且立足于八位的RISC-CPU设计实例,应用硬件描述语言VHDL语言实现8位简化RISC-CPUIP软核的设计,通过对RISC-CPU结构和指令执行的分析将整个系统划分为各个功能模块,并阐明各模块间的接口信号,给出了每个模块内部设计实现的详细叙述,最后介绍对设计的综合和验证工作,给出了仿真验证数据以及时序图。
设计需要实现的这个简化的8位RISC-CPU采用MIPS的部分指令集,同时对MIPSCPU的结构进行一定的修改。
第二章RISC-CPU的架构设计
2.1RISC-CPU基本架构
一个基本的CPU要包括三部分功能:
数据的存储、数据的运算和控制部分。
与之相对应的硬件结构也分为三部分:
存储器、数据通路和控制器。
存储器存放指令和数据;数据通路包括ALU、程序计数器等,主要功能是对操作数进行运算,得到结果,并产生程序计数器的值,作为要执行的下一条指令的地址;控制器内有指令寄存器,它对指令进行译码,产生相应的控制信号,完成对存储器和数据通路部分的控制。
存储器、数据通路和控制器这三部分的基本关系下图所示:
图2-1CPU基本结构
存储器中存放了要执行的指令和相应数据。
存储器的读写信号由控制器给出。
存储器的地址来源有两个:
程序计数器和指令寄存器。
在取新指令时,用程序计数器的值作为存储器地址;在执行指令时,用指令中的地址部分作为存储器地址。
数据通路主要包括累加器、程序计数器和算术逻辑单元。
累加器用于保存参加运算的数据以及运算的中间结果。
实际上,累加器也是寄存器,不过,它有特殊性,即许多指令执行过程以累加器为中心。
往往在运算指令前,累加器中存放一个操作数,指令执行后,由累加器保存运算结果。
另外输入输出指令一般也通过累加器来完成。
程序计数器指向下一条要执行的指令。
由于程序一般存放在内存的一个连续区域,所以,顺序执行程序时,每取一个指令字节,程序计数器便加一。
算术逻辑单元是专门用来处理各种运算的数据信息的,它可以进行加、减、乘、除算术运算和与、或、非、异或等逻辑运算。
控制器产生相应的控制信号送到时序和控制逻辑电路,从而,组合成外部电路所需要的时序和控制信号。
这些信号送往其他部件,以控制这些部件协调工作。
对图2-1中的结构进行细化,可以得到一个简单的架构,如下图所示。
该CPU采用总线结构,即控制器所需的指令和数据通路所需的数据都是从总线上得到的。
图2-2CPU的简单架构
2.2RISC-CPU模块的划分
计算机进行信息处理可分为两个步骤:
一、将数据和程序(即指令序列)输入到计算机的存储器中。
二、从第一条指令的地址起开始执行该程序,得到所需结果,结束运行。
CPU的作用是协调并控制计算机的各个部件执行程序的指令序列,使其有条不紊地进行。
因此它必须具有以下基本功能:
(1)取指令:
当程序已在存储器中时,首先根据程序入口地址取出一条程序,为此要发出指令地址及控制信号。
(2)分析指令:
即指令译码。
是对当前取得的指令进行分析,指出它要求什么操作,并产生相应的操作控制命令。
(3)执行指令:
根据分析指令时产生的“操作命令”形成相应的操作控制信号序列,通过运算器,存储器及输入/输出设备的执行,实现每条指令的功能,其中包括对运算结果的处理以及下条指令地址的形成。
由功能分析,RISC-CPU应至少包含八个基本组成部件,即:
时钟发生器、指令寄存器、累加器、算术逻辑单元、数据输出控制器、地址多路器、程序计数器、状态控制器,各个模块之间的互连关系如下图:
图2-3RISC-CPU结构图
1.时钟发生器(clkgen):
产生一系列的时钟信号送往CPU其他部件;
2.指令寄存器(register):
存储指令;
3.累加器(accum):
存放算术逻辑单元当前的结果,它也是算术逻辑单元双目运算中的一个数据来源;
4.算术逻辑单元(alu):
根据输入的8种不同操作码分别实现相应的加、与、读、写、异或,跳转等指令;
5.数据输出控制器(datactl):
控制累加器的数据输出;
6.状态控制器(control):
CPU的控制核心,用于产生一系列的控制信号,启动或停止某些部件;
7.程序计数器(counter):
提供指令地址,以便读取指令;
8.地址多路器(adr):
选择输出的地址是PC(程序计数)地址还是跳转的目标地址。
第三章八位RISC-CPU各模块设计与仿真
3.1时钟发生器
图3-1时钟发生器
时钟发生器ClockGenerator如上图所示,利用外来时钟信号CLK来生成一系列时钟信号CLK1、FETCH、ALU_CLK送往CPU的其他部件,各分频时钟信号功能如下:
•CLK1信号经CLK反相后用作指令寄存器、累加器、状态控制器的时钟信号。
•FETCH是外来时钟CKL的8分频信号,其上升沿触发CPU控制器开始执行一条指令,该信号同时还控制地址多路器输出指令地址和数据地址。
•ALU电路的时钟信号ALU_CLK,由CLK的2分频信号、4分频信号和FETCH的反相信号相与得到,用于触发算术逻辑单元。
时钟发生器源程序如下:
libraryieee;
useieee.std_logic_1164.all;
entityclkgenis
port(clk:
instd_logic;
clk1:
bufferstd_logic;
fetch:
bufferstd_logic:
='0';
alu_clk:
outstd_logic);
endclkgen;
architecturebehaveofclkgenis
signalclk2:
std_logic:
='0';
signalclk4:
std_logic:
='1';
begin
alu_clk<=clk2andclk4and(notfetch);
process(clk1)
begin
clk1<=notclk;
ifclk1'eventandclk1='1'then
clk2<=notclk2;
endif;
endprocess;
process(clk2)
begin
ifclk2'eventandclk2='0'then
clk4<=notclk4;
endif;
endprocess;
process(clk4)
begin
ifclk4'eventandclk4='1'then
fetch<=notfetch;
endif;
endprocess;
endbehave;
外来时钟为12MHz,周期T=0.083us,取每格41.6ns。
仿真波形如下:
图3-2时钟发生器仿真波形
3.2指令寄存器
指令寄存器InstructionRegister用于寄存指令。
如图3-3,指令寄存器的触发时钟是CLK1,在CLK1的上升沿触发下,寄存器将数据总线送来的指令存入高8位或低8位寄存器中。
但并不是每个CLK1的上升沿都寄存数据总线的数据,因为数据总线上有时传输指令,有时传输数据。
寄存与否,由CPU状态控制器的IR_ENA信号控制。
IR_ENA信号通过ENA口输入到指令寄存器。
当数据总线传输的是指令时,ENA置1,指令寄存;当数据总线传输的是数据时,ENA置0,指令寄存器不工作。
每条指令为2个字节,即16位。
高3位是操作码,低13位是地址(CPU的地址总线为13位,寻址空间为8K字节)。
本设计的数据总线为8位,所以每条指令需取两次。
先取高8位,后取低8位。
而当前取的是高8位还是低8位,由变量STATE记录。
STATE为零表示取的高8位,存入高8位寄存器,同时将变量STATE置为1。
再次寄存时,因STATE为1,取低8位并存入低8位寄存器中,同时将STATE置为0,如此往复。
指令寄存时,将高3位和低13位分别寄存到操作码寄存器OPCODE和地址寄存器IR_ADDR。
复位后,指令寄存器被清为零。
图3-3指令寄存器
指令寄存器源程序如下:
libraryieee;
useieee.std_logic_1164.all;
entityiris
port(clk1,rst,ena:
instd_logic;
data:
instd_logic_vector(7downto0);
opcode:
outstd_logic_vector(2downto0);
ir_addr:
outstd_logic_vector(12downto0));
endir;
architecturebehaveofiris
signalopc_iraddrs:
std_logic_vector(15downto0);
begin
process(clk1)
variablestate:
std_logic:
='0';
begin
if(clk1'eventandclk1='1')then
ifrst='1'then
opc_iraddrs<=(others=>'0');
elsifena='1'then
casestateis
when'0'=>opc_iraddrs(15downto8)<=data;
state:
='1';
when'1'=>opc_iraddrs(7downto0)<=data;
state:
='0';
whenothers=>null;
endcase;
else
state:
='0';
endif;
endif;
endprocess;
opcode<=opc_iraddrs(15downto13);
ir_addr<=opc_iraddrs(12downto0);
endbehave;
仿真波形如下图:
(续)
图3-4指令寄存器仿真波形
在此仿真波形图中,clk1为时钟输入信号,ena为使能输入端口,rst为置位端口,这里假设在ena=1之前data=00000000,ena=1后传输了10011001、01100110、11001100、00110011四个数据,则当state为0时,传输高八位,当state为1时,传输低八位。
其中第15至第13位存入opcode中并替换旧数据,第12至第0位存入str_addr中并替换旧数据。
3.3累加器
图3-5累加器
累加器Accumulator用于存放当前的结果,它也是双目运算其中的一个数据来源,同时累加器还用来存放算术运算指令的结果,如图3-5所示。
累加器采用同步复位方式,即当RST信号为高电平时,累加器的值为零。
当累加器通过ENA口收到来自CPU状态控制器ACC_ENA信号时,即ENA=1时,在CLK1时钟正跳沿时就收到来自于数据总线的数据,由DATA[7..0]输入;而当ENA=0时,累加器保持不变。
累加器源程序如下:
libraryieee;
useieee.std_logic_1164.all;
entityaccis
port(clk1,rst,ena:
instd_logic;
data:
instd_logic_vector(7downto0);
accum:
outstd_logic_vector(7downto0));
endacc;
architectureartofaccis
begin
process(clk1,ena)
begin
ifclk1'eventandclk1='1'then
ifrst='1'then
accum<="00000000";
elsifena='1'then
accum<=data;
endif;
endif;
endprocess;
endart;
在仿真时,设定6个周期假设中,data端每周期输入不同的8位二进制数,观察accum端输出数据与rst和ena值的对应关系,仿真波形如下:
图3-6累加器仿真波形
如图所示,当复位信号rst=’0’、使能信号ena=’1’时,在每个clk1上升沿到来后,accum接收来自于数据总线的数据;当第4周期ena=’0’时,accum保持01010101不变,故该数据占两个周期;当ena又变为有效信号,因同时rst由0变为1,累加器复位,accum输出清零。
3.4算术逻辑单元
算术逻辑单元ALU的全称是ArithmeticLogicUnit,该模块用来执行诸如加减乘除以及寄存器中的值之间的逻辑运算,通常在一般的处理器上被设成一个周期上升沿运行一次,这主要是由附属于ALU的输入输出寄存器以及在ALU输入处插入旁路乘法器来决定的。
算术逻辑单元根据输入的8种不同操作码分别实现相应的加、与、异或、跳转等8种基本操作运算,利用这几种基本运算可以实现很多种其它运算以及逻辑判断等操作。
图3-7算术逻辑单元
算术逻辑单元如上图所示,其各端口功能如下:
•ALU_CLOCK为ALU的时钟信号,由时钟发生器输出;
•OPCODE取自指令寄存器的高3位,ALU根据输入OPCODE的8种不同操作码分别实现相应的加、与、异或、跳转等基本操作运算;
•DATA输入来自数据总线上的数据;
•ACCUM输入来自累加器的一个操作数;
•ALU_OUT用来保存或输出操作后的值;
•ZERO用于标志ACCUM是否为0,其值为0时标ZERO=1,否则ZERO=0。
算术逻辑单元源程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityaluis
port(alu_clk:
instd_logic;
opcode:
instd_logic_vector(2downto0);
data,accum:
instd_logic_vector(7downto0);
zero:
outstd_logic;
alu_out:
outstd_logic_vector(7downto0));
endalu;
architecturebehaveofaluis
signalalu_out_latch:
std_logic_vector(7downto0);
constantHLT:
std_logic_vector(2downto0):
="000";
constantSKZ:
std_logic_vector(2downto0):
="001";
constantADD:
std_logic_vector(2downto0):
="010";
constantAN_D:
std_logic_vector(2downto0):
="011";
constantXO_R:
std_logic_vector(2downto0):
="100";
constantLDA:
std_logic_vector(2downto0):
="101";
constantSTO:
std_logic_vector(2downto0):
="110";
constantJMP:
std_logic_vector(2downto0):
="111";
begin
zero<='1'whenaccum="00000000"else'0';
process(alu_clk)
variabletemp:
std_logic_vector(2downto0);
begin
temp:
=opcode;
ifalu_clk'eventandalu_clk='1'then
casetempis
whenHLT=>alu_out_latch<=accum;
whenSKZ=>alu_o
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于VHDL语言的8位RISCCPU的设计 终稿 基于 VHDL 语言 RISCCPU 设计