1、第三次试验报告课程名称 数字系统EDA技术 实验题目处理器核心电路的设计及验证一、实验目的 1、进一步掌握Altera DE2-115开发平台的使用; 2、掌握Quartus软件设计流程; 3、掌握一个处理器核心电路的基本结构及设计方法; 4、掌握状态机的设计方法; 5、进一步掌握如何编写testBench,并利用Modelsim进行仿真。二、实验环境 1、预装开发环境Quartus11.0以上的版本和仿真工具软件Modelsim的计算机; 2、DE2-115开发板一套。三、实验内容1、 利用层次化的设计方法使用VHDL语言设计一个简单的处理器;2、 设计一个应用程序用于验证所设计的处理器的功
2、能。四、实验原理1、一个最基本处理器的主要部件的构成如下图所示,一个最基本的处理器应该包括一些寄存器,一个多路选择器、一个加法/减法单元、计数器和一个控制单元。其中,寄存器的位宽可以选择8位、16位、32位、64位。以下均以16位为例来说明所设计的处理器的基本结构。处理器所处理的输入数据通过多路复用器加载到不同的寄存器内,寄存器分别定义为R0、R1、R2、R3、R4、R5、R6、R7和A。各个寄存器之间可以相互传递数据。复用器的输出称之为总线。该总线容许数据从一个位置传递到另一个位置。加法/减法单元首先通过多路复用器将一个16位数加载到寄存器A中,寄存器A固定作为加法/减法单元的一个操作数。加
3、法/减法单元的第二个操作数将通过总线传至加法/减法单元的另一个数据输入接口,完成运算操作后的数据存入寄存器G内。寄存器G的值可通过复用器将其搬移到需要的位置。图1 处理器内部结构图 在控制单元的控制下,每个时钟周期可完成不同的操作。这个控制单元决定什么数据放在总线上,并且控制哪个寄存器加载总线上的数据。例如,将寄存器R0的值加载到寄存器A内,可在两个时钟周期内完成,第一个时钟周期是将R0的值放在总线上,第二个周期则将总线上的数据加载到寄存器A内。 2、处理器的操作处理器可通过各种指令来进行所需要的操作。下表列出了本次实验需要完成的4条指令及相应的功能。mv Rx, Ry 表示将Ry寄存器内的数
4、据移到Rx寄存器内。mvi Rx, #D 表示将立即数送到Rx寄存器内。add Rx, Ry 表示将Rx和Ry寄存器内的数据相加,结果存入Rx寄存器内。sub Rx,Ry 表示将Rx和Ry寄存器内的数据相加减,结果存入Rx寄存器内。指令可通过编码后存入IR寄存器内。IR寄存器可以使用9位表示。如IIIXXXYYY。其中III表示指令,XXX代表Rx寄存器,YYY代表Ry寄存器。IR必须连接到16位数据输入脚上(可以是低9位或高9位)。对于mvi指令,YYY域不用,立即数#D在mvi指令存入IR寄存器后由16位数据输入口送入。对于加法和减法指令,由于该类操作需要多次占用总线,因此完成这类操作需要
5、多个时钟周期。为此可增加一个2位的计数器counter。当RUN有效时计数器counter开始计数,即检测到开始执行加法/减法操作,当指令执行完毕后Done有效,此时清空counter计数器,可以进行下一指令的操作。表1处理器操作指令操作所完成的功能mv Rx, RyRx - Rymvi Rx, #DRx - Dadd Rx, RyRx - Rx + Rysub Rx, RyRx Rx, 001: R1 - Rx, . , 111: R7 - Rx-YYY: select Ry value : 000: R0 - Ry, 001: R1 - Ry, . , 111: R7 - Ry-resou
6、rces-8 16-bit registers: R0 R7 -1 16-bit ALU(Add or subtract)-Operation timing- 1 2 3 4 5 6-clk _|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_-Run _|-|_-DIn =-Done _|-|_ mv or mvi-procBus= Bus valid data-R7:0 = R7:0 valid data(delay a clock period) -Done _|-|_ add or sub-procBus=-R7:0 =R7:0 v
7、alid data(delay a clock period)- : Valid Instruction-: Valid Data-库、程序包的声明library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; -有符号的加减运算-处理器的输入和输出口entity simProc isgeneric (BusWidth : integer :=16);port(DIn : in std_logic_vector(BusWidth-1 downto 0); -16-bit data input portnARst
8、 : in std_logic ; -reset signal, low activeclk : in std_logic ; -clock input, can be obtained through 50 MHZ frequency -divider or through a button of DE2_115 boardRun: in std_logic ; -high active, Keep at least one clock cycleDone: out std_logic; -operation over, high activeprocBus: out std_logic_v
9、ector(BusWidth-1 downto 0); -output processor bus statIndic: out std_logic_vector(2 downto 0) -state indicators);end simProc ;architecture arch of simProc issignal highLevel : std_logic ;signal upCntClr: std_logic ;signal cntRst: std_logic ;signal procBusReg: std_logic_vector(BusWidth-1 downto 0); -
10、register procBus -IR(2 downto 0): RY register-IR(5 downto 3): RX register-IR(8 downto 6): resprents Instruction signal IR: std_logic_vector(8 downto 0) ; -9-bit Instruction-mv: I=0 -mvi: I=1-add: I=2-sub: I=3signal I : std_logic_vector(2 downto 0); -Instruction registersignal Xreg, Yreg: std_logic_v
11、ector(7 downto 0) ;-Indicate which registers(R0 R7) -R0 R7 registerssignal R0, R1, R2, R3, R4, R5, R6, R7: std_logic_vector(BusWidth-1 downto 0) ;-write enable signals of R0 R7 registerssignal Rin: std_logic_vector(7 downto 0) ;- operand Rx and Rysignal Rx, Ry: std_logic_vector(BusWidth-1 downto 0)
12、;-A register which is used to save Rx operand when to add or subtract operationsignal A: std_logic_vector(BusWidth-1 downto 0) ;-write enable signal of A register-signal A_En: std_logic ; -Hidden in the program-save add/subtract result signal G: std_logic_vector(BusWidth-1 downto 0) ;-operation step
13、s-signal Tstep_Q :std_logic_vector(1 downto 0) ;type Tstep is (Tstep_Q0, Tstep_Q1, Tstep_Q2, Tstep_Q3) ;signal currentOpState : std_logic_vector(1 downto 0) ;signal nextOpState : Tstep ;component dec3to8 isport(w: in std_logic_vector(2 downto 0); En: in std_logic; Y: out std_logic_vector(7 downto 0)
14、;end component ;component regn isgeneric (regWidth: integer:=16);port(R: in std_logic_vector(regWidth-1 downto 0); nRst: in std_logic ; Rin, clk: in std_logic ; Q: out std_logic_vector(regWidth-1 downto 0);end component ;begin-highLevel = 1 ;procBus = procBusReg ;-decode IR registerI BusWidth)port m
15、ap(procBusReg, nARst, Rin(0), clk, R0);reg_1: regn generic map(regWidth = BusWidth)port map(procBusReg, nARst, Rin(1), clk, R1);reg_2: regn generic map(regWidth = BusWidth)port map(procBusReg, nARst, Rin(2), clk, R2);reg_3: regn generic map(regWidth = BusWidth)port map(procBusReg, nARst, Rin(3), clk
16、, R3);reg_4: regn generic map(regWidth = BusWidth)port map(procBusReg, nARst, Rin(4), clk, R4);reg_5: regn generic map(regWidth = BusWidth)port map(procBusReg, nARst, Rin(5), clk, R5);reg_6: regn generic map(regWidth = BusWidth)port map(procBusReg, nARst, Rin(6), clk, R6);reg_7: regn generic map(reg
17、Width = BusWidth)port map(procBusReg, nARst, Rin(7), clk, R7);-Determine which registers are used according to IR instructiuon-RxRx = R0 when IR(5 downto 3) = 000 else R1 when IR(5 downto 3) = 001 else R2 when IR(5 downto 3) = 010 else R3 when IR(5 downto 3) = 011 else R4 when IR(5 downto 3) = 100 e
18、lse R5 when IR(5 downto 3) = 101 else R6 when IR(5 downto 3) = 110 else R7 ;-RyRy = R0 when IR(2 downto 0) = 000 else R1 when IR(2 downto 0) = 001 else R2 when IR(2 downto 0) = 010 else R3 when IR(2 downto 0) = 011 else R4 when IR(2 downto 0) = 100 else R5 when IR(2 downto 0) = 101 else R6 when IR(2
19、 downto 0) = 110 else R7 ;-instruction operation state machineprocess(clk, nARst)beginif (nARst = 0) then currentOpState = 00 ;elsif clkevent and clk = 1 then- currentOpState -Tstep_Q :T0 if (Run = 1) then currentOpState -Tstep_Q :T1 if (I = 010) or (I = 011) then currentOpState = 10 ; else currentO
20、pState -Tstep_Q : T2 if (I = 010) or (I = 011) then currentOpState = 11 ; else currentOpState - nextOpState -Tstep_Q :T3 currentOpState = 00 ;end case ;end if ;end process; -operationprocess(clk, nARst)beginif (nARst = 0) then Done = 0 ; Rin 0) ; statIndic(0) = 0 ; procBusReg 0) ; IR 0) ; G 0) ; els
21、if clkevent and clk = 1 thencase currentOpState is-load instructionwhen 00 = -Tstep_Q :T0 Done = 0 ; Rin 0) ; statIndic(0) = 0 ; if (Run = 1) then IR -Tstep_Q :T1 case I is when 000 = -mv Rx, Ry procBusReg = Ry ; Rin = Xreg ; Done -mvi Rx, #D procBusReg = DIn ; Rin = Xreg ; Done - add Rx, Ry A -inpu
22、t error statIndic(0) -Tstep_Q : T2 case I is when 000 | 001 = statIndic(0) - add Rx, Ry G - sub Rx, Ry G statIndic(0) -Tstep_Q :T3 case I is when 000 | 001 = statIndic(0) - add Rx, Ry or sub Rx, Ry procBusReg = G ; Rin = Xreg ; Done statIndic(0) statIndic(0) = 1 ;end case ;end if ;end process;statIndic(2 downto 1) Y Y Y Y Y Y Y
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1