VHDL基本语句课件_第1页
VHDL基本语句课件_第2页
VHDL基本语句课件_第3页
VHDL基本语句课件_第4页
VHDL基本语句课件_第5页
已阅读5页,还剩155页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1第10章

VHDL基本语句1第10章1第10章1第10章210.1顺序语句

10.1.1赋值语句

信号赋值语句变量赋值语句10.1.2IF语句

10.1.3CASE语句

单个普通数值,如6。数值选择范围,如(2TO4)。并列数值,如310。混合方式,以上三种方式的混合。

VHDL有6种基本顺序语句:赋值语句、流程控制语句、等待语句、子程序调用语句、返回语句、空操作语句.多条件选择值表达式的4种形式210.1顺序语句10.1.1赋值语句信号赋值语210.1顺序语句10.1.1赋值语句信号赋值语3(1)IF

条件句THEN

顺序语句

ELSIF

条件句THEN

顺序语句

ELSE

顺序语句

ENDIF;(2)IF

条件句THEN

顺序语句

ELSE

顺序语句

ENDIF;2.IF语句完全IF语句(3)IF

条件句THEN

顺序语句

ENDIF;(4)IF

条件句THEN

顺序语句

ELSIF

条件句THEN

顺序语句

ENDIF;不完全IF语句3(1)IF条件句THEN2.IF语句完全3(1)IF条件句THEN2.IF语句完全42.CASE

语句CASE<表达式>ISWhen<选择值1>=><顺序语句>;When<选择值2>=><顺序语句>;...Whenothers

=><顺序语句(或NULL)>;ENDCASE;•选择值可以有四种不同的表达方式:

单个普通数值:如6。

数值选择范围:如(2TO4),表示取值为2、3或4。

并列数值:如35,表示取值为3或者5。

混合方式:以上三种方式的混合。CASE语句的格式:42.CASE语句CASE<表达式>IS•选择42.CASE语句CASE<表达式>IS•选择5•用CASE语句应该注意三个问题:(1)关键字WHEN的数量不作限制,但不容许两个语句用一个值;(2)所有WHEN后面的值在CASE语句中合起来的值是值域中的全部;(3)WHEN语句的次序可以任意排定。

•CASE语句是VHDL提供的另一种形式的控制语句,每当单个表达式的值在多个起作用的项中选择时,用此语句是较合适的,它根据所给表达式的值或域,选择“=>”后面的执行语句。5•用CASE语句应该注意三个问题:(5•用CASE语句应该注意三个问题:(6[例]:用VHDL设计7段16进制译码器用CASE语句完成真值表的功能向7段数码管输出信号,最高位控制小数点6[例]:用VHDL设计7段16进制译码器用CASE语句完成6[例]:用VHDL设计7段16进制译码器用CASE语句完成7注意,此语句必须加入4位加法计数器7段译码器8位总线输出信号输出one;7注意,此语句必须加入4位加法7段译码器8位总线输出信号输出7注意,此语句必须加入4位加法7段译码器8位总线输出信号输出8KX康芯科技【例10-1】LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYmux41ISPORT(s4,s3,s2,s1:INSTD_LOGIC;z4,z3,z2,z1:OUTSTD_LOGIC);ENDmux41;

ARCHITECTUREactivOFmux41ISSIGNALsel:INTEGERRANGE0TO110;BEGINPROCESS(sel,s4,s3,s2,s1)BEGINsel<=0;--输入初始值

IF(s1='1')THENsel<=sel+1;ELSIF(s2='1')THENsel<=sel+2;ELSIF(s3='1')THENsel<=sel+4;ELSIF(s4='1')THENsel<=sel+8;ELSENULL;--注意,这里使用了空操作语句

ENDIF;z1<='0';z2<='0';z3<='0';z4<='0';--输入初始值

CASEselISWHEN0=>z1<='1';--当sel=0时选中

WHEN13=>z2<='1';--当sel为1或3时选中

WHEN4To72=>z3<='1';--当sel为2、4、5、6或7时选中

WHENOTHERS=>z4<='1';--当sel为8~110中任一值时选中

ENDCASE;

ENDPROCESS;

ENDactiv;

4选1选择器:根据4位输入码来确定4位输出中哪一位输出为1.8KX康芯科技【例10-1】4选1选择器:根据4位输入码来确8KX康芯科技【例10-1】4选1选择器:根据4位输入码来确910.1顺序语句

10.1.3CASE语句【例10-2】SIGNALvalue:INTEGERRANGE0TO110;SIGNALout1:STD_LOGIC;...CASEvalueIS--缺少以WHEN引导的条件句

ENDCASE;

...CASEvalueISWHEN0=>out1<='1';--value2~110的值未包括进去

WHEN1=>out1<='0';ENDCASE...CASEvalueISWHEN0TO10=>out1<='1';--选择值中10~10的值有重叠

WHEN10TO110=>out1<='0';ENDCASE;910.1顺序语句10.1.3CASE语句【例10910.1顺序语句10.1.3CASE语句【例101010.1顺序语句

10.1.3CASE语句与IF语句相比,CASE语句组的程序可读性比较好,这是因为它把条件中所有可能出现的情况全部列出来了,可执行条件一目了然.而且CASE语句的执行过程即条件性是独立的,排它的,而不像IF语句那样有一个逐项条件顺序比较的过程.CASE中条件句的次序是不重要的,其运行方式更接近于并行方式.一般地,综合后对相同的逻辑功能,CASE语句比IF语句的描述耗用更多的硬件资源,不但如此,对于有的逻辑,CASE语句无法描述.1010.1顺序语句10.1.3CASE语句与IF1010.1顺序语句10.1.3CASE语句与IF1110.1.4LOOP语句(1)单个LOOP语句,其语法格式如下:

[LOOP标号:]LOOP

顺序语句

ENDLOOP[LOOP标号

];...L2:LOOPa:=a+1;EXITL2WHENa>10;--当a大于10时跳出循环

ENDLOOPL2;...1110.1.4LOOP语句(1)单个LOOP语句,1110.1.4LOOP语句(1)单个LOOP语句,1210.1.4LOOP语句(2)FOR_LOOP语句,语法格式如下:

[LOOP标号:]FOR循环变量IN循环次数范围

LOOP

顺序语句

ENDLOOP[LOOP标号];

FOR后的”循环变量”是一个临时变量,属LOOP语句的局部变量,不必事先定义.这个变量只能作为赋值源,不能被赋值,它由LOOP语句自动定义.使用时应当注意,在LOOP语句范围内不要再使用其他与此循环变量同名的标识符.“循环次数范围”规定LOOP语句中的顺序语句被执行次数.循环变量从范围初值开始,每执行完一次顺序增1,直至最大值.1210.1.4LOOP语句(2)FOR_LOOP语1210.1.4LOOP语句(2)FOR_LOOP语13【例10-4】LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;ENTITYp_checkISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDp_check;

ARCHITECTUREoptOFp_checkISSIGNALtmp:STD_LOGIC;BEGINPROCESS(a)BEGINtmp<='0';FORnIN0TO7LOOPtmp<=tmpXORa(n);ENDLOOP;y<=tmp;ENDPROCESS;ENDopt;奇校验就是看2进制数的1的个数为奇数

就在校验位填0

偶数就填1

使1的个数变成奇数个.偶校验相反

把1的个数变成偶数.

然后传送数据,接收后在做相应的奇偶校验判断是否有位传送错误13【例10-4】奇校验就是看2进制数的1的个数为奇数

13【例10-4】奇校验就是看2进制数的1的个数为奇数

11410.1.4LOOP语句【例10-5】SIGNALa,b,c:STD_LOGIC_VECTOR(1TO3);...FORnIN1To3LOOPa(n)<=b(n)ANDc(n);ENDLOOP;此段程序等效于顺序执行以下三个信号赋值操作:a(1)<=b(1)ANDc(1);a(2)<=b(2)ANDc(2);a(3)<=b(3)ANDc(3);1410.1.4LOOP语句【例10-5】1410.1.4LOOP语句【例10-5】1410.11510.1顺序语句

10.1.10NEXT语句NEXT;

--第一种语句格式NEXTLOOP标号;

--第二种语句格式NEXTLOOP标号

WHEN条件表达式;

--第三种语句格式

对于第一种格式,当LOOP内的顺序语句执行到NEXT语句时,即刻无条件终止当前的循环,跳回到本次循环LOOP语句处,开始下一次循环.对于第二种格式,与第一种功能基本相似.只是在有多重LOOP语句嵌套时,前者可以跳转到指定标号的LOOP语句处.对于第三种格式,分句”WHEN条件表达式”是NEXT执行的条件,如果条件表达式为TRUE,则执行NEXT语句,进入跳转操作,否则继续向下执行.1510.1顺序语句10.1.10NEXT语句N1510.1顺序语句10.1.10NEXT语句N1610.1顺序语句

10.1.10NEXT语句【例10-6】...L1:FORcnt_valueIN1TO8LOOPs1:a(cnt_value):='0';NEXTWHEN(b=c);s2:a(cnt_value+8):='0';ENDLOOPL1;1610.1顺序语句10.1.10NEXT语句【1610.1顺序语句10.1.10NEXT语句【1710.1顺序语句

10.1.10NEXT语句【例10-7】...L_x:FORcnt_valueIN1TO8LOOPs1:a(cnt_value):='0';k:=0;L_y:LOOPs2:b(k):='0';NEXTL_xWHEN(e>f);s3:b(k+8):='0';k:=k+1;NEXTLOOPL_y;NEXTLOOPL_x;...嵌套LOOP语句跳转到标号处1710.1顺序语句10.1.10NEXT语句【1710.1顺序语句10.1.10NEXT语句【1810.1.6EXIT语句EXIT;

--第一种语句格式EXITLOOP标号;

--第二种语句格式EXITLOOP标号

WHEN条件表达式;--第三种语句格式

EXIT的每种格式都与NEXT语句的格式和功能类似.所不同的是,NEXT是跳转到LOOP语句的起点,而EXIT是跳转方向是LOOP标号制定的LOOP循环语句的结束处,即完全跳出指定的循环,并开始执行此循环外的语句.这就是说,NEXT语句是转向LOOP语句的起始点,而EXIT语句则是转向LOOP语句的终点.1810.1.6EXIT语句EXIT;1810.1.6EXIT语句EXIT;1910.1.6EXIT语句【例10-8】SIGNALa,b:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALa_less_then_b:Boolean;...a_less_then_b<=FALSE;--设初始值

FORiIN1DOWNTO0LOOPIF(a(i)='1'ANDb(i)='0')THENa_less_then_b<=FALSE;--a>bEXIT;ELSIF(a(i)='0'ANDb(i)='1')THENa_less_then_b<=TRUE;--a<bEXIT;ELSENULL;ENDIF;ENDLOOP;--当

i=1时返回LOOP语句继续比较

1910.1.6EXIT语句【例10-8】1910.1.6EXIT语句【例10-8】1910.12010.1顺序语句

10.1.7WAIT语句WAIT;

--第一种语句格式WAITON信号表;

--第二种语句格式

WAITUNTIL条件表达式;

--第三种语句格式WAITFOR时间表达式;

--第四种语句格式,超时等待语句

2010.1顺序语句10.1.7WAIT语句WA2010.1顺序语句10.1.7WAIT语句WA2110.1.7WAIT语句WAIT;

--第一种语句格式WAITON信号表;

--第二种语句格式

WAITUNTIL条件表达式;

--第三种语句格式WAITFOR时间表达式;

--第四种语句格式,超时等待语句

第一种语句格式中,未设置停止挂起条件的表达式,表示永远挂起第二种格式称为敏感信号等待语句,在信号表中列出的信号是等待语句的敏感信号,当处于等待状态时,敏感信号的任何变化将结束挂起,再次启动进程.(已列出敏感量的进程中不能使用任何形式的WAIT语句).

一般地,WAIT语句可用于进程中的任何地方.2110.1.7WAIT语句WAIT;2110.1.7WAIT语句WAIT;2210.1顺序语句

10.1.7WAIT语句【例10-9】SIGNALs1,s2:STD_LOGIC;...PROCESSBEGIN...WAITONs1,s2;ENDPROCESS;

2210.1顺序语句10.1.7WAIT语句【例2210.1顺序语句10.1.7WAIT语句【例2310.1.7WAIT语句【例10-10】(a)WAIT_UNTIL结构

(b)WAIT_ON结构

...LOOPWaituntilenable='1';Waitonenable;...EXITWHENenable='1';

ENDLOOP;WAIT_UNTIL结构称为条件等待语句,相对于第二种语句格式,条件等待语句格式中又多了一种重新启动进程的条件,即被此语句挂起的进程需顺序满足如下两个条件,进程才能脱离挂起状态.在条件表达式中所含的信号发生了改变此信号改变后,且满足WAIT语句所设的条件等效2310.1.7WAIT语句【例10-10】WAIT_2310.1.7WAIT语句【例10-10】WAIT_2410.1.7WAIT语句WAITUNTIL信号=Value;--(1)WAITUNTIL信号’EVENTAND信号=Value;--(2)WAITUNTILNOT信号’STABLEAND信号=Value;--(3)WAITUNTILclock='1';WAITUNTILrising_edge(clock);WAITUNTILNOTclock’STABLEANDclock='1';WAITUNTILclock='1'ANDclock’EVENT;一般地,只有WAIT_UNTIL格式的等待语句可以被综合器接受(其余格式语句只能在VHDL仿真器中使用),3种表达方式:如果设clock为时钟信号输入端,以下4条语句所设的进程启动条件都是时钟上升沿,所以他们对应的硬件结构是一样的.与ENENT函数相反,在δ时间内无事件发生2410.1.7WAIT语句WAITUNTIL信2410.1.7WAIT语句WAITUNTIL信2510.1顺序语句

10.1.7WAIT语句【例10-11】PROCESSBEGINWAITUNTILclk='1';ave<=a;WAITUNTILclk='1';ave<=ave+a;WAITUNTILclk='1';ave<=ave+a;WAITUNTILclk='1';ave<=(ave+a)/4;ENDPROCESS;完成硬件求平均的功能.4个时钟脉冲后将获得4个数值的平均值.1个脉冲2个脉冲2510.1顺序语句10.1.7WAIT语句【例2510.1顺序语句10.1.7WAIT语句【例2610.1顺序语句

10.1.7WAIT语句【例10-12】PROCESSBEGINrst_loop:LOOPWAITUNTILclock='1'ANDclock’EVENT;--等待时钟信号NEXTrst_loopWHEN(rst='1');--检测复位信号rstx<=a;--无复位信号,执行赋值操作WAITUNTILclock='1'ANDclock’EVENT;--等待时钟信号NEXTrst_loopWhen(rst='1');--检测复位信号rsty<=b; --无复位信号,执行赋值操作

ENDLOOPrst_loop;ENDPROCESS;2610.1顺序语句10.1.7WAIT语句【例2610.1顺序语句10.1.7WAIT语句【例27【例10-13】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYshifterISPORT(data:INSTD_LOGIC_VECTOR(7DOWNTO0);shift_left:INSTD_LOGIC;shift_right:INSTD_LOGIC;clk:INSTD_LOGIC;reset:INSTD_LOGIC;mode:INSTD_LOGIC_VECTOR(1DOWNTO0);qout:BUFFERSTD_LOGIC_VECTOR(7DOWNTO0));ENDshifter;ARCHITECTUREbehaveOFshifterISSIGNALenable:STD_LOGIC;BEGIN

27【例10-13】27【例10-13】27【例10-13】28

BEGINPROCESSBEGINWAITUNTIL(RISING_EDGE(clk));--等待时钟上升沿

IF(reset='1')THENqout<="00000000";ELSECASEmodeISWHEN"01"=>qout<=shift_right&qout(7DOWNTO1);--右移

WHEN"10"=>qout<=qout(6DOWNTO0)&shift_left;--左移

WHEN"11"=>qout<=data;--并行加载

WHENOTHERS=>NULL;ENDCASE;ENDIF;ENDPROCESS;ENDbehave;2828282910.1顺序语句

10.1.9RETURN语句RETURN;--用于过程RETURN表达式;

--用于函数,有返回值

【例10-16】PROCEDURErs(SIGNALs,r:INSTD_LOGIC;SIGNALq,nq:INOUTSTD_LOGIC)ISBEGINIF(s='1'ANDr='1')THENREPORT"Forbiddenstate:sandrarequualto'1'";RETURN;ELSEq<=sANDnqAFTER5ns;nq<=sANDqAFTER5ns;ENDIF;ENDPROCEDURErs;2910.1顺序语句10.1.9RETURN语句2910.1顺序语句10.1.9RETURN语句3010.1顺序语句

【例10-17】FUNCTIONopt(a,b,opr:STD_LOGIC)RETURNSTD_LOGICISBEGINIF(opr='1')THENRETURN(aANDb);ELSERETURN(aORb);ENDIF;ENDFUNCTIONopt;10.1.10空操作语句

CASEOpcodeISWHEN"001"=>tmp:=regaANDregb;WHEN"101"=>tmp:=regaORregb;WHEN"110"=>tmp:=NOTrega;WHENOTHERS=>NULL;ENDCASE;3010.1顺序语句【例10-17】10.1.103010.1顺序语句【例10-17】10.1.103110.2并行语句

并行信号赋值语句(ConcurrentSignalAssignments)。

进程语句(ProcessStatements)。

块语句(BlockStatements)。条件信号赋值语句(SelectedSignalAssignments)。元件例化语句(ComponentInstantiations),其中包括类属配置语句。生成语句(GenerateStatements)。并行过程调用语句(ConcurrentProcedureCalls)。ARCHITECTURE结构体名

OF实体名

IS

说明语句

BEGIN

并行语句ENDARCHITECTURE

结构体名

3种形式:简单信号赋值条件信号赋值选择信号赋值3110.2并行语句

3110.2并行语句

32[例]:2选1多路选择器的VHDL描述LIBRARYieee;USEieee.std_logic_1164.all;ENTITYmux21aIS

PORT(a,b:INSTD_LOGIC;s:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGIN

y<=(aAND(NOTs))OR(bANDs);

ENDARCHITECTUREone;实体结构体1.简单的信号赋值语句

赋值语句的格式:<对象>=<表达式>32[例]:2选1多路选择器的VHDL描述LIBRARY32[例]:2选1多路选择器的VHDL描述LIBRARY33[例]:下面的两个结构体在功能上是等价的。ENTITYexeIS

PORT(a1,a2:INBIT;

b1,b2:OUTBIT);

ENDexe;ARCHITECTUREexe_arc1OFexeIS

BEGIN

b1<=a1ANDb2;

b2<=(NOTa1)ORa2;

ENDexe_arc1;ARCHITECTUREexe_arc2OFexeIS

BEGIN

b2<=(NOTa1)ORa2;

b1<=a1ANDb2;

ENDexe_arc2;a1a2b1b233[例]:下面的两个结构体在功能上是等价的。ENTITY33[例]:下面的两个结构体在功能上是等价的。ENTITY34将第一个满足WHEN后赋值条件所对应的表达式的值,赋给赋值目标信号。条件信号赋值语句的格式如下:

<赋值目标信号><=<表达式1>WHEN<赋值条件1>ELSE

<表达式2>WHEN<赋值条件2>ELSE

…<表达式n>;2.条件赋值语句数据类型:布尔量条件测试的顺序性34将第一个满足WHEN后赋值条件所对应的表达式的值,赋给赋34将第一个满足WHEN后赋值条件所对应的表达式的值,赋给赋35LIBRARYieee;

USEieee.std_logic_1164.all;

ENTITYmux4IS

PORT(I0,I1,I2,I3,A,B:INstd_logic;

Q:OUTstd_logic);

ENDmux4;ARCHITECTUREmux4_arcOFmux4IS

BEGIN

Q<=I0WHENA=‘0’ANDB=‘0’ELSE

I1WHENA=‘1’ANDB=‘0’ELSE

I2WHENA=‘0’ANDB=‘1’ELSE

I3;ENDmux4_arc;[例]:四路数据选择器VHDL程序I0I1I2I3AQmux4B35LIBRARYieee;35LIBRARYieee;36当选择信号的值满足条件的子句时,将此子句表达式中的值赋给赋值目标信号。选择信号赋值语句的格式如下:

WITH<选择表达式>SELECT

<赋值目标><=<表达式1>WHEN<选择值1>,<表达式2>WHEN<选择值2>,…<表达式n>WHEN<选择值n>;

3.选择信号赋值语句:包含所有的值条件测试的同期性36当选择信号的值满足条件的子句时,将此子句表达式中的值赋给36当选择信号的值满足条件的子句时,将此子句表达式中的值赋给3710.2.1并行信号赋值语句

选择信号赋值语句本身不能在进程中应用,但其功能却与进程中CASE语句的功能相似.CASE语句的执行依赖于进程中敏感信号的改变而启动进程,而且要求CASE语句中各子句的条件不能有重叠,必须包含所有的条件.

选择信号语句中也有敏感量,即关键词WITH旁的选择表达式,每当选择表达式的值发生变化时,就将启动此语句对各子句的选择值进行测试对比,当发现有满足条件的子句时,就将此子句表达式中的值赋给赋值目标信号.

选择信号语句对子句条件选择值的测试具有同期性,不允许有条件重叠的现象,也不允许存在条件涵盖不全的情况.3710.2.1并行信号赋值语句选择信号赋值语句3710.2.1并行信号赋值语句选择信号赋值语句38[例]:四路数据选择器VHDL程序ENTITYselsIS

PORT(d0,d1,d2,d3:INSTD_LOGIC;

s:INSTD_LOGIC_VECTOR(1DOWNTO0);out1:OUTSTD_LOGIC);

ENDsels;ARCHITECTUREsels_arcOFselsISBEGIN

WITHsSELECT

out1<=d0WHEN“00”,

d1WHEN“01”,

d2WHEN“10”,

d3WHENothers;

ENDsels_arc;d0d1d2d3sout1sels38[例]:四路数据选择器VHDL程序ENTITYsel38[例]:四路数据选择器VHDL程序ENTITYsel39LIBRARYieee;

USEieee.std_logic_1164.all;

ENTITYmux4IS

PORT(I0,I1,I2,I3,A,B:INstd_logic;

Q:OUTstd_logic);

ENDmux4;ARCHITECTUREmux4_arcOFmux4IS

SIGNALsel:INTEGERRANGE0TO3;

BEGIN

WITHselSELECT

Q<=I0WHEN0,

I1

WHEN1,

I2

WHEN2,

I3WHEN3;

sel<=0WHENA=‘0’ANDB=‘0’ELSE

1WHENA=‘1’ANDB=‘0’ELSE

2WHENA=‘0’ANDB=‘1’ELSE

3;ENDmux4_arc;[例]:四路数据选择器VHDL程序I0I1I2I3AQmux4B39LIBRARYieee;39LIBRARYieee;40KX康芯科技【例10-19】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYdecoderISPORT(a,

b,

c:INSTD_LOGIC;data1,data2:INSTD_LOGIC;dataout:OUTSTD_LOGIC);ENDdecoder;ARCHITECTUREconcuntOFdecoderISSIGNALinstruction:STD_LOGIC_VECTOR(2DOWNTO0);

BEGINinstruction<=c&b&a;WITHinstructionSELECTdataout<=data1ANDdata2WHEN"000",

data1ORdata2WHEN"001",

data1NANDdata2WHEN"010",

data1NORdata2WHEN"011",

data1XORdata2WHEN"100",

data1XNORdata2WHEN"101",

'Z'WHENOTHERS;ENDconcunt;40KX康芯科技【例10-19】40KX康芯科技【例10-19】40KX康芯科技【例10-14110.2并行语句

10.2.1并行信号赋值语句

3.选择信号赋值语句...WITHseltSELECTmuxout<=aWHEN0|1,--0或1bWHEN2TO10,--2或3,或4或10cWHEN6,dWHEN7,'Z'WHENOTHERS;...注意:选择信号赋值语句的每一子句结尾是逗号,最后一句是分号;而条件赋值语句每一子句的结尾没有任何标点,只有最后一句有分号.4110.2并行语句

4110.2并行语句

42PROCESS组成PROCESS语句结构进程说明顺序描述语句敏感信号参数表简单赋值语句进程启动语句子程序调用语句顺序描述语句进程跳出语句42PROCESS组成PROCESS语句结构进程说明顺序描42PROCESS组成PROCESS语句结构进程说明顺序描Somethingwhichyoucan■

SomethingwhichyoucanusewithinProcessonly-IF-THEN-ELSIF-ENDIF-

CASE-WHEN-OTHERS-

LOOP-FORSomethingwhichyoucan■SomSomethingwhichyoucan■SomIf-then-elsesyntaxIF__expressionTHEN__statement;__statement;ELSIF__expressionTHEN__statement;__statement;ELSE__statement;__statement;ENDIF;if(a=‘1’)thenc<=“111”;elsif(b=‘0’)thenc<=“101”elsec<=“000”;endif;If-then-elsesyntaxIF__expresIf-then-elsesyntaxIF__expresCase-When-OthersCASE__expressionIS

WHEN

__constant_value=> __statement; __statement;

WHEN__constant_value=> __statement; __statement;

WHENOTHERS=> __statement; __statement;ENDCASE;CASEinstructionISwhen“00”=>accum<=‘0’;when“01”=>accum<=‘1’;whenothers=>accum<=‘Z’;ENDCASE;Case-When-OthersCASE__expCase-When-OthersCASE__expLoop-For__loop_label:FOR__index_variableIN__rangeLOOP__statement;__statement;ENDLOOP__loop_label;FORiIN1to10LOOPi_squared(i):=i*i;ENDLOOP;Loop-For__loop_label:FORiILoop-For__loop_label:FORiI473)进程语句要点:(1)PROCESS为一无限循环语句(3)进程中的顺序语句具有明显的顺序/并行运行双重性(2)进程必须由敏感信号的变化来启动(4)进程语句本身是并行语句(5)信号是多个进程间的通信线(6)一个进程中只允许描述对应于一个时钟信号的同步时序逻辑

473)进程语句要点:(1)PROCESS为一无限循环语句473)进程语句要点:(1)PROCESS为一无限循环语句4810.2并行语句

10.2.2块语句结构

BLOCK语句应用知识一种将结构体中的并行描述语句进行组合的方法,它的主要目的是改善并行语句及其结构的可读性,或是利用BLOCK的保护表达式关闭某些信号。BLOCK语句的表达格式如下:块标号

:BLOCK[(块保护表达式)]

接口说明

类属说明

BEGIN

并行语句ENDBLOCK块标号

;

4810.2并行语句

4810.2并行语句

4910.2并行语句

10.2.2块语句结构

【例10-21】...

b1:BLOCKSIGNALs1:BIT;BEGINS1<=aANDb;

b2:BLOCKSIGNALs2:BIT;BEGINs2<=cANDd;

b3:BLOCKBEGINZ<=s2;ENDBLOCKb3;ENDBLOCKb2;y<=s1;ENDBLOCKb1;...4910.2并行语句

4910.2并行语句

50【例10-22】LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYf_adderISPORT(ain,bin,cin:INstd_logic;sum,cout:OUTstd_logic);ENDf_adder;ARCHITECTUREe_adOFf_adderISSIGNALso1,co1,co2:std_logic;BEGINh_adder1:BLOCK--半加器u1BEGINPROCESS(ain,bin)BEGINso1<=NOT(ainXOR(NOTbin));co1<=ainANDbin;ENDPROCESS;ENDBLOCKh_adder1;h_adder2:BLOCK--半加器u2SIGNALso2:std_logic;BEGINso2<=NOT(so1XOR(NOTcin));co2<=so1andcin;sum<=so2;ENDBLOCKh_adder2;or2:BLOCK--或门u3BEGINPROCESS(co2,co1) BEGINcout<=co2ORco1;ENDPROCESS;ENDBLOCKor2;ENDe_ad;

50【例10-22】50【例10-22】50【例10-22】5110.2并行语句

10.2.3并行过程调用语句

过程名(关联参量名);【例10-23】...PROCEDUREadder(SIGNALa,b:INSTD_LOGIC;--过程名为adderSIGNALsum:OUTSTD_LOGIC);...adder(a1,b1,sum1);--并行过程调用

...--在此,a1、b1、sum1即为分别对应于a、b、sum的关联参量名

PROCESS(c1,c2);--进程语句执行

BEGINAdder(c1,c2,s1);--顺序过程调用,在此c1、c2、s1即为分别

--对应于a、b、sum的关联参量名ENDPROCESS;5110.2并行语句

5110.2并行语句

5210.2并行语句

10.2.3并行过程调用语句

【例10-24】PROCEDUREcheck(SIGNALa:INSTD_LOGIC_VECTOR;--在调用时

SIGNALerror:OUTBOOLEAN)IS--再定位宽

VARIABLEfound_one:BOOLEAN:=FALSE;--设初始值

BEGINFORiINa'RANGELOOP--对位矢量a的所有的位元素进行循环检测

IFa(i)='1'THEN--发现a中有

'1'IFfound_oneTHEN--若found_one为TRUE,则表明发现了一个以上的'1'ERROR<=TRUE;--发现了一个以上的'1',令found_one为TRUERETURN;--结束过程

ENDIF;Found_one:=TRUE;--在a中已发现了一个'1'EndIF;EndLOOP;--再测a中的其他位

error<=NOTfound_one;--如果没有任何'1'被发现,error将被置TRUEENDPROCEDUREcheck;

5210.2并行语句10.2.3并行过程调用语句5210.2并行语句10.2.3并行过程调用语句5310.2并行语句

10.2.3并行过程调用语句

...CHBLK:BLOCKSIGNALs1:STD_LOGIC_VECTOR(0TO0);--过程调用前设定位矢尺寸

SIGNALs2:STD_LOGIC_VECTOR(0TO1);SIGNALs3:STD_LOGIC_VECTOR(0TO2);SIGNALs4:STD_LOGIC_VECTOR(0TO3);SIGNALe1,e2,e3,e4:Boolean;BEGINCheck(s1,e1);--并行过程调用,关联参数名为s1、e1Check(s2,e2);--并行过程调用,关联参数名为s2、e2Check(s3,e3);--并行过程调用,关联参数名为s3、e3Check(s4,e4);--并行过程调用,关联参数名为s4、e4ENDBLOCK;

...5310.2并行语句10.2.3并行过程调用语句5310.2并行语句10.2.3并行过程调用语句5410.2并行语句

10.2.10生成语句

生成语句可以简化为有规则设计结构的逻辑描述。生成语句有一种复制作用,在设计中,只要根据某些条件,设定好某一元件或设计单位,就可以利用生成语句复制一组完全相同的并行元件或设计单元电路结构。生成语句有以下两种形式:[标号:]FOR循环变量

IN取值范围

GENERATE

说明

BEGIN

并行语句

ENDGENERATE[标号];5410.2并行语句10.2.10生成语句生成5410.2并行语句10.2.10生成语句生成5510.2并行语句

10.2.10生成语句

[标号:]IF条件GENERATE

说明

Begin

并行语句

ENDGENERATE[标号];

这两种语句格式都是由如下4部分组成:1。生成方式:有FOR和IF两种结构,用于规定并行语句的复制方式。5510.2并行语句10.2.10生成语句[标5510.2并行语句10.2.10生成语句[标5610.2并行语句

10.2.10生成语句

2.说明部分:对元件数据类型、子程序、数据对象做一些局部说明。3.并行语句:生成语句结构中的并行语句是用来“复制”的基本单元,主要包括元件、进程语句、块语句、并行过程调用语句、并行信号赋值语句,甚至生成语句,这表示生成语句允许存在嵌套结构,因而可用于生成元件的多维阵列结构。4.标号:并非必需的5610.2并行语句10.2.10生成语句2.说5610.2并行语句10.2.10生成语句2.说5710.2并行语句

10.2.10生成语句

表达式TO表达式;--递增方式,如1TO10表达式DOWNTO表达式;--递减方式,如10DOWNTO1【例10-210】...COMPONENTcompPORT(x:INSTD_LOGIC;

y:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALa:STD_LOGIC_VECTOR(0TO7);SIGNALb:STD_LOGIC_VECTOR(0TO7);...gen:FORiINa’RANGEGENERATEu1:compPORTMAP(x=>a(i),y=>b(i));ENDGENERATEgen,...5710.2并行语句10.2.10生成语句表达式5710.2并行语句10.2.10生成语句表达式5810.2并行语句

10.2.10生成语句

图10-3生成语句产生的8个相同的电路模块

5810.2并行语句10.2.10生成语句图105810.2并行语句10.2.10生成语句图105910.2并行语句

10.2.10生成语句

【例10-26】锁存器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYLatchISPORT(D,ENA:INSTD_LOGIC;Q:OUTSTD_LOGIC);ENDENTITYLatch;ARCHITECTUREoneOFLatchISSIGNALsig_save:STD_LOGIC;BEGINPROCESS(D,ENA)BEGINIFENA='1'THENsig_save<=D;ENDIF;Q<=sig_save;ENDPROCESS;ENDARCHITECTUREone;5910.2并行语句10.2.10生成语句【例15910.2并行语句10.2.10生成语句【例160KX康芯科技【例10-27】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSN74373ISPORT(D:INSTD_LOGIC_VECTOR(8DOWNTO1);OEN,G:INSTD_LOGIC;Q:OUTSTD_LOGIC_VECTOR(8DOWNTO1));ENDENTITYSN74373;ARCHITECTUREtwoOFSN74373ISSIGNALsigvec_save:STD_LOGIC_VECTOR(8DOWNTO1);BEGINPROCESS(D,OEN,G,sigvec_save)BEGINIFOEN='0'THENQ<=sigvec_save;ELSEQ<="ZZZZZZZZ";ENDIF;IFG='1'THENSigvec_save<=D;ENDIF;ENDPROCESS;ENDARCHITECTUREtwo;ARCHITECTUREoneOFSN74373ISCOMPONENTLatchPORT(D,ENA:INSTD_LOGIC;Q:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALsig_mid:STD_LOGIC_VECTOR(8DOWNTO1);BEGINGeLatch:FORiNumIN1TO8GENERATELatchx:LatchPORTMAP(D(iNum),G,sig_mid(iNum));ENDGENERATE;Q<=sig_midWHENOEN='0'ELSE"ZZZZZZZZ";--当OEN=1时,Q(8)~Q(1)输出状态呈高阻态ENDARCHITECTUREone;

60KX康芯科技【例10-27】60KX康芯科技【例10-27】60KX康芯科技【例10-261KX康芯科技【例10-28】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYd_ffISPORT(d,clk_s:INSTD_LOGIC;q:OUTSTD_LOGIC;nq:OUTSTD_LOGIC);ENDENTITYd_ff;ARCHITECTUREa_rs_ffOFd_ffISBEGINbin_p_rs_ff:PROCESS(CLK_S)BEGINIFclk_s='1'ANDclk_s'EVENTTHENq<=d;nq<=NOTd;ENDIF;ENDPROCESS;ENDARCHITECTUREa_rs_ff;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcnt_bin_nisGENERIC(n:INTEGER:=6);PORT(q:OUTSTD_LOGIC_VECTOR(0TOn-1);in_1:INSTD_LOGIC);ENDENTITYcnt_bin_n;(接下页)61KX康芯科技【例10-28】61KX康芯科技【例10-28】61KX康芯科技【例10-262ARCHITECTUREbehvOFcnt_bin_nISCOMPONENTd_ffPORT(d,clk_s:INSTD_LOGIC;Q,NQ:OUTSTD_LOGIC);ENDCOMPONENTd_ff;SIGNALs:STD_LOGIC_VECTOR(0TOn);BEGINs(0)<=in_1;q_1:FORiIN0TOn-1GENERATEdff:d_ffPORTMAP(s(i+1),s(I

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论