VHDL学习资料6.ppt
- 文档编号:4880353
- 上传时间:2023-05-07
- 格式:PPT
- 页数:81
- 大小:1.89MB
VHDL学习资料6.ppt
《VHDL学习资料6.ppt》由会员分享,可在线阅读,更多相关《VHDL学习资料6.ppt(81页珍藏版)》请在冰点文库上搜索。
第六章VHDL并行语句,在结构体中的执行是同步进行的其执行方式与书写的顺序无关在执行中,并行语句之间可以有信息往来,也可以互为独立、互不相关每一并行语句内部的语句运行方式可以是并行执行方式和顺序执行方式。
并行语句特点,在结构体语句中,并行语句的位置是:
ARCHITECTURE结构体名OF实体名IS说明语句BEGIN并行语句END结构体名;,结构体中可综合的并行语句有:
并行信号赋值语句进程语句块语句元件例化语句生成语句并行过程调用语句,进程语句(PROCESS),进程语句是最主要的并行语句,它在VHDL程序设计中使用频率最高,也是最能体现硬件描述语言特点的一条语句。
进程语句的内部是是顺序语句,而进程语句本身是一种并行语句。
Process语句的格式为:
进程标号:
Process(敏感信号列表)变量声明Begin顺序语句;EndProcess进程标号;,敏感信号列表,进程赖以启动的敏感表。
对于表中列出的任何信号的改变,都将启动进程,执行进程内相应顺序语句。
一些VHDL综合器,综合后,对应进程的硬件系统对进程中的所有输入的信号都是敏感的,不论在源程序的进程中是否把所有的信号都列人敏感表中。
为了使软件仿真与综合后的硬件仿真对应起来,应当将进程中的所有输人信号都列入敏感表中。
敏感表举例,latchlabel:
PROCESS(oe)BEGINIFoe=1THENy=a;ENDIF;ENDPROCESSlatchlabel;,敏感表举例,latchlabel:
PROCESS(oe,a)BEGINIFoe=1THENy=a;ENDIF;ENDPROCESSlatchlabel;,进程的激活与挂起由敏感信号表或等待语句wait控制。
敏感信号控制:
敏感信号的变化激活该进程。
当执行到最后一条语句时,进程挂起,等待敏感信号的变化。
进程挂起时,进程中的信号、变量的状态保持不变。
wait控制:
运行开始(初始化)时,所有进程均被激活,并执行。
当执行到等待语句时,进程挂起。
当等待语句条件满足时,进程再次被激活,并从等待语句处接着运行,直到遇到下一个等待语句,进程再次被挂起如此循环反复,直到运行结束。
对含有敏感信号表的进程,其执行过程相当于进程末尾有一个关于敏感信号的wait语句。
下面的两个进程是等价的:
process(A,B)beginOutput=AorB;endprocess;processbeginOutput=AorB;waitonA,B;endprocess;若有敏感信号表指定,则不能有wait语句。
进程语句,一般用于组合电路进程模式,进程标记:
PROCESS(信号名1,信号名2,信号名n)VARIABLE_变量名:
STD_LOGIC;VARIABLE_变量名:
STD_LOGIC;BEGIN-信号赋值-变量赋值-过程调用-IF语句-CASE语句-LOOP语句ENDPROCESS进程标记;,用于时序电路进程模式,进程标记:
PROCESSVARIABLE变量名:
STD_LOGIC;VARIABLE变量名:
STD_LOGIC;BEGINWAITUNTIL时钟信号=1;或CLKeventandCLK=1-指定信号-指定变量-过程调用-如果语句-CASE语句-循环语句ENDPROCESS进程标记;,LIBRARYieee;USEieee.std_logic_1164.all;ENTITYif_caseISPORT(a,b,c,d:
INStd_Logic;sel:
INStd_Logic_Vector(1downto0);y,z:
OUTStd_Logic);ENDif_case;ARCHITECTURElogicOFif_caseISBEGINif_label:
PROCESS(a,b,c,d,sel)BEGINIFsel=00THENy=a;ELSIFsel=01THENy=b;ELSIFsel=10THENy=c;ELSEy=d;ENDIF;ENDPROCESSif_label;,case_label:
PROCESS(a,b,c,d,sel)BEGINCASEselISWHEN00=zzzzz=0;ENDCASE;ENDPROCESScase_label;ENDlogic;,进程语句举例,例:
一个构造体中有两个进程通信,LibraryIEEE;useieee.std_logic_1164.all;entitycproisport(ina:
instd_logic;outa,outb:
outstd_logic);endentitycpr;,architecturedyofcproissignalcom_a,com_b:
STD_LOGIC:
=0;beginJC1:
PROCESS(ina,com_a)beginif(inaorcom_a)thencom_b=1after25ns;0after50ns;outa=1after20ns;0after20ns;endif;endprocessJC1;JC2:
PROCESS(com_b)beginif(com_beventandcom_b=1)thencom_a=0after25ns;1after50ns;outb=1after20ns;0after20ns;endif;endprocessJC2;endarchitecturedy;,进程A,进程B,信号inA启动进程A,信号comm_A启动进程A,信号comm_B启动进程B,输出信号outB,输出信号outA,Process(sel,a,b)Beginf=a;Ifsel=1thenf=b;endif;Endprocess;,Process(sel,a,b)BeginIfsel=1thenf=b;endif;f=a;Endprocess;,注意进程内的语句是顺序执行,结果f总是等于a,块语句(课本29页),块语句(BLOCK)格式:
(课本29页)块标号:
BLOCK(块保护表达式)接口说明类属说明BEGIN并行语句ENDBLOCK块标号;,说明块语句应用只是一种将结构体中的并行描述语句进行组合的方法,它的主要目的是改善并行语句及其结构的可读性从综合的角度来说,块语句的存在没有实际意义,综合器会略去所有的块语句,保护表达式是可选项,它是一个布尔表达式。
保护表达式的作用是:
只有当其为真时,该块中的语句才被启动执行;否则,该块中的语句不被执行。
【例】a,b,c,d输入端口,bit类型。
.b1:
BLOCKSIGNALs1:
BIT;BEGINS1=aANDb;b2:
BLOCKSIGNALs2:
BIT;BEGINs2=cANDd;b3:
BLOCKBEGINZ=s2;ENDBLOCKb3;ENDBLOCKb2;y=s1;ENDBLOCKb1;.,块内定义的数据类型、数据对象(信号、变量、常量)、子程序等都是局部的。
例:
用BLOCK语句描述2选1电路的程序。
ENTITYmux2_1ISPORT(d0,d1,sel:
INSTD_LOGIC;q:
OUTSTD_LOGIC);ENDmux2_1;ARCHITECTUREamuxOFmux2_1ISSIGNALtmp1,tmp2,tmp3:
STD_LOGIC;BEGINcale:
BLOCKBEGINtmp1=d0ANDsel;tmp2=d1AND(notsel);tmp3=tmp1ORtmp2;q=tmp3;ENDBLOCKcale;ENDamux;上述结构体中只有一个BLOCK块,若电路复杂时可由几个BLOCK块组成。
【例】(课本17页)LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYf_adderISPORT(ain,bin,cin:
INstd_logic;sum,cout:
OUTstd_logic);ENDf_adder;ARCHITECTUREe_adOFf_adderISSIGNALe,d,f:
std_logic;BEGINh_adder1:
BLOCK-半加器u1BEGINPROCESS(ain,bin)BEGINe=(ainAND(NOTbin)OR(binAND(NOTain);d=ainANDbin;ENDPROCESS;ENDBLOCKh_adder1;,【例】(课本17页)h_adder2:
BLOCK-半加器u2BEGINPROCESS(e,cin)BEGINsum=(eAND(NOTcin)OR(cinAND(NOTe);f=eandcin;endprocess;ENDBLOCKh_adder2;or2:
BLOCK-或门u3BEGINPROCESS(f,d)BEGINcout=dORf;ENDPROCESS;ENDBLOCKor2;ENDe_ad;,块结构与进程结构的区别,一个构造体中各个块是并行的,与书写顺序无关;每个块里的各个语句也是并行执行的,与书写顺序无关。
一个构造体中各个进程是并行的,与书写顺序无关;每个进程里的各个语句是顺序执行的,与书写顺序有关。
一个构造体中,块里面可以包含多个进程,各个进程是并发执行的;一个构造体中,进程里面不能包含块结构。
一个构造体中,块和进程可以并列,各个块和进程都是并发执行的。
并行信号赋值语句信号代入语句有两种:
一种是在结构体中的进程内使用,此时它作为一种顺序语句出现;另一种是在结构体的进程之外使用,此时它是一种并行语句,因此称之为并行信号代入语句。
并行信号代入语句的语法格式为:
信号量=敏感信号量表达式;,BEGINtmp1=AXORB;tmp2=AANDB;ANDdataflow;,在上例的结构体中有2条并发信号代入语句,他们的执行顺序与书写顺序是无关的,因此上面的2条并发信号代入语句可以任意颠倒书写顺序,不会对执行结果产生任何影响。
信号代入语句的并发性,例:
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYand_gatISPORT(a:
INSTD_LOGIC;b:
INSTD_LOGIC;y:
OUTSTD_LOGIC);ENDand_gat;ARCHITECTUREbehaveOFand_gatISBEGINPROCESS(a,b)BEGINy=aANDbafter7ns;-进程语句(顺序语句)ANDPROCESS;ENDbehave;,信号代入语句的进程等效性,例:
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYand_gatISPORT(a:
INSTD_LOGIC;b:
INSTD_LOGIC;y:
OUTSTD_LOGIC);ENDand_gat;ARCHITECTUREbehaveOFand_gatISBEGINy=aANDbafter7ns;-并行信号代入语句(在结构体进程之外)ANDbehave;,信号代入语句的进程等效性,总结:
一个并发信号带入语句等效于一个进程,多个并发信号语句等效于多个进程,多个进程语句是并行处理的,而多个并发信号带入语句也是并行处理的。
条件信号代入语句书写格式为:
目的信号=表达式1WHEN条件1ELSE表达式2WHEN条件2ELSE表达式2WHEN条件3ELSE表达式n-1WHEN条件ELSE表达式;条件信号代入语句执行时要先进行条件判断,如果条件满足,就将条件前面的表达式的值代入目的信号;如果不满足条件,就去判断下一个条件;最后一个表达式可以不限条件子句。
不能省略,例:
采用条件代入语句描述的七段显示译码器(共阴极)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYse7ISPORT(input:
INSTD_LOGIC_VECTOR(3DOWNTO0);output:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));ENDse7;ARCHITECTURErtlOFse7ISBEGINoutput=(0,1,1,1,1,1,1)WHENinput=“0000”ELSE(0,0,0,0,1,1,0)WHENinput=“0001”ELSE(1,0,1,1,0,1,1)WHENinput=“0010”ELSE,(1,0,0,1,1,1,1)WHENinput=“0011”ELSE(1,1,0,0,1,1,0)WHENinput=“0100”ELSE(1,1,0,1,1,0,1)WHENinput=“0101”ELSE(1,1,1,1,1,0,1)WHENinput=“0110”ELSE(0,0,0,0,1,1,1)WHENinput=“0111”ELSE(1,1,1,1,1,1,1)WHENinput=“1000”ELSE(1,1,0,1,1,1,1)WHENinput=“1001”ELSE(1,1,1,0,1,1,1)WHENinput=“1010”ELSE(1,1,1,1,1,0,0)WHENinput=“1011”ELSE(0,1,1,1,0,0,1)WHENinput=“1100”ELSE(1,0,1,1,1,1,0)WHENinput=“1101”ELSE(1,1,1,1,0,0,1)WHENinput=“1110”ELSE(1,1,1,0,0,0,1)WHENinput=“1111”ELSE(0,0,0,0,0,0,0);-灭灯ENDrtl;,在上例中,七段显示译码器有一个输入端口input和一个输出端口output。
输入端口input是一个四位总线,表示3到0的四位逻辑向量,表示输入是一个四位二进制数。
输出端口output也以总线形式表示,它表示6到0的7位逻辑向量,表示输出是一个七位二进制数,以驱动共阴极显示七段数码管。
在上例的结构体中,用一个条件代入语句来完成所有状态的显示译码。
在保留字WHEN的前面是驱动显示数码管的七位位矢量,WHEN的后面是译码的条件。
需要说明的是条件信号代入语句中的书写顺序不是固定的,位置是可以任意颠倒的,他们并不表示执行的先后顺序,实际上他们是并发执行的。
选择信号代入语句选择信号代入语句的书写格式为:
WITH选择条件表达式SELECT目的信号=信号量表达式1WHEN条件1,信号量表达式2WHEN条件2,信号量表达式3WHEN条件3,信号量表达式nWHEN条件n;VHDL在执行选择信号代入语句时,目的信号是根据条件表达式的当前值来进行信号表达式代入的。
当条件表达式的值符合某个条件时,就把该条件前的信号表达式代入目的信号。
注意:
选择信号代入语句与case语句一样,必须把表达式的值在条件中都列出来,否则编译将会出错。
例:
四选一多路选择器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(d0:
INSTD_LOGIC_VECTOR(7DOWNTO0);d1:
INSTD_LOGIC_VECTOR(7DOWNTO0);d2:
INSTD_LOGIC_VECTOR(7DOWNTO0);d3:
INSTD_LOGIC_VECTOR(7DOWNTO0);s0:
INSTD_LOGIC;s1:
INSTD_LOGIC;q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDmux4;,ARCHITECTURErtlOFmux4ISSIGNALcomb:
STD_LOGIC_VECTOR(1DOWNTO0);BEGINcomb=s1&s0;WITHcombSELECT-用comb进行选择q=d0WHEN“00”,d1WHEN“01”,d2WHEN“10”,d3WHENOTHERS;-上面4条语句是并行执行的ENDrtl;,When-else语句和With-select-When语句的差别,两个语句的关键不同是:
对于条件的要求程度不同,前者要求较松,后者要求严格。
aWith-select-When语句中When后的条件表达式必须是互不相同的;,b而When-else语句中When后的条件表达式则不需要这样的严格条件,因为其When后的条件表达式的优先权次序为由先到后排列。
VHDL子程序(课本35页),子程序和进程(Process)一样,采用顺序描述来定义算法。
和进程不同的是,子程序不可以直接从结构体的其他部分对信号进行读写操作,所有的通信都必须通过子程序的接口完成。
由于可以在结构体的不同部分调用子程序完成重复的计算,因此子程序显得非常的实用。
子程序由过程(PROCEDURE)和函数(FUNCTION)组成。
函数和过程主要进行高层次的数值运算或类型转换、运算符重载,也可用来元件例化。
调用一次子程序都意味着增加了一个硬件电路模块,因此,在实际使用时,要密切关注和严格控制子程序的调用次数。
函数的语法格式:
函数首(函数在进程或结构体中不必定义函数首,在程序包中必须定义函数首):
FUNCTION函数名(参数表)RETURN数据类型;函数体:
FUNCTION函数名(参数表)RETURN数据类型IS说明语句;BEGIN顺序处理语句;RETURN返回变量名;ENDFUNCTION函数名;其中输入参数表中的每个参数均应表示为:
参数名:
数据类型;,函数(Function),注:
参数表中参量都是“输入”信号。
过程的语法格式:
过程首(在进程或结构体中不必定义函数首,在程序包中必须定义函数首):
PROCEDURE过程名(参数表);过程体:
PROCEDURE过程名(参数表)IS说明语句;BEGIN顺序处理语句;ENDPROCEDURE过程名;,过程(Procedure),注:
参数表中参量可以是变量、信号、常数,参数的方向可以是IN、OUT、INOUT,
(1)过程调用过程名(实参1,实参2,)将实参赋给对应的形参执行过程将结果返回给对应的实参
(2)函数调用:
函数调用与过程调用是十分相似调用函数将返回一个指定数据类型的值函数的参量只能是输入值,子程序调用语句,例1:
函数应用举例,EntityfuncIsPort(a:
inbit_vector(0to2);m:
outbit_vector(0to2);EndEntityfunc;ArchitecturedemooffuncIsFunctionsam(x,y,z:
bit)ReturnbitisBeginReturn(xandy)orzEndFunctionsam;BeginProcess(a)Beginm(0)=sam(a(0),a
(1),a
(2);m
(1)=sam(a
(2),a(0),a
(1);m(0)=sam(a
(1),a
(2),a(0);EndProcess;EndArchitecturedemo;,函数体,输入变量,注意:
函数定义的位置,函数调用,例2:
函数举例。
此函数完成取反功能。
PACKAGEdeclareIS-程序包首TYPEthree_level_logicIS(0,1,Z);FUNCTIONinvert(s:
three_level_logic)RETURNthree_level_logic;-函数首ENDPACKAGEdeclare;PACKAGEBODYdeclareIS-程序包体FUNCTIONinvert(s:
three_level_logic)RETURNthree_level_logicIS-函数体VARIABLEtemp:
three_level_logic;BEGINCASEsIS-顺序语句WHEN0=temp:
=1;WHEN1=temp:
=0;WHENZ=temp:
=Z;ENDCASE;RETURNtemp;ENDFUNCTIONinvert;ENDPACKAGEBODYdeclare;,函数(Function),例2:
函数举例。
此函数完成取反功能。
USEWORK.declare.ALL;ENTITYfun_exampleISPORT(x:
INthree_level_logic;y:
OUTthree_level_logic);ENDENTITYfun_example;ARCHITECTUREaOFfun_exampleISBEGINy=invert(x);-函数的调用!
x为in类型ENDa;,函数(Function),过程调用,例题,ENTITYlitiISPORT(a,b,c,d:
inbit_vector(0to3);ra,rb,rc,rd:
outbit_vector(0to3);ENDliti;ARCHITECTUREmuxesOFlitiisProceduresort(x,y:
inoutbit_vector(0to3)isvariabletmp:
bit_vector(0to3);BeginIfxythentmp:
=x;x:
=y;y:
=tmp;ENDIF;ENDSORT;,BeginProcess(a,b,c,d)Beginsort(a,b);sort(a,c);sort(a,d);sort(b,c);sort(b,d);sort(c,d);ENDprocess;ra=a;rb=b;rc=c;rd=d;ENDmuxes;,试找出程序中的错误,过程调用,ENTITYlitiISPORT(a,b,c,d:
inoutbit_vector(0to3);ra,rb,rc,rd:
outbit_vector(0to3);ENDliti;ARCHITECTUREmuxesOFlitiisBeginProcess(a,b,c,d)Proceduresort(signalx,y:
inoutbit_vector(0to3)isvariabletmp:
bit_vector(0to3);BeginIfxythentmp:
=x;x=y;y=tmp;ENDIF;ENDSORT;,Beginsort(a,b);sort(a,c);sort(a,d);sort(b,c);sort(b,d);sort(c,d);ENDprocess;ra=a;rb=b;rc=c;rd=d;ENDmuxes;过程的定义可以处在进程的说明部分,这样可以不需要过程首。
并发过程调用,如果过程的调用出现在进程之外,构造体之内,这样的过程调用称之为并发过程调用语句。
实际上,如果过程调用出现在进程中,但是该进程语句仅仅实现过程的调用,完成该过程的操作功能,那么过程调用语句和进程调用子程序的结构是完全等价的。
注意:
函数和过程可以在结构体的说明部分中定义,这种方式同时包含了函数和过程的首说明和体定义;也可以在程序包的包头和包体中分别进行函数和过程的首说明和体定义,并将其编译到库中以便在其他设计中使用他们。
在函数和过程中,所有语句都必须是顺序语句,并且不能在他们中说明信号。
过程可以返回多值,函数只能返回一个值。
过程的参数为IN、OUT、INOUT;函数的参数为IN。
子程序函数和过程,RETURN语句格式:
(1)RETURN;
(2)RETURN表达式;第一种格式只能用于过程,只是结束过程,第二种格式
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL 学习 资料