vhdl课程设计简单处理器的设计与仿真.docx
- 文档编号:27915235
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:44
- 大小:507.79KB
vhdl课程设计简单处理器的设计与仿真.docx
《vhdl课程设计简单处理器的设计与仿真.docx》由会员分享,可在线阅读,更多相关《vhdl课程设计简单处理器的设计与仿真.docx(44页珍藏版)》请在冰豆网上搜索。
vhdl课程设计简单处理器的设计与仿真
前言
VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于1982年。
1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
与其他硬件描述语言相比,VHDL具有以下特点:
(1)功能强大、设计灵活
VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。
它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。
VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言所不能比拟的。
VHDL还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。
(2)支持广泛、易于修改
由于VHDL已经成为IEEE标准所规范的硬件描述语言,目前大多数EDA工具几乎都支持VHDL,这为VHDL的进一步推广和广泛应用奠定了基础。
在硬件电路设计过程中,主要的设计文件是用VHDL编写的源代码,因为VHDL易读和结构化,所以易于修改设计。
(3)强大的系统硬件描述能力
VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门级电路。
而描述既可以采用行为描述、寄存器传输描述或结构描述,也可以采用三者混合的混合级描述。
另外,VHDL支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型。
VHDL支持预定义的和自定义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创建高层次的系统模型。
(4)独立于器件的设计、与工艺无关
设计人员用VHDL进行设计时,不需要首先考虑选择完成设计的器件,就可以集中精力进行设计的优化。
当设计描述完成后,可以用多种不同的器件结构来实现其功能。
(5)很强的移植能力
VHDL是一种标准化的硬件描述语言,同一个设计描述可以被不同的工具所支持,使得设计描述的移植成为可能。
(6)易于共享和复用
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
IRin
IRin
IRin
RYout,RXin,Done
DINout,RXin,Done
RXout,Ain
RXout,Ain
----
----
RYout,Gin,Addsub
RYout,Gin,Addsub
----
----
Gout,RXin,Done
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为例)。
(1)计数器为“00”时,指令寄存器的置位控制信号输入端IRin=1有效,将DIN输入的数据的高9位锁存。
置位的控制信号如图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)
begin
if(clock'eventandclock='1')then
if(RXin='1')thendatabuffer<=datain;
elsedatabuffer<=databuffer;
endif;
elsedatabuffer<=databuffer;
endif;
dataout<=databuffer;
endprocess;
endbehave;
4.2寄存器A
寄存器A用于数据的存储,当时钟输入clock的上升沿到来且Ain=1时,将数据输入端datain[15..0]的数据锁存到寄存器中并从数据输出端dataout[15..0]输出;当RXin=0时,输出端保持原来的值不变。
当处理加减法时,将时间T1时总线送过来的数据暂存,当T2时,将T1时存储在A中的数据与总线传输过来的数据在Addsub中进行加减运算,并将结果并输出到寄存器G中。
图12
寄存器A的VHDL代码:
libraryieee;
useieee.std_logic_1164.all;
entityAis
port(
Ain,clock:
instd_logic;
datain:
instd_logic_vector(15downto0);
dataout:
outstd_logic_vector(15downto0)
);
endA;
architecturebehaveofAis
signaldatabuffer:
std_logic_vector(15downto0);
begin
process(clock,Ain,datain,databuffer)
begin
if(clock'eventandclock='1')then
if(Ain='1')thendatabuffer<=datain;
elsedatabuffer<=databuffer;
endif;
elsedatabuffer<=databuffer;
endif;
dataout<=databuffer;
endprocess;
endbehave;
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代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityaddsubis
port(
Addsub:
instd_logic;
datain1:
instd_logic_vector(15downto0);
datain2:
instd_logic_vector(15downto0);
dataout:
outstd_logic_vector(15downto0)
);
endaddsub;
architecturebehaveofaddsubis
signaldatabuffer:
std_logic_vector(15downto0);
begin
process(Addsub,datain1,datain2,databuffer)
begin
if(Addsub='1')thendatabuffer<=datain2+datain1;
elsif(Addsub='0')thendatabuffer<=datain2-datain1;
elsedatabuffer<=databuffer;
endif;
dataout<=databuffer;
endprocess;
endbehave;
4.4寄存器G
寄存器G用于加减运算结果的存储,当时钟输入clock的上升沿到来且Gin=1时,将数据输入端datain[15..0]的数据锁存到寄存器中并从数据输出端dataout[15..0]输出;当RXin=0时,输出端保持原来的值不变。
图14
寄存器G的VHDL代码:
libraryieee;
useieee.std_logic_1164.all;
entityGis
port(
Gin,clock:
instd_logic;
datain:
instd_logic_vector(15downto0);
dataout:
outstd_logic_vector(15downto0)
);
endG;
architecturebehaveofGis
signaldatabuffer:
std_logic_vector(15downto0);
begin
process(clock,Gin,datain,databuffer)
begin
if(clock'eventandclock='1')then
if(Gin='1')thendatabuffer<=datain;
elsedatabuffer<=databuffer;
endif;
elsedatabuffer<=databuffer;
endif;
dataout<=databuffer;
endprocess;
endbehave;
4.5指令寄存器IR
指令寄存器IR用于对输入的16为指令进行处理,取其高9位。
当时钟输入clock的上升沿到来且IRin=1时,取数据输入端datain[15..0]的高9位将其锁存到寄存器中并从数据输出端dataout[8..0]输出;当RXin=0时,输出端保持原来的值不变。
图15
指令寄存器IR的VHDL代码
libraryieee;
useieee.std_logic_1164.all;
entityIRis
port(
IRin,clock:
instd_logic;
datain:
instd_logic_vector(15downto0);
dataout:
outstd_logic_vector(8downto0)
);
endIR;
architecturebehaveofIRis
signaldatabuffer:
std_logic_vector(8downto0);
begin
process(clock,IRin,datain,databuffer)
begin
if(clock'eventandclock='1')then
if(IRin='1')thendatabuffer<=datain(15downto7);
elsedatabuffer<=databuffer;
endif;
elsedatabuffer<=databuffer;
endif;
dataout<=databuffer;
endprocess;
endbehave;
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代码
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_signed.all;
entityupcountis
port(clear,clock:
instd_logic;
Q:
outstd_logic_vector(1downto0));
endupcount;
architectureBehaviorofupcountis
signalcount:
std_logic_vector(1downto0);
begin
process(Clock)
begin
if(clock'eventandclock='1')then
ifclear='1'then--------clear='1'cleariseffective
count<="00";
elsecount<=count+1;
endif;
endif;
endprocess;
Q<=count;
endBehavior;
4.7复用器multi
复用器根据控制单元的控制信号将指定的输入数据输出到总线上。
来自控制单元的控制信号为R0out~R7out、Gout、DINout,输入数据位来自寄存器R0~R7、寄存器A、数据输入端DIN,当控制信号的某一位为1时,将其对应的输入数据输出到总线上。
图17
复用器multi的VHDL代码
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitymultiis
port(
R0in:
instd_logic_vector(15downto0);
R1in:
instd_logic_vector(15downto0);
R2in:
instd_logic_vector(15downto0);
R3in:
instd_logic_vector(15downto0);
R4in:
instd_logic_vector(15downto0);
R5in:
instd_logic_vector(15downto0);
R6in:
instd_logic_vector(15downto0);
R7in:
instd_logic_vector(15downto0);
DIN:
instd_logic_vector(15downto0);
Gin:
instd_logic_vector(15downto0);
R0out:
instd_logic;
R1out:
instd_logic;
R2out:
instd_logic;
R3out:
instd_logic;
R4out:
instd_logic;
R5out:
instd_logic;
R6out:
instd_logic;
R7out:
instd_logic;
Gout:
instd_logic;
DINout:
instd_logic;
buswire:
bufferstd_logic_vector(15downto0)
);
endmulti;
architecturebehaveofmultiis
signalselect_signal:
std_logic_vector(9downto0);
signaldatabuffer:
std_logic_vector(15downto0);
begin
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)
begin
caseselect_signalis
when"0000000001"=>databuffer<=DIN;
when"0000000010"=>databuffer<=Gin;
when"0000000100"=>databuffer<=R0in;
when"0000001000"=>databuffer<=R1in;
when"0000010000"=>databuffer<=R2in;
when"0000100000"=>databuffer<=R3in;
when"0001000000"=>databuffer<=R4in;
when"0010000000"=>databuffer<=R5in;
when"0100000000"=>databuffer<=R6in;
when"1000000000"=>databuffer<=R7in;
whenothers=>null;
endcase;
buswire<=databuffer;
endprocess;
endbehave;
4.8控制单元control
控制单元根据计数器发出的脉冲和DIN输入的操作指令对整个系统的其他模块进行控制,完成指定的操作。
图18
控制单元control的VHDL代码
libraryieee;
useieee.std_logic_1164.all;
useieee.std_l
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vhdl 课程设计 简单 处理器 设计 仿真
![提示](https://static.bdocx.com/images/bang_tan.gif)