数字系统EDA技术实验报告实验名称:处理器核心电路的设计及验证指导教师:陈学英学生姓名:尹康学号:2012029010010电子科技大学电子工程学院一.实验要求1、利用层次化的设计方法使用VHDL语言设计一个简单的处理器;2、设计一个应用程序用于验证所设计的处理器的功能。二.实验目的1、进一步掌握AlteraDE2-115开发平台的使用;2、掌握Quartus软件设计流程;3、掌握一个处理器核心电路的基本结构及设计方法;4、掌握状态机的设计方法;5、进一步掌握如何编写testBench,并利用Modelsim进行仿真。三设计文件1.设计思路Ⅰ.一个最基本处理器的主要部件的构成如下图所示,一个最基本的处理器应该包括一些寄存器,一个多路选择器、一个加法/减法单元、计数器和一个控制单元。其中,寄存器的位宽可以选择8位、16位、32位、64位。以下均以16位为例来说明所设计的处理器的基本结构。处理器所处理的输入数据通过多路复用器加载到不同的寄存器内,寄存器分别定义为R0、R1、R2、R3、R4、R5、R6、R7和A。各个寄存器之间可以相互传递数据。复用器的输出称之为总线。该总线容许数据从一个位置传递到另一个位置。加法/减法单元首先通过多路复用器将一个16位数加载到寄存器A中,寄存器A固定作为加法/减法单元的一个操作数。加法/减法单元的第二个操作数将通过总线传至加法/减法单元的另一个数据输入接口,完成运算操作后的数据存入寄存器G内。寄存器G的值可通过复用器将其搬移到需要的位置。电子科技大学电子工程学院图1处理器内部结构图在控制单元的控制下,每个时钟周期可完成不同的操作。这个控制单元决定什么数据放在总线上,并且控制哪个寄存器加载总线上的数据。例如,将寄存器R0的值加载到寄存器A内,可在两个时钟周期内完成,第一个时钟周期是将R0的值放在总线上,第二个周期则将总线上的数据加载到寄存器A内。Ⅱ.处理器的操作处理器可通过各种指令来进行所需要的操作。下表列出了本次实验需要完成的4条指令及相应的功能。mvRx,Ry表示将Ry寄存器内的数据移到Rx寄存器内。mviRx,#D表示将立即数送到Rx寄存器内。addRx,Ry表示将Rx和Ry寄存器内的数据相加,结果存入Rx寄存器内。subRx,Ry表示将Rx和Ry寄存器内的数据相加减,结果存入Rx寄存器内。指令可通过编码后存入IR寄存器内。IR寄存器可以使用9位表示。如IIIXXXYYY。其中III表示指令,XXX代表Rx寄存器,YYY代表Ry寄存器。IR必须连接到16位数据输入脚上(可以是低9位或高9位)。对于mvi指令,YYY域不用,立即数#D在mvi指令存入IR寄存器后由16位数据输入口送入。对于加法和减法指令,由于该类操作需要多次占用总线,因此完成这类操作电子科技大学电子工程学院需要多个时钟周期。为此可增加一个2位的计数器counter。当RUN有效时计数器counter开始计数,即检测到开始执行加法/减法操作,当指令执行完毕后Done有效,此时清空counter计数器,可以进行下一指令的操作。表1处理器操作指令操作所完成的功能mvRx,RyRx--[Ry]mviRx,#DRx--DaddRx,RyRx--[Rx]+[Ry]subRx,RyRx--[Rx]-[Ry]表2指令的操作时序T0T1T2T3mv从IR中取指令完成移位操作mvi从IR中取指令完成移位操作add从IR中取指令将Rx值存入寄存器A内将Ry值送至总线上完成加法操作并将G值送入Rx寄存器内sub从IR中取指令将Rx值存入寄存器A内将Ry值送至总线上完成减法操作并将G值送入Rx寄存器内2.顶层文件libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitymycpuisgeneric(busWidth:integer:=16);port(din:instd_logic_vector(BusWidth-1downto0);narst:instd_logic;clk:instd_logic;run:instd_logic;readir:instd_logic;done:outstd_logic;procbus:outstd_logic_vector(27downto0));endmycpu;电子科技大学电子工程学院architectureartofmycpuissignalclkd,runedge,readiredge:std_logic;signalbusreg:std_logic_vector(busWidth-1downto0);componentdivnisgeneric(n:integer:=2);port(rst,clkin:instd_logic;clkout:outstd_logic);endcomponent;componentedgeisport(clk,a:instd_logic;b:outstd_logic);endcomponent;componentsimProcisgeneric(BusWidth:integer:=16);port(DIn:instd_logic_vector(BusWidth-1downto0);nARst:instd_logic;clk:instd_logic;Run:instd_logic;readir:instd_logic;Done:outstd_logic;procBus:outstd_logic_vector(BusWidth-1downto0);statIndic:outstd_logic_vector(2downto0));endcomponent;componentdec4to7isport(d:instd_logic_vector(3downto0);s:outstd_logic_vector(6downto0));endcomponent;begindiv:divngenericmap(50)--分频数portmap(narst,clk,clkd);ir1:edgeportmap(clkd,run,runedge);ir2:edgeportmap(clkd,readir,readiredge);cpu:simProcgenericmap(16)portmap(din,narst,clkd,runedge,readiredge,done,busreg);电子科技大学电子工程学院show0:dec4to7portmap(busreg(3downto0),procBus(6downto0));show1:dec4to7portmap(busreg(7downto4),procBus(13downto7));show2:dec4to7portmap(busreg(11downto8),procBus(20downto14));show3:dec4to7portmap(busreg(15downto12),procBus(27downto21));endart;3.底层文件Ⅰ.4-7译码器模块libraryieee;useieee.std_logic_1164.all;entitydec4to7isport(d:instd_logic_vector(3downto0);s:outstd_logic_vector(6downto0));enddec4to7;architectureartofdec4to7isbeginprocess(d)begincasediswhen0000=s=1000000;--0when0001=s=1111001;--1when0010=s=0100100;--2when0011=s=0110000;--3when0100=s=0011001;--4when0101=s=0010010;--5when0110=s=0000010;--6when0111=s=1111000;--7when1000=s=0000000;--8when1001=s=0010000;--9when1010=s=0001000;--awhen1011=s=0000011;--bwhen1100=s=1000110;--cwhen1101=s=0100001;--dwhen1110=s=0000110;--ewhen1111=s=0001110;--fwhenothers=s=1111111;endcase;endprocess;endart;电子科技大学电子工程学院Ⅱ.3-8译码器模块libraryieee;useieee.std_logic_1164.all;entitydec3to8isport(w:instd_logic_vector(2downto0);En:instd_logic;Y:outstd_logic_vector(7downto0));enddec3to8;architecturearchofdec3to8isbeginprocess(w,En)beginifEn='1'thencasewiswhen000=Y=00000001;when001=Y=00000010;when010=Y=00000100;when011=Y=00001000;when100=Y=00010000;when101=Y=00100000;when110=Y=01000000;when111=Y=10000000;whenothers=Y=00000000;endcase;elseY=00000000;endif;endprocess;endarch;Ⅲ.数据寄存器模块libraryieee;useieee.std_logic_1164.all;entityregnisgeneric(regWidth:integer:=16);port(R:instd_logic_vector(regWidth-1downto0);nRst:instd_logic;Rin,clk:instd_logic;Q:outstd_logic_vector(regWidth-1downto0));endregn;电子科技大学电子工程学院architecturearchofregnisbeginprocess(clk)beginif(clk'eventandclk='1')thenif(nRst='0')thenQ=(others='0');elseifRin='1'thenQ=R;endif;endif;endif;endprocess;endarch;Ⅳ.分频器模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitydivnisgeneric(n:integer:=4);--偶数分频,占空比50%port(rst,clkin:instd_logic;clkout:outstd_logic);enddivn;architectureartofdivnissignalcount:integerrange1ton/2;signaltmp:std_logic;beginprocess(clkin,rst)beginifrst='0'thencount=1;tmp='0';elsifclkin'eventandclkin='1'thenifcount=n/2thentmp=nottmp;count=1;elsecount=count+1;endif;endif;电子科技大学电子工程学院endprocess;clkout=tmp;endart;Ⅴ.边沿检测模块libraryieee;useieee.std_logic_1164.all;entityedgeisport(clk,a:in