vhdl课程设计简单处理器的设计与仿真大学毕设论文Word文档下载推荐.docx
《vhdl课程设计简单处理器的设计与仿真大学毕设论文Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《vhdl课程设计简单处理器的设计与仿真大学毕设论文Word文档下载推荐.docx(38页珍藏版)》请在冰豆网上搜索。
VHDL采用基于库(Library)的设计方法,可以建立各种可再次利用的模块。
这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中,就可以在以后的设计中进行复用,可以使设计成果在设计人员之间进行交流和共享,减少硬件电路设计。
1、设计任务
用VHDL设计一个简单的处理器,并完成相关的仿真测试。
2、设计说明
2.1处理器原理图及其组成
图1是一个处理器的原理图,它包含了一定数量的寄存器、一个复用器、一个加法/减法器(Addsub),一个计数器和一个控制单元。
图1简单处理器的电路图
2.2数据传输及加减法的实现
数据传输实现过程:
16位数据从DIN输入到系统中,可以通过复用器分配给R0~R7和A,复用器也允许数据从一个寄存器传通过Bus送到另外一个寄存器。
加法和减法的实现过程:
复用器先将一个数据通过总线放到寄存器A中,然后将另一个数据放到总线上,加法/减法器对这两个数据进行运算,运算结果存入寄存器G中,G中的数据又可根据要求通过复用器转存到其他寄存器中。
2.3处理器所支持的指令及功能说明、指令的编码规则
表1是该处理所支持的指令
表1
操作
功能
说明
mvRx,Ry
Rx←[Ry]
将Ry寄存器的值复制到Rx寄存器
mviRx,#D
Rx←Data
将Data值存入Rx寄存器
addRx,Ry
Rx←[Rx]+[Ry]
先将Rx和Ry寄存器的值相加,再把相加的值存入Rx寄存器
subRx,Ry
Rx←[Rx]-[Ry]
先将Rx和Ry寄存器的值相减,再把相减的值存入Rx寄存器
所有指令都按9位编码(取自DIN的高9位)存储在指令寄存器IR中,编码规则为IIIXXXYYY,III表示指令,XXX表示Rx寄存器,YYY表示Ry寄存器。
立即数#D是在mvi指令存储到IR中之后,通过16位DIN输入的。
如表2所示
表2
2.4指令执行的时序控制
有一些指令,如加法指令和减法指令,需要在总线上多次传输数据,因此需要多个时钟周期才能完成。
控制单元使用了一个两位计数器来区分这些指令执行的每一个阶段。
当Run信号置位时,处理器开始执行DIN输入的指令。
当指令执行结束后,Done信号置位,表3列出四个指令在执行过程中每一个时间段置位的控制信号。
图2列出了处理器的状态转换图
表3:
时间
指令
T0
T1
T2
T3
(mv):
I0
(mvi):
I1
(add):
I2
(sub):
I3
IRin
RYout,RXin,Done
DINout,RXin,Done
RXout,Ain
----
RYout,Gin,Addsub
Gout,RXin,Done
图2,处理器状态转换图
3.处理器指令实现的功能及其具体描述
3.1mvRx,Ry
实现的功能:
将寄存器Rx的值赋给寄存器Ry(以mvR0,R5为例)
(1)计数器为“00”时,指令寄存器的置位控制信号输入端IRin=1有效,将DIN输入的数据的高9位锁存。
置位的控制信号如图3加粗黑线所示。
图3
(2)计数器为“01”时,首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让R5的值输出到总线上,然后控制单元控制寄存器R0将总线上的值锁存,完成整个寄存器对寄存器的赋值过程。
置位的控制信号和数据流如图4加粗黑线所示。
图4
3.2mviRx,#D
将的立即数#D赋给寄存器Rx(以mvR0,#D为例)
(1)计数器为“00”时,指令寄存器的置位控制信号输入端IRin=1有效,将DIN输入的数据的高9位锁存。
置位的控制信号如图5加粗黑线所示。
图5
(2)计数器为“01”时,首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让DIN的值输出到总线上,然后控制单元控制寄存器R0将总线上的值锁存,完成整个立即数对寄存器的赋值过程。
置位的控制信号和数据流如图6加粗黑线所示。
图6
3.3addRx,Ry和subRx,Ry
将寄存器Ry的值加上/减去寄存器Rx的值并赋给寄存器Rx(以add/subR0,R1为例)。
置位的控制信号如图7加粗黑线所示。
图7
(2)计数器为“01”时,首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让R0的值输出到总线上,然后控制单元控制寄存器A将总线上的值锁存。
置位的控制信号和数据流如图8加粗黑线所示。
图8
(3)计数器为“10”时,首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让R1的值输出到总线上,然后控制单元控制加法/减法器addsub将寄存器A的值和总线上的值相加/相减并输出,接着寄存器G将加法/减法器addsub的计算结果锁存。
置位的控制信号和数据流如图9加粗黑线所示。
图9
(4)计数器为“11”时,首先控制单元向复用器发出选通控制信号,复用器根据该控制信号让寄存器G的值输出到总线上,寄存器R0将总线上的值进行锁存,完成整个寄存器与对寄存器见加减法的运算过程。
置位的控制信号和数据流如图10加粗黑线所示。
图10
4单元模块设计说明、VHDL代码及其仿真
4.1寄存器RX
寄存器R0~R7用于数据的存储。
当时钟输入clock的上升沿到来且RXin=1时,将数据输入端datain[15..0]的数据锁存到寄存器中并从数据输出端dataout[15..0]输出;
当RXin=0时,输出端保持原来的值不变。
图11
寄存器RX的VHDL代码:
libraryieee;
useieee.std_logic_1164.all;
entityRXis
port(
RXin,clock:
instd_logic;
datain:
instd_logic_vector(15downto0);
dataout:
outstd_logic_vector(15downto0)
);
endRX;
architecturebehaveofRXis
signaldatabuffer:
std_logic_vector(15downto0);
begin
process(clock,RXin,datain,databuffer)
if(clock'
eventandclock='
1'
)then
if(RXin='
)thendatabuffer<
=datain;
elsedatabuffer<
=databuffer;
endif;
elsedatabuffer<
dataout<
endprocess;
endbehave;
4.2寄存器A
寄存器A用于数据的存储,当时钟输入clock的上升沿到来且Ain=1时,将数据输入端datain[15..0]的数据锁存到寄存器中并从数据输出端dataout[15..0]输出;
当处理加减法时,将时间T1时总线送过来的数据暂存,当T2时,将T1时存储在A中的数据与总线传输过来的数据在Addsub中进行加减运算,并将结果并输出到寄存器G中。
图12
寄存器A的VHDL代码:
entityAis
Ain,clock:
endA;
architecturebehaveofAis
process(clock,Ain,datain,databuffer)
if(Ain='
4.3加/减法器addsub
加/减法器addsub用于处理两个输入的数据datain2[15..0]和datain1[15..0],当控制端Addsub=1时,两个数据输入端datain2[15..0]和datain1[15..0]相加并从数据输出端dataout[15..0]输出;
当控制端Addsub=0时,数据输入端datain2[15..0]减去datain1[15..0],结果从数据输出端dataout[15..0]输出。
图13
加/减法器addsub的VHDL代码:
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityaddsubis
Addsub:
datain1:
datain2:
endaddsub;
architecturebehaveofaddsubis
process(Addsub,datain1,datain2,databuffer)
if(Addsub='
=datain2+datain1;
elsif(Addsub='
0'
=datain2-datain1;
4.4寄存器G
寄存器G用于加减运算结果的存储,当时钟输入clock的上升沿到来且Gin=1时,将数据输入端datain[15..0]的数据锁存到寄存器中并从数据输出端dataout[15..0]输出;
图14
寄存器G的VHDL代码:
entityGis
Gin,clock:
endG;
architecturebehaveofGis
process(clock,Gin,datain,databuffer)
if(Gin='
4.5指令寄存器IR
指令寄存器IR用于对输入的16为指令进行处理,取其高9位。
当时钟输入clock的上升沿到来且IRin=1时,取数据输入端datain[15..0]的高9位将其锁存到寄存器中并从数据输出端dataout[8..0]输出;
图15
指令寄存器IR的VHDL代码
entityIRis
IRin,clock:
outstd_logic_vector(8downto0)
endIR;
architecturebehaveofIRis
std_logic_vector(8downto0);
process(clock,IRin,datain,databuffer)
if(IRin='
=datain(15downto7);
4.6计数器upcount
计数器upcount用于产生控制单元的输入脉冲,对控制单元的工作时序进行控制。
当clear=0时(清零端clear无效),时钟输入clock每来一个上升沿,输出Q[1..0]加1,所以输出为00——>
01——>
10——>
11——>
00不断循环;
当clear=1时(清零端clear有效),对输出Q[1..0]异步清零,与时钟无关。
图16
计数器upcount的VHDL代码
useieee.std_logic_signed.all;
entityupcountis
port(clear,clock:
Q:
outstd_logic_vector(1downto0));
endupcount;
architectureBehaviorofupcountis
signalcount:
std_logic_vector(1downto0);
process(Clock)
ifclear='
then--------clear='
cleariseffective
count<
="
00"
;
elsecount<
=count+1;
Q<
=count;
endBehavior;
4.7复用器multi
复用器根据控制单元的控制信号将指定的输入数据输出到总线上。
来自控制单元的控制信号为R0out~R7out、Gout、DINout,输入数据位来自寄存器R0~R7、寄存器A、数据输入端DIN,当控制信号的某一位为1时,将其对应的输入数据输出到总线上。
图17
复用器multi的VHDL代码
entitymultiis
R0in:
R1in:
R2in:
R3in:
R4in:
R5in:
R6in:
R7in:
DIN:
Gin:
R0out:
instd_logic;
R1out:
R2out:
R3out:
R4out:
R5out:
R6out:
R7out:
Gout:
DINout:
buswire:
bufferstd_logic_vector(15downto0)
endmulti;
architecturebehaveofmultiis
signalselect_signal:
std_logic_vector(9downto0);
select_signal<
=R7out&
R6out&
R5out&
R4out&
R3out&
R2out&
R1out&
R0out&
Gout&
DINout;
process(databuffer,R0in,R1in,R2in,R3in,R4in,R5in,R6in,R7in,DIN,Gin,R7out,R6out,R5out,R4out,R3out,R2out,R1out,R0out,Gout,DINout)
caseselect_signalis
when"
0000000001"
=>
databuffer<
=DIN;
0000000010"
=Gin;
0000000100"
=R0in;
0000001000"
=R1in;
0000010000"
=R2in;
0000100000"
=R3in;
0001000000"
=R4in;
0010000000"
=R5in;
0100000000"
=R6in;
1000000000"
=R7in;
whenothers=>
null;
endcase;
buswire<
4.8控制单元control
控制单元根据计数器发出的脉冲和DIN输入的操作指令对整个系统的其他模块进行控制,完成指定的操作。
图18
控制单元control的VHDL代码
useieee