1、前言11、设计任务22、设计说明32.1 处理器原理图及其组成32.2数据传输及加减法的实现32.3处理器所支持的指令及功能说明、指令的编码规则42.4指令执行的时序控制43.处理器指令实现的功能及其具体描述63.1 mv Rx,Ry63.2 mvi Rx,#D73.3 add Rx,Ry和sub Rx,Ry84单元模块设计说明、VHDL代码及其仿真104.1寄存器RX104.2 寄存器A114.3 加/减法器addsub124.4 寄存器G134.5 指令寄存器IR144.6 计数器upcount154.7 复用器multi164.8 控制单元control184.9 控制指令输入转换模块2
2、64.10 16*16点阵显示控制模块275 处理器各个模块的连接及处理器功能仿真295.1处理器各个模块的连接295.2处理器功能仿真295.2.1立即数赋给寄存器R0295.2.2立即数赋给寄存器R1295.2.3 寄存器R0的值赋给寄存器R2295.2.4 寄存器R1的值赋给寄存器R3295.2.5立即数赋给寄存器R4295.2.6 寄存器R0加上R4赋给R0305.2.7 寄存器R1加上R4赋给R1305.2.6 寄存器R0加上R4赋给R0305.2.7立即数赋给寄存器R5305.2.8 寄存器R4减去R5赋给R4305.2.9 寄存器R4减去R0赋给R4306 处理器实现的功能与操作
3、说明316.1 处理器实现的功能316.2 处理器相关的操作说明317 课程设计总结328附录.34前言VHDL 的英文全名是 Very-High-Speed Integrated Circuit Hardware Description Language,诞生于 1982 年。1987 年底,VHDL被 IEEE 和美国国防部确认为标准硬件描述语言。 VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个
4、系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。与其他硬件描述语言相比,VHDL具有以下特点:(1)功能强大、设计灵活VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言所不能比拟的。VHDL还支持各种设计方法,既支持自底向上的设计,又支持自
5、顶向下的设计;既支持模块化设计,又支持层次化设计。(2)支持广泛、易于修改由于VHDL已经成为IEEE标准所规范的硬件描述语言,目前大多数EDA工具几乎都支持VHDL,这为VHDL的进一步推广和广泛应用奠定了基础。在硬件电路设计过程中,主要的设计文件是用VHDL编写的源代码,因为VHDL易读和结构化,所以易于修改设计。(3)强大的系统硬件描述能力VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门级电路。而描述既可以采用行为描述、寄存器传输描述或结构描述,也可以采用三者混合的混合级描述。另外,VHDL支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型。VHDL支持预定义的和自
6、定义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创建高层次的系统模型。(4)独立于器件的设计、与工艺无关设计人员用VHDL进行设计时,不需要首先考虑选择完成设计的器件,就可以集中精力进行设计的优化。当设计描述完成后,可以用多种不同的器件结构来实现其功能。(5)很强的移植能力VHDL是一种标准化的硬件描述语言,同一个设计描述可以被不同的工具所支持,使得设计描述的移植成为可能。(6)易于共享和复用VHDL采用基于库(Library)的设计方法,可以建立各种可再次利用的模块。这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中,就可以在以后的设计中进行复用,可以使设计
7、成果在设计人员之间进行交流和共享,减少硬件电路设计。1、设计任务用VHDL设计一个简单的处理器,并完成相关的仿真测试。 2、设计说明2.1 处理器原理图及其组成图1是一个处理器的原理图,它包含了一定数量的寄存器、一个复用器、一个加法/减法器(Addsub),一个计数器和一个控制单元。图1 简单处理器的电路图2.2数据传输及加减法的实现数据传输实现过程:16位数据从DIN输入到系统中,可以通过复用器分配给R0R7和A,复用器也允许数据从一个寄存器传通过Bus送到另外一个寄存器。加法和减法的实现过程:复用器先将一个数据通过总线放到寄存器A中,然后将另一个数据放到总线上,加法/减法器对这两个数据进行
8、运算,运算结果存入寄存器G中,G中的数据又可根据要求通过复用器转存到其他寄存器中。2.3处理器所支持的指令及功能说明、指令的编码规则表1是该处理所支持的指令表1 操作功能说明mv Rx, RyRx Ry将 Ry 寄存器的值复制到 Rx 寄存器mvi Rx, #DRx Data将 Data 值 存入 Rx寄存器add Rx, RyRx Rx + Ry先将 Rx 和 Ry寄存器的值相加,再把相加的值存入 Rx寄存器sub Rx, RyRx Rx - Ry先将 Rx 和 Ry 寄存器的值相减,再把相减的值存入 Rx 寄存器所有指令都按9位编码(取自DIN的高9位)存储在指令寄存器IR中,编码规则为I
9、IIXXXYYY,III表示指令,XXX表示Rx寄存器,YYY表示Ry寄存器。立即数#D是在mvi指令存储到IR中之后,通过16位DIN输入的。如表2所示表22.4指令执行的时序控制有一些指令,如加法指令和减法指令,需要在总线上多次传输数据,因此需要多个时钟周期才能完成。控制单元使用了一个两位计数器来区分这些指令执行的每一个阶段。当Run信号置位时,处理器开始执行DIN输入的指令。当指令执行结束后,Done信号置位,表3列出四个指令在执行过程中每一个时间段置位的控制信号。图2列出了处理器的状态转换图表3: 时间指令T0T1T2T3(mv):I0(mvi):I1(add):I2(sub):I3I
10、RinIRinIRinIRinRYout,RXin,DoneDINout,RXin,DoneRXout,AinRXout,Ain-RYout,Gin,AddsubRYout,Gin,Addsub-Gout,RXin,DoneGout,RXin,Done“00”IRin“10”Add/sub“01”mv“11”Add/sub“01”Add/sub“01”mvi“10”Add/sub图2,处理器状态转换图3.处理器指令实现的功能及其具体描述3.1 mv Rx,Ry实现的功能:将寄存器Rx的值赋给寄存器Ry(以mv R0, R5为例)(1 )计数器为“00”时,指令寄存器的置位控制信号输入端IRin
11、=1有效,将DIN输入的数据的高9位锁存。置位的控制信号如图3加粗黑线所示。图3(2)计数器为“01”时,首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让R5的值输出到总线上,然后控制单元控制寄存器R0将总线上的值锁存,完成整个寄存器对寄存器的赋值过程。置位的控制信号和数据流如图4加粗黑线所示。图43.2 mvi Rx,#D实现的功能:将的立即数#D赋给寄存器Rx(以mv R0, #D为例)(1)计数器为“00”时,指令寄存器的置位控制信号输入端IRin=1有效,将DIN输入的数据的高9位锁存。置位的控制信号如图5加粗黑线所示。图5(2)计数器为“
12、01”时,首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让DIN的值输出到总线上,然后控制单元控制寄存器R0将总线上的值锁存,完成整个立即数对寄存器的赋值过程。置位的控制信号和数据流如图6加粗黑线所示。图63.3 add Rx,Ry和sub Rx,Ry实现的功能:将寄存器Ry的值加上/减去寄存器Rx的值并赋给寄存器Rx(以add/sub R0,R1为例)。(1)计数器为“00”时,指令寄存器的置位控制信号输入端IRin=1有效,将DIN输入的数据的高9位锁存。置位的控制信号如图7加粗黑线所示。图7(2)计数器为“01”时,首先控制单元根据设计器为“
13、00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让R0的值输出到总线上,然后控制单元控制寄存器A将总线上的值锁存。置位的控制信号和数据流如图8加粗黑线所示。图8(3)计数器为“10”时,首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让R1的值输出到总线上,然后控制单元控制加法/减法器addsub将寄存器A的值和总线上的值相加/相减并输出,接着寄存器G将加法/减法器addsub的计算结果锁存。置位的控制信号和数据流如图9加粗黑线所示。图9(4)计数器为“11”时,首先控制单元向复用器发出选通控制信号,复用器根据该控制信号让寄存器G的
14、值输出到总线上,寄存器R0将总线上的值进行锁存,完成整个寄存器与对寄存器见加减法的运算过程。置位的控制信号和数据流如图10加粗黑线所示。图104单元模块设计说明、VHDL代码及其仿真4.1寄存器RX寄存器R0R7用于数据的存储。当时钟输入clock的上升沿到来且RXin=1时,将数据输入端datain15.0的数据锁存到寄存器中并从数据输出端dataout15.0输出;当RXin=0时,输出端保持原来的值不变。图11寄存器RX的VHDL代码: library ieee;use ieee.std_logic_1164.all;entity RX isport(RXin,clock : in st
15、d_logic;datain :in std_logic_vector(15 downto 0);dataout:out std_logic_vector(15 downto 0) );end RX;architecture behave of RX is signal databuffer:std_logic_vector(15 downto 0);beginprocess(clock,RXin,datain,databuffer)beginif (clockevent and clock=1) then if (RXin=1) then databuffer=datain; else da
16、tabuffer=databuffer;end if;else databuffer=databuffer;end if;dataout=databuffer;end process;end behave;4.2 寄存器A寄存器A用于数据的存储,当时钟输入clock的上升沿到来且Ain=1时,将数据输入端datain15.0的数据锁存到寄存器中并从数据输出端dataout15.0输出;当RXin=0时,输出端保持原来的值不变。当处理加减法时,将时间T1时总线送过来的数据暂存,当T2时,将T1时存储在A中的数据与总线传输过来的数据在Addsub中进行加减运算,并将结果并输出到寄存器G中。图12寄
17、存器A的VHDL代码:library ieee;use ieee.std_logic_1164.all;entity A isport(Ain,clock : in std_logic;datain :in std_logic_vector(15 downto 0);dataout:out std_logic_vector(15 downto 0) );end A;architecture behave of A is signal databuffer:std_logic_vector(15 downto 0);beginprocess(clock,Ain,datain,databuffer
18、)beginif (clockevent and clock=1) then if (Ain=1) then databuffer=datain; else databuffer=databuffer;end if;else databuffer=databuffer;end if;dataout=databuffer;end process;end behave;4.3 加/减法器addsub加/减法器addsub用于处理两个输入的数据datain215.0 和datain115.0,当控制端Addsub=1时,两个数据输入端datain215.0 和datain115.0相加并从数据输出端
19、dataout15.0输出;当控制端Addsub=0时,数据输入端datain215.0 减去datain115.0,结果从数据输出端dataout15.0输出。图 13加/减法器addsub的VHDL代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity addsub isport(Addsub : in std_logic;datain1 :in std_logic_vector(15 downto 0);datain2 :
20、in std_logic_vector(15 downto 0);dataout:out std_logic_vector(15 downto 0) );end addsub;architecture behave of addsub is signal databuffer:std_logic_vector(15 downto 0);beginprocess(Addsub,datain1,datain2,databuffer)begin if (Addsub=1) then databuffer=datain2+datain1; elsif (Addsub=0) then databuffe
21、r=datain2-datain1;else databuffer=databuffer;end if;dataout=databuffer;end process;end behave;4.4 寄存器G寄存器G用于加减运算结果的存储,当时钟输入clock的上升沿到来且Gin=1时,将数据输入端datain15.0的数据锁存到寄存器中并从数据输出端dataout15.0输出;当RXin=0时,输出端保持原来的值不变。图14寄存器G的VHDL代码:library ieee;use ieee.std_logic_1164.all;entity G isport(Gin,clock : in std
22、_logic;datain :in std_logic_vector(15 downto 0);dataout:out std_logic_vector(15 downto 0) );end G;architecture behave of G is signal databuffer:std_logic_vector(15 downto 0);beginprocess(clock,Gin,datain,databuffer)beginif (clockevent and clock=1) then if (Gin=1) then databuffer=datain; else databuf
23、fer=databuffer;end if;else databuffer=databuffer;end if;dataout=databuffer;end process;end behave;4.5 指令寄存器IR指令寄存器IR用于对输入的16为指令进行处理,取其高9位。当时钟输入clock的上升沿到来且IRin=1时,取数据输入端datain15.0的高9位将其锁存到寄存器中并从数据输出端dataout8.0输出;当RXin=0时,输出端保持原来的值不变。图15指令寄存器IR的VHDL代码library ieee;use ieee.std_logic_1164.all;entity IR
24、 isport(IRin,clock : in std_logic;datain :in std_logic_vector(15 downto 0);dataout:out std_logic_vector(8 downto 0) );end IR;architecture behave of IR is signal databuffer:std_logic_vector(8 downto 0);beginprocess(clock,IRin,datain,databuffer)beginif (clockevent and clock=1) then if (IRin=1) then da
25、tabuffer=datain(15 downto 7); else databuffer=databuffer;end if;else databuffer=databuffer;end if;dataout01101100不断循环;当clear=1时(清零端clear有效),对输出Q1.0异步清零,与时钟无关。图16计数器upcount的VHDL代码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_signed.all;entity upcount isport(clear, clock : in std_logic;
26、Q : out std_logic_vector(1 downto 0);end upcount;architecture Behavior of upcount issignal count : std_logic_vector(1 downto 0);beginprocess (Clock)beginif (clockevent and clock=1) thenif clear=1 then -clear=1 clear is effectivecount = 00;else count= count+1;end if;end if;end process;Q=count;end Beh
27、avior;4.7 复用器multi复用器根据控制单元的控制信号将指定的输入数据输出到总线上。来自控制单元的控制信号为R0outR7out、Gout、DINout,输入数据位来自寄存器R0R7、寄存器A、数据输入端DIN,当控制信号的某一位为1时,将其对应的输入数据输出到总线上。图17复用器multi的VHDL代码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity multi isport(R0in :in std_logic_v
28、ector(15 downto 0);R1in :in std_logic_vector(15 downto 0);R2in :in std_logic_vector(15 downto 0);R3in :in std_logic_vector(15 downto 0);R4in :in std_logic_vector(15 downto 0);R5in :in std_logic_vector(15 downto 0);R6in :in std_logic_vector(15 downto 0);R7in :in std_logic_vector(15 downto 0);DIN :in
29、std_logic_vector(15 downto 0);Gin :in std_logic_vector(15 downto 0);R0out :in std_logic;R1out :in std_logic;R2out :in std_logic;R3out :in std_logic;R4out :in std_logic;R5out :in std_logic;R6out :in std_logic;R7out :in std_logic;Gout :in std_logic;DINout :in std_logic;buswire:buffer std_logic_vector(
30、15 downto 0) );end multi;architecture behave of multi is signal select_signal:std_logic_vector(9 downto 0);signal databuffer:std_logic_vector(15 downto 0);beginselect_signaldatabufferdatabufferdatabufferdatabufferdatabufferdatabufferdatabufferdatabufferdatabufferdatabuffernull;end case;buswire=datab
31、uffer;end process;end behave;4.8 控制单元control控制单元根据计数器发出的脉冲和DIN输入的操作指令对整个系统的其他模块进行控制,完成指定的操作。图18控制单元control的VHDL代码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity control isport(Run :in std_logic;Reset :in std_logic;DIN_IR_9 :in std_logic_ve
32、ctor(8 downto 0);count :in std_logic_vector(1 downto 0);IRin :out std_logic;Gout :out std_logic;DINout :out std_logic;R0in,R1in,R2in,R3in,R4in,R5in,R6in,R7in:out std_logic;R0out,R1out,R2out,R3out,R4out,R5out,R6out,R7out :out std_logic;Gin :out std_logic;Ain :out std_logic;Addsub :out std_logic;Done
33、:out std_logic;clear :out std_logic);end control;architecture behave of control is -type state is (state0,state1,state2,state3);-signal current_state,next_state:state;signal IR_buffer:std_logic_vector (8 downto 0);-signal temp0:std_logic_vector (2 downto 0);beginprocess(Run,reset,count)beginIR_buffe
34、r IRin=0; Gout=0;DINout=0;R0in=0;R1in=0;R2in=0;R3in=0;R4in=0;R5in=0;R6in=0;R7in=0;R0out=0;R1out=0;R2out=0;R3out=0;R4out=0;R5out=0;R6out=0;R7out=0;Gin=0;Ain=0;Addsub=0;Done=0;clear=0; IRin -ttttttttttttttttttttttttttttttttttttttttt if(IR_buffer(8 downto 6)=000) then - mv Rx,Ry state1 IRin=0; Gout=0;D
35、INout=0;R0in=0;R1in=0;R2in=0;R3in=0;R4in=0;R5in=0;R6in=0;R7in=0;R0out=0;R1out=0;R2out=0;R3out=0;R4out=0;R5out=0;R6out=0;R7out=0;Gin=0;Ain=0;Addsub=0;Done=0;clear R0out=1; - test1_signalR0inR1inR2inR3inR4inR5inR6inR7in null; end case; when001= R1outR0inR1inR2inR3inR4inR5inR6inR7in null; end case; when010= R2outR0inR1inR2inR3inR4inR5inR6inR7in null; end case; when011= R3outR0inR1inR2inR3inR4inR5inR6inR7in null; end case;
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100