1、第18讲 VHDL顺序语句(4) 主要知识点: RETURN语句 NULL语句 函数调用语句 过程调用语句,VHDL语言的顺序语句,顺序语句(Sequential Statements)用来实现模型的算法描述。,这些语句从多侧面完整地描述数字系统的硬件结构和基本逻辑功能,其中包括通信的方式、信号的赋值、多层次的元件例化以及系统行为等。,顺序语句和并行语句是VHDL程序设计中两大基本描述语句系列。,并行语句(Concurrent Statements)用来表示各模型算法描述之间的连接关系。,顺序语句只能出现在进程(PROCESS)过程(PROCEDURE)函数(FUNCTION) 中,其它都是并
2、行语句。,顺序语句是相对于并行语句而言的,其特点是每一条顺序语句的执行(指仿真执行)顺序是与它们的书写顺序基本一致的,,理解,一个进程是由一系列顺序语句构成的,而进程本身属并行语句。也就是说,在同一设计实体中,所有的进程是并行执行的,每个进程内部是顺序执行的。,VHDL有如下六类基本顺序语句:,信号赋值语句 变量赋值语句,1、赋值语句,2、流程控制语句,3、等待语句,4、子程序调用语句,5、返回语句,6、空操作语句,IF语句 CASE语句 LOOP语句 NEXT语句 EXIT语句,RETURN语句,NULL语句,WAIT语句,过程调用 函数调用,返回语句 RETURNRETURN语句是一段子程
3、序结束后,返回主程序的控制语句。它只能用于函数与过程体内,并用来结束当前最内层函数或过程体的执行。 RETURN语句的书写格式为: RETURN; RETURN 表达式;,第一种格式只能用于过程,它后面一定不能有表达式;第二种格式只能用于函数,它后面必须有条件表达式,它是函数结束的必要条件,函数结束必须用RETURN语句。,例:在函数体中使用RETURN语句 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY example ISPORT(a,b:IN INTEGER range 0 to 10;y:OUT INTEGER range 0 to
4、 10); END example;ARCHITECTURE rtl OF example IS BEGIN PROCESS(a,b)FUNCTION maximum(a,b:INTEGER range 0 to 10) RETURN INTEGER ISVARIABLE tmp:INTEGER;,BEGINIF(a b)THENtmp := a; ELSEtmp := b; END IF; return tmp; END maximum; BEGINy = maximum(a,b); END PROCESS; END rtl;,上例是一个对两个输入整数取最大值的功能描述,在结构体的进程中定义
5、了一个取最大值的函数。在函数体中正是通过RETURN语句将比较得到的最大值返回的,并结束该函数体的执行。,NULL语句 NULL语句是空操作语句,不完成任何操作,执行NULL语句只是让程序运行流程走到下一个语句。 NULL语句的书写格式为:NULL; 常用于CASE语句中,利用NULL来表示所余的不用的条件下的操作行为,以满足CASE语句对条件值全部列举的要求。,CASE Opcode IS WHEN “001“ = tmp := rega AND regb ;WHEN “101“ = tmp := rega OR regb ;WHEN “110“ = tmp := NOT rega ;WHE
6、N OTHERS = NULL ; END CASE ;,例:采用NULL语句的四选一数据选择器。 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY mux4 ISPORT(d0 :IN STD_LOGIC_VECTOR (7 DOWNTO 1);d1 :IN STD_LOGIC_VECTOR (7 DOWNTO 1);d2 :IN STD_LOGIC_VECTOR (7 DOWNTO 1);d3 :IN STD_LOGIC_VECTOR (7 DOWNTO 1);s0 :IN STD_LOGIC;s1 :IN STD_LOGIC;y :OU
7、T STD_LOGIC_VECTOR (7 DOWNTO 1) ); END mux4 ; ARCHITECTURE behave OF mux4 IS,BEGIN lable:PROCESS(d0,d1,d2,d3,s0,s1)VARIABLE tmp:INTEGER;BEGINtmp := 0;IF(s0=1)THENtmp := tmp+1;END IF;IF(s1=1)THENtmp := tmp+2;END IF;,CASE tmp ISWHEN 0 = y y y y NULL;END CASE;END PROCESS; END behave; 上例是通过对用于选通8位总线的四选一
8、多路选择器进行功能描述,具体说明NULL语句的使用。,子程序调用语句 A.过程调用语句(Procedure Call)与其他高级程序设计语言相似,VHDL提供了子程序的概念。其中在进程、函数和过程中,可以使用过程调用语句,此时它是一种顺序语句。一个过程被调用时将去执行它的过程体。,调用过程的语句格式如下:过程名(形参名= 实参表达式 ,形参名= 实参表达式) ;,一个过程的调用将分别完成以下三个步骤:,(1)将IN和INOUT模式的实参值赋给欲调用的过程中与它们对应的形参;,(2)执行这个过程;,(3)将过程中IN和INOUT模式的形参值返回给对应的实参。,例: LIBRARY IEEE; U
9、SE IEEE. STD_LOGIC_1164.ALL; USE IEEE. STD_LOGIC_UNSIGNED.ALL; ENTITY max ISPORT(in1:IN STD_LOGIC_VECTOR (7 DOWNTO 0);in2:IN STD_LOGIC_VECTOR (7 DOWNTO 0);in3:IN STD_LOGIC_VECTOR (7 DOWNTO 0);q:OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); END max;,ARCHITECTURE rtl OF max ISfunction maximum(a,b:IN STD_LOGIC_
10、VECTOR)return std_logic_vector ISVARIABLE temp,c:STD_LOGIC_VECTOR(7 downto 0); BEGIN IF(a b)THENtemp := a;ELSEtemp := b;END IF;c := temp; return c;END maximum;,BEGINPROCESS(in1,in2,in3) VARIABLE tmp1,tmp2:STD_LOGIC_VECTOR (7 DOWNTO 0);BEGINtmp1:=maximum(in1,in2); -过程调用tmp2:=maximum(tmp1,in3);q = tmp
11、2;END PROCESS; END rtl;上例是一个取三个输入位矢量最大值的功能描述,它在结构体中的进程语句中使用了两个过程调用语句。,B. 函数调用语句函数调用与过程调用是十分相似的,不同之处是,调用函数将返还一个指定数据类型的值,函数的参量只能是输入值。,函数语句分为两个部分,函数首和函数体。 (1)函数首的格式为: FUNCTION 函数名称(参数列表) RETURN 数据类型名; (2)函数体的格式为: FUNCTION 函数名称(参数列表)RETURN 数据类型名 IS 说明部分BEGIN顺序语句RETURN 返回变量END 函数名称; 调用函数语句的格式为: Y=函数名称(参数
12、列表);,练习:用函数实现求三个数中的最大数。 三个整数(0-15之间):A,B,C; 最大数:MAX。,断言语句(Assert) 断言语句分为顺序断言语句和并行断言语句,顺序断言语句主要用于进程、函数和过程仿真、调试中的人机对话,它可以给出一个文字串作为警告和错误信息。断言语句的书写格式如下: ASSERT 条件 REPORT 报告信息 SEVERITY 出错级别; 在执行过程中,断言语句对条件(布尔表达式)的真假进行判断,如果条件为“TURE”,则向下执行另外一条语句;如果条件为“FALSE”,则输出错误信息和错误严重程度的级别。在REPORT后面跟着的是设计者写的字符串,通常是说明错误的
13、原因,字符串要用双引号括起来。SEVERITY后面跟着的是错误严重程度的级别,他们分别是:,NOTE(注意) WARNING(警告) ERROR(错误) FAILURE(失败) 若REPORT子句缺省,则默认消息为“Assertion violation”;若SEVERITY子句缺省,则出错级别的默认值为“ERROR”。,例: RS触发器的VHDL描述中断言语句的使用 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY rsff ISPORT(s :IN BIT;r :IN BIT;q :OUT BIT;qb :OUT BIT); END rs
14、ff; ARCHITECTURE rtl OF rsff IS BEGINPROCESS(s,r) VARIABLE last_state :BIT;,BEGINASSERT(NOT(s =1AND r =1)REPORT “Both s and r equal to1.”SEVERITY ERROR;IF(s =0AND r =0)THENlast_state := last_state;ELSIF(s =0AND r =1)THENlast_state := 0;ELSElast_state := 1;END IF; q = last_state;qb = not(last_state);
15、 END PROCESS; END rtl;,上例中,如果 r 和 s 都为1时,表示一种不定状态。在进程中先是设定了一条断言语句,目的是:当判断 r 和 s 都为1时,输出终端将显示字符串“Both s and r equal to1.”,同时可能终止模拟过程,并显示错误的严重程度。接下来用IF语句判别触发器的其他三种情况,最后将值送到触发器的两个输出端口上。,REPORT 语句REPORT语句不增加硬件任何功能,但提供顺序断言语句的短格式,在仿真时使用REPORT语句可以提高程序的可读性。 REPORT语句的书写格式为: REPORT 输出信息 SEVERITY 出错级别; 例: RS触发
16、器的VHDL描述中REPORT语句的使用 (本例中,用REPORT语句代替上例进程中的断言语句。),LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY rsff ISPORT(s :IN BIT;r :IN BIT;q :OUT BIT;qb :OUT BIT); END rsff; ARCHITECTURE rtl OF rsff IS BEGIN PROCESS(s,r) VARIABLE last_state :BIT;,BEGINIF(s =1AND r =1)THENREPORT “Both s and r equal to1.”;E
17、LSIF (s =0AND r =0)THENlast_state:= last_state;ELSIF (s =0AND r =1)THENlast_state := 0;ELSElast_state := 1;END IF;q = last_state;qb = not(last_state); END PROCESS; END rtl;,在VHDL中,并行语句在结构体中的执行是同时并发执行的,其书写次序与其执行顺序并无关联,并行语句的执行顺序是由他们的触发事件来决定的。 我们知道,实际的硬件系统中很多操作都是并发的,因此在对系统进行模拟时就要把这些并发性体现出来,并行语句正是用来表示这种
18、并发行为的。 在结构体语句中,并行语句的位置是: ARCHITECTURE 结构体名 OF 实体名 IS说明语句BEGIN并行语句END 结构体名;,VHDL并行语句,其中并行语句主要有以下几种: PROCESS -进程语句 BLOCK -块语句 CONCURRENT SIGNAL ASSIGNMENT -并行信号代入语句 CONDITIONAL SIGNAL ASSIGNMENT - -条件信号代入语句 SELECTIVE SIGNAL ASSIGNMENT - -选择信号代入语句 CONCURRENT PROCEDURE CALL -并行过程调用语句 ASSERT - -并行断言语句 GE
19、NERIC - -参数传递语句 COMPONENT_INSTANT -元件例化语句 GENERATE -生成语句 并行描述语句语句可以是结构性的,也可以是行为性的。下面对这些语句的应用加以介绍。,进程语句(PROCESS) 进程语句是最主要的并行语句,它在VHDL程序设计中使用频率最高,也是最能体现硬件描述语言特点的一条语句。进程语句的内部是是顺序语句,而进程语句本身是一种并行语句。进程语句的综合是比较复杂的,主要涉及这样一些问题:综合后的进程是用组合逻辑电路还是用时序逻辑电路来实现?进程中的对象是否有必要用寄存器、触发器、锁存器或是RAM等存储器件来实现。 进程语句结构中至少需要一个敏感信号
20、量,否则除了初始化阶段,进程永远不会被再次激活。这个敏感量一般是一个同步控制信号,同步控制信号用在同步语句中,同步语句可以是敏感信号表、WAIT UNTIL语句或是WAIT ON语句。一般来说,只有一个同步点或者是具有多个同步点但都使用完全相同的同步控制信号的进程不需要“记忆”在哪一个同步点上被挂起时,不会形成存储器。如下例所示:,-综合后不需要存储器的VHDL进程 label1:PROCESS(a,b,c) BEGIN -其中没有其他同步描述 AND PROCESS label1; -综合后需要存储器的VHDL进程 label2:PROCESS BEGINWAIT UNTIL clkEVEN
21、T AND clk=1;s =0;WAIT UNTIL clkEVENT AND clk=1;s =1; AND PROCESS label2;,-不会形成存储器的变量 label3:PROCESS(a,b,c)VARIABLE var:BIT; BEGINvar := a XOR b;s = var AND c; AND PROCESS label3; -需要存储器的变量 label4:PROCESSTYPE state_table IS (stop,go);VARIABLE state:table_ state; BEGINWAIT UNTIL clkEVENT AND clk=1;,CA
22、SE state IS - - state在赋值之前先被读访问WHEN stop = state := go;WHEN go = state := stop;- -这两个语句是并发关系END CASE; AND PROCESS label4;,-综合为触发器的进程 label5:PROCESS BEGINWAIT UNTIL clkEVENT AND clk=1;q = d; END PROCESS label5;,块语句(BLOCK) 块(BLOCK)语句可以看作是结构体中的子模块,块语句把许多并行语句组合在一起形成一个子模块,而它本身也是一个并行语句。 块语句的基本结构如下: 块标号: B
23、LOCK 保护表达式 类属子句 类属接口表;; 端口子句 端口接口表;; 块说明部分 BEGIN END BLOCK 块标号;,例: 利用块语句描述的全加器 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY add ISPORT(A:IN STD_LOGIC;B:IN STD_LOGIC;Cin:IN STD_LOGIC;Co:OUT STD_LOGIC;S:OUT STD_LOGIC); END add; ARCHITECTURE dataflow OF add IS BEGIN,ex : BLOCKPORT(a_A:IN STD_LOGI
24、C;a_B:IN STD_LOGIC;a_Cin:IN STD_LOGIC;a_Co:OUT STD_LOGIC; a_S:OUT STD_LOGIC);PORT MAP(a_A=A,a_B=B,a_Cin= Cin,a_Co= Co,a_S=S);SIGNAL tmp1,tmp2:STD_LOGIC;BEGINlabel1:PROCESS(a_A,a_B)BEGINtmp1= a_A XOR a_B;END PROCESS label1;,label2:PROCESS(tmp1,a_Cin)BEGINtmp2= tmp1AND a_Cin ;END PROCESS label2;label3
25、:PROCESS(tmp1,a_Cin)BEGINa_S = tmp1XOR a_Cin ;END PROCESS label3;label4:PROCESS(a_A,a_B,tmp2)BEGINa_Co = tmp2 OR(a_A AND a_B);END PROCESS label4;END BLOCK ex; END dataflow;,在上面的例子中,结构体内含有4个进程语句,这4个进程语句是并行关系,共同形成了一个块语句。在实际应用中,一个块语句中又可以包含多个子块语句,这样循环嵌套以形成一个大规模的硬件电路。,并行信号代入语句 信号代入语句有两种:一种是在结构体中的进程内使用,此时
26、它作为一种顺序语句出现;另一种是在结构体的进程之外使用,此时它是一种并行语句,因此称之为并行信号代入语句。 并行信号代入语句的语法格式为:信号量 = 敏感信号量表达式; 需要注意的是,一条信号代入语句与一个信号代入的进程语句是等价的,我们可以把一条信号代入语句改写成一个信号代入的进程语句。,例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY and_gat ISPORT(a:IN STD_LOGIC;b:IN STD_LOGIC;y:OUT STD_LOGIC); END and_gat; ARCHITECTURE behave OF a
27、nd_gat IS BEGINy = a AND b; -并行信号代入语句(在结构体进程之外) AND behave; 本例是一个2输入与门的VHDL描述,在结构体中使用了并行信号代入语句。下面是2输入与门的另一种VHDL描述,在描述的结构体中采用了与上述并行信号代入语句等价的进程语句。,例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY and_gat ISPORT(a:IN STD_LOGIC;b:IN STD_LOGIC;y:OUT STD_LOGIC); END and_gat; ARCHITECTURE behave OF an
28、d_gat IS BEGINPROCESS (a,b)BEGINy = a AND b; -进程语句( 顺序语句)AND PROCESS; AND behave;,通过对上述两个例子的分析可见:从并行信号代入语句描述来看,当代入符号“=”右边的值发生任何变化时,信号代入语句的操作立即执行,将信号代入符号“=”右边的表达式代入给左边的信号量;从进程语句的描述来看,当进程敏感信号表中的敏感信号量发生变化时,进程将被启动,顺序信号代入语句将被执行以完成信号的代入操作。 在VHDL中提供了三种并行信号代入语句: 并发信号代入语句 条件信号代入语句选择信号代入语句,(1) 并发信号代入语句 信号代入语句
29、在进程内部执行时,它是一种顺序语句;信号代入语句在结构体的进程之外出现时,它作为并发语句的形式出现。作为并发信号代入语句,在结构体中他们是并行执行的,他们的执行顺序与书写无关。 并发信号代入语句是靠事件驱动的。对于并发信号代入语句来说,只有代入符号“=”右边的对象有事件发生时才会执行该语句。 在实际设计中,并发信号代入语句常用来进行加法器、乘法器、除法器和比较器等多种逻辑电路的描述。下面是一个用VHDL并发语句描述的全加器的例子。,例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY add ISPORT(A:IN STD_LOGIC;B:
30、IN STD_LOGIC;Cin:IN STD_LOGIC;Co:OUT STD_LOGIC;S:OUT STD_LOGIC); END add; ARCHITECTURE dataflow OF add ISSIGNAL tmp1,tmp2:STD_LOGIC;,BEGINtmp1 = A XOR B;tmp2 = tmp1 AND Cin; -4条并发信号代入语句S = tmp1 XOR Cin;Co = tmp2 OR(A AND B); AND dataflow;,在上例的结构体中有4条并发信号代入语句,他们的执行顺序与书写顺序是无关的,因此上面的4条并发信号代入语句可以任意颠倒书写顺
31、序,不会对执行结果产生任何影响。上面提到的并发信号代入语句是事件驱动的,例如:tmp2 = tmp1 AND Cin;S = tmp1 XOR Cin; 两条语句,只要tmp1 和 Cin中的值有一个发生变化,即有事件发生,那么这两条语句就会立即并发执行。,(2)条件信号代入语句 条件信号代入语句也是一种并发描述语句,它是一种根据不同条件将不同的表达式代入目的信号的语句。条件信号代入语句的书写格式为: 目的信号 = 表达式1 WHEN 条件1 ELSE表达式2 WHEN 条件2 ELSE表达式2 WHEN 条件3 ELSE表达式n-1 WHEN 条件 ELSE表达式; 条件信号代入语句执行时要
32、先进行条件判断,如果条件满足,就将条件前面的那个表达式的值代入目的信号;如果不满足条件,就去判断下一个条件;最后一个表达式没有条件,也就是说在前面的条件都不满足时,就将该表达式的值代入目的信号。,下面的例子是用条件信号代入语句来描述的七段显示译码器 例: 采用条件代入语句描述的七段显示译码器 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY se7 ISPORT(input:IN STD_LOGIC_VECTOR (3 DOWNTO 0);output:OUT STD_LOGIC_VECTOR (6 DOWNTO 0)); END se7;
33、ARCHITECTURE rtl OF se7 IS BEGINoutput =(0,1,1,1,1,1,1) WHEN input =“0000”ELSE(0,0,0,0,1,1,0)WHEN input =“0001”ELSE(1,0,1,1,0,1,1)WHEN input =“0010”ELSE,(1,0,0,1,1,1,1)WHEN input =“0011”ELSE (1,1,0,0,1,1,0)WHEN input =“0100”ELSE (1,1,0,1,1,0,1)WHEN input =“0101”ELSE (1,1,1,1,1,0,1)WHEN input =“0110”
34、ELSE (0,0,0,0,1,1,1)WHEN input =“0111”ELSE (1,1,1,1,1,1,1)WHEN input =“1000”ELSE (1,1,0,1,1,1,1)WHEN input =“1001”ELSE(1,1,1,0,1,1,1)WHEN input =“1010”ELSE (1,1,1,1,1,0,0)WHEN input =“1011”ELSE (0,1,1,1,0,0,1)WHEN input =“1100”ELSE (1,0,1,1,1,1,0)WHEN input =“1101”ELSE (1,1,1,1,0,0,1)WHEN input =“11
35、10”ELSE (1,1,1,0,0,0,1)WHEN input =“1111”ELSE (0,0,0,0,0,0,0); - -灭灯 END rtl;,在上例中,七段显示译码器有一个输入端口input和一个输出端口output。输入端口input是一个四位总线,表示3到0的四位逻辑向量,表示输入是一个四位二进制数。输出端口output也以总线形式表示,它表示6到0的7位逻辑向量,表示输出是一个七位二进制数,以驱动共阴极显示七段数码管。在上例的结构体中,用一个条件代入语句来完成所有状态的显示译码。在保留字WHEN的前面是驱动显示数码管的七位位矢量,WHEN的后面是译码的条件。需要说明的是条件
36、信号代入语句中的书写顺序不是固定的,位置是可以任意颠倒的,他们并不表示执行的先后顺序,实际上他们是并发执行的。,(3) 选择信号代入语句 选择信号代入语句的书写格式为: WITH 表达式 SELECT 目的信号 = 表达式1 WHEN 条件1;表达式2 WHEN 条件2;表达式3 WHEN 条件3;表达式n WHEN 条件n; VHDL在执行选择信号代入语句时,目的信号是根据表达式的当前值来进行表达式代入的。当表达式的值符合某个条件时,就把该条件前的表达式代入目的信号;当表达式的值不符合条件时,语句就继续向下判断,直到找到满足的条件为止。选择信号代入语句与case语句相类似,都是对表达式进行测
37、试,当表达式的值不同时,将把不同的表达式代入目的信号。需要注意的是,选择信号代入语句与case语句一样,必须把表达式的值在条件中都列出来,否则编译将会出错。,下面的例子是一个采用选择信号代入语句描述的选通8位总线的四选一多路选择器。 例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY mux4 ISPORT(d0:IN STD_LOGIC_VECTOR (7 DOWNTO 0);d1:IN STD_LOGIC_VECTOR (7 DOWNTO 0);d2:IN STD_LOGIC_VECTOR (7 DOWNTO 0);d3:IN STD
38、_LOGIC_VECTOR (7 DOWNTO 0);s0:IN STD_LOGIC;s1:IN STD_LOGIC;q:OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END mux4;,ARCHITECTURE rtl OF mux4 ISSIGNAL comb:STD_LOGIC_VECTOR (1 DOWNTO 0); BEGIN comb = s1 & s0;WITH comb SELECT - -用comb进行选择q = d0 WHEN “00”;d1 WHEN “01”;d2 WHEN “10”d3 WHEN OTHERS; - -上面4条语句是并行执行的
39、 END rtl;,并行过程调用语句过程调用语句在进程内部执行时,它是一种顺序语句;过程调用语句在结构体的进程之外出现时,它作为并发语句的形式出现。作为并行过程调用语句,在结构体中他们是并行执行的,其执行顺序与书写顺序无关。 并行过程调用语句的一般书写格式如下:PROCEDURE 过程名(参数1;参数2;)IS定义语句; -变量定义BEGIN顺序处理语句END 过程名;,下例是一个取三个输入位矢量最大值的功能描述,在它的结构体中使用了两个并行过程调用语句。 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; USE IEEE. STD_LOGIC_UNSIG
40、NED.ALL; ENTITY max ISPORT(in1:IN STD_LOGIC_VECTOR (7 DOWNTO 0);in2:IN STD_LOGIC_VECTOR (7 DOWNTO 0);in3:IN STD_LOGIC_VECTOR (7 DOWNTO 0);q:OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END max; ARCHITECTURE rtl OF max IS,PROCEDURE maximun(a,b:IN STD_LOGIC_VECTOR;SIGNAL c:OUT STD_LOGIC_VECTOR)ISVARIABLE temp:
41、STD_LOGIC_VECTOR (aRANGE); BEGIN - -temp矢量长度与a相同IF (a b) THENtemp := a;ELSEtemp := b;END IF;c = temp;END maximun;SIGNAL tmp1,tmp2:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);,BEGmaximun(in1,in2,tmp1);maximun(tmp1,in3,tmp2);q = tmp2; END rtl;,并行断言语句 并行断言语句的书写格式为: ASSERT 条件 REPORT 报告信息 SEVERITY 出错级别 并行断言语句的书写格式与
42、顺序断言语句的书写格式相同。顺序断言语句只能用在进程、函数和过程中,而并行断言语句用在结构体中。任何并行断言语句都对应着一个等价的被动进程语句,被动进程语句没有输出,因此并行断言语句的执行不会引起任何事件的发生,只是在断言条件为“false”时给出一条信息报告。,例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; USE IEEE. STD_LOGIC_UNSIGNED.ALL; ENTITY example IS END example; ARCHITECTURE behave OF example ISSIGNAL comb: STD_LOGIC_
43、VECTOR(1 DOWNTO 0); BEGINASSERT FALSEREPORT“This entity is a example to descript assert statement”SEVERITY NOTE; END behave;,参数传递语句 参数传递语句(GENERIC)主要用来传递信息给设计实体的某个具体元件,如用来定义端口宽度、器件延迟时间等参数后并将这些参数传递给设计实体。使用参数传递语句易于使设计具有通用性,例如,在设计中有一些参数不能确定,为了简化设计和减少VHDL程序的书写,我们通常编写通用的VHDL程序。在设计程序中,这些参数是待定的,在模拟时,只要用GEN
44、ERIC语句将待定参数初始化即可。 参数传递语句的书写格式为: GENERIC(类属表);,例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY and2 ISGENERIC(DELAY:TIME:= 10 ns);PORT(a:IN STD_LOGIC;b:IN STD_LOGIC;c:OUT STD_LOGIC); END and2; ARCHITECTURE behave OF and2 IS BEGINc = a AND b AFTER(DELAY); END behave;,元件例化语句 元件例化就是将预先设计好的设计实体定义为一
45、个元件,然后利用映射语句将此元件与当前设计实体中的指定端口相连,从而为当前设计实体引入了一个低一级的设计层次。在结构体中,描述只表示元件(或模块)和元件(或模块)之间的互连,就象网表一样。当引用库中不存在的元件时,必须首先进行元件的创建,然后将其放在工作库中,通过调用工作库来引用元件。在引用元件时,要先在结构体中说明部分进行元件的说明,然后在使用元件时进行元件例化。 元件例化语句也是一种并行语句,各个例化语句的执行顺序与例化语句的书写顺序无关,而是按照驱动的事件并行执行的。 在进行元件例化时,首先要进行例化元件的说明,元件说明部分使用COMPONENT语句,COMPONENT语句用来说明在结构
46、体中所要调用的模块。如果所调用的模块在元件库中并不存在时,设计人员必须首先进行元件的创建,然后将其放在工作库中通过调用工作库来引用该元件。,COMPONENT语句的一般书写格式如下:COMPONENT GENERIC ;PORT ;END COMPONENT; - -元件说明语句 在上面的书写结构中,保留字COMPONENT后面的“引用元件名”用来指定要在结构体中例化的元件,该元件必须已经存在于调用的工作库中;如果在结构体中要进行参数传递,在COMPONENT语句中,就要有传递参数的说明,传递参数的说明语句以保留字GENERIC开始;然后是端口说明,用来对引用元件的端口进行说明;最后以保留字E
47、ND COMPONENT来结束 COMPONENT语句。,如果在结构体中要引用上例中所定义的带延迟的二输入与门,首先在结构体中要用COMPONENT语句对该元件进行说明,说明如下: COMPONENT and2 GENERIC(DELAY:TIME);PORT(a:IN STD_LOGIC;b:IN STD_LOGIC;c:OUT STD_LOGIC); END COMPONENT; 用COMPONENT语句对要引用的元件进行说明之后,就可以在结构体中对元件进行例化以使用该元件。 元件例化语句的书写格式为:GENERIC MAP(参数映射) PORT MAP(端口映射);,标号名是此元件例化的唯一标志,在结构体中标号名应该是唯一的,否则编译时将会给出错误信息;接下来就是映射语句,映射语句就是把元件的参数和端口与实际连接的信号对应起来,以进行元件的引用。 VHDL提供了两种映射方法:位置映射和名称映射。 位置映射就是PORT MAP语句中实际信号的书写顺序与COMPONENT语句中端口说明中的信号书写顺序保持一致,如下例所示:,位置映射示例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY example ISPORT(in1,in2:IN STD_LOGIC; out:OUT STD_LOGIC); END example;,