VHDL顺序描述语句.ppt

上传人:小飞机 文档编号:6522958 上传时间:2023-11-08 格式:PPT 页数:79 大小:208KB
返回 下载 相关 举报
VHDL顺序描述语句.ppt_第1页
第1页 / 共79页
VHDL顺序描述语句.ppt_第2页
第2页 / 共79页
VHDL顺序描述语句.ppt_第3页
第3页 / 共79页
VHDL顺序描述语句.ppt_第4页
第4页 / 共79页
VHDL顺序描述语句.ppt_第5页
第5页 / 共79页
点击查看更多>>
资源描述

《VHDL顺序描述语句.ppt》由会员分享,可在线阅读,更多相关《VHDL顺序描述语句.ppt(79页珍藏版)》请在三一办公上搜索。

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语句,过程调用函数调用,返回语句 RETURN RETURN语句是一段子程序结束后,返回主程序的控制语句。它只能用于函数与过程体内,并用来结束当前最内层函数或过程体的执行。RETURN语句的书写格式为:RETURN;RE

3、TURN 表达式;,第一种格式只能用于过程,它后面一定不能有表达式;第二种格式只能用于函数,它后面必须有条件表达式,它是函数结束的必要条件,函数结束必须用RETURN语句。,例1:在函数体中使用RETURN语句LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY example IS PORT(a,b:IN INTEGER range 0 to 10;y:OUT INTEGER range 0 to 10);END example;ARCHITECTURE rtl OF example ISBEGIN PROCESS(a,b)FUNCTION maxi

4、mum(a,b:INTEGER range 0 to 10)RETURN INTEGER IS VARIABLE tmp:INTEGER;,BEGIN IF(a b)THEN tmp:=a;ELSE tmp:=b;END IF;return tmp;END maximum;BEGIN y=maximum(a,b);END PROCESS;END rtl;,上例是一个对两个输入整数取最大值的功能描述,在结构体的进程中定义了一个取最大值的函数。在函数体中正是通过RETURN语句将比较得到的最大值返回的,并结束该函数体的执行。,NULL语句NULL语句是空操作语句,不完成任何操作,执行NULL语句只

5、是让程序运行流程走到下一个语句。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;WHEN OTHERS=NULL;END CASE;,例2:采用NULL语句的四选一数据选择器。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux4 IS PORT(d0:IN S

6、TD_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:OUT 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;B

7、EGIN tmp:=0;IF(s0=1)THEN tmp:=tmp+1;END IF;IF(s1=1)THEN tmp:=tmp+2;END IF;,CASE tmp IS WHEN 0=y y y y NULL;END CASE;END PROCESS;END behave;上例是通过对用于选通8位总线的四选一多路选择器进行功能描述,具体说明NULL语句的使用。,子程序调用语句A.过程调用语句(Procedure Call)与其他高级程序设计语言相似,VHDL提供了子程序的概念。其中在进程、函数和过程中,可以使用过程调用语句,此时它是一种顺序语句。一个过程被调用时将去执行它的过程体。,调用过

8、程的语句格式如下:过程名(形参名=实参表达式,形参名=实参表达式);,一个过程的调用将分别完成以下三个步骤:,(1)将IN和INOUT模式的实参值赋给欲调用的过程中与它们对应的形参;,(2)执行这个过程;,(3)将过程中IN和INOUT模式的形参值返回给对应的实参。,例3:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY max IS PORT(in1:IN STD_LOGIC_VECTOR(7 DOWNTO 0);in2:IN STD_LOGIC_VECTOR(7 DOWNTO 0)

9、;in3:IN STD_LOGIC_VECTOR(7 DOWNTO 0);q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END max;,ARCHITECTURE rtl OF max IS procedure maximum(a,b:IN STD_LOGIC_VECTOR;c:out std_logic_vector)IS BEGIN IF(a b)THEN c:=a;ELSE c:=b;END IF;END maximum;,BEGIN PROCESS(in1,in2,in3)VARIABLE tmp1,tmp2:STD_LOGIC_VECTOR(7 DOWNTO

10、0);BEGIN maximum(in1,in2,tmp1);-过程调用 maximum(tmp1,in3,tmp2);-过程调用 q=tmp2;END PROCESS;END rtl;上例是一个取三个输入位矢量最大值的功能描述,它在结构体中的进程语句中使用了两个过程调用语句。,B.函数调用语句 函数调用与过程调用是十分相似的,不同之处是,调用函数将返还一个指定数据类型的值,函数的参量只能是输入值。,函数语句分为两个部分,函数首和函数体。(1)函数首的格式为:FUNCTION 函数名称(参数列表)RETURN 数据类型名;(2)函数体的格式为:FUNCTION 函数名称(参数列表)RETURN

11、 数据类型名IS 说明部分BEGIN顺序语句RETURN 返回变量END 函数名称;调用函数语句的格式为:Y=函数名称(参数列表);,练习1:将例3改为函数调用实现.练习2:用函数实现求三个数中的最大数。三个整数(0-15之间):A,B,C;最大数:MAX。,断言语句(Assert)断言语句分为顺序断言语句和并行断言语句,顺序断言语句主要用于进程、函数和过程仿真、调试中的人机对话,它可以给出一个文字串作为警告和错误信息。断言语句的书写格式如下:ASSERT 条件 REPORT 报告信息 SEVERITY 出错级别;在执行过程中,断言语句对条件(布尔表达式)的真假进行判断,如果条件为“TURE”

12、,则向下执行另外一条语句;如果条件为“FALSE”,则输出错误信息和错误严重程度的级别。在REPORT后面跟着的是设计者写的字符串,通常是说明错误的原因,字符串要用双引号括起来。SEVERITY后面跟着的是错误严重程度的级别,他们分别是:,NOTE(注意)WARNING(警告)ERROR(错误)FAILURE(失败)若REPORT子句缺省,则默认消息为“Assertion violation”;若SEVERITY子句缺省,则出错级别的默认值为“ERROR”。,例4:RS触发器的VHDL描述中断言语句的使用LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTI

13、TY rsff IS PORT(s:IN BIT;r:IN BIT;q:OUT BIT;qb:OUT BIT);END rsff;ARCHITECTURE rtl OF rsff ISBEGIN PROCESS(s,r)VARIABLE last_state:BIT;,BEGIN ASSERT(NOT(s=1AND r=1)REPORT Both s and r equal to 1 SEVERITY ERROR;IF(s=0 AND r=0)THEN last_state:=last_state;ELSIF(s=0AND r=1)THEN last_state:=0;ELSE last_st

14、ate:=1;END IF;q=last_state;qb=not(last_state);END PROCESS;END rtl;,上例中,如果 r 和 s 都为1时,表示一种不定状态。在进程中先是设定了一条断言语句,目的是:当判断 r 和 s 都为1时,输出终端将显示字符串“Both s and r equal to1.”,同时可能终止模拟过程,并显示错误的严重程度。接下来用IF语句判别触发器的其他三种情况,最后将值送到触发器的两个输出端口上。,REPORT 语句 REPORT语句不增加硬件任何功能,但提供顺序断言语句的短格式,在仿真时使用REPORT语句可以提高程序的可读性。REPORT

15、语句的书写格式为:REPORT 输出信息 SEVERITY 出错级别;例:RS触发器的VHDL描述中REPORT语句的使用(本例中,用REPORT语句代替上例进程中的断言语句。),例5:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY rsff IS PORT(s:IN BIT;r:IN BIT;q:OUT BIT;qb:OUT BIT);END rsff;ARCHITECTURE rtl OF rsff ISBEGINPROCESS(s,r)VARIABLE last_state:BIT;,BEGIN IF(s=1AND r=1)THEN REP

16、ORT“Both s and r equal to1.”;ELSIF(s=0AND r=0)THEN last_state:=last_state;ELSIF(s=0AND r=1)THEN last_state:=0;ELSE last_state:=1;END IF;q=last_state;qb=not(last_state);END PROCESS;END rtl;,在VHDL中,并行语句在结构体中的执行是同时并发执行的,其书写次序与其执行顺序并无关联,并行语句的执行顺序是由他们的触发事件来决定的。我们知道,实际的硬件系统中很多操作都是并发的,因此在对系统进行模拟时就要把这些并发性体现

17、出来,并行语句正是用来表示这种并发行为的。在结构体语句中,并行语句的位置是:ARCHITECTURE 结构体名 OF 实体名 IS 说明语句 BEGIN 并行语句 END 结构体名;,VHDL并行语句,其中并行语句主要有以下几种:PROCESS-进程语句BLOCK-块语句CONCURRENT SIGNAL ASSIGNMENT-并行信号代入语句CONDITIONAL SIGNAL ASSIGNMENT-条件信号代入语句SELECTIVE SIGNAL ASSIGNMENT-选择信号代入语句CONCURRENT PROCEDURE CALL-并行过程调用语句ASSERT-并行断言语句GENERI

18、C-参数传递语句COMPONENT_INSTANT-元件例化语句GENERATE-生成语句并行描述语句语句可以是结构性的,也可以是行为性的。下面对这些语句的应用加以介绍。,进程语句(PROCESS)进程语句是最主要的并行语句,它在VHDL程序设计中使用频率最高,也是最能体现硬件描述语言特点的一条语句。进程语句的内部是是顺序语句,而进程语句本身是一种并行语句。进程语句的综合是比较复杂的,主要涉及这样一些问题:综合后的进程是用组合逻辑电路还是用时序逻辑电路来实现?进程中的对象是否有必要用寄存器、触发器、锁存器或是RAM等存储器件来实现。进程语句结构中至少需要一个敏感信号量,否则除了初始化阶段,进程

19、永远不会被再次激活。这个敏感量一般是一个同步控制信号,同步控制信号用在同步语句中,同步语句可以是敏感信号表、WAIT UNTIL语句或是WAIT ON语句。一般来说,只有一个同步点或者是具有多个同步点但都使用完全相同的同步控制信号的进程不需要“记忆”在哪一个同步点上被挂起时,不会形成存储器。如下例所示:,-综合后不需要存储器的VHDL进程label1:PROCESS(a,b,c)BEGIN-其中没有其他同步描述AND PROCESS label1;-综合后需要存储器的VHDL进程label2:PROCESS BEGIN WAIT UNTIL clkEVENT AND clk=1;s=0;WAI

20、T UNTIL clkEVENT AND clk=1;s=1;AND PROCESS label2;,-不会形成存储器的变量label3:PROCESS(a,b,c)VARIABLE var:BIT;BEGIN var:=a XOR b;s=var AND c;AND PROCESS label3;-需要存储器的变量label4:PROCESS TYPE state_table IS(stop,go);VARIABLE state:table_ state;BEGIN WAIT UNTIL clkEVENT AND clk=1;,CASE state IS-state在赋值之前先被读访问 WH

21、EN stop=state:=go;WHEN go=state:=stop;-这两个语句是并发关系 END CASE;AND PROCESS label4;,-综合为触发器的进程label5:PROCESSBEGIN WAIT UNTIL clkEVENT AND clk=1;q=d;END PROCESS label5;,块语句(BLOCK)块(BLOCK)语句可以看作是结构体中的子模块,块语句把许多并行语句组合在一起形成一个子模块,而它本身也是一个并行语句。块语句的基本结构如下:块标号:BLOCK 保护表达式类属子句 类属接口表;;端口子句 端口接口表;;块说明部分BEGIN END BL

22、OCK 块标号;,例:利用块语句描述的全加器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY add IS PORT(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 ISBEGIN,ex:BLOCK PORT(a_A:IN STD_LOGIC;a_B:IN STD_LOGIC;a_Cin:IN STD_LOGIC;a_Co:OUT STD_LOGIC;a_S:OU

23、T STD_LOGIC);PORT MAP(a_A=A,a_B=B,a_Cin=Cin,a_Co=Co,a_S=S);SIGNAL tmp1,tmp2:STD_LOGIC;BEGIN label1:PROCESS(a_A,a_B)BEGIN tmp1=a_A XOR a_B;END PROCESS label1;,label2:PROCESS(tmp1,a_Cin)BEGIN tmp2=tmp1AND a_Cin;END PROCESS label2;label3:PROCESS(tmp1,a_Cin)BEGIN a_S=tmp1XOR a_Cin;END PROCESS label3;lab

24、el4:PROCESS(a_A,a_B,tmp2)BEGIN a_Co=tmp2 OR(a_A AND a_B);END PROCESS label4;END BLOCK ex;END dataflow;,在上面的例子中,结构体内含有4个进程语句,这4个进程语句是并行关系,共同形成了一个块语句。在实际应用中,一个块语句中又可以包含多个子块语句,这样循环嵌套以形成一个大规模的硬件电路。,并行信号代入语句信号代入语句有两种:一种是在结构体中的进程内使用,此时它作为一种顺序语句出现;另一种是在结构体的进程之外使用,此时它是一种并行语句,因此称之为并行信号代入语句。并行信号代入语句的语法格式为:信号量

25、=敏感信号量表达式;需要注意的是,一条信号代入语句与一个信号代入的进程语句是等价的,我们可以把一条信号代入语句改写成一个信号代入的进程语句。,例:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY and_gat IS PORT(a:IN STD_LOGIC;b:IN STD_LOGIC;y:OUT STD_LOGIC);END and_gat;ARCHITECTURE behave OF and_gat ISBEGIN y=a AND b;-并行信号代入语句(在结构体进程之外)AND behave;本例是一个2输入与门的VHDL描述,在结构体中使用

26、了并行信号代入语句。下面是2输入与门的另一种VHDL描述,在描述的结构体中采用了与上述并行信号代入语句等价的进程语句。,例:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY and_gat IS PORT(a:IN STD_LOGIC;b:IN STD_LOGIC;y:OUT STD_LOGIC);END and_gat;ARCHITECTURE behave OF and_gat ISBEGIN PROCESS(a,b)BEGIN y=a AND b;-进程语句(顺序语句)AND PROCESS;AND behave;,通过对上述两个例子的分析可

27、见:从并行信号代入语句描述来看,当代入符号“=”右边的值发生任何变化时,信号代入语句的操作立即执行,将信号代入符号“=”右边的表达式代入给左边的信号量;从进程语句的描述来看,当进程敏感信号表中的敏感信号量发生变化时,进程将被启动,顺序信号代入语句将被执行以完成信号的代入操作。在VHDL中提供了三种并行信号代入语句:并发信号代入语句条件信号代入语句 选择信号代入语句,(1)并发信号代入语句信号代入语句在进程内部执行时,它是一种顺序语句;信号代入语句在结构体的进程之外出现时,它作为并发语句的形式出现。作为并发信号代入语句,在结构体中他们是并行执行的,他们的执行顺序与书写无关。并发信号代入语句是靠事

28、件驱动的。对于并发信号代入语句来说,只有代入符号“=”右边的对象有事件发生时才会执行该语句。在实际设计中,并发信号代入语句常用来进行加法器、乘法器、除法器和比较器等多种逻辑电路的描述。下面是一个用VHDL并发语句描述的全加器的例子。,例:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY add IS PORT(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

29、SIGNAL tmp1,tmp2:STD_LOGIC;,BEGIN tmp1=A XOR B;tmp2=tmp1 AND Cin;-4条并发信号代入语句 S=tmp1 XOR Cin;Co=tmp2 OR(A AND B);AND dataflow;,在上例的结构体中有4条并发信号代入语句,他们的执行顺序与书写顺序是无关的,因此上面的4条并发信号代入语句可以任意颠倒书写顺序,不会对执行结果产生任何影响。上面提到的并发信号代入语句是事件驱动的,例如:tmp2=tmp1 AND Cin;S=tmp1 XOR Cin;两条语句,只要tmp1 和 Cin中的值有一个发生变化,即有事件发生,那么这两条语

30、句就会立即并发执行。,(2)条件信号代入语句条件信号代入语句也是一种并发描述语句,它是一种根据不同条件将不同的表达式代入目的信号的语句。条件信号代入语句的书写格式为:目的信号=表达式1 WHEN 条件1 ELSE 表达式2 WHEN 条件2 ELSE 表达式2 WHEN 条件3 ELSE 表达式n-1 WHEN 条件 ELSE 表达式;条件信号代入语句执行时要先进行条件判断,如果条件满足,就将条件前面的那个表达式的值代入目的信号;如果不满足条件,就去判断下一个条件;最后一个表达式没有条件,也就是说在前面的条件都不满足时,就将该表达式的值代入目的信号。,下面的例子是用条件信号代入语句来描述的七段

31、显示译码器例:采用条件代入语句描述的七段显示译码器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY se7 IS PORT(input:IN STD_LOGIC_VECTOR(3 DOWNTO 0);output:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END se7;ARCHITECTURE rtl OF se7 ISBEGIN output=(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)WH

32、EN 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”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=“1

33、010”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=“1110”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的四位逻辑向量,表示输入是一个四位二进制数。输出

34、端口output也以总线形式表示,它表示6到0的7位逻辑向量,表示输出是一个七位二进制数,以驱动共阴极显示七段数码管。在上例的结构体中,用一个条件代入语句来完成所有状态的显示译码。在保留字WHEN的前面是驱动显示数码管的七位位矢量,WHEN的后面是译码的条件。需要说明的是条件信号代入语句中的书写顺序不是固定的,位置是可以任意颠倒的,他们并不表示执行的先后顺序,实际上他们是并发执行的。,(3)选择信号代入语句选择信号代入语句的书写格式为:WITH 表达式 SELECT目的信号=表达式1 WHEN 条件1;表达式2 WHEN 条件2;表达式3 WHEN 条件3;表达式n WHEN 条件n;VHDL

35、在执行选择信号代入语句时,目的信号是根据表达式的当前值来进行表达式代入的。当表达式的值符合某个条件时,就把该条件前的表达式代入目的信号;当表达式的值不符合条件时,语句就继续向下判断,直到找到满足的条件为止。选择信号代入语句与case语句相类似,都是对表达式进行测试,当表达式的值不同时,将把不同的表达式代入目的信号。需要注意的是,选择信号代入语句与case语句一样,必须把表达式的值在条件中都列出来,否则编译将会出错。,下面的例子是一个采用选择信号代入语句描述的选通8位总线的四选一多路选择器。例:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux

36、4 IS PORT(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_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 IS SIGNAL comb:STD_LOGIC_VECTOR(1 DOWNTO 0);BEG

37、IN comb=s1&s0;WITH comb SELECT-用comb进行选择 q=d0 WHEN“00”;d1 WHEN“01”;d2 WHEN“10”d3 WHEN OTHERS;-上面4条语句是并行执行的END rtl;,并行过程调用语句 过程调用语句在进程内部执行时,它是一种顺序语句;过程调用语句在结构体的进程之外出现时,它作为并发语句的形式出现。作为并行过程调用语句,在结构体中他们是并行执行的,其执行顺序与书写顺序无关。并行过程调用语句的一般书写格式如下:PROCEDURE 过程名(参数1;参数2;)IS 定义语句;-变量定义 BEGIN 顺序处理语句 END 过程名;,下例是一个

38、取三个输入位矢量最大值的功能描述,在它的结构体中使用了两个并行过程调用语句。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY max IS PORT(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 O

39、F max IS,PROCEDURE maximun(a,b:IN STD_LOGIC_VECTOR;SIGNAL c:OUT STD_LOGIC_VECTOR)IS VARIABLE temp:STD_LOGIC_VECTOR(aRANGE);BEGIN-temp矢量长度与a相同 IF(a b)THEN temp:=a;ELSE temp:=b;END IF;c=temp;END maximun;SIGNAL tmp1,tmp2:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);,BEG maximun(in1,in2,tmp1);maximun(tmp1,in3,tmp2)

40、;q=tmp2;END rtl;,并行断言语句并行断言语句的书写格式为:ASSERT 条件 REPORT 报告信息 SEVERITY 出错级别并行断言语句的书写格式与顺序断言语句的书写格式相同。顺序断言语句只能用在进程、函数和过程中,而并行断言语句用在结构体中。任何并行断言语句都对应着一个等价的被动进程语句,被动进程语句没有输出,因此并行断言语句的执行不会引起任何事件的发生,只是在断言条件为“false”时给出一条信息报告。,例:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY exa

41、mple ISEND example;ARCHITECTURE behave OF example IS SIGNAL comb:STD_LOGIC_VECTOR(1 DOWNTO 0);BEGIN ASSERT FALSE REPORT“This entity is a example to descript assert statement”SEVERITY NOTE;END behave;,参数传递语句参数传递语句(GENERIC)主要用来传递信息给设计实体的某个具体元件,如用来定义端口宽度、器件延迟时间等参数后并将这些参数传递给设计实体。使用参数传递语句易于使设计具有通用性,例如,在设

42、计中有一些参数不能确定,为了简化设计和减少VHDL程序的书写,我们通常编写通用的VHDL程序。在设计程序中,这些参数是待定的,在模拟时,只要用GENERIC语句将待定参数初始化即可。参数传递语句的书写格式为:GENERIC(类属表);,例:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY and2 IS GENERIC(DELAY:TIME:=10 ns);PORT(a:IN STD_LOGIC;b:IN STD_LOGIC;c:OUT STD_LOGIC);END and2;ARCHITECTURE behave OF and2 ISBEGIN

43、c=a AND b AFTER(DELAY);END behave;,元件例化语句元件例化就是将预先设计好的设计实体定义为一个元件,然后利用映射语句将此元件与当前设计实体中的指定端口相连,从而为当前设计实体引入了一个低一级的设计层次。在结构体中,描述只表示元件(或模块)和元件(或模块)之间的互连,就象网表一样。当引用库中不存在的元件时,必须首先进行元件的创建,然后将其放在工作库中,通过调用工作库来引用元件。在引用元件时,要先在结构体中说明部分进行元件的说明,然后在使用元件时进行元件例化。元件例化语句也是一种并行语句,各个例化语句的执行顺序与例化语句的书写顺序无关,而是按照驱动的事件并行执行的。

44、在进行元件例化时,首先要进行例化元件的说明,元件说明部分使用COMPONENT语句,COMPONENT语句用来说明在结构体中所要调用的模块。如果所调用的模块在元件库中并不存在时,设计人员必须首先进行元件的创建,然后将其放在工作库中通过调用工作库来引用该元件。,COMPONENT语句的一般书写格式如下:COMPONENT GENERIC;PORT;END COMPONENT;-元件说明语句在上面的书写结构中,保留字COMPONENT后面的“引用元件名”用来指定要在结构体中例化的元件,该元件必须已经存在于调用的工作库中;如果在结构体中要进行参数传递,在COMPONENT语句中,就要有传递参数的说明

45、,传递参数的说明语句以保留字GENERIC开始;然后是端口说明,用来对引用元件的端口进行说明;最后以保留字END COMPONENT来结束 COMPONENT语句。,如果在结构体中要引用上例中所定义的带延迟的二输入与门,首先在结构体中要用COMPONENT语句对该元件进行说明,说明如下:COMPONENT and2GENERIC(DELAY:TIME);PORT(a:IN STD_LOGIC;b:IN STD_LOGIC;c:OUT STD_LOGIC);END COMPONENT;用COMPONENT语句对要引用的元件进行说明之后,就可以在结构体中对元件进行例化以使用该元件。元件例化语句的书

46、写格式为:GENERIC MAP(参数映射)PORT MAP(端口映射);,标号名是此元件例化的唯一标志,在结构体中标号名应该是唯一的,否则编译时将会给出错误信息;接下来就是映射语句,映射语句就是把元件的参数和端口与实际连接的信号对应起来,以进行元件的引用。VHDL提供了两种映射方法:位置映射和名称映射。位置映射就是PORT MAP语句中实际信号的书写顺序与COMPONENT语句中端口说明中的信号书写顺序保持一致,如下例所示:,位置映射示例:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY example IS PORT(in1,in2:IN ST

47、D_LOGIC;out:OUT STD_LOGIC);END example;,ARCHITECTURE structure OF example IS COMPONENT and2GENERIC(DELAY:TIME);PORT(a:IN STD_LOGIC;b:IN STD_LOGIC;c:OUT STD_LOGIC);END COMPONENT;BEGIN U1:and2 GENERIC MAP(10 ns)-参数映射 PORT MAP(in1,in2,out);-端口映射END structure;,标号名 元件名,元件例化,在上例中,元件U1 的端口 a 映射到信号in1,端口 b

48、映射到信号in2,端口c 映射到信号 out。,元件说明,名称映射就是在PORT MAP语句中将引用的元件的端口信号名称赋给结构体中要使用的例化元件的信号,如下例所示:例:名称映射LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY example IS PORT(in1,in2:IN STD_LOGIC;out:OUT STD_LOGIC);END example;ARCHITECTURE structure OF example IS COMPONENT and2GENERIC(DELAY:TIME);PORT(a:IN STD_LOGIC;b:I

49、N STD_LOGIC;,c:OUT STD_LOGIC);END COMPONENT;BEGIN U1:and2 GENERIC MAP(10 ns)PORT MAP(a=in1,b=in2,c=out);END structure;,注意:名称映射的书写顺序要求并不是很严格,只要把要映射的对应信号连接起来就可以了,顺序是可以颠倒的.,生成语句生成语句(GENERATE)是一种可以建立重复结构或者是在多个模块的表示形式之间进行选择的语句。由于生成语句可以用来产生多个相同的结构,因此使用生成语句就可以避免多段相同结构的VHDL程序的重复书写(相当于复制)。生成语句有两种形式:FOR-GENER

50、ATE模式和IF-GENERATE模式。FOR-GENERATE 模式的生成语句FOR-GENERATE 模式生成语句的书写格式为:标号:FOR 循环变量 IN 离散范围 GENERATE;END GENERATE 标号;,其中循环变量的值在每次的循环中都将发生变化;离散范围用来指定循环变量的取值范围,循环变量的取值将从取值范围最左边的值开始并且递增到取值范围最右边的值,实际上也就限制了循环的次数;循环变量每取一个值就要执行一次GENERATE语句体中的并行处理语句;最后FOR-GENERATE模式生成语句以保留字END GENERATE 标号:;来结束GENERATE语句的循环。生成语句的典

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号