基于VHDL语言的RISC-CPU系统设计.doc_第1页
基于VHDL语言的RISC-CPU系统设计.doc_第2页
基于VHDL语言的RISC-CPU系统设计.doc_第3页
基于VHDL语言的RISC-CPU系统设计.doc_第4页
基于VHDL语言的RISC-CPU系统设计.doc_第5页
免费预览已结束,剩余40页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

xx大学 毕业设计(论文)题 目: 基于VHDL语言的 RISC-CPU系统设计 学 院:电气与电子工程学院 专 业:电子信息工程 学生姓名: 指导教师: 毕业设计时间:二 九 年 二 月 二十三 日 六 月 十四 共 十 七 周中 文 摘 要摘 要本课题利用CPLD做载体,借助MAX+PLUS软件平台,完成了RISC-CPU系统的设计。本文主要阐述了应用CPLD技术实现这一IP核的设计方法。RISC即精简指令集计算机(Reduced Instruction Set Computer)的缩写,RISC-CPU与一般的CPU相比不仅只是简化了指令系统,而且是通过简化指令系统使计算机的结构更加合理,从而提高了运算速度。本课题采用硬件描述语言VHDL设计了8位RISC-CPU系统,采用自顶向下(Top-down)的设计方法,根据设计流程,首先将RISC-CPU划分成八个基本功能模块。然后对各个模块进行VHDL代码描述,再应用开发系统中的各种工具进行编译、功能仿真、逻辑综合、时序仿真、布局布线等,并最终给出了指令执行的仿真波形,验证了CPU指令的功能。设计表明应用CPLD技术实现RISC-CPU系统设计的方法是完全可行的。关键词:复杂可编程逻辑器件,VHDL语言,RISC-CPU- II -AbstractAbstractBased on MAX+PLUS and CPLD (Complex Programmable Logic Devices),an IP Core Compatible with instructions of RISC-CPU was designed. This thesis mainly researches a method that uses CPLD technology to design the IP core.RISC is the acronym of Reduced Instruction Set Computer.Compared with the common CPU,RISC not only simplifies the instruction set but also makes the computer construction simpler and more reasonable.Consequently it increases the work frequency.Part of 8 bits RISC-CPU was designed with VHSIC hardware description language(VHDL). This paper uses the Top-down design method. According to the designing course, firstly, RISC-CPU was divided into eight modules that the function was single.Secondly, every module was described with VHDL. Then all programs were synthesized and simulated with Quartus II ,and the simulation waves are also provided. As a result,the mehtod that uses VHDL to form the strcture of RISC-CPU is feasible.Keywords: CPLD, VHDL,RISC-CPU 目 录目 录摘 要IAbstractII目 录III第一章绪论11.1课题的背景及意义11.2国内外研究现状21.3本设计的主要内容2第二章RISC-CPU系统及设计方案32.1 RISC的特点32.2 RISC-CPU基本框架32.3 RISC-CPU系统的设计方案5第三章八位RISC-CPU各模块设计及仿真83.1 时钟电路83.2 累加器103.3 算术逻辑运算单元(ALU)123.4 指令寄存器163.5 状态控制电路183.6 数据控制电路293.7 程序计数器303.8 地址多路器32第四章RISC-CPU的综合及操作时序344.1 RISC-CPU的综合344.2 CPU复位启动操作时序38第五章设计结论及展望39参考文献40致谢41- 41 -第一章 绪论第一章 绪论随着信息产业的飞速发展,以软硬件协同设计(Software/Hardware Co-Design ),IP核复用(Intellectual Property Core Reuse)和超深亚微米技术(Very Deep Sub-M)为支撑的SOC(系统级芯片System-On-a-Chip)成为集成电路发展的主流。本文以SOC关键技术之一嵌入式IP和设计技术为研究的出发点,以八位RISC-CPU IP核的设计为目标,对IP核的设计技术进行了实践与研究。1.1 课题的背景及意义随着可编程逻辑芯片与基于IP(知识产权)的SOC片上系统技术的发展,RISC软核处理器的研究与设计越来越受到人们的重视。研究RISC软核处理器的现实意义有以下几方面:(1)对基于FPGA的嵌入式系统的开发具有现实意义。现在FPGA在各种嵌入式系统中发挥着越来越大的作用,FPGA的内部逻辑也越来越复杂,导致了开发难度的增加。而应用RISC软核处理器来设计FPGA的内部逻辑就可以大大降低设计的难度,并可以代替嵌入式系统中的硬处理器,从而可以把系统的大部分,甚至全部功能都做到一片FPGA中,使整个系统变得紧凑、小巧,并能提高系统的稳定性。(2)对基于IP的SOC的设计开发具有一定的实用价值。SOC芯片的设计开发一般是基于IP模块的复用来设计的,一个SOC 芯片往往会包括一个内嵌的RISC处理器,用来完成其核心处理功能。RISC软核处理器的设计可以很方便的转化成相应的IP,从而可以用来设计SOC芯片。(3 )对商用RISC处理器的开发具有指导意义。RISC软核处理器包括了所有RISC的基本技术,给商用RISC处理器的开发提供了一个很好的框架。由于RISC软核处理器在验证与修改上比较方便,并且软核处理器设计完成后,可以很方便的转化成相应硬处理器的前端设计,因此可以用RISC软核处理器的设计替代原来硬处理器的前端设计,从而节省开发时间,并降低设计难度。由上可知,研究RISC软核处理器是很有现实意义的。1.2 国内外研究现状目前国内总体来说在IP的开发和应用方面做的不够,但可喜的是,近年来国家己经在IP产业上也有了很大的动作。科技部于2000年启动了“十五”国家在国家高技术研究发展863计划中,SOC作为微电子重大专项己列入了信息技术领域的重大专项启动项目中,在若干关键IP核的开发、软硬件协同设计、IP复用、VDSM设计、新工艺新器件等等方面都布置了预研性课题。CPU的IP核是构成SOC技术的核心,开发出具有自主知识产权的CPU IP核对我国在电子设计技术方面跟上世界先进的步伐,提高信息产业在世界上的核心竞争力和效益具有重大意义。在国内,基于SOC的CPU设计研究很少有人涉足。虽然市场上应用较为广泛的微控制器、嵌入式处理器等都有了很成熟的产品,但这些产品主要靠从国外引进,技术基础比较薄弱。前不久,中芯微系统公司生产出我国第一个具有自主知识产权的实用化32位嵌入式CPU芯片“方舟一号”,这表明我国的RISC CPU设计在嵌入式领域达到了先进水平。1.3本设计的主要内容本设计主要应用VHDL语言实现八位RISC-CPU系统的设计。本论文详细介绍了关于RISC-CPU的结构以及利用硬件描述语言进行设计的的方法,通过对RISC-CPU结构和指令执行的分析将整个系统划分为各个功能模块,并阐明各模块间的接口信号,给出了每个模块内部设计实现的详细叙述,最后介绍对设计的综合和验证工作,给出了仿真验证数据以及时序图。第二章RISC-CPU系统及其设计方案第二章 RISC-CPU系统及设计方案RISC-CPU的设计,首先是架构设计。首先要考虑:RISC指令集的特点;RISC-CPU基本框架;然后由指令集特点及RISC-CPU基本框架得出RISC-CPU系统的设计方案。2.1 RISC的特点计算机体系结构中的一个根本性的变革是RISC处理器的出现。RISC即精简指令集计算机(Reduced Instruction Set Computer)的缩写。RISC-CPU与一般的CPU相比不仅只是简化了指令系统,而且是通过简化指令系统使计算机的结构更加简单合理,从而提高了运算速度。从实现的途径看,RISC-CPU与一般的CPU的不同之处在于:它的时序控制信号形成部件是用硬布线逻辑实现的而不是采用微程序控制的方式。所谓硬布线逻辑也就是用触发器和逻辑门直接连线所构成的状态机和组合逻辑,故产生控制序列的速度比用微程序控制方式快得多,因为这样做省去了读取微指令的时间。RISC处理器可以说既简单又复杂:简单之处在于,相比于复杂指令集CISC (Complex Instruction Set Computer,复杂指令系统计算机),这种处理器的指令和变量非常少,正如它的英文字母缩写RISC所代表的“精简指令集”的含义一样;说RISC复杂,是因为它们容易实现更高的并行性,而这个特点只有与设计得很好的编译器结合起来,才能显现出其优越性。2.2 RISC-CPU基本框架虽然RISC-CPU采用精简指令系统但是它具有和其它CPU一样的基本功能,也就是其基本组成部分和一般的CPU相同由运算器、控制器和存储器组成。存储器存放指令和数据;数据通路包括ALU、程序计数器等,图2-1 RISC-CPU基本结构读写控制信号控制信号存储器数据通路控制器指令状态信号主要功能是对操作数进行运算,得到结果,并产生程序计数器的值,作为要执行的下一条指令的地址;控制器内有指令寄存器,它对指令进行译码,产生相应的控制信号,完成对存储器和数据通路部分的控制。存储器、数据通路和控制器这三部分的基本关系如图2-1所示。 存储器存储器中存放了要执行的指令和相应数据。存储器的读写信号由控制器给出。存储器的地址来源有两个:程序计数器和指令寄存器。在取新指令时,用程序计数器的值作为存储器地址:在执行指令时,用指令中的地址部分作为存储器地址。 数据通路数据通路主要包括累加器、程序计数器和算术逻辑单元。累加器用于保存参加运算的数据以及运算的中间结果。实际上,累加器也是寄存器,不过,它有特殊性,即许多指令执行过程以累加器为中心。往往在运算指令前,累加器中存放一个操作数,指令执行后,由累加器保存运算结果。另外输入输出指令一般也通过累加器来完成。程序计数器指向下一条要执行的指令。由于程序一般存放在内存的一个连续区域,所以,顺序执行程序时,每取一个指令字节,程序计数器便加一。算术逻辑单元是专门用来处理各种运算的数据信息的,它可以进行加、减、乘、除算术运算和与、或、非、异或等逻辑运算。 控制器控制器产生相应的控制信号送到时序和控制逻辑电路,从而,组合成外部电路所需要的时序和控制信号。这些信号送往其他部件,以控制这些部件协调工作。实现RISC-CPU的设计,将数据和程序(指令序列)统一存放在一个数据存储器中。对图2-1中的结构进行细化,可以得到一个简单CPU的构架,如图2-2所示该CPU采用总线结构,即控制器所需的指令,数据通路所需的数据都是从总线上得到的。控制信号操作码地址信号数据输入控制器指令寄存器状态控制器指令译码器地址信号 执行部件(数据通路)数据输出图2-2 RISC-CPU简单构架2.3 RISC-CPU系统的设计方案计算机进行信息处理可分为两个步骤:1)将数据和程序(即指令序列)输入到计算机的存储器中。2)从第一条指令的地址起开始执行该程序,得到所需结果,结束运行。CPU的作用是防调并控制计算机的各个部件执行程序的指令序列,使其有条不紊地进行。因此它必须具有以下基本功能:取指令:当程序已在存储器中时,首先根据程序入口地址取出一条程序,为此要发出指令地址及控制信号。分析指令:即指令译码。是对当前取得的指令进行分析,指出它要求什么操作,并产生相应的操作控制命令。执行指令:根据分析指令时产生的“操作命令”形成相应的操作控制信号序列,通过运算器,存储器及输入/输出设备的执行,实现每条指令的功能,其中包括对运算结果的处理以及下条指令地址的形成。本设计的RISC-CPU数据总线为8位,而每条指令为两个字节(高3位为操作码,低13位是地址),所以每条指令需取两次。CPU每次取到指令后,其状态控制器(CPU控制中心)分析操作码后,产生一系列控制信号,启动或停止某些部件。其中时钟发生器利用外来时钟信号进行分频生成一系列时钟信号,送往其他部件用作时钟信号。由功能分析,RISC-CPU是一个复杂的数字逻辑电路,但是它的基本部件的逻辑并不复杂,可把它分成以下八个基本部件,各个模块之间的互连关系如图2-3所示。clkresetetet累加器地址多路器程序计数器数据控制电路状态控制电路时钟电路逻辑运算单元指令寄存器图2-3 RISC-CPU 结构框图1.时钟电路(clock):产生一系列的时钟信号送往CPU其他部件;2.状态控制电路(state-contrl):CPU的控制核心,用于产生一系列的控制信号,启动或停止某些部件;3.指令寄存器(reg):存储指令;4.累加器(acc):存放算术逻辑运算单元当前的结果,它也是算术逻辑运算单元双目运算中的一个数据来源;5.算术逻辑运算单元(alu):根据输入的8种不同操作码分别实现相应的加、与、读、写、异或,跳转等指令;6.数据控制电路(datactrl)控制累加器的数据输出;7.程序计数器(pc):提供指令地址;8.地址多路器(addr-mux):选择输出的地址是PC(程序计数)地址还是跳转的目标地址。第三章 八位RISC-CPU各摸块设计及仿真第三章 八位RISC-CPU各模块设计及仿真八位RISC-CPU可以划分为八个基本部件:时钟电路、累加器、RISC-CPU算术逻辑运算单元、指令寄存器、状态控制电路、数据控制电路、程序计数器、地址多路器,下面将具体阐述各子模块的功能和设计思想。3.1 时钟电路时钟电路用于产生CPU各部件的时钟。单片机的时钟可以由两种方式产生,一种是内部方式,利用芯片内部的振荡电路;另一种方式为外部方式。在此采用外部时钟的方式,即利用外部振荡信号经过分频以后产生所需时钟。综合后的引脚图,如图3-1所示。3-1时钟电路图中clk为输入引脚接外部振荡信号,在此设计中,外部振荡信号由4M晶振提供。clk1、clk8和alu_clk是输出信号,分别用来控制CPU的其它部件。其中clkl信号经clk反相后到,用作指令寄存器、累加器、状态控制电路的时钟信号:clk信号8分频后得到clk8,clk8的上升沿到来触发CPU的状态控制电路,控制CPU开始执行一条指令,同时clk8信号还用于控制地址多路器:clk的2分频信号、4分频信号和clk8的反相信号相与得到ALU电路的时钟信号alu_clk。clkl和alu_clk信号的逻辑算式如下: clkl=not clk; alu_clk=clk2 and clk4 and (not clk8);时钟电路源程序及仿真波形如下:library ieee;use ieee.std_logic_1164.all;entity clock isport(clk: in std_logic; clk1: buffer std_logic; clk8: buffer std_logic:=0; alu_clk: out std_logic);end clock;architecture behave of clock issignal clk2: std_logic:=0;signal clk4: std_logic:=1;begin alu_clk=clk2 and clk4 and (not clk8);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 clk8=not clk8; end if;end process;end behave;图3-2 时钟电路各信号波形3.2 累加器累加器是一个最常用的专用寄存器,大部分单操作数指令的操作数取自累加器,很多双操作数指令的一个操作数也取自累计器。同时累加器还用来存放算术运算指令的结果,综合后的引脚图,如图3-3所示。图3-3 累加器累加器的时钟信号由时钟电路产生的clkl信号提供。累加器采用同步复位方式,当reset信号为高电平时,累加器的值为零。在reset信号变低以后,当ena信号有效时,clk上升沿到来后接收来自于数据总线的数据,由d7.0端输入:当ena信号无效时,累加器的值保持不变。累加器的ena信号由状态控制电路产生。累加器的VHDL代码主要采用PROCESS语句编写。如前所述,PROCESS语句本身是一种并行处理语句,但进程的内部结构由一系列顺序语句构成,语句逐条执行,顺序与语句的书写顺序相一致。之所以采用PROCESS语句的原因是:进程必须由敏感信号表中定义的任一敏感信号的变化激活。而累加器的一切操作都由时钟信号控制进行,因此采用PROCESS语句可以很方便的实现这一要求。其源程序如下:library ieee;use ieee.std_logic_1164.all;entity acc isport(clk,reset,ena:in std_logic; d:in std_logic_vector(7 downto 0); accum:out std_logic_vector(7 downto 0);end acc;architecture art of acc isbeginprocess(clk, ena)beginif clkevent and clk=1then if reset=1then accum=00000000; elsif ena=1then accum=d; end if; end if;end process;end art;3-4 累加器各信号波形图3-4为累加器各信号仿真波形图。如图所示,当复位信号reset=0、使能信号ena=1时,在每个clk上升沿到来后,ACC接收来自于数据总线d7.0的数据(00、01、02、03、04);当ena=0,ACC保持04不变;当ena又变为有效信号后,ACC继续接受来自数据总线的数据;当reset=1,ACC复位,输出accum清零。3.3 算术逻辑运算单元(ALU)ALU的功能十分强大,它不仅可以进行逻辑“与”“或”“异或”等逻辑运算,还可以进行加、减算术运算。除此之外还可以进行停机、跳转等操作。逻辑运算单元模块引脚图如3-5所示。图3-5 算术逻辑运算单元图3-5中clk为ALU的时钟信号,由时钟电路生成的alu_clk信号提供;opcode为操作码输入端,取自指令寄存器的高3位,ALU根据输入的不同操作码进行不同的操作;data输入来自数据总线上的数据;accum端输入来自累加器的一个操作数;alu_out端用来保存或输出操作后的结果;zero用于标志累加器的结果accum是否为0,如果为0,则zero为1,否则zero为0。在程序设计时,首先定义指令的编码,然后规定各个指令所对应的操作,编写程序时采用CASE语句实现。CASE语句用来描述总线或编码、译码的行为,从许多不同语句的序列中选择其中之一执行,属于数据流描述法,是结构体描述方法的一种。当然此处也可以采用IF语句实现。没有采用IF语句的原因有以下几个:首先CASE语句的可读性比IF语句要强的多,程序的阅读者很容易找出条件式和动作的对应关系。其次在CASE语句中,WHEN语句可以颠倒次序而不至于发生错误:而在IF语句中,颠倒条件判别的次序往往会使综合的逻辑功能发生变化。另外,在IF语句中,先处理最起始的条件,如果不满足,再处理下一个条件:而在CASE语句中,没有值的顺序号,所有值是并行处理的,这样就缩短了程序的执行时间。算术逻辑运算单元程序及仿真波形如下,library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity alu isport(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 downto 0);constant NOP: std_logic_vector(2 downto 0):=000;constant JZ: std_logic_vector(2 downto 0):=001;constant ADD: std_logic_vector(2 downto 0):=010;constant ANL: std_logic_vector(2 downto 0):=011;constant XRL: std_logic_vector(2 downto 0):=100;constant MOV: std_logic_vector(2 downto 0):=101;constant MEM: std_logic_vector(2 downto 0):=110;constant AJMP: 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;仿真波形如图3-6所示:图3-6 算术逻辑运算单元仿真波形在此仿真波形图中,clk为时钟信号输入端口,zero为判accum是否为零的输出端口。opcode为操作码输入端,data为数据输入端,accum为另一输入端口,它接累加器的输出端。opcode不同的值代表不同的操作,在此图中,假设data为“1”(十进制),accum为“2”,两者相与为“0”,相加为“3”,跳转时则输出accum的值“2”,数据传输时输出data的值“1”。3.4 指令寄存器指令寄存器用来寄存指令,其引脚图如图3-7所示。指令寄存器的触发时钟是clk1。clk1的上升沿触发,寄存器开始工作。每条指令为两个字节,即16位。高3位是操作码,低13位是地址。本设计的数据总线为8位,所以每条指令需要取两次,先取高8位,后取低8位。由状态变量state来标志从数据总线上取来的数据是高8位还是低8位。如果state为0表示取得的是高8位,存入高8位寄存器,同时将变量state置为1。下次再寄存时,由于state为1,可知取得的是低8位,存入低8位寄存器中,同时将state置为0。图3-7指令寄存器由于数据总线既可以传输指令也可以传输数据,而且只有指令需要寄存到指令寄存器中,因此需要一个信号指示是否进行寄存。图中ena引脚用来控制是否寄存。当数据总线传输的是指令时,ena端由控制电路置为1,指令寄存;如果数据总线传输的是数据,则ena为0,指令寄存器停止工作。指令寄存时,分为高3位和低13位分别寄存到操作码寄存器opcode和地址寄存器instr_addr。指令寄存器源程序如下:library ieee;use ieee.std_logic_1164.all;entity reg isport(clk, reset, ena: in std_logic; data: in std_logic_vector(7 downto 0); opcode: out std_logic_vector(2 downto 0); instr_addr: out std_logic_vector(12 downto 0);end reg;architecture behave of reg issignal opc_iraddrs: std_logic_vector(15 downto 0);beginprocess(clk)variable state: std_logic:=0;begin if(clkevent and clk=1)then if reset=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); instr_addr=opc_iraddrs(12 downto 0);end behave;仿真波形如图3-8如下:图3-8 指令寄存器仿真波形在此仿真波形图中,clk为时钟输入信号,ena为使能输入端口,reset为复位端口,这里假设data传输的一直是“21”(十六进制),则当state为0时,传输高八位,当state为1时,传输低八位。其中13至15位存入opcode中,0至12位存入str_addr中。所以这里的opcode为“1”,str_addr为“0121”。3.5 状态控制电路状态控制电路是CPU的控制核心。用于产生一系列的控制信号,来控制各部件的启动或者停止。clk1、clk8由时钟产生电路产生;reset为高电平时,复位状态控制电路所有输出信号;opcode为操作码输入端,取自指令寄存器的高三位;pc_clk作为程序计数器的时钟信号;acc_ena输出到累加器的使能端;pc_ena为指令寄存器的使能信号,控制指令寄存器的启、停;datactrl_ena作为数据控制电路的使能信号;idle为停机信号,输出到片外。图3-9 状态控制电路如果将状态控制电路作为一个整体进行程序编写,有许多语句需要反复描述。这样降低了程序的可读性,而且在硬件实现时也会增加不必要的重复的逻辑电路。因此将状态控制电路又分为状态机和状态控制器两部分。状态控制器产生使能信号ena控制状态机的启、停。当复位信号reset有效时,状态控制器将ena置零,从而使状态机停止工作,各输出信号复位。状态控制器中当复位脉冲过后,clk8上升沿到来,ena 输出为1,否则为0。下面重点说明状态机的设计。图3-11状态机 图3-10状态控制器此设计中,指令周期由8个时钟周期组成,每个时钟周期完成固定的工作。因此状态控制器有8个状态,当前状态由某一变量记录,此变量的值就是当前这个指令周期中经过的时钟数(从零开始记录)。各时钟周期,CPU 进行的操作如下:第0个时钟,从ROM读取指令。由于指令长度为16位,数据总线为8位,所以读取一条指令需要两个时钟周期。第0个时钟读取指令的高8位代码,并存入指令寄存器。此时状态机使读信号rd和reg_ena输出1(表示高电平),其余全部为0(表示低电平)。第1个时钟,从ROM读取指令的低8位代码并存入指令寄存器。此时钟结束后一条指令读完,程序指针将指向下一个存储单元。因此与上一时钟相比pc_clk也从0变为1,使程序计数器(PC)增1。第2个时钟,空操作。所有的输出信号均为0。第3个时钟,开始分析前两个时钟读取的指令。如果操作符为NOP ,则输出信号idle为高;如果操作符不为NOP,则PC增1,指向下一条指令,其他各控制线输出为零。第4个时钟,若取得的操作符为ANL,ADD,XRL或MOV,则rd输出1,读取相应地址的数据,地址由所读取的指令的低13位给出;若为AJMP,则pc_ena信号输出为1,使程序计数器读入目的地址;若为MEM,则datactrl_ena输出1,使数据控制电路输出累加器数据;若为其它指令,则输出全为0。第5个时钟,若取得的操作符为ANL,ADD或XRL,则ALU将从ROM读取的数据和累加器数据进行相应的运算;若为MOV,就把从ROM读取的数据通过ALU送给累加器;若为JZ,先通过zero判断累加器的值是否为0,如果为0,pc_clk输出1,使PC增1,否则PC保持原值不变;若为AJMP,锁存目的地址;若为MEM,将数据写入ROM中的相应地址处;若为其它指令,则输出全为0。第6个时钟,空操作。第7个时钟,若操作符为JZ且累加器值为0,则PC值再加1,跳过一条指令,否则PC保持原值不变;如果操作符不是JZ,则所有输出为0。根据上述描述,画出状态机的状态转换图,如图4-12所示。其中输入为opcode,输出为状态机的各个输出信号。然后根据各状态编写状态机的VHDL代码。AJMPADD,ANL,XRL,MOVMEM其他读取高八位空操作JZ其他S0S7NOP其他S1S2S3S6S5S4读取低八位空操作AJMPANL,ADD,XRLMOVJZMEM 其他图3-12 状态机状态转换状态控制器程序如下: library ieee;use ieee.std_logic_1164.all;entity mach_ctr isport(clk8,reset: in std_logic; ena: out std_logic);end mach_ctr;architecture behave of mach_ctr isbeginprocess(clk8)begin if clk8event and clk8=1 then if reset=1then ena=0; else ena=1; end if; end if;end process;end behave;状态机程序如下:library ieee;use ieee.std_logic_1164.all;package mypack is component mach_ctr port(clk8,reset: in std_logic; ena: out std_logic); end component; component state_machine port(clk, ena, zero: in std_logic; opcode: in std_logic_vector(2 downto 0); pc_clk,acc_ena,pc_ena,rd,wr,reg_ena,idle,datactrl_ena:out std_logic); end component;end mypack;library ieee;use ieee.std_logic_1164.all;use work.mypack.all;entity state_contrl isport(clkl,zero,clk8,reset: in std_logic; opcode: in std_logic_vector(2 downto 0); pc_clk,acc_ena,pc_ena,rd,wr,reg_ena,idle,datactrl_ena:out std_logic);end state_contrl;architecture rt1 of state_contrl issignal ena_b: std_logic;beginUl:mach_ctr port map(clk8,reset,ena_b);U2:state_machine port map (clkl,ena_b, zero, opcode, pc_clk, acc_ena,pc_ena, rd, wr, reg_ena, idle, datactrl_ena);end rt1;library ieee;use ieee.std_logic_1164.all;entity state_machine isport(clk, ena, zero: in std_logic; opcode: in std_logic_vector(2 downto 0); pc_clk, acc_ena, pc_ena, rd, wr, reg_ena, idle, datactrl_ena: out std_logic);end state_machine;architecture behave of state_machine istype state_type is (s0, s1,s2, s3, s4, s5, s6, s7);signal state: state_type;constant NOP: std_logic_vector(2 downto 0):=000;constant JZ: std_logic_vector(2 downto 0):=001;constant ADD: std_logic_vector(2 downto 0):=010;constant ANL: std_logic_vector(2 downto 0):=011;constant XRL: std_logic_vector(2 downto 0):=100;constant MOV: std_logic_vector(2 downto 0):=101;constant MEM: std_logic_vector(2 downto 0):=110;constant AJMP: std_logic_vector(2 downto 0):=111;beginprocess(clk)begin if clkevent and clk=1then if ena=0 then state=s0; pc_clk=0; acc_ena=0; pc_ena=0; rd=0; wr=0; reg_ena=0; idle=0; datactrl_enapc_clk=0; acc_ena=0; pc_ena=0; rd=1; wr=0; reg_ena=1; datactrl_ena=0; idle=0; statepc_clk=1; acc_ena=0; pc_ena=0; rd=1; wr=0; reg_ena=1; datactrl_ena=0; idle=0; statepc_clk=0; acc_ena=0; pc_ena=0; rd=0; wr=0; reg_ena=0; datactrl_ena=0; i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论