vhdl课程设计简单处理器的设计与仿真大学毕设论文Word文档下载推荐.docx

上传人:b****5 文档编号:19663829 上传时间:2023-01-08 格式:DOCX 页数:38 大小:508.22KB
下载 相关 举报
vhdl课程设计简单处理器的设计与仿真大学毕设论文Word文档下载推荐.docx_第1页
第1页 / 共38页
vhdl课程设计简单处理器的设计与仿真大学毕设论文Word文档下载推荐.docx_第2页
第2页 / 共38页
vhdl课程设计简单处理器的设计与仿真大学毕设论文Word文档下载推荐.docx_第3页
第3页 / 共38页
vhdl课程设计简单处理器的设计与仿真大学毕设论文Word文档下载推荐.docx_第4页
第4页 / 共38页
vhdl课程设计简单处理器的设计与仿真大学毕设论文Word文档下载推荐.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

vhdl课程设计简单处理器的设计与仿真大学毕设论文Word文档下载推荐.docx

《vhdl课程设计简单处理器的设计与仿真大学毕设论文Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《vhdl课程设计简单处理器的设计与仿真大学毕设论文Word文档下载推荐.docx(38页珍藏版)》请在冰豆网上搜索。

vhdl课程设计简单处理器的设计与仿真大学毕设论文Word文档下载推荐.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1