VHDL语言知识学习的主要描述语句.docx

上传人:b****7 文档编号:9451674 上传时间:2023-02-04 格式:DOCX 页数:24 大小:74.79KB
下载 相关 举报
VHDL语言知识学习的主要描述语句.docx_第1页
第1页 / 共24页
VHDL语言知识学习的主要描述语句.docx_第2页
第2页 / 共24页
VHDL语言知识学习的主要描述语句.docx_第3页
第3页 / 共24页
VHDL语言知识学习的主要描述语句.docx_第4页
第4页 / 共24页
VHDL语言知识学习的主要描述语句.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

VHDL语言知识学习的主要描述语句.docx

《VHDL语言知识学习的主要描述语句.docx》由会员分享,可在线阅读,更多相关《VHDL语言知识学习的主要描述语句.docx(24页珍藏版)》请在冰豆网上搜索。

VHDL语言知识学习的主要描述语句.docx

VHDL语言知识学习的主要描述语句

VHDL语言的主要描述语句

按照语句的执行顺序对VHDL语言进行分类,包含两类语句:

●并行描述语句该语句的执行与书写顺序无关,总是同时被执行

●顺序描述语句从仿真的角度,该语句是顺序执行的

进程语句(PROCESS)是最典型的并行语句,一个构造体内可以有几个进程语句同时存在,而且并发执行。

但是进程内部的所有语句都是顺序语句。

一、顺序描述语句

顺序描述语句只能用在进程和子程序中,它和其他高级语言一样,其语句是按照语句的出现的顺序加以执行的。

如下分别介绍有关的顺序描述语句.

1.WAIT语句

进程在执行过程中总是处于两种状态:

执行或挂起,进程的状态变化受等待语句的控制,当进程执行到等待语句,就被挂起,并等待再次执行进程.

等待语句的格式:

*WAIT无限等待

*WAITON敏感信号变化

*WAITUNTIL条件满足

*WAITFOR时间到

(1)WAITON

格式:

WAITON信号[,信号]

例5-1

PROCESS(a,b)

BEGIN

y<=aANDb;

ENDPROCESS;

该例中的进程与下例中进程相同:

例5-1

PROCESS

BEGIN

y<=aANDb;

WAITONa,b;

ENDPROCESS;

例5-2

PROCESS(a,b)

BEGIN

y<=aANDb;

WAITONa,b;

ENDPROCESS;

(2)WAITUNTIL直到条件满足

格式:

WAITUNTIL布尔表达式

当进程执行到该语句时,被挂起;若布尔表达式为真时,进程将被启动.

例:

WAITUNTIL((x*10)<100)

(3)WAITFOR 等到时间到

格式:

WAITFOR时间表达式

当进程执行到该语句时,被挂起;等待一定的时间后,进程将被启动.

例:

WAITFOR20ns;

WAITFOR(a*(b+c);

(4)多条件WAIT语句

例:

WAITONnmi,interruptUNTIL((nmi=TRUE)OR(interrupt=TRUE))FOR5us

该等待有三个条件:

第一,信号nmi和interrupt任何一个有一次刷新动作

第二,信号nmi和interrupt任何一个为真

第三,已等待5us

只要一个以上的条件被满足,进程就被启动.

*注意:

多条件等待时,表达式的值至少应包含一个信号量的值。

(5)超时等待

例5-3

例5-4

 

2.断言语句(ASSERT)

(主要用于仿真、调试)

格式:

ASSERT条件[REPORT输出信息][SEVERITY级别]

执行到断言语句时,判断条件,若条件满足就继续执行,否则输出文字串和错误级别信息.

例:

ASSERT(tiaojian=’1’)

REPORT“somethingwrong”

SEVERITYERROR;

3.信号代入语句

格式:

目的信号量<=信号量表达式

例:

a<=b;(注意区别小于等于)

4.变量赋值语句

格式:

目的变量:

=表达式

例:

c:

=a+d

5.IF语句

三种书写格式:

1)IF的门闩控制

格式:

IF条件THEN

顺序执行语句;

ENDIF;

例5-5

IF(a=’1’)THEN

c<=b;

ENDIF;

例5-6

2)IF语句的二选择控制

格式:

IF条件THEN

顺序执行语句;

ELSE

顺序执行语句;

ENDIF;

例5-7

ARCHITECTURErt1OFmux2IS

BEGIN

PROCESS(a,b,sel)

BEGIN

IF(sel=’1’)THEN

c<=a;

ELSE

c<=b;

ENDIF;

ENDPROCESS;

ENDrt1;

3)IF语句的多选择控制

格式:

IF条件THEN

顺序执行语句

ELSIF条件THEN

顺序执行语句

ELSIF条件THEN

顺序执行语句

ELSIF条件THEN

顺序执行语句

ENDIF;

例如:

5-8

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYmux4IS

PORT(input:

INSTD_LOGIC_VECTOR(3DOWNTO0);

sel:

INSTD_LOGIC_VECTOR(1DOWNTO0);

q:

OUTSTD_LOGIC);

ENDmux4;

ARCHITECTURErt1OFmux4IS

BEGIN

nn:

PROCESS(input,sel)

BEGIN

IF(sel='00')THEN

q<=input(0);

ELSIF(sel='01')THEN

q<=input

(1);

ELSIF(sel='10')THEN

q<=input

(2);

ELSE

q<=input(3);

ENDIF;

ENDPROCESSnn;

ENDrt1;

注意:

条件判断输出是布尔量。

6.CASE语句

常用来描述总线、编码和译码的行为。

格式:

CASE表达式IS

WHEN条件表达式=>顺序处理语句

END CASE;

其中WHEN的条件表达式可以有4种形式:

WHEN值=>顺序处理语句

WHEN值|值|值|…|值=>顺序处理语句

WHEN值TO值=>顺序处理语句

WHENOTHERS=>顺序处理语句

例:

5-9

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYmux43IS

PORT(a,b,i0,i1,i2,i3:

INSTD_LOGIC;

q:

OUTSTD_LOGIC);

ENDmux43;

ARCHITECTUREmux4_behaveOFmux43IS

SIGNALsel:

INTEGERRANGE0TO3;

BEGIN

nn:

PROCESS(a,b,i0,i1,i2,i3)

BEGIN

sel<=0;

IF(a='1')THEN

sel<=sel+1;

ENDIF;

IF(b='1')THEN

sel<=sel+2;

ENDIF;

CASEselIS

WHEN0=>q<=i0;

WHEN1=>q<=i1;

WHEN2=>q<=i2;

WHEN3=>q<=i3;

ENDCASE;

ENDPROCESSnn;

ENDmux4_behave;

 

例5-103-8译码器

LIBRARYieee;

USEieee.std_logic_1164.all;

entitydecoder38is

port(a,b,c,g1,g2a,g2b:

instd_logic;

y:

outstd_logic_vector(7downto0));

enddecoder38;

architecturebehave38OFdecoder38is

signalindata:

std_logic_vector(2downto0);

begin

indata<=c&b&a;

process(indata,g1,g2a,g2b)

begin

if(g1='1'andg2a='0'andg2b='0')then

caseindatais

when"000"=>y<="11111110";

when"001"=>y<="11111101";

when"010"=>y<="11111011";

when"011"=>y<="11110111";

when"100"=>y<="11101111";

when"101"=>y<="11011111";

when"110"=>y<="10111111";

when"111"=>y<="01111111";

whenothers=>y<="XXXXXXXX";

endcase;

else

y<="11111111";

endif;

endprocess;

endbehave38;

例5-11

LIBRARYieee;

USEieee.std_logic_1164.all;

entityencoderis

port(input:

instd_logic_vector(7downto0);

y:

outstd_logic_vector(2downto0));

endencoder;

architecturebehaveOFencoderis

begin

process(input)

begin

caseinputis

when”01111111”=>y<=“111”;

when”10111111”=>y<=“110”;

when”11011111”=>y<=“101”;

when”11101111”=>y<=“100”;

when”11110111”=>y<=“011”;

when”11111011”=>y<=“010”;

when”11111101”=>y<=“001”;

when”11111110”=>y<=“000”;

whenothers=>y<=“xxx”;

endcase;

endprocess;

endbehave;

表5-1优先级编码器的真值表

输入

输出

input(7)

input(6)

input(5)

input(4)

input(3)

input

(2)

input

(1)

input(0)

Y2

Y1

Y0

X

X

x

X

X

x

X

0

1

1

1

X

X

X

X

X

X

0

1

1

1

0

X

X

X

X

x

0

1

1

1

0

1

X

X

X

X

0

1

1

1

1

0

0

X

x

X

0

1

1

1

1

0

1

1

x

X

0

1

1

1

1

1

0

1

0

X

0

1

1

1

1

1

1

0

0

1

X

1

1

1

1

1

1

1

0

0

0

例5-12

LIBRARYieee;

USEieee.std_logic_1164.all;

entityprioris

port(input:

instd_logic_vector(7downto0);

y:

outstd_logic_vector(2downto0));

endprior;

architecturebe_priorOFprioris

begin

process(input)

begin

if(input(0)='0')then

y<="111";

elsif(input

(1)='0')then

y<="110";

elsif(input

(2)='0')then

y<="101";

elsif(input(3)='0')then

y<="100";

elsif(input(4)='0')then

y<="011";

elsif(input(5)='0')then

y<="010";

elsif(input(6)='0')then

y<="001";

else

y<="000";

endif;

endprocess;

endbe_prior;

 

7.LOOP语句

格式一:

[标号]:

FOR循环变量IN 离散范围 LOOP

顺序处理语句;

ENDLOOP[标号];

例:

ASUM:

FORiIN1TO9LOOP

sum=1+sum;

ENDLOOPASUM;

例5-13:

8位奇偶校验电路

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYpcIS

PORT(a:

INSTD_LOGIC_VECTOR(7DOWNTO0);

y:

OUTSTD_LOGIC);

ENDpc;

ARCHITECTUREbehaveOFpcIS

BEGIN

cbc:

PROCESS(a)

VARIABLEtmp:

STD_LOGIC;

BEGIN

tmp:

='0';

FORiIN0TO7LOOP

tmp:

=tmpXORa(i);

ENDLOOP;

y<=tmp;

ENDPROCESScbc;

ENDbehave;

格式二:

[标号]:

WHILE条件LOOP

顺序处理语句;

ENDLOOP[标号];

在该语句中,如果条件为真,则进行循环,否则结束循环.

例:

I:

=1;

sum:

=0

abcd:

WHILE(I<10)LOOP

sum:

=I+sum;

I:

=I+1;

ENDLOOPabcd;

例5-14:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYpcIS

PORT(a:

INSTD_LOGIC_VECTOR(7DOWNTO0);

y:

OUTSTD_LOGIC);

ENDpc;

ARCHITECTUREbehaveOFpcIS

BEGIN

cbc:

PROCESS(a)

VARIABLEtmp:

STD_LOGIC;

BEGIN

tmp:

='0';

i:

=0;

WHILE(i<8)LOOP

tmp:

=tmpXORa(i);

i=i+1;

ENDLOOP;

y<=tmp;

ENDPROCESScbc;

ENDbehave;

 

8.NEXT语句

在LOOP语句中用NEXT语句跳出循环.

格式:

NEXT[标号][WHEN条件];

NEXT语句用于控制内循环的结束.

例5-15:

PROCESS(a,b)

CONSTANTmax_limit:

INTEGER:

=255

BEGIN

FORIIN0TOmax_limitLOOP

IF(done(I)=TRUE)THEN

NEXT;

ELSEdone(I):

=TRUE;

ENDIF;

q(I)<=a(I)ANDb(I);

ENDLOOP;

ENDPROCESS;

9.EXIT语句

EXIT语句用于结束LOOP循环状态.

格式:

EXIT[标号][WHEN条件]

例5-16:

PROCESS(a)

VARIABLEint_a:

INTEGER;

BEGIN

int_a:

=a

FORI=0IN0TOmax_limitLOOP

IF(int_a<=0)THEN

EXIT;

ELSE

int_a:

=int_a-1;

q(I)<=3.1416/REAL(a*I);

ENDIF

ENDLOOP;

y<=q;

ENDPROCESS;

二、并发描述语句

1.进程语句

在一个构造体中多个PROCESS语句可以同时并行的执行,该语句有如下特点:

1)可以和其它进程语句同时执行,并可以存取构造体和实体中所定义的信号

2)进程中的所有语句都按照顺序执行

3)为启动进程,在进程中必须包含一个敏感信号表或WAIT语句

4)进程之间的通信是通过信号量来实现的

2.并发信号代入

代入语句在进程中使用是顺序语句,但是在进程外即在构造体中使用就是并发语句,相当于一个进程.

例:

ARCHITECTUREbehaveOFa_varIS

BEGIN

Output<=a(I);

ENDbehave;

可以等效于:

ARCHITECTUREbehaveOFa_varIS

BEGIN

ssPROCESS(a,I)

BEGIN

Output<=a(I);

ENDPROCESSss;

ENDbehave;

信号代入语句的右边可以是算数表达式,也可以是逻辑表达式,还可以是关系表达式,所以可以仿真加法器、乘法器、除法器、比较器和各种逻辑电路。

3.条件信号代入

条件代入语句也是并发语句,它可以将符合条件的表达式代入信号量。

格式:

目的信号量<=表达式1WHEN条件1

ELSE表达式2WHEN条件2

ELSE表达式3WHEN条件3

:

ELSE表达式n;

例5-17:

四选一电路

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYmux44IS

PORT(i0,i1,i2,i3,a,b:

INSTD_LOGIC;

q:

OUTSTD_LOGIC);

ENDmux44;

ARCHITECTUREaaOFmux44IS

SIGNALsel:

STD_LOGIC_VECTOR(1DOWNTO0);

BEGIN

sel<=b&a;

q<=i0WHENsel="00"ELSE

i1WHENsel="01"ELSE

i2WHENsel="10"ELSE

i3WHENsel="11";

ENDaa;

4.选择信号代入

格式:

WITH表达式样SELECT

目的信号量<=表达式1WHEN条件1

表达式2WHEN条件2

:

表达式nWHEN条件n;

该语句很象CASE语句.

例5-18:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYmux45IS

PORT(i0,i1,i2,i3,a,b:

INSTD_LOGIC;

q:

OUTSTD_LOGIC);

ENDmux45;

ARCHITECTUREbbOFmux45IS

SIGNALsel:

INTEGERrange0to3;

BEGIN

WITHselSELECT

q<=i0WHEN0,

i1WHEN1,

i2WHEN2,

i3WHEN3;

sel<=0WHENa='0'ANDb='0'ELSE

1WHENa='1'ANDb='0'ELSE

2WHENa='0'ANDb='1'ELSE

3WHENa='1'ANDb='1';

ENDbb;

5.并发过程调用语句

过程调用语句可以并发执行,但要注意如下问题:

●并发过程调用是一个完整的语句,在它之前可以加标号

●并发过程调用语句应带有IN,OUT或INOUT的参数,他们应该列在过程名后的括号内

●并发过程调用可以有多个返回值

例:

ARCHITECTURE….

BEGIN

vector_to_int(z,x_flag,q);

:

END;

等同于:

ARCHITECTURE….

BEGIN

PROCESS(z,q)

BEGIN

vector_to_int(z,x_flag,q);

:

ENDPROCESS;

END;

6.Block语句

7.通用模块调用语句Component

COMPONENT元件名

PORT说明;

ENDCOMPONENT;

8.端口映射语句

格式:

标号名:

元件名PORTMAP(信号,…);

9.参数传递语句

 

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYand2IS

GENERIC(rise,fall:

TIME);

PORT(a,b:

instd_logic;

c:

outstd_logic);

ENDand2;

ARCHITECTURErt1OFand2IS

SIGNALinternal:

std_logic;

BEGIN

internal<=aANDb;

c<=internalAFTER(rise)WHENinternal

ELSEinternalAFTER(fall);

ENDrt1;

 

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYsampleIS

GENERIC(rise,fall:

TIME);

PORT(ina,inb,inc,ind:

instd_logic;

q:

outstd_logic);

ENDsample;

ARCHITECTUREbehavOFsampleIS

COMPONENTand2;

GENERIC(rise,fall:

TIME);

PORT(a,b:

instd_logic;

c:

outstd_logic);

ENDCOMPONENT;

SIGNALU0-C,U1-C:

std_logic;

BEGIN

U0:

and2GENERICMAP(5ns,5ns)

PORTMAP(ina,inb,U0-C);

U1:

and2GENERICMAP(8ns,10ns)

PORTMAP(inc,ind,U1-C);

U0:

and2GENERICMAP(9ns,11ns)

PORTMAP(U0-c,U1-c,q);

ENDbehav;

另外三种顺序语句

1.RETURN

1.REPORT

3.NULL

FUNCTIONis_x(s:

STD_LOGIC_VECTOR)

RETURNBooleanIS

BEGIN

FORiINS’RANGELOOP

CASES(i)IS

WHEN‘U’|’X’|’Z’|’W’|’-‘=>RETURNTURE;

WHENOTHERS=>NULL;

ENDCASE;

RETURNFALSE;

END;

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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