




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 毕业设计说明书基于VHDL语言的8位RISC-CPU的设计学 院: 专 业: 学生姓名: 学 号: 指导教师: 201 年 月摘 要RISC即精简指令集计算机Reduced Instruction Set Computer的缩写。RISC-CPU与一般的CPU相比,通过简化指令系统使计算机的结构更加简单合理,从而提高了运算速度。本文对RISC-CPU的架构进行了分析,并使用VHDL语言设计了8位RISC-CPU IP软核。RISC-CPU由八大根本模块构成:时钟发生器、指令存放器、累加器、算术逻辑单元、数据输出控制器、地址多路器、程序计数器、状态控制器。本设计中借助MAX+PLUS软件平台对
2、各模块进行时序仿真,并最终给出了指令执行的仿真波形,验证了CPU的功能。设计仿真结果说明,该8位RISC-CPU能够完成既定的任务指标,而且在运行效率上有一定程度改善。关键词:RISC-CPU、VHDL、MAX+PLUS、IP软核、时序仿真AbstractRISC reduced instruction set computer that (Reduced Instruction Set Computer) acronym. RISC-CPU and CPU in general compared to instruction by simplifying the structure of t
3、he computer is more simple and reasonable, thereby increasing processing speed. In this paper, RISC-CPU architecture is analyzed, and by using the VHDL language, I designed an 8-bit RISC-CPU IP soft core.RISC-CPU is based on 8 modules: clock generator, instruction register, accumulator, arithmetic l
4、ogic unit, data output controller, address multiplexer, program counter, state controller. In the design, each module are timing simulated on MAX+PLUS software platform, and finally the simulated waveform of instruction execution that verifies the CPU features is given.Design and simulation results
5、show that the 8-bit RISC-CPU can complete the tasks, and also has a certain degree of improvement on operational efficiency.Keywords: RISC-CPU, VHDL, MAX+PLUS, IP soft core, Timing Simulation目 录 TOC o 1-3 h z u HYPERLINK l _Toc295176393 摘 要 PAGEREF _Toc295176393 h I HYPERLINK l _Toc295176394 Abstrac
6、t英文摘要 PAGEREF _Toc295176394 h II HYPERLINK l _Toc295176395 目 录 PAGEREF _Toc295176395 h III HYPERLINK l _Toc295176396 第一章引言 PAGEREF _Toc295176396 h 1 HYPERLINK l _Toc295176397 课题背景与开展现状 PAGEREF _Toc295176397 h 1 HYPERLINK l _Toc295176398 1.1.1 课题背景 PAGEREF _Toc295176398 h 1 HYPERLINK l _Toc295176399
7、1.1.2 RISC-CPU的开展现状 PAGEREF _Toc295176399 h 1 HYPERLINK l _Toc295176400 1.2 RISC-CPU优势与现实意义 PAGEREF _Toc295176400 h 1 HYPERLINK l _Toc295176401 1.2.1 RISC-CPU具备的优势 PAGEREF _Toc295176401 h 1 HYPERLINK l _Toc295176402 1.2.2 本课题的现实意义 PAGEREF _Toc295176402 h 2 HYPERLINK l _Toc295176403 1.3 本设计的主要内容 PAGE
8、REF _Toc295176403 h 2 HYPERLINK l _Toc295176404 第二章RISC-CPU的架构设计 PAGEREF _Toc295176404 h 3 HYPERLINK l _Toc295176405 2.1 RISC-CPU根本架构 PAGEREF _Toc295176405 h 3 HYPERLINK l _Toc295176406 2.2 RISC-CPU模块的划分 PAGEREF _Toc295176406 h 4 HYPERLINK l _Toc295176407 第三章八位RISC-CPU各模块设计与仿真 PAGEREF _Toc295176407
9、h 6 HYPERLINK l _Toc295176408 3.1 时钟发生器 PAGEREF _Toc295176408 h 6 HYPERLINK l _Toc295176409 3.2 指令存放器 PAGEREF _Toc295176409 h 7 HYPERLINK l _Toc295176410 3.3 累加器 PAGEREF _Toc295176410 h 10 HYPERLINK l _Toc295176411 3.4 算术逻辑单元 PAGEREF _Toc295176411 h 11 HYPERLINK l _Toc295176412 3.5 数据输出控制器 PAGEREF _
10、Toc295176412 h 13 HYPERLINK l _Toc295176413 3.6 地址多路器 PAGEREF _Toc295176413 h 14 HYPERLINK l _Toc295176414 3.7 程序计数器 PAGEREF _Toc295176414 h 15 HYPERLINK l _Toc295176415 3.8 状态控制器 PAGEREF _Toc295176415 h 17 HYPERLINK l _Toc295176416 第四章RISC-CPU的综合及操作时序 PAGEREF _Toc295176416 h 25 HYPERLINK l _Toc2951
11、76417 4.1 RISC-CPU各模块综合 PAGEREF _Toc295176417 h 25 HYPERLINK l _Toc295176418 4.2 CPU复位启动操作时序 PAGEREF _Toc295176418 h 29 HYPERLINK l _Toc295176419 结论 PAGEREF _Toc295176419 h 30 HYPERLINK l _Toc295176420 参考文献 PAGEREF _Toc295176420 h 31 HYPERLINK l _Toc295176421 致谢 PAGEREF _Toc295176421 h 32引 言 题背景与开展现
12、状 课题背景CPU是Central Processing Unit中央处理器的缩写,它是计算机中最重要的一个局部。CPU由运算器和控制器组成,其内部结构归纳起来可以分为控制单元、逻辑单元和存储单元三大局部,这三个局部相互协调,便可以进行分析,判断、运算并控制计算机各局部协调工作。CPU从最初开展至今已经有几十年的历史了,这期间,按照其处理信息的字长,CPU可以分为:四位微处理器、八位微处理器、十六位微处理器、三十二位微处理器以及六十四位微处理器。而RISC处理器的出现标志着计算机体系结构中的一个根本性变革。RISC即精简指令集计算机(Reduced Instruction Set Comput
13、er)的缩写。从实现的途径看,RISC-CPU与一般的CPU的不同处在于:它的时序控制信号形成部件是用硬布线逻辑实现的而不是采用微程序控制的方式。所谓硬布线逻辑也就是用触发器和逻辑门直接连线所构成的状态机和组合逻辑,故产生控制序列的速度比用微程序控制方式快得多,因为这样做省去了读取微指令的时间。 RISC-CPU的开展现状IBM公司在1975年成功开发出第一款RISC处理器,从此RISC架构开始走进超级计算机中。由于指令高度简约,RISC处理器的晶体管规模普遍都很小而性能强大,深受超级计算机厂商所青睐。很快,许多厂商都开发出了自己的RISC指令系统,除了IBM的Power和PowerPC外,还
14、有DEC的Alpha、SUN的SPARC、HP的PA-RISC、MIPS技术公司的MIPS、ARM公司的ARM等。它的应用范围也远比X86来得广泛,大到各种超级计算机、工作站、高阶效劳器,小到各类嵌入式设备、家用游戏机、消费电子产品、工业控制计算机,都可以看到RISC的身影。1.2 RISC-CPU优势与现实意义 RISC-CPU具备的优势RISC有一套优化过的指令架构,它是根据著名的80/20法那么所订立。早在上个世纪60年代,计算机科学家们发现,计算机中80%的任务只是动用了大约20%的指令,而剩下20%的任务才有时机使用到其他80%的指令。如果对指令系统作相应的优化,就可以从根本上快速提
15、高处理器的执行效率。RISC与CISC一般指普通的X86CPU比拟,有以下优势:指令简单而且少;指令系统选用那些使用频度高的简单指令和一些实用的但不十分复杂的指令,一般指令不超过100条;指令字长固定,寻址方式一般不超过四种,指令格式也不超过四种;所有指令(几乎所有指令)均在单指令周期完成;指令系统中只允许存(STORE)和取(LOAD)指令访问主存,其它指令均在存放器之间进行;CPU中设置大量的存放器,称作存放器堆;指令的运行采用高效的流水线方式;以硬布线控制逻辑为主,不用或少用微码;优化的编译程序,简单有效地支持高级语言;超低功耗。 本课题的现实意义本课题的设计具有重要的意义:从IP设计技
16、术层面看,本课题按照自顶向下(Top-Down)的设计方法,从系统级结构和模块划分到硬件描述、综合、仿真灯,研究了Altera公司的MAX+plusII工具的使用,掌握了IP正向设计的根本方法,积累了珍贵经验。从RISC-CPU设计技术层面看,通过本课题的设计过程,了解掌握了MIPS指令系统CPU体系结构设计的关键技术。从嵌入式系统设计技术层面看,集成电路开展已进入IP core复用的SoC时代,8位嵌入式微处理器开展的一个重要特点是片上系统SoC化。本课题也为基于IP核的嵌入式系统设计积累了珍贵经验。从市场应用层面看,8位RISC-CPU是目前市场上同类产品占市场份额最大的一块,符合我国集成
17、电路当前的设计水平,以它作为参与市场竞争的突破口,来提高企业的市场竞争能力和技术创新能力,是一个切实可行的方案。1.3 本设计的主要内容本文对RISC-CPU的架构进行了探讨,介绍了如何设计RISC-CPU,并且立足于八位的 RISC-CPU设计实例,应用硬件描述语言VHDL语言实现8位简化RISC-CPU IP软核的设计,通过对RISC-CPU结构和指令执行的分析将整个系统划分为各个功能模块,并说明各模块间的接口信号,给出了每个模块内部设计实现的详细表达,最后介绍对设计的综合和验证工作,给出了仿真验证数据以及时序图。设计需要实现的这个简化的8位 RISC-CPU采用MIPS的局部指令集,同时
18、对MIPS CPU的结构进行一定的修改。RISC-CPU的架构设计2.1 RISC-CPU根本架构一个根本的CPU要包括三局部功能:数据的存储、数据的运算和控制局部。与之相对应的硬件结构也分为三局部:存储器、数据通路和控制器。存储器存放指令和数据;数据通路包括ALU、程序计数器等,主要功能是对操作数进行运算,得到结果,并产生程序计数器的值,作为要执行的下一条指令的地址;控制器内有指令存放器,它对指令进行译码,产生相应的控制信号,完成对存储器和数据通路局部的控制。存储器、数据通路和控制器这三局部的根本关系下列图所示:图2-1 CPU根本结构存储器中存放了要执行的指令和相应数据。存储器的读写信号由
19、控制器给出。存储器的地址来源有两个:程序计数器和指令存放器。在取新指令时,用程序计数器的值作为存储器地址;在执行指令时,用指令中的地址局部作为存储器地址。数据通路主要包括累加器、程序计数器和算术逻辑单元。累加器用于保存参加运算的数据以及运算的中间结果。实际上,累加器也是存放器,不过,它有特殊性,即许多指令执行过程以累加器为中心。往往在运算指令前,累加器中存放一个操作数,指令执行后,由累加器保存运算结果。另外输入输出指令一般也通过累加器来完成。程序计数器指向下一条要执行的指令。由于程序一般存放在内存的一个连续区域,所以,顺序执行程序时,每取一个指令字节,程序计数器便加一。算术逻辑单元是专门用来处
20、理各种运算的数据信息的,它可以进行加、减、乘、除算术运算和与、或、非、异或等逻辑运算。控制器产生相应的控制信号送到时序和控制逻辑电路,从而,组合成外部电路所需要的时序和控制信号。这些信号送往其他部件,以控制这些部件协调工作。对图2-1中的结构进行细化,可以得到一个简单的架构,如下列图所示。该CPU采用总线结构,即控制器所需的指令和数据通路所需的数据都是从总线上得到的。图2-2 CPU的简单架构2.2 RISC-CPU模块的划分计算机进行信息处理可分为两个步骤:一、将数据和程序即指令序列输入到计算机的存储器中。二、从第一条指令的地址起开始执行该程序,得到所需结果,结束运行。CPU的作用是协调并控
21、制计算机的各个部件执行程序的指令序列,使其有条不紊地进行。因此它必须具有以下根本功能:取指令:当程序已在存储器中时,首先根据程序入口地址取出一条程序,为此要发出指令地址及控制信号。分析指令:即指令译码。是对当前取得的指令进行分析,指出它要求什么操作,并产生相应的操作控制命令。执行指令:根据分析指令时产生的“操作命令形成相应的操作控制信号序列,通过运算器,存储器及输入/输出设备的执行,实现每条指令的功能,其中包括对运算结果的处理以及下条指令地址的形成。由功能分析,RISC-CPU应至少包含八个根本组成部件,即:时钟发生器、指令存放器、累加器、算术逻辑单元、数据输出控制器、地址多路器、程序计数器、
22、状态控制器,各个模块之间的互连关系如下列图:图2-3 RISC-CPU结构图1时钟发生器(clkgen):产生一系列的时钟信号送往 CPU 其他部件;2指令存放器(register):存储指令;3累加器(accum):存放算术逻辑单元当前的结果,它也是算术逻辑单元双目运算中的一个数据来源;4算术逻辑单元(alu):根据输入的 8 种不同操作码分别实现相应的加、与、读、写、异或,跳转等指令;5数据输出控制器(datactl):控制累加器的数据输出;6状态控制器(control):CPU 的控制核心,用于产生一系列的控制信号,启动或停止某些部件;7程序计数器(counter):提供指令地址,以便读
23、取指令;8地址多路器(adr):选择输出的地址是 PC程序计数地址还是跳转的目标地址。八位RISC-CPU各模块设计与仿真3.1 时钟发生器图3-1 时钟发生器时钟发生器Clock Generator如上图所示,利用外来时钟信号CLK来生成一系列时钟信号CLK1、FETCH、ALU_CLK送往CPU的其他部件,各分频时钟信号功能如下:CLK1信号经CLK反相后用作指令存放器、累加器、状态控制器的时钟信号。FETCH是外来时钟CKL的8分频信号,其上升沿触发CPU控制器开始执行一条指令,该信号同时还控制地址多路器输出指令地址和数据地址。ALU电路的时钟信号ALU_CLK,由CLK的2分频信号、4
24、分频信号和FETCH的反相信号相与得到,用于触发算术逻辑单元。时钟发生器源程序如下:library ieee;use ieee.std_logic_1164.all;entity clkgen isport(clk: in std_logic; clk1: buffer std_logic; fetch: buffer std_logic:=0; alu_clk: out std_logic);end clkgen;architecture behave of clkgen issignal clk2: std_logic:=0;signal clk4: std_logic:=1;begin
25、alu_clk=clk2 and clk4 and (not fetch);process(clk1)beginclk1=not clk; if clk1event and clk1=1then clk2=not clk2; end if;end process;process(clk2)begin if clk2event and clk2=0 then clk4=not clk4; end if;end process;process(clk4)begin if clk4event and clk4=1 then fetch=not fetch; end if;end process;en
26、d behave;us,取每格41.6ns。仿真波形如下:图3-2 时钟发生器仿真波形3.2 指令存放器指令存放器Instruction Register用于存放指令。如图3-3,指令存放器的触发时钟是CLK1,在CLK1的上升沿触发下,存放器将数据总线送来的指令存入高8位或低8位存放器中。但并不是每个CLK1的上升沿都存放数据总线的数据,因为数据总线上有时传输指令,有时传输数据。存放与否,由CPU状态控制器的IR_ENA信号控制。IR_ENA信号通过ENA口输入到指令存放器。当数据总线传输的是指令时,ENA置1,指令存放;当数据总线传输的是数据时,ENA置0,指令存放器不工作。每条指令为2个
27、字节,即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指令存放器指令存放器源程序如下:library ieee;use ieee.std_lo
28、gic_1164.all;entity ir isport(clk1, rst, ena: in std_logic; data: in std_logic_vector(7 downto 0); opcode: out std_logic_vector(2 downto 0); ir_addr: out std_logic_vector(12 downto 0);end ir;architecture behave of ir issignal opc_iraddrs: std_logic_vector(15 downto 0);beginprocess(clk1)variable stat
29、e: std_logic:=0;begin if(clk1event and clk1=1)then if rst=1then opc_iraddrs0); elsif ena=1 then case state is when 0 =opc_iraddrs(15 downto 8)opc_iraddrs(7 downto 0)null; end case; else state:=0; end if;end if;end process; opcode=opc_iraddrs(15 downto 13); ir_addr=opc_iraddrs(12 downto 0);end behave
30、;仿真波形如下列图:(续)图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用于存放当前的结果,它也是双目运算其中的一个数据来源,同时累加器还用来存放算术运算指令
31、的结果,如图3-5所示。累加器采用同步复位方式,即当RST信号为高电平时,累加器的值为零。当累加器通过ENA口收到来自CPU状态控制器ACC_ENA信号时,即ENA=1时,在CLK1时钟正跳沿时就收到来自于数据总线的数据,由DATA7.0输入;而当ENA=0时,累加器保持不变。累加器源程序如下:library ieee;use ieee.std_logic_1164.all;entity acc isport(clk1,rst,ena:in std_logic; data:in std_logic_vector(7 downto 0); accum:out std_logic_vector(7
32、 downto 0);end acc;architecture art of acc isbeginprocess(clk1, ena)beginif clk1event and clk1=1then if rst=1then accum=00000000; elsif ena=1then accum=data; end if;end if;end process;end art;在仿真时,设定6个周期假设中,data端每周期输入不同的8位二进制数,观察accum端输出数据与rst和ena值的对应关系,仿真波形如下:图3-6 累加器仿真波形如下图,当复位信号rst=0、使能信号ena=1时,在
33、每个clk1上升沿到来后,accum接收来自于数据总线的数据;当第4周期ena=0时,accum保持01010101不变,故该数据占两个周期;当ena又变为有效信号,因同时rst由0变为1,累加器复位,accum输出清零。3.4 算术逻辑单元算术逻辑单元ALU的全称是Arithmetic Logic Unit,该模块用来执行诸如加减乘除以及存放器中的值之间的逻辑运算,通常在一般的处理器上被设成一个周期上升沿运行一次,这主要是由附属于ALU的输入输出存放器以及在ALU输入处插入旁路乘法器来决定的。算术逻辑单元根据输入的8种不同操作码分别实现相应的加、与、异或、跳转等8种根本操作运算,利用这几种根
34、本运算可以实现很多种其它运算以及逻辑判断等操作。图3-7 算术逻辑单元算术逻辑单元如上图所示,其各端口功能如下:ALU_CLOCK为ALU的时钟信号,由时钟发生器输出;OPCODE取自指令存放器的高3位,ALU根据输入OPCODE的8种不同操作码分别实现相应的加、与、异或、跳转等根本操作运算;DATA输入来自数据总线上的数据;ACCUM输入来自累加器的一个操作数;ALU_OUT用来保存或输出操作后的值;ZERO用于标志ACCUM是否为0,其值为0时标ZERO=1,否那么ZERO=0。算术逻辑单元源程序如下:library ieee;use ieee.std_logic_1164.all;use
35、 ieee.std_logic_unsigned.all;entity alu isport(alu_clk: in std_logic; opcode: in std_logic_vector(2 downto 0); data,accum: in std_logic_vector(7 downto 0); zero: out std_logic; alu_out: out std_logic_vector(7 downto 0);end alu;architecture behave of alu issignal alu_out_latch: std_logic_vector(7 dow
36、nto 0);constant HLT: std_logic_vector(2 downto 0):=000;constant SKZ: std_logic_vector(2 downto 0):=001;constant ADD: std_logic_vector(2 downto 0):=010;constant AN_D: std_logic_vector(2 downto 0):=011;constant XO_R: std_logic_vector(2 downto 0):=100;constant LDA: std_logic_vector(2 downto 0):=101;con
37、stant STO: std_logic_vector(2 downto 0):=110;constant JMP: std_logic_vector(2 downto 0):=111;begin zeroalu_out_latchalu_out_latchalu_out_latchalu_out_latchalu_out_latchalu_out_latchalu_out_latchalu_out_latchalu_out_latch=XXXXXXXX; end case;end if;end process; alu_out=alu_out_latch;end behave;在仿真过程中,
38、假设操作码依次为上述8种操作码。数据值为5,累加器值为由3变0,以此来验证zero作用。仿真波形下列图所示:图3-8 算术逻辑运算单元仿真波形alu_clk为时钟信号输入端口,zero为判accum是否为零的输出端口。opcode为操作码输入端,data为数据输入端,accum为累加器输入端口。opcode不同的值代表不同的操作。alu_out中的06代表5(转化为二进制=101)异或3(转化为二进制=011)得6(二进制=110),而其他数值均正确反映不同操作码下的运算结果。 数据输出控制器数据输出控制器Data Control的作用是控制累加器数据输出,如图3-9由于数据总线是各种操作时传
39、送数据的公共通道,不同的情况下传送不同的内容。有时要传输指令,有时要传送RAM区或接口的数据。累加器的数据只有在需要往RAM区或端口写时才允许输出,否那么应呈现高阻态,以允许其它部件使用数据总线。所以任何部件往总线上输出数据时,都需要控制信号。而此控制信号的启、停,那么由CPU状态控制器输出的各信号控制决定。数据控制器何时输出累加器的数据那么由状态控制器输出的控制信号DATACTL_ENA决定。图3-9 数据输出控制器数据控制电路源程序如下:library ieee;use ieee.std_logic_1164.all;entity datactrl isport(data_ena: in
40、std_logic; alu_out: in std_logic_vector(7 downto 0); data: out std_logic_vector(7 downto 0);end datactrl;architecture behave of datactrl isbegin data=alu_out when data_ena=1 else ZZZZZZZZ;end behave;在此波形图3-10中,假设累加器输出值由00000000递增,验证当data_ena为0时,data输出alu_out的值,当data_ena为1时,data输出ZZZZZZZZ。图3-10 数据输出控
41、制器仿真波形 地址多路器地址多路器ADDR用于选择输出的地址是PC程序计数地址还是数据/端口地址,如图3-11所示。每个指令周期的前4个时钟周期用于从ROM中读取指令,输出PC地址。后4个时钟周期用于对RAM或端口的读写,输出数据或端口地址。地址的选择输出信号由时钟信号的8分频信号FETCH提供,其上升沿到来时输出PC地址,其他时候输出数据或端口地址。图3-11 地址多路器地址多路器源程序如下:library ieee;use ieee.std_logic_1164.all;entity addr_mux isport(fetch:in std_logic; pc_addr, ir_addr:
42、 in std_logic_vector(12 downto 0); addr: out std_logic_vector(12 downto 0);end addr_mux;architecture behave of addr_mux isbegin addr=pc_addr when fetch=1 else ir_addr;end behave;图3-12 地址多路器仿真波形当fetch=0时addr输出ir_addr的值,当fetch=1时addr输出pc_addr的值。3.7 程序计数器程序计数器Program Counter用于提供指令地址,如图3-13,以便读取指令,指令按地址
43、顺序存放在存储器中。有两种途径可形成指令地址:其一是顺序执行的情况,其二是遇到要改变顺序执行程序的情况,例如执行JMP指令后,需要形成新的指令地址。复位后,指令指针为零,即每次CPU重新启动将从ROM的零地址开始读取指令并执行。指令为双字节,每条指令执行完需2个时钟,这时PC_ADDR已被增2,指向下一条指令。如果正执行的指令是跳转语句,这时CPU状态控制器将会输出PC_ENA信号,通过LOAD口进入程序计数器。程序计数器PC_ADDR将装入目标地址IR_ADDR,而不是增2。图3-13 程序计数器程序计数器源程序如下:library ieee;use ieee.std_logic_1164.
44、all;use ieee.std_logic_unsigned.all;entity pc isport(clk, rst, ena: in std_logic; ir_addr: in std_logic_vector(12 downto 0); pc_addr: out std_logic_vector(12 downto 0);end pc;architecture behave of pc issignal pc_addr_latch: std_logic_vector(12 downto 0);beginprocess(clk)begin if clkevent and clk=1t
45、hen if rst=1then pc_addr_latch0); elsif ena=1 then pc_addr_latch=ir_addr; elsif ena=0 then pc_addr_latch=pc_addr_latch+1; end if; end if;end process; pc_addr=pc_addr_latch;end behave;假设指令地址为0、1、2、3,为便于显示,设置地址指令和程序计数器输出为数制十进制,仿真波形如下列图:图3-14 程序计数电路仿真波形clk的上升沿启动电路,当rst为低电平, ena为低电平时,pc_addr自身加1;ena为高电平
46、那么pc_addr输出ir_addr的值。rst为高电平时输出清0。3.8 状态控制器图3-15 状态控制器状态控制器State Control是CPU的控制核心,用于产生一系列的控制信号,启动或停止某些部件,由状态机(STATE_MACHINE)和状态机控制器(MACH_CTR)组成,如上图。状态机控制器接受复位信号RST,当RST有效时通过信号ENA使其为0,输入到状态机中停止状态机的工作。状态机的当前状态,由变量STATE记录,STATE的值就是当前这个指令周期中已经过的时钟数。指令周期是由8个时钟周期组成,每个时钟周期都要完成固定的操作。状态转换如下列图:图3-16 状态控制器状态转换
47、图 (1) 第1个时钟S0,CPU状态控制器的输出:RD和IR_ENA为高电平,其余均为低电平。指令存放器存放由ROM送来的高8位指令代码。(2) 第2个时钟S1,与上一时钟相比只是PC_CLK从0变为1,故PC增1;同时ROM送来低8位指令代码,指令存放器存放该8位代码。(3) 第3个时钟S2,空操作。(4) 第4个时钟S3,PC增1,指向下一条指令。假设操作符为HLT,那么输出信号HLT为高。如果操作符不为HLT,除了PC增1外指向下一条指令,其它各控制线输出为零。(5)第5个时钟S4,假设操作符为AND、ADD、XOR或LDA,读相应地址的数据;假设为JMP,将目的地址送给程序计数器;假
48、设为STO,输出累加器数据。(6) 第6个时钟S5,假设操作符为AND、ADD或XOR,算术逻辑单元就进行相应的运算;假设为LDA,就把数据通过算术逻辑单元送给累加器;假设为SKZ,先判断累加器的值是否为0,如果为0,PC就增1,否那么保持原值;假设为JMP,锁存目的地址;假设为STO,将数据写入地址处。(7) 第7个时钟S6,空操作。(8) 第8个时钟S7,假设操作符为SKZ且累加器值为0,那么PC值再增1,跳过一条指令,否那么PC无变化。在实体编写过程中,首先定义8个状态为S0S7,然后定义8个指令代码为常量。由于只有8条指令,所以采用3位二进制数编码。因AND和XOR指令为VHDL关键字
49、,故用AN_D和XO_R代替。指令HLTSKZADDAN_DXO_RLDASTOJMP代码000001010011100101110111状态机控制器源程序如下:library ieee;use ieee.std_logic_1164.all;entity mach_ctr isport(fetch,rst: in std_logic; ena: out std_logic);end mach_ctr;architecture behave of mach_ctr isbeginprocess(fetch)begin if fetchevent and fetch=1 then if rst=
50、1then ena=0; else ena=1; end if; end if;end process;end behave;状态机源程序如下:library ieee;use ieee.std_logic_1164.all;entity state_machine isport(clk1, ena, zero: in std_logic; opcode: in std_logic_vector(2 downto 0); pc_clk, acc_ena, pc_ena, rd, wr, ir_ena, halt, datactl_ena: out std_logic);end state_ma
51、chine;architecture behave of state_machine istype state_type is (s0, s1,s2, s3, s4, s5, s6, s7);signal state: state_type;constant HLT: std_logic_vector(2 downto 0):=000;constant SKZ: std_logic_vector(2 downto 0):=001;constant ADD: std_logic_vector(2 downto 0):=010;constant AN_D: std_logic_vector(2 d
52、ownto 0):=011;constant XO_R: std_logic_vector(2 downto 0):=100;constant LDA: std_logic_vector(2 downto 0):=101;constant STO: std_logic_vector(2 downto 0):=110;constant JMP: std_logic_vector(2 downto 0):=111;beginprocess(clk1)begin if clk1event and clk1=1then if ena=0 then state=s0;pc_clk=0; acc_ena=
53、0; pc_ena=0; rd=0; wr=0; ir_ena=0; halt=0; datactl_enapc_clk=0; acc_ena=0; pc_ena=0; rd=1; wr=0; ir_ena=1; datactl_ena=0; halt=0; statepc_clk=1; acc_ena=0; pc_ena=0; rd=1; wr=0; ir_ena=1; datactl_ena=0; halt=0; statepc_clk=0; acc_ena=0; pc_ena=0; rd=0; wr=0; ir_ena=0; datactl_ena=0; halt=0; stateif
54、(opcode=HLT) then pc_clk=1; acc_ena=0; pc_ena=0; rd=0; wr=0; ir_ena=0; datactl_ena=0; halt=1; else pc_clk=1; acc_ena=0; pc_ena=0; rd=0; wr=0; ir_ena=0; datactl_ena=0; halt=0; end if; stateif (opcode=JMP) then pc_clk=1; acc_ena=0; pc_ena=1; rd=0; wr=0; ir_ena=0; datactl_ena=0; halt=0; elsif (opcode=A
55、DD or opcode=AN_D or opcode=XO_R or opcode=LDA) then pc_clk=0; acc_ena=0; pc_ena=0; rd=1; wr=0; ir_ena=0; datactl_ena=0; halt=0; elsif opcode=STO then pc_clk=0; acc_ena=0; pc_ena=0; rd=0; wr=0; ir_ena=0; datactl_ena=1;halt=0; else pc_clk=0; acc_ena=0; pc_ena=0; rd=0; wr=0; ir_ena=0; datactl_ena=0; h
56、alt=0; end if; stateif (opcode=ADD or opcode=AN_D or opcode=XO_R or opcode=LDA) then pc_clk=0; acc_ena=1;pc_ena=0; rd=1; wr=0; ir_ena=0; datactl_ena=0; halt=0; elsif(opcode=SKZ and zero=1) then pc_clk=1; acc_ena=0; pc_ena=0; rd=0; wr=0; ir_ena=0; datactl_ena=0; halt=0; elsif opcode=JMP then pc_clk=1
57、; acc_ena=0; pc_ena=1;rd=0; wr=0; ir_ena=0; datactl_ena=0; halt=0; elsif opcode=STO then pc_clk=0; acc_ena=0; pc_ena=0; rd=0; wr=1;ir_ena=0; datactl_ena=1; halt=0; else pc_clk=0; acc_ena=0; pc_ena=0; rd=0; wr=0;ir_ena=0; datactl_ena=0; halt=0; end if; statepc_clk=0; acc_ena=0; pc_ena=0; rd=0; wr=0;
58、ir_ena=0; datactl_ena=0; halt=0; stateif (opcode=SKZ and zero=1) then pc_clk=1;acc_ena=0; pc_ena=0; rd=0; wr=0; ir_ena=0; datactl_ena=0; halt=0; else pc_clk=0; acc_ena=0; pc_ena=0; rd=0; wr=0; ir_ena=0; datactl_ena=0; halt=0; end if; state=s0; end case; end if; end if;end process;end behave;状态控制器源程序
59、如下: library ieee;use ieee.std_logic_1164.all;package mypack is component mach_ctr port(fetch,rst: in std_logic; ena: out std_logic); end component; component state_machine port(clk1, ena, zero: in std_logic; opcode: in std_logic_vector(2 downto 0); pc_clk,acc_ena,pc_ena,rd,wr,ir_ena,halt,datactl_ena
60、:out std_logic); end component;end mypack;library ieee;use ieee.std_logic_1164.all;use work.mypack.all;entity state_contrl isport(clk1,zero,fetch,rst: in std_logic; opcode: in std_logic_vector(2 downto 0); pc_clk,acc_ena,pc_ena,rd,wr,ir_ena,halt,datactl_ena:out std_logic);end state_contrl;architectu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度企业内部车辆使用规范及责任划分协议
- 二零二五年度搏击选手参赛安全保障免责协议
- 房产代持协议书(2025年度)-专项融资支持
- 二零二五年度人力资源绩效评估与薪酬管理合作协议
- 2025年度艺人与经纪公司长期战略合作协议
- 2025年度股权内部转让及知识产权归属协议
- 2025年度时尚服饰代销及库存管理合同
- 2025年度运动场所场地使用规定免责协议书
- 2025年度服装店员工劳动合同附带培训与发展协议
- 二零二五年度大数据技术入股合作协议范本
- 2020 ACLS-PC-SA课前自我测试试题及答案
- 流体输送实训装置操作规程
- BIM技术应用管理办法
- 信息论与编码第4章信息率失真函数
- extreme-sports 极限运动 英文 ppt
- 国际注册建造师与项目管理师双资格认证
- 面瘫护理查房
- 空间几何向量法之点到平面的距离
- 反激式变压器计算表格
- 精品资料(2021-2022年收藏)建筑立面装饰设计技术导则
- ISO9001质量管理体系目录结构
评论
0/150
提交评论