版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章VHDL典型语句4.1VHDL顺序语句4.2VHDL并行语句4.3子程序4.4程序包、配置第四章VHDL典型语句4.1VHDL顺序语句1 进程语句内部称为顺序部分,用顺序语句进行描述;
进程语句外的语句就是并行部分。并行语句又称并发语句,各种并行语句的执行与语句书写顺序无关,当某一信号变化时,由此信号触发的所有语句将同时被执行。 进程语句内部称为顺序部分,用顺序语句进行描述;24.1VHDL顺序语句
4.1.1赋值语句
赋值语句的功能就是将一个值或一个表达式的运算结果传递给某一数据对象,如信号、变量、或由此组成的数组。 (1) 信号代入语句
信号代入语句的语法结构为:(2) 变量赋值语句变量赋值语句的语法结构为:4.1VHDL顺序语句 4.1.1赋值语句信号代入语句的31.由于高阻‘Z’状态作为电路的输入时,等效于输入为开路状态,所以常量高阻‘Z’任何时候都不能出现在表达式中。2.在VHDL语言中,信号只能在结构体中说明,但可以在并行语句和顺序语句中使用;在进程、过程、函数中使用的信号代入语句就是顺序语句,在结构体中则为并行语句。二者在语法上是一样的。3. 信号代入语句作为顺序语句使用时,表达式的运算结果并不是在语句运行后立即代入到信号中,而是只有在进程(函数、过程)的最后一条结束后(如进程即将挂起前),进程中的所有的信号代入语句结果同时赋值。所以在同一个进程中如果一个信号被代入多次,编译器有可能会给出错误警告并退出综合过程或只给出最后的执行语句有效。 例如:--该例子在编译的时候,出现了错误警告。s<=aORb; s<=aANDb;1.由于高阻‘Z’状态作为电路的输入时,等效于输入为开路状态4第四章VHDL典型语句课件5 【例4-2】试比较N1、N2两个进程的执行结果 【例4-2】试比较N1、N2两个进程的执行结果6 4.1.2条件控制语句1.IF语句IF语句的语法结构为: 4.1.2条件控制语句1.IF语句IF语句的语法结构为7使用IF语句需要注意的事项: (1)IF语句是一种条件语句,语句中至少应有一个条件句,条件结果必须是BOOLEAN类型值。 (2)IF语句根据条件句产生的判断结果TRUE或FALSE,有条件地选择执行其后的顺序语句。如果某个条件句的布尔值为真(TRUE),则执行该条件句后的关键词THEN后面的顺序语句,否则结束该条件的执行,或执行ELSIF或ELSE后面的顺序语句后结束该条件句的执行……直到执行到最外层的ENDIF语句,才完成全部IF语句的执行。 (3)IF语句可嵌套使用,即在一个IF语句中可再调用另一个“IF”语句。
使用IF语句需要注意的事项:8
(4)可以有多个elsif部分,但只能有一个else。 (5)IF语句不仅能实现条件分支处理,而且在条件判断上有优先级,因此特别适合描述含有优先级的电路。 (6)从设计人员的思维习惯出发,他们会更倾向于使用IF语句。但是,使用IF语句也会对电路带来负面影响,因为IF语句在综合时可能会产生不必要的优先级解码电路。目前的一些综合工具在处理这类语句时会对其结构进行优化,以避免占用过多的硬件资源。(4)可以有多个elsif部分,但只能有一个els9【例4-3】IF语句举例【例4-3】IF语句举例10注意:使用不带ELSE子句的IF语句时,电路可能会引入锁存器。但是,对于是否产生锁存器这个问题,我们也不应该孤立地理解一条顺序语句,还是应该结合上下文背景,从总体上把握。如【例4-4】所示。注意:使用不带ELSE子句的IF语句时,电路可能会引入锁存器11说明:本例中没有ELSE子句,但可以从上下文含义中知道该电路和例4-3一样并没有引入寄存器。说明:本例中没有ELSE子句,但可以从上下文含义中知道该电路12
ifthenelse语句综合i/.引入寄存器entitydff1isport(d:instd_logic;clk:instd_logic;q:outstd_logic);Enddff1;architecturertlofdff1isbegininfer_reg:process(d,clk)beginif(clk’eventandclk=‘1’)thenq<=d;endif;endprocessinfer;endrtl;ifthenelse语句综合i/.引入13ii/.引入锁存器Infer_latch:process(A,B)beginif(A=‘1’)thenx<=B;endif;endprocessinfer_infer_latch;Infer_latch:process(A,B)Beginx<=‘0’;if(A=‘1’)thenx<=B;endif;endprocessinfer_infer_latch;隐含了A=‘0’时x<=x;不完全的elseii/.引入锁存器Infer_latch:proce14iii/.组合电路entitycombisport(a,b:inbit;select:inbit;y:outbit);endcomb;architecturearchofcombisbeginprocess(a,b,select)beginif(select=‘1’)theny<=b;elsey<=a;endif;endprocess;endarch;bayselect10iii/.组合电路entitycombisarchi152.4.3ifthenelse语句综合(Cont.)iv/.异步复位process(reset,clk,d)Beginif(reset=‘0’)thenq<=‘0’;elsif(clk’eventandclk=‘1’)thenq<=d;endif;endprocess;dclkresetq2.4.3ifthenelse语句综合(Cont.162.4.3ifthenelse语句综合(Cont.)v/.三态逻辑signals,sel,data:std_logic;process(sel,data)Beginif(sel=‘1’)thens<=data;elses<=‘Z’;endif;endprocess;12.4.3ifthenelse语句综合(Cont.17v/.三态逻辑architecturebehoftribufissignalasel,bsel,a,b,s:std_logic;beginpa:process(asel,a)begins<=‘Z’;if(asel=‘1’)thens<=a;endif;endprocesspa;2pb:process(bsel,b)begins<=‘Z’;if(bsel=‘1’)thens<=b;endif;endprocesspb;endbeh;Multidriver!!v/.三态逻辑architecturebehoft182.4.3ifthenelse语句综合(Cont.)vii/.‘Z’值使用规则如:dout<=‘Z’anddin;如:if(sel=‘Z’)then相当于
iffalsethen
某个信号被赋值‘Z’值时,将会引入三态驱动,但‘Z’值不能用于复杂的表达式中(逻辑/算术表达式)1当信号与‘Z’值比较时,结果总为false,引用这样的关系表达式将导致模拟与综合结果不匹配22.4.3ifthenelse语句综合(Cont.192.4.3ifthenelse语句综合(Cont.)vii/.ifthenelse语句小结可以描述顺序行为1可以生成三态逻辑4生成组合逻辑2如果缺少else语句,可能生成latch3可以引入时序元件5一般用于process和subprogram中62.4.3ifthenelse语句综合(Cont.202.CASE语句CASE语句的语法结构为:2.CASE语句CASE语句的语法结构为:21 WHEN后面的选择值可以有四种表达方式; 单个普通数值,如6,’1’等; 并列数值,如3|5,表示取值为3或5; 数值选择范围,如(4DOWNTO2)表示取值为4、3、2; WHENOTHERS=>顺序语句。 WHEN后面的选择值可以有四种表达方式;221、CASE语句的功能是根据表达式满足的条件直接选择多项顺序语句中的一项执行,类似于IF语句,但是可读性比IF语句好。
2、当执行到CASE语句时,首先计算CASE和IS之间的表达式的值,然后根据条件语句中与之相同的选择值,执行对应的顺序语句,最后结束CASE语句。3、CASE语句中的“=>”不是操作符,它只相当于“THEN”的作用。
4、CASE语句中每一条语句的选择值只能出现一次,即不能有相同选择值的条件语句出现。
1、CASE语句的功能是根据表达式满足的条件直接选择23
4、CASE语句执行中必须选中,且只能选中所列条件语句中的一条,即CASE语句至少包含一个条件语句。
5、除非所有条件语句中的选择值能完全覆盖CASE语句中表达式的取值,否则“OTHERS”子句不应该省略。并且关键词OTHERS只能出现一次,且只能作为最后一种条件取值。
6、使用OTHERS是为了使条件语句中的所有选择值能覆盖表达式的所有取值,以免综合过程中插入不必要的锁存器。这一点对于定义为STD_LOGIC和STD_LOGIC_VECTOR数据类型的值尤为重要,因为这些数据对象的取值除了1、0之外,还可能出现输入高阻态Z,不定态X等取值,难以列举表达式的全部可能取值。4、CASE语句执行中必须选中,且只能选中所列条24
IF语句和CASE语句都是条件语句,但是两者也有很大的区别,主要体现在以下几点:(1)IF语句描述功能更强,有些CASE语句无法描述的内容(如描述含有优先级的内容时)IF语句可以描述。(2)CASE语句描述比IF语句更直观,这是因为CASE语句把条件中所有可能出现的情况全部列出来了,可执行条件一目了然。(3)与IF语句相比,CASE语句组的程序语句是没有先后顺序的,所有表达式的值都并行处理。而IF语句是有序的,先处理最起始、最优先的条件,后处理次优先的条件。具体应用请看【例4-6】。 IF语句和CASE语句都是条件语句,但是两者也有很大的区别25【例4-6】用CASE语句实现7段显示译码器【例4-6】用CASE语句实现7段显示译码器264.1.3循环语句1.FOR…LOOP语句FOR…LOOP循环语句主要用于循环次数已知的循环程序设计,可以使其所包含的顺序语句被循环执行,它类似于并行语句中FOR…GENERATE生成语句。FOR…LOOP语句的语法结构为:循环变量在使用前不需声明4.1.3循环语句1.FOR…LOOP语句FOR…LOO27(1)FOR
循环变量
IN初值TO终值
LOOP
顺序语句;
ENDLOOP;(2)FOR循环变量
IN初值DOWNTO终值
LOOP
顺序语句; ENDLOOP;(3)FOR循环变量INx’RANGELOOP
顺序语句; ENDLOOP;(1)FOR循环变量IN初值TO终值L28注意:一般的综合工具可以对FOR…LOOP循环语句进行综合;而对WHILE…LOOP循环语句来说,只有一些高级的综合工具才能对它进行综合,所以,一般使用FOR…LOOP循环语句,而很少使用WHILE…LOOP循环语句。注意:一般的综合工具可以对FOR…LOOP循环语句进行29【例4-7】用FOR…LOOP语句来实现的数码中‘1’的个数的检测器。【例4-7】用FOR…LOOP语句来实现的数码中‘1’的个302.WHILE…LOOP语句WHILE…LOOP语句的语法结构为:例如:WHILEi<10LOOP
--这里利用了i≥10的条件使程序结束循环
sum:=i+sum;--sum初始值为0
i:=i+1;
--循环控制变量i的递增是通过算式i:=i+1来实现
ENDLOOP;2.WHILE…LOOP语句WHILE…LOOP语句的语法311、 和FOR…LOOP语句不同的是,该语句条件中如果用到了变量,这个变量一定要事先声明。2、WHILE…LOOP语句没有自动递增循环变量的功能,而是在顺序处理语句中增加了一条循环次数计算语句,用于循环语句的控制。1、 和FOR…LOOP语句不同的是,该语句条件中如果用到了32【例4-8】用WHILE…LOOP语句来实现的连续0检测器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYzero_ceshi1IS PORT(data:INSTD_LOGIC_VECTOR(7DOWNTO0);
--输入的数据 y:OUTINTEGERRANGE8DOWNTO0);
--输出0的个数ENDzero_ceshi1;ARCHITECTUREbehOFzero_ceshi1ISBEGIN PROCESS(data) VARIABLEcount:INTEGERRANGE8DOWNTO0;
--定义一个中间变量 VARIABLEi:INTEGERRANGE7DOWNTO-1;
--变量i在使用前必须声明
【例4-8】用WHILE…LOOP语句来实现的连续0检测33
BEGIN count:=0; i:=7; WHILE(i<8ANDi>-1)LOOP
--‘RANGE不能用在一个表达式中 CASEdata(i)IS--所以必须用数值表示 WHEN'0'=>count:=count+1; WHENOTHERS=>EXIT; ENDCASE; i:=i-1;--实现循环控制变量i的递增 ENDLOOP;
y<=count; ENDPROCESS;ENDbeh;BEGIN34
3.单个LOOP语句 1)单个LOOP语句的语法结构为:
[标号:]LOOP
顺序语句;
ENDLOOP[标号]; 这种循环语句需引入其他控制语句(如EXIT、NEXT)后才能确定,否则为无限循环。其中的标号是可选的。 2)EXIT语句的作用是结束整个循环操作 EXIT语句的语法结构为:
[标号:]EXIT[标号][WHEN条件表达式]; 注意:EXIT语句如果不跟[WHEN条件],EXIT语句立即无条件跳出整个循环。 3)NEXT语句的作用是跳出本次循环 NEXT语句的语法结构为:
[标号:]NEXT[标号][WHEN条件表达式]; 注意:NEXT语句不跟有WHEN条件时,NEXT语句将立即无条件跳出本次循环。NEXT语句与EXIT语句的区别是:NEXT语句转向LOOP语句的起点,而EXIT语句转向LOOP语句的终点。 3.单个LOOP语句35 PROCESS(a,b) CONSTANTmax_limit:INTEGER:=255 BEGIN FORiIN0TOmax_limitLOOP IF(done(i)=TRUE)THEN
NEXT;--跳出本次循环 ELSE
done(i):=TRUE; ENDIF;
q(i)<=a(i)ANDb(i); ENDLOOP;ENDPROCESS; PROCESS(a,b)36 4.1.4其他顺序语句1.等待语句WAIT语句的语法结构为:当进程执行到WAIT语句,就被挂起,直到满足此语句设置的结束挂起条件后,将重新开始执行进程或过程中的程序。有以下几种格式:(1)WAIT;此语句为永久等待语句,在语句中未设置停止挂起条件的表达式,表示程序永远挂起。(2)WAITON敏感信号表;此语句为敏感信号等待语句,语句中设置了敏感信号表。当执行到WAIT语句后,程序进入等待状态,直至敏感信号表中的任一信号发生变化时,结束等待重新执行后面的操作。 4.1.4其他顺序语句1.等待语句WAIT语句的语法37如:WAITONa,b;
表示当a或b中任一信号发生改变时,就恢复执行WAIT语句之后的语句。参见进程的概念及执行机制一节。(3)WAITFOR时间表达式 此语句为时间等待语句,语句中列出了时间表达式。当进程执行到该语句时,被挂起;等待一定的时间后,才开始进行后面的操作。 例:WAITFOR20ns;--等待20ns后执行后面的操作 例如下面的例子: PROCESS BEGIN
a<=’1’;
Waitfor20ns;
a<=’0’;
Waitfor20ns; EndPROCESS;
如:WAITONa,b;38上面例子的执行过程为:执行信号赋值:a为1,等待20ns后,执行信号赋值:a为0,等待20ns后,结束进程。(4)WAITUNTIL条件表达式 此语句为条件等待语句,语句中给出了条件表达式。当进程执行到该语句时,程序进入等待状态,若满足条件表达式,则开始进行后面的操作。 例:WAITUNTILclk’EVENTANDclk=’1’;
目前,现有的EDA工具只支持对WAITUNTIL语句,其他语句在综合的时候会出错,所以读者重点掌握该语句。由于在使用WAITUNTIL语句时,PROCESS没有敏感信号列表,所以它必须是PROCESS中的第一条语句。当WAITUNTIL语句的条件满足时,PROCESS内部的代码就执行一遍。WAITUNTIL语句后面只有一个条件表达式,因此更适合于实现同步电路。上面例子的执行过程为:执行信号赋值:a为1,等待20ns后,39wait语句waituntil,wait,waiton,waitforwait语句表明了信号激活process的条件在process中,如有wait语句,敏感表必须取消在process中,如既无wait语句,也无敏感表,则不能正确模拟
综合工具仅支持waituntil语句(引入寄存器)!!!wait语句waituntil,wait,wait40第四章VHDL典型语句课件412.空操作语句
空操作语句的语法结构为:
NULL;
空操作(NULL)语句类似于计算机汇编语言中的NOP指令,执行该语句时不进行任何操作,只是使程序去执行下一个语句。2.空操作语句42另外,在VHDL语言中经常在CASE语句中用到NULL语句,它用来表示CASE语句中所剩余的条件选择值下的操作行为,从而能够满足CASE语句对条件选择值全部列举的要求。另外,在VHDL语言中经常在CASE语句中用到NULL语句,434.2VHDL并行语句 在VHDL程序中,结构体中的并行语句的执行与书写顺序没有关系,其中每个并行语句用来表示一个功能模块,各个功能模块组织在一起便组成了一个结构体。并行语句主要有:进程语句、并行信号赋值语句、块语句、元件例化语句、生成语句和并行过程调用语句。4.2VHDL并行语句 在VHDL程序中,结构体中的并行语44 4.2.1进程语句PROCESS语句的语法结构为:进程使用的要点:(1)进程由敏感信号的变化来启动。
(2)一个进程中只允许描述对应于一个时钟信号的同步时序逻辑。(3)同步电路可由结构体中的多个进程描述, 4.2.1进程语句PROCESS语句的语法结构为:进程使45
每个进程语句都可以有一个进程标号,作为进程的名称,但进程标号是可选项;
敏感信号表是进程要读取的所有信号(包括端口信号)的列表;
进程说明部分仅用于定义该进程内部所需的数据类型,如定义进程内部使用的变量,则必须在关键字BEGIN之前的进程说明部分对其进行定义,但需注意进程说明部分不允许定义信号和共享变量;
BEGIN和ENDPROCESS之间的顺序语句用于描述一个电路功能或行为,是一段顺序执行的语句,并且可以反复执行。 每个进程语句都可以有一个进程标号,作为进程的名称,但进程标461)进程由敏感信号的变化来启动。
只有当敏感信号表中的信号发生变化时,进程语句才能够被启动,进程内部的顺序语句才能够被执行,否则进程就处于等待状态。
敏感信号是指那些值发生变化后能够引起进程执行的信号。敏感信号表中可以使用一个或多个信号,每当其中的一个或多个信号值改变时,就在进程内部引起语句执行。注意:所有被读信号均应包含在敏感表中。进程使用的要点:1)进程由敏感信号的变化来启动。进程使用的要点:47第四章VHDL典型语句课件48 (2)一个进程中只允许描述对应于一个时钟信号的同步时序逻辑,异步时序逻辑必须由多个进程来表达。(3)同步电路可由结构体中的多个进程描述,这是因为进程之间的通信可以通过传递信号和共享变量值来实现。 (2)一个进程中只允许描述对应于一个时钟信号的同步时序逻49【例4-11】多进程语句实现16进制加法计数器的举例【例4-11】多进程语句实现16进制加法计数器的举例50IF(clk'EVENTANDclk='1')THENIFqn="1111"THENqn<=”0000”;ELSEqn<=qn+1;ENDIF;ENDIF;q<=qn;ENDPROCESSP1;P2:PROCESS(clk)BEGINIF(clk'EVENTANDclk='1')THENIFqn="1111"THENco<='1';ELSEco<='0';ENDIF;ENDIF;ENDPROCESSP2;ENDbeh;IF(clk'EVENTANDclk='1')TH51
进程P1和进程P2通过信号qn在两个进程之间进行通信,进程P2每次启动,需要对信号qn进行判断,从而决定是否对co进行置1操作。同时,两个进程中的启动条件是一样的,都是clk上升沿时启动进程,这样可以保证两个进程同步并发执行。 进程P1和进程P2通过信号qn在两个进程之间进行通信,进程52(4)进程内部是顺序语句,但进程语句本身是并行语句
同一结构体中的不同进程是并行运行的,不同进程根据各自的敏感信号独立运行。如【例4-12】中有两个进程:u1和u2,它们的敏感信号分别为a、b、s1和a、c、s2。两个进程完全独立运行,但当两组敏感信号表中的信号a发生变化时,两个进程被同时启动。
(4)进程内部是顺序语句,但进程语句本身是并行语句53【例4-12】两个二选一数据选择器【例4-12】两个二选一数据选择器54
communicationamongprocessAssignmentIf,case,loopetcSignal_NSignal_3Signal_1Signal_2ProcessAProcessBarchitectureexample
一个结构体中含有多个进程存在,而且各个进程一边进行通信,一边并行地同步执行。communicationamongprocessAsva:process(a,to_a)beginif(a'eventanda='1')thento_b<=a;elseto_b<='0'after10ns;;endif;endprocessva;vb:process(to_b)beginif(to_b'eventandto_b='1')thento_a<='1'after10ns;elseto_a<='0'after10ns;endif;endprocessvb;va:process(a,to_a)习题
图所示的是双2选1多路选择器构成的电路MUXK,对于其中MUX21A,当s='0'和'1'时,分别有y<='a'和y<='b'。试在一个结构体中用两个进程来表达此电路,每个进程中用CASE语句描述一个2选1多路选择器MUX21A。
双2选1多路选择器
习题图所示的是双2选1多路选择器构成的电路MU
并行信号赋值语句有3种形式:简单信号赋值语句、条件信号赋值语句和选择信号赋值语句。
赋值语句的共同点:赋值目标必须都是信号。
每一个信号赋值语句都相当于一条缩写的进程语句,任何信号的变化都将启动相关并行语句的赋值操作,而这种启动完全是独立于其他语句的,它们都可以直接出现在结构体中。4.2.2并行信号赋值语句并行信号赋值语句有3种形式:简单信号赋值语句、条件信58
1.简单信号赋值语句 1.简单信号赋值语句592.条件信号赋值语句2.条件信号赋值语句60条件信号赋值语句1、最后一个表达式有分号,其他的表达式后面没有标点符号2、每个赋值条件按书写的先后顺序逐项检测,如果条件满足,就将该表达式的值代入目的信号量;如果条件不满足,则再判断下一个表达式所指定的条件。如果前面条件都不满足时,就将最后一个表达式的值代入到目的信号量中。3、条件信号赋值语句和IF语句的区别:(1)IF语句是顺序语句,而条件信号赋值语句是并行语句;(2)对于IF语句来说,ELSE语句是可有可无的,而条件赋值信号语句中的ELSE是必须的。(3)IF语句可以是程序段,而条件信号赋值语句只能对信号赋值。条件信号赋值语句1、最后一个表达式有分号,其他的表达式后面没613.选择信号赋值语句3.选择信号赋值语句621、关键字WITH旁的选择条件表达式的值是一个敏感量,每当选择表达式的值发生变化时,就将启动此语句对各子句中的选择值进行测试对比。2、选择信号赋值语句对于子句条件选择值的测试是同期进行的,不像条件信号赋值语句那样是按照子句的书写顺序自上而下逐条测试。因此,选择信号赋值语句不允许有条件重叠的现象,也不允许存在条件涵盖不全的情况,为了防止这种情况出现,可以在语句的最后加上“表达式nWHENOTHERS”子句。3、选择信号赋值语句前面的每个子句的结尾都有逗号,只有最后一句是分号;而条件信号赋值语句前面每一子句的结尾没有任何标点符号,只有最后一句是分号。1、关键字WITH旁的选择条件表达式的值是一个敏感量,每当选63【例4.2.4】用赋值语句来实现数据选择器的举例【例4.2.4】用赋值语句来实现数据选择器的举例64省略赋值操作符是为了简化表达才使用的短语,它可以在较多位的位矢量赋值中作省略化的赋值,如:dout<=(OTHERS=>'Z');该语句等价于dout<=”ZZZZZZZZ”;利用省略赋值操作符还可以给位矢量的某一部分位赋值以后再给剩下的位赋值,如:d2<=(1=>’1’,4=>’1’,OTHERS=>’0’);上面语句的作用就是给位矢量d2的第一位和第四位赋值为‘1’,而其余位赋值为‘0’。使用省略赋值操作符的优点是给位矢量赋值时,与位矢量的长度无关,因而经常应用在总线宽度不确定的场合,另外也经常和类属参数说明语句一起应用,来实现总线的传输或改变电路的规模。4.省略赋值操作符省略赋值操作符是为了简化表达才使用的短语,它可以在较多位的位65 4.2.3元件说明与元件例化语句 1.系统的层次结构化
系统学的一个重要的观点是:系统是分层次的,是复杂研究对象的总称,系统是具有若干互相依赖、相互作用、完成特定功能的有机整体。因此,可以认为数字系统设计也是一种层次结构,其设计过程是:以用户对系统性能的要求所定义的系统功能说明为出发点,根据系统结构的观点确定系统内包含的数据流和控制流,自上而下将系统逐级分解为若干个子系统,每个子系统再分解成模块,再将模块分成若干个更小的子模块,如此继续分解下去,直至该子模块易于实现为止,从而形成多层次设计。 4.2.3元件说明与元件例化语句 1.系统的层次结构化66一个四选一数据选择器电路的层次结构图如图4-2所示,其中顶层设计调用底层实体,底层实体是二选一数据选择器。实现时利用信号把底层的三个二选一数据选择器连接起来。在层次设计中,我们把用在底层的电路模块(它本身也是一个实体)称为元件。一个四选一数据选择器电路的层次结构图如图4-2所示,其中顶层672.元件例化语句元件例化语句由两部分组成,前一部分是元件说明语句,第二部分是元件例化语句。元件说明语句的功能是将一个现成的设计实体定义或声明为一个元件;1、元件名”用来指定要在结构体中引用(或称例化)的元件。2、如果在结构体中要进行参数传递,在元件定义语句中,就要有传递参数的说明,传递参数的说明语句以关键字GENERIC开始;。3、元件定义语句一般放在结构体的说明部分,用来说明结构体中所要用到的元件或者模块。
元件说明语句的语法结构为:2.元件例化语句元件例化语句由两部分组成,前一部分是元件说68(2)元件例化语句的语法结构为:元件例化语句的功能是将调用的元件或模块的端口信号与结构体中的相应端口信号进行正确的连接,从而达到引用元件的目的。(2)元件例化语句的语法结构为:元件例化语句的功能是将调用69
设计人员经常采用两种基本映射方法:第一种是名称映射,第二种是位置映射。
其中名称映射是指用“=>”将所调用的元件端口名和结构体中需要连接的信号名直接对应起来;
位置映射是指POTRMAP语句中的实际信号的书写顺序及位置与所调用元件的端口信号的书写顺序及位置保持一致。也可以将两种方法混合起来用,就有了第三种映射方法,即混合映射方法。设计人员经常采用两种基本映射方法:第一种是名称映射,第70
“u1:mux21PORTMAP(d0,d1,s0,a);”就是采用位置映射的方法来实现的元件调用;上面的语句也可以用名称映射来实现同样的功能,即: u1:mux21PORTMAP(a=>d0,b=>d1,sel=>s0,y=>a); 而采用混合映射方法实现该功能的语句为: u1:mux21PORTMAP(d0,d1,sel,s0,y=>a); “u1:mux21PORTMAP(d0,d1,s0,71【例4.2.5】用元件例化语句来实现数据选择器【例4.2.5】用元件例化语句来实现数据选择器72习题
要求用例化语句来完成此项设计双2选1多路选择器
习题要求用例化语句来完成此项设计双2选1多路选习题
图是一个含有上升沿触发的D触发器的时序电路,试写出此电路的VHDL设计文件。
时序电路图
ab习题图是一个含有上升沿触发的D触发器的时序电路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff1isPORT(d,cp:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDdff1;ARCHITECTURErtlOFdff1ISBEGINPROCESS(d,cp)BEGINIF(cp'EVENTANDcp='1')THENq<=d;ENDIF;ENDPROCESS;ENDrtl;LIBRARYIEEE;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff_35isPORT(cl,clk0:INSTD_LOGIC;out1:OUTSTD_LOGIC);ENDdff_35;ARCHITECTURErtlOFdff_35ISCOMPONENTdff1PORT(d,cp:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALa,b:STD_LOGIC;BEGINU1:dff1PORTMAP(a,clk0,b);a<=not(bORCL);out1<=notb;ENDrtl;LIBRARYIEEE;习题根据图,写出顶层文件MX3256.VHD的VHDL设计文件。习题根据图,写出顶层文件MX3256.VHD的V其它(Cont.)元件例化端口映射问题inst1:comp1portmap(din_1=>‘0’;din_2=>con_A;dout=>con_out);signalgnd:std_logic;……gnd<=‘0’;inst1:comp1portmap(din_1=>gnd;din_2=>con_A;dout=>con_out);当某一输入端口接固定电平时,必须引入中间信号,且中间信号不能在说明时赋初值!1其它(Cont.)元件例化端口映射问题signalgnd2.6其它(Cont.)iv/.元件例化端口映射问题componentdffport(reset,clk:instd_logic;d:instd_logic;q,qn:outstd_logic);enddff;当某一输出端悬空时,应连接open关键字!u1:dffportmap(reset=>reset,clk=>clk;q=>dout,qn=>open);22.6其它(Cont.)iv/.元件例化端口映射问题当4.2.4生成语句将已经设计好的某一元件或设计单元进行复制,从而生成一组结构上完全相同的并行元件或设计单元的电路结构。FOR…GENERATE的语法结构为:4.2.4生成语句将已经设计好的某一元件或设计单元进行复制80FOR…GENERATE语句主要用来描述设计中的一些有规律的单元,其循环变量、循环次数范围的含义及运行方式与FOR…LOOP语句十分相似。同FOR…LOOP语句一样,循环变量是一个局部变量,在使用时不需要预先声明,它会根据取值范围自动递增或递减。如:FORiIN1
TO5GENERATE --递增方式FORiIN5
DOWNTO1GENERATE--递减方式需要注意的是,从软件运行的角度看,FOR…GENERATE语句的循环变量虽然有顺序性,但最终结果是完全并行的。FOR…GENERATE语句主要用来描述设计中的一些有规律的81IF…GENERATE的语法结构为:IF…GENERATE语句主要用于描述含有例外情况的相同结构,比如某些寄存器中边界寄存器的描述。它的执行情况是:在条件为“真”时,才执行结构内部的并行语句,功能与IF语句类似。不同的是:在这里不允许使用ELSE。IF…GENERATE的语法结构为:IF…GENERATE语82【例4.2.6】用D触发器组成的4位移位寄存器【例4.2.6】用D触发器组成的4位移位寄存器83图4-3用元件例化语句实现4位移位寄存器的RTL图图4-4用生成语句实现4位移位寄存器的RTL图图4-3用元件例化语句实现4位移位寄存器的RTL图图4-84
块语句是由一系列并行执行语句构成的组合体,它的功能是将结构体中的并行语句组成一个或多个模块。
这种方式可以把只用于该电路模块的信号、元件、进程、常量等封装起来形成只属于该模块特有的局部元素。
因为在不同的块中定义的信号互不干扰,使得整个设计工作更加容易实现,同时程序代码的维护性、可读性都能得到提高。
在小型电路设计时,一般不需要采用块语句。
从综合的角度看,BLOCK语句的存在毫无意义,因为将设计实体划分成多个块,只是形式上的改变并非功能上的改变。确切地说,BLOCK语句不属于功能描述语句,无论是否存在BLOCK语句,设计实体的逻辑功能不会有任何变化。但卫式块语句用于同步时序电路时更直观些。4.2.5块语句 块语句是由一系列并行执行语句构成的组合体,它的功能是将结85简单块语句的语法结构为:卫式块语句的语法结构为:所谓卫式语句指的是前面有关键字GUARDED的并行语句,如【例4-17】中“q<=GUARDEDd;”。简单块语句的语法结构为:卫式块语句的语法结构为:所谓卫式语句86【例4-16】用块语句来实现加减法运算电路【例4-16】用块语句来实现加减法运算电路87第四章VHDL典型语句课件884.4程序包、配置4.4.1程序包一个完整的程序包一般由程序包首和程序包体两部分组成。程序包的一般语法结构为:注意:我们先讲程序包4.4程序包、配置4.4.1程序包程序包的一般语法结构为定义程序包的一般语句格式:PACKAGE程序包名ISTypeDeclarationSubtypeDeclarationConstantDeclarationComponentDeclarationSubprogramDeclarationEND程序包名;PACKAGEBODY程序包名ISTypeDeclarationSubtypeDeclarationConstantDeclarationFunctionDeclarationProcedureDeclarationFunctionBodyProcedureBodyComponentDeclarationSubprogramDeclarationEND程序包名;定义程序包的一般语句格式:PACKAGE程序包名IS
程序包首说明部分完成的功能是为程序包定义接口,可以完成对程序包中的数据类型进行说明、元件说明、子程序、常量和信号说明等。另外,程序包首中的说明语句是对外可见的,这一点与实体说明语句的功能十分类似。不同的是程序包首说明部分用来指定那些数据类型、子程序、常量和信号等对外可见;而实体说明部分则只用来指定哪些信号对外可见。 程序包体说明部分完成程序包的实际功能,即具体地描述实现在程序包首说明部分定义的函数、过程功能和数据的赋值,其方式与结构体描述方法相同。 如果仅仅是定义数据类型或定义数据对象等内容,程序包体是不必要的,程序包首可以独立使用。但是在程序包中若有子程序说明,则必须有对应的子程序包体,这时子程序内容必须放在程序包体中。 程序包首说明部分完成的功能是为程序包定义接口,可以完成对程【例4-23】程序包说明语句的举例【例4-23】程序包说明语句的举例
(1)程序包也是VHDL语言编写的,因而可以保存为.vhd的文件类型(也可以不保存,放在程序前面),在本例中被保存为add_pack.vhd。 (2)本例中程序包首说明部分只包含元件说明,实际上还可以包括数据类型说明、信号说明、子程序说明等。 (3)add_pack程序包是用户自定义的,如果没有指定给特定的库,编译以后就会自动地加到WORK库的目录中,注意:如果add_pack不在当前的工程中,则必须加入到当前工程中,才能用WORK库打开。WORK库并不是这个目录的目录名,而是一个逻辑名,是指当前的工作目录,综合器将指示器指向该目录的路径。
并且WORK库是自动打开的,如要使用该程序包,则用如下格式调用:USEwork.add_pack.all; (1)程序包也是VHDL语言编写的,因而可以保存为.vh
在设计实体前定义并立即使用的程序包示例。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEseg7IS
TYPEbcdISINTEGERRANGE0TO9;
SUBTYPEsegmentsISSTD_LOGIC_VECTOR(0TO6);ENDseg7;USEWORK.seg7.ALL;
ENTITYbcd_to_segmentsIS
PORT( input:INbcd; drive:OUTsegments );ENDbcd_to_segments;
在设计实体前定义并立即使用的程序包示例。LIBRARYIARCHITECTUREbevOFbcd_to_segmentsISBEGIN
WITHinputSELECT drive<=b"0000001"WHEN0,
b"1001111"WHEN1,
b"0010010"WHEN2,
b"0000110"WHEN3,
b"1001100"WHEN4,
b"0010010"WHEN5,
b"0010000"WHEN6,
b"0001111"WHEN7,
b"0000000"WHEN8,
b"0001100"WHEN9,
b"1111111"WHEN
OTHERS;ENDbev;ARCHITECTUREbevOFbcd_to_seg第四章VHDL典型语句课件
LIBRARYIEEE;
--程序包首
USEIEEE.std_logic_1164.all;USEIEEE.std_logic_arith.all;PACKAGESTD_LOGIC_UNSIGNEDisfunction"+"(L:STD_LOGIC_VECTOR;R:INTEGER)returnSTD_LOGIC_VECTOR;function"+"(L:INTEGER;R:STD_LOGIC_VECTOR)returnSTD_LOGIC_VECTOR;function"+"(L:STD_LOGIC_VECTOR;R:STD_LOGIC
)returnSTD_LOGIC_VECTOR;functionSHR(ARG:STD_LOGIC_VECTOR;COUNT:STD_LOGIC_VECTOR)returnSTD_LOGIC_VECTOR;...endSTD_LOGIC_UNSIGNED;
LIBRARYIEEE;--程序包首
LIBRARYIEEE;--程序包体useIEEE.std_logic_1164.all;useIEEE.std_logic_arith.all;packagebodySTD_LOGIC_UNSIGNEDisfunction"+"(L:STD_LOGIC_VECTOR;R:INTEGER)
returnSTD_LOGIC_VECTORisVariableresult:STD_LOGIC_VECTOR(L’range);Beginresult:=UNSIGNED(L)+R;returnstd_logic_vector(result);end;...endSTD_LOGIC_UNSIGNED;LIBRARYIEEE;--程序包体
VHDL语言中,过程(Procedure)和函数(Function)统称为子程序。
结构上,它们和介绍过的进程十分相似,内部都是包含顺序语句的VHDL代码,但在函数中禁止进行信号声明和使用元件例化语句。
然而从应用的角度来看,PROCESS与FUCTION或PROCEDURE之间有着本质的区别。
PROCESS是直接在主代码段中使用的,而后者主要是为了建库而使用的,目的是存储常用的VHDL代码,以达到代码重用和共享的目的。
当然,如果需要,过程(Procedure)和函数(Function)也可以在主代码中直接建立并使用。
函数和进程很相似,相同的顺序语句既可以在进程中,也可以在函数中(除WAIT语句除外)。4.3子程序VHDL语言中,过程(Procedure)和函数99
1.函数语句的语法结构
(1)函数首和函数体函数首的语法结构为:函数体的语法结构为: 函数首的语法结构为:函数体的语法结构为:100 参数的数据类型可以是常量、信号这两类数据对象,变量不能作为参数,同时参数不能指定取值范围;另外,函数只有一个返回值,格式中的数据类型用来定义返回值的数据类型。 FUNCTIONf1(a,b:INTEGER;SIGNAL
c:STD_LOGIC_VECTOR)RETURNBOOLEAN; 一个名为“f1”的函数,该函数接收3个参数(a、b和c)。
a和b是常量(注意关键字CONSTANT可以省略),c是信号。a和b都是INTEGER类型的,这里不能使用RANGE和DOWNTO等来约束输入参数的取值范围;输出参数只有一个(而且只能是一个)是BOOLEAN类型的。 参数的数据类型可以是常量、信号这两类数据对象,变量不能作为101 函数首是函数的索引,由函数名、参数表和返回值的数据类型三部分组成。 函数体包含一个对数据类型、常量、变量等的局部说明,以及用于完成规定算法或转换的顺序语句部分。一旦函数被调用,就执行这部分语句。 函数首是函数的索引,由函数名、参数表和返回值的数据类型三部1021、为了进行有效的代码分割、代码重用和代码共享,函数存放在程序包中。2、在程序包首的说明部分定义函数首,在包体中存放函数体。3、当函数在程序包中定义时,函数首、函数体都是必须的,同时程序包首和程序包体也都是必须的。1、为了进行有效的代码分割、代码重用和代码共享,函数存1032.函数调用函数调用语句在程序中通常是作为表达式或语句的一部分,其调用格式如下:【例4.3.1】函数在程序包中定义并被结构体调用的举例2.函数调用函数调用语句在程序中通常是作为表达式或语句的一104ENDFUNCTIONmin_1;--函数体定义结束ENDpackmin;--包体定义结束----------------------------------------------------------------------------------------------------------------------LIBRARYIEEE;--文件名为expmin.vhdUSEIEEE.STD_LOGIC_1164.ALL;USEWORK.packmin.ALL;--调用包packminENTITYexpminISPORT(a1,b1:INstd_logic_vector(3downto0);
y1:OUTstd_logic_vector(3downto0));endexpmin;architecturestrofexpminisbeginy1<=min_1(a1,b1);--调用包中函数min_1endstr;ENDFUNCTIONmin_1;105
函数也可以存放在主代码中(即可以存放在实体中,也可以存放在结构体中)。
当函数定义在结构体中,应把函数定义在结构体的说明部分。当函数放在主代码中,函数首是可以省略的,函数体是必须的。函数也可以存放在主代码中(即可以存放在实体中,也可以存106函数在结构体中定义并调用的举例LIBRARYIEEE;--文件名为min-fun-1.vhdUSEIEEE.STD_LOGIC_1164.ALL;ENTITYmin_fun_1isPORT(a,b:INSTD_LOGIC_VECTOR(7DOWNTO0); y:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDmin_fun_1;ARCHITECTUREstrOFmin_fun_1ISFUNCTIONmin(c,d:STD_LOGIC_VECTOR(7DOWNTO0))
--函数体min的定义RETURNSTD_LOGIC_VECTORIS--函数首省略 BEGIN--函数完成的功能是求两个数中的最小值 IF(c<d)THENRETURNc; ELSE RETURNd; ENDIF;ENDmin;--函数体定义结束BEGIN y<=min(a,b);--调用函数minENDstr;函数在结构体中定义并调用的举例LIBRARYIEEE;107 注意:VHDL语言中的函数调用不同于计算机语言中的函数调用,计算机语言中的函数调用,仅是一种软件行为,多次调用不会产生附加的电路,而VHDL语言中的函数调用则不同,因为综合后的函数将映射成目标芯片中的一个相应的电路模块,而且调用多少次就映射成多少个同一结构的模块,随着函数调用次数的增加,综合结果所占用资源将不断增加。因此,在VHDL程序设计中,要尽量控制子程序的调用次数,最大程度节省资源。 注意:VHDL语言中的函数调用不同于计算机语言中的函数调用108 3.函数的重载
VHDL中,可以对已经使用过的函数(表现形式当然是函数名),进行多次重新定义,这样的函数被称之为重载函数(OverloadedFunction)。
新定义的同名函数中所定义的操作数的数据类型是各不相同的,函数调用时系统会根据调用要求的操作数的数据类型,自动分辨不同功能的同名函数。 3.函数的重载VHDL中,可以对已经使用过的函数109LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;PACKAGESTD_LOGIC_UNSIGNEDIS--定义包首
FUNCTION“+”(L,R:STD_LOGIC_VECTOR)--定义函数首
RETURNSTD_LOGIC_VECTOR;FUNCTION“+”(L:STD_LOGIC_VECTOR;R:INTEGER)--定义函数首
RETURNSTD_LOGIC_VECTOR; …ENDpackmin;--包首定义结束PACKAGEBODYpackminis--定义包体FUNCTION“+”(L,R:STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTORIS … END;FUNCTION“+”(L:STD_LOGIC_VECTOR;R:INTEGER)RETURN
STD_LOGIC_VECTORIS … END;…ENDpackmin;--包体定义结束LIBRARYIEEE;110【例4-20】重载函数min_1在程序包中的定义及调用的示例LIBRARYIEEE;--文件名为packmin.vhdUSEIEEE.STD_LOGIC_1164.ALL;PACKAGEpackminIS--定义包首FUNCTIONmin_1(a,b:INSTD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTOR;
--定义函数首FUNCTIONmin_1(a,b:ININTEGER)RETURNINTEGER;
--定义函数首ENDpackmin;--包首定义结束PACKAGEBODYpackminis--定义包体FUNCTIONmin_1(a,b:INSTD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTORIS BEGIN--定义函数体 IFa<bthenRETURNa; ELSERETURNb; ENDIF; ENDFUNCTIONmin_1;--函数体定义结束【例4-20】重载函数min_1在程序包中的定义及调用的示111FUNCTIONmin_1(a,b:ININTEGER)RETURNINTEGERIS--定义函数体
begin IFa<bthenRETURNa; ELSERETURNb; ENDIF; ENDFUNCTIONmin_1;--函数体定义结束ENDpackmin;--包体定义结束LIBRARYIEEE;
--文件名为expmin.vhdUSEIEEE.STD_LOGIC_1164.ALL;USEWORK.packmin.ALL;--调用包packminENTITYexpminIS PORT(a1,b1:INstd_logic_vector(3downto0); y1:OUTstd_logic_vector(3downto0)); a2,b2:ININTEGERRANGE13downto0; y2:OUTINTEGERRANGE13downto0);endexpmin;architecturestrofexpminis begin y1<=min_1(a1,b1);--调用包中函数min_1y2<=min_1(a2,b2);endstr;FUNCTIONmin_1(a,b:ININTEGE1124.3.2过程
过程与函数一样,都是VHDL中的子程序,也分为过程首和过程体,分别放置在程序包首和程序包体中供VHDL程序共享。过程是一种语句结构而函数是表达式的一部分;过程可以单独存在,而函数只是作为语句的一部分;过程有输入参数、输出参数和双向参数,而函数入口处的所有参数都是输入参数;过程通过调用可以从其端口界面获得多个返回值,而函数调用后只能返回一个值。4.3.2过程过程与函数一样,都是VHDL中的子程序,1131.过程语句的语法结构(1)过程首过程体过程首由过程名和参数表组成。过程首的语法结构为:过程体由说明部分、顺序语句组成。过程体的语法结构为:1.过程语句的语法结构(1)过程首过程体过程首
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 健身房砌墙施工合同
- 幼儿园景观照明电工招聘
- 保健分公司管理手册
- 知识产权侵权行为处罚办法
- 商业促销设备短期租赁合同
- 旧城改造项目密封条样本
- 建筑咨询项目经理施工协议
- 商铺自动门施工合同
- 剧院音响租赁合同
- 环保信息化管理行动计划
- 人教版五年级数学上册专项计算题12套(每日一练)
- 皮疹的分级及护理课件
- 个人工作中存在的问题和不足及改进措施(6篇)
- 2024年河南省机场集团有限公司招聘笔试参考题库含答案解析
- 国际法与国际关系的法律与人权维度
- 2023-2024学年深圳市初三中考适应性考试语文试题(含答案)
- 2024年成都交通投资集团招聘笔试参考题库含答案解析
- 公务员考试行测模拟试题及答案解析3
- 外研社(一年级起点)小学英语四年级上册单词(带音标、词性)
- 情侣分手经济纠纷起诉书模板
- 胆囊切除术术后健康饮食宣教
评论
0/150
提交评论