《EDA技术实用教程.ppt》由会员分享,可在线阅读,更多相关《EDA技术实用教程.ppt(80页珍藏版)》请在三一办公上搜索。
1、EDA技术实用教程,第6章 VHDL设计进阶,6.1 4位加法计数器的VHDL描述,一、4位加法计数器,【例6-1】ENTITY CNT4 IS PORT(CLK:IN BIT;Q:BUFFER INTEGER RANGE 15 DOWNTO 0);END;ARCHITECTURE bhv OF CNT4 IS BEGIN PROCESS(CLK)BEGIN IF CLKEVENT AND CLK=1 THEN Q=Q+1;END IF;END PROCESS;END bhv;,注意:(1)表面上BUFFER具有双向端口INOUT的功能,但实际上其输入功能是不完整的,它只能将自己输出的信号再反
2、馈回来,并不含有IN的功能。(2)VHDL规定加,减等算术符+,-对应的操作数(如式a+b中的a和b)的数据类型只能是INTEGER(除非对算术操作符有一些特殊的说明,如重载函数的利用).(3)表达式Q=Q+1的右项与左向并非处于相同的时刻内,对于时序电路,前者的结果出现于当前时钟周期;后者,即左项要获得当前的Q+1,需等待下一个时钟周期。,二、整数、自然数和正整数数据类型 整数类型INTEGER 的元素包括正整数、负整数和零。在VHDL中,整数的取值范围是-2147483647+2147483647,即可用32位有符号的二进制数表示。注意:通常VHDL仿真器将INTEGER类型作为有符号数处
3、理,而VHDL综合器则将INTEGER作为无符号数处理。在使用整数时,VHDL综合器要求必须使用RANGE字句为所定义的数限定范围,然后根据所限定的范围来决定表示此信号或变量的二进制数的位数因为VHDL综合器无法综合未限定范围的整数类型的信号或变量。,在例6-1中的语句 Q:BUFFER INTEGER RANGE 15 DOWNTO 0;即限定Q的取值范围是0-15共16个值,可用4位二进制数来表示,因此,VHDL综合器即将Q综合成由四条信号线构成的总线方式信号:Q(3)、Q(2)、Q(1)和Q(0)。,整数常量的书写方式示例如下:1 十进制整数0 十进制整数35 十进制整数10E3 十进制
4、整数100016#D9#十六进制整数D9H8#720#八进制整数720 O 2#11010010#二进制整数11010010B,NB:在语句中整数的表达不加单引号,如1、0、25等;而逻辑位的数据必须加引号,如1、0、“10”、“1000111”。自然数类型NATURAL是整数类型的一个子类型,它包括0和所有正整数。如果对例6-1的Q定义为NATURAL类型,综合的结果不变,语句表达为:Q:BUFFER NATURAL RANGE 15 DOWNTO 0;正整数类型POSITIVE也是整数类型的一个子类型,它只比自然数类型NATURAL少一个0。尽管如此,对于许多综合器来说,若定义例6-1的Q
5、为 Q:BUFFER POSITIVE RANGE 15 DOWNTO 0,仍然能综合出相同的计数器电路来。与BIT、BIT-VECTOR一样,整数类型INTEGER、NATURAL和POSITIVE都定义在VHDL标准程序包STANDARD中,是默认打开的。,三、4位加法计数器的另一种表达方式,【例6-2】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4 IS PORT(CLK:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
6、END;ARCHITECTURE bhv OF CNT4 ISSIGNAL Q1:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN PROCESS(CLK)BEGIN IF CLKEVENT AND CLK=1 THEN Q1=Q1+1;END IF;Q=Q1;END PROCESS;END bhv;,例6-2特点:(1)若输入和输出为标准逻辑位STD_LOGIC和标准逻辑位矢量STD_LOGIC_VECTOR,必须利用LABRARY语句和USE语句,打开程序包STD_LOGIC_1164。如例6-2中的CLK和Q。(2)Q的端口模式是OUT,由于没有输入的端口模式特性,因
7、此不能如例6-1那样直接用Q=Q+1中。考虑到计数器必须建立一个用于计数累加的寄存器,因此在计数器内部先定义一个信号SIGNAL(类似于节点),语句表达上可以在结构体的ARCHITECTURE和BEGIN之间定义一个信号:SIGNAL Q1:STD_LOGIC_VECTOR(3 DOWNTO 0),由于Q1是内部的信号,不必像端口信号那样定义它们的端口模式,即Q1的数据流动是不受方向限制的。因此可以在Q1=Q1+1中用信号Q1来完成累加的任务,然后将累加的结果用语句Q=Q1向端口Q输出。于是,在例6-2的不完整的IF条件语句中,Q1变成了内部加法计数器的数据端口。,(3)考虑到VHDL不允许在
8、不同数据类型的操作数之间进行直接操作或运算,而Q1=Q1+1中数据传输符=右边加号的两个操作数分属不同的数据类型:Q1(逻辑矢量)+1(整数),不满足算术符“+”对应的操作数必须是整数类型,且相加和也为整数类型的要求,因此必须对Q1=Q1+1中的加号赋予新的功能,使之允许不同数据类型的数据可以相加,且相加和为标准逻辑矢量。方法之一就是调用一个函数,以便赋予加号具备新的数据类型的操作功能,这就是所谓的运算符重载,这个函数称为运算符重载函数。,为了方便各种不同数据类型间的运算操作,VHDL允许用户对原有的基本操作符重新定义,赋予新的含义和功能,从而建立一种新的操作符。事实上,VHDL的IEEE库中
9、的STD_LOGIC_UNSIGNED程序包中预定义的操作符,如“+”、“-”、“*”、“=”、“=”、“”、“”、“/=”、“AND”和“MOD”等,对相应的数据类型INTEGER、STD_LOGIC、STD_LOGIC_VECTOR的操作作了重载,赋予了新的数据类型进行操作,或者允许不同的数据类型之间用此运算符进行运算。例6-2中第三行使用语句“USE IEEE.STD_LOGIC_UNSIGNED.ALL”的目的就在于此 使用此程序包就是允许当遇到例6-2中的+号时,调用+号的算符重载函数。,例6-1和6-2的综合结果是相同的,其RTL电路如图6-1所示,工作时序如图6-2所示。4位加法
10、计数器由两大部分组成:完成加1操作的纯组合电路加法器和4位边沿触发方式锁存器。,图6-1 4位加法计数器RTL电路,图6-2 4位加法计数器工作时序,数据类型:整数类型、自然数类型、正整数类型。BUFFER模式:BUFFER表达特定端口的特定功能,并非是特定的端口结构。重栽函数:程序包STD_LOGIC_UNSIGNED含有(+)和其它运算符的重载函数。计数器结构:加法计数器由两部分组成:加1组合电路和寄存器时序电路。,归纳,数据类型,BUFFER模式,重载函数,计数器结构,6.2 不同工作方式的时序电路设计,带有复位和时钟使能的10进制计数器 相关语法 带有并行置位的移位寄存器,一、带有复位
11、和时钟使能的10进制计数器,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT10 IS PORT(CLK,RST,EN:IN STD_LOGIC;CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);COUT:OUT STD_LOGIC);END CNT10;,例6-3描述的是一个带有异步复位和同步时钟使能的十进制加法计数器。所谓同步或异步都是相对于时钟信号而言的,不依赖于时钟而有效的信号称为异步信号,否则称为同步信号。,【例6-3】,ARCHITECTURE
12、 behav OF CNT10 ISBEGIN PROCESS(CLK,RST,EN)VARIABLE CQI:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN IF RST=1 THEN CQI:=(OTHERS=0);-计数器复位,独立于CLK,称为异步 ELSIF CLKEVENT AND CLK=1 THEN-检测时钟上升沿 IF EN=1 THEN-检测是否允许计数 IF CQI 0);-大于9,计数值清零 END IF;END IF;END IF;IF CQI=1001 THEN COUT=1;-计数大于9,输出进位信号 ELSE COUT=0;END IF;C
13、Q=CQI;-将计数值向端口输出 END PROCESS;END behav;,图6-3 例6-3的RTL电路,图6-4 例6-3的工作时序,二、相关语法,1.变量 变量VARIABLE与信号SIGNAL一样,都属于数据对象,在此程序中的功能与信号相似。但变量的赋值符号与信号的赋值符号是不同的,信号的赋值符号是“=”,而变量的赋值符号是“:=”。例如a为变量,对其赋值可以写为:a:=1。再如语句:VARIABLE CQI:STD_LOGIC_VECTOR(3 DOWNTO 0),定义标识符CQI为变量VARIABLE,其数据类型是4元素的标准逻辑矢量。变量的功能主要用于数据的暂存。,2.省略赋
14、值操作符(OTHERS=X),为了简化表达才使用短语“(OTHERS=X)”,这是一个省略赋值操作符,它可以在较多位的位矢量赋值中作省略化的赋值,如以下语句:SIGNAL d1:STD_LOGIC_VECTOR(4 DOWNTO 0);VARIABLE a1:STD_LOGIC_VECTOR(15 DOWNTO 0);.d1 0);a1:=(OTHERS=0);这条语句等同于d1=“00000”;a1:=“0000000000000000”.其优点是在给大的位矢量赋值时简化了表述,明确了含义,这种表述与位矢量无关。,利用“(OTHERS=X)”还可以给位矢量的某一部分位赋值之后再使用OTHER
15、S给剩余的位赋值,例如:d21.4=1,OTHERS=0,此赋值语句的意义是给位矢量d2的第1位和第4位赋值为1,而其余位赋值为0。下例是用省略赋值操作符“(OTHERS=X)”给d2赋其他信号的值:d1e(3),3=e(5),OTHERS=e(1);这个矢量赋值语句也可以改写为使用连接符的语句(假设d1的长度为5位):fX)”的描述方法要优于“”的描述方法,因为后者的缺点是赋值依赖于矢量的长度,当长度改变时必须重新排序。,三、带有并行置位的移位寄存器,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SHFRT IS-8位右移寄存器 PORT(C
16、LK,LOAD:IN STD_LOGIC;DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);QB:OUT STD_LOGIC);END SHFRT;,【例6-4】8位右移移位寄存器,ARCHITECTURE behav OF SHFRT IS BEGIN PROCESS(CLK,LOAD)VARIABLE REG8:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN IF CLKEVENT AND CLK=1 THEN IF LOAD=1 THEN-装载新数据 REG8:=DIN;ELSE REG8(6 DOWNTO 0):=REG8(7 DOWNTO
17、1);END IF;END IF;QB=REG8(0);END PROCESS;-输出最低位END behav;,图6-5 例6-4的工作时序,(1)在第一个时钟到来时,LOAD恰为高电平,(2)第二个时钟,以及以后的时钟信号都是移位时钟,高位置1,(3)第二个时钟后,QB输出了右移出的第2个位1,常数定义的一般表述:CONSTANT 常数名:数据类型:=表达式;,6.3 数据对象DATA OBJECTS,在VHDL中,数据对象有三类,即常量(CONSTANT)、变量(VARABLE)和信号(SIGNAL)。,一、常数(CONSTANT)常数的定义和设置主要是为了使程序更容易阅读和修改。例如,
18、将逻辑位的宽度定义为一个常量,只要修改这个常量就能很容易地改变宽度,从而改变硬件结构。在程序中,常量是一个恒定不变的值,一旦作了数据类型和赋值定义后,在程序中不能在改变,因而具有全局性意义。,例如:CONSTANT FBT:STD_LOGIC_VECTOR:=“010110”;-标准位矢量类型 CONSTANT DATAIN:INTEGER:=15-整数类型 VHDL要求所定义的常量数据类型必须与表达式的数据类型一致。常量的可视性规则即常量的使用范围取决于它被定义的位置。*如果在程序包中,常量具有最大的的全局化特征,可以用在调用此程序包的所有设计实体中;*常量如果定义在设计实体中,其有效范围为
19、这个实体定义的所有的结构体(多结构体);*如果常量定义在设计实体的某一结构体中,则只能用于此结构体;*如果常量定义在结构体的某一单元,如一个进程中,则这个常量只能用在这一进程中。,定义变量的一般表述:VARIABLE 变量名:数据类型:=初始值;,二、变量(VARIABLE)在VHDL语法规则中,变量是一个局部量,只能在进程和子程序中使用。变量不能将信息带出对它作出定义的当前结构中。变量的赋值是一种理想化的数据传输,是立即发生的,不存在任何延时的行为。变量的主要作用是在进程中作为临时的数据存储单元。,例如:VARIABLE a:INTEGER RANGE 0 TO 15;VARIABLE d:
20、STD_LOGIC;分别定义a的取值范围从0到15的整数型变量;d为标准位类型的变量。,变量赋值的一般表述为;目标变量名:=表达式;注意:10 变量赋值符号是“:=”,变量数值的改变是通过变量赋值来实现的。20 赋值语句右方的“表达式”必须是一个与“目标变量名”具有相同数据类型的数值,这个表达式可以是一个运算表达式,也可以是一个数值。30 通过赋值操作,新的变量值的获得是立刻发生的。40 变量赋值语句左边的目标变量可以是单值变量,也可以是一个变量的集合,如位矢量类型的变量。例如:VARIABLE x,y:INTEGER RANGE 15 DOWNTO 0;VARIABLE a,b:STD_LO
21、GIC_VECTOR(7 DOWNTO 0);x:=11;y:=2+x;-运算表达式赋值,y也是实数变量 a:=b a(0 TO 5):=b(2 TO 7);,信号定义格式:SIGNAL 信号名:数据类型:=初始值;,三、信号(SIGNAL)信号是描述硬件系统的基本数据对象,它类似于连接线。信号可以作为设计实体中并行语句模块间的信息交流通道。信号作为一种数值容器,不但可以容纳当前值,也可以保持历史值与触发器的记忆功能有很好的对应关系,只是不必注明信号上数据流动的方向。,信号初始值的设置不是必须的,而且初始值仅在VHDL的行为仿真中有效。除了没有方向说明外,信号与实体的端口(Port)概念是一致
22、的,它可以看成是实体内部(设计器件内部)的端口。信号的使用和定义范围是实体、结构体和程序包,在进程和子程序的顺序语句中不允许定义信号。,当信号定义了数据类型和表达式后,在VHDL设计中就能对信号进行赋值了。信号的赋值语句表达式为:目标信号名=表达式;这里的“表达式”可以是一个运算表达式,也可以是数据对象(变量、信号或常量)。数据信息的传入可以设置延时量。信号的赋值可以出现在一个进程中,也可以直接出现在结构体的并行语句结构中,但它们运行的含义是不一样的。前者属顺序信号赋值(这时的信号赋值操作要视进程是否已被启动);后者属并行信号赋值(其赋值操作是各自独立并行地发生的)。在进程中,可以允许同一信号
23、有多个驱动源(赋值源),即在同一进程中存在多个同名的信号被赋值,其结果只有最后的赋值语句被启动,并进行赋值操作。,例如:SIGNAL a,b,c,y,z:INTEGER;PROCESS(a,b,c)BEGIN y=a+b;z=c-a;y=b;END PROCESS;其中,a、b、c被列入进程敏感表,当进程被启动后,信号赋值将自上而下顺序执行,但第一项赋值操作并不会发生,这是因为y的最后一项驱动源是b,因此y被赋值b。在并行赋值语句中,不允许如上例所示的同一信号有多个驱动源的情况。,表6-1 信号与变量赋值语句功能的比较,四、进程中的信号与变量赋值语句 从硬件电路系统来看,变量和信号相当于逻辑电
24、路系统中的连线和连线上的信号值;常量相当于电路中的恒定电平,如GND或VCC接口。从行为仿真和VHDL语句功能上看,信号与变量具有比较明显的区别,其差异主要表现在接受与保持信号的方式和信息保持与传递的区域大小上。表6-1在三方面对信号与变量作了比较,之后给出了一些实例。,【例6-5】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DFF3 IS PORT(CLK,D1:IN STD_LOGIC;Q1:OUT STD_LOGIC);END;ARCHITECTURE bhv OF DFF3 IS BEGIN PROCESS(CLK)VARIABLE
25、QQ:STD_LOGIC;BEGIN IF CLKEVENT AND CLK=1 THEN QQ:=D1;END IF;Q1=QQ;END PROCESS;END;,【例6-6】.ARCHITECTURE bhv OF DFF3 IS SIGNAL QQ:STD_LOGIC;BEGIN PROCESS(CLK)BEGIN IF CLKEVENT AND CLK=1 THEN QQ=D1;END IF;Q1=QQ;END PROCESS;END;,图6-6 例6-6 的RTL电路,【例6-7】SIGNAL in1,in2,e1,.:STD_LOGIC;.PROCESS(in1,in2,.)VAR
26、IABLE c1,.:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN IF in1=1 THEN.-第 1 行 e1=1010;-第 2 行.IF in2=0 THEN.-第 15+n 行.c1:=0011;-第 30+m 行.END IF;END PROCESS;,【例6-8】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DFF3 IS PORT(CLK,D1:IN STD_LOGIC;Q1:OUT STD_LOGIC);END;ARCHITECTURE bhv OF DFF3 IS SIGNAL A,B:STD_LOG
27、IC;BEGIN PROCESS(CLK)BEGIN IF CLKEVENT AND CLK=1 THEN A=D1;B=A;Q1=B;END IF;END PROCESS;END;,图6-7 例6-8 的RTL电路,【例6-9】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DFF3 IS PORT(CLK,D1:IN STD_LOGIC;Q1:OUT STD_LOGIC);END;ARCHITECTURE bhv OF DFF3 IS BEGIN PROCESS(CLK)VARIABLE A,B:STD_LOGIC;BEGIN IF CLKE
28、VENT AND CLK=1 THEN A:=D1;B:=A;Q1=B;END IF;END PROCESS;END;,【例6-10】错误的4 选1多路选择器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux4 ISPORT(i0,i1,i2,i3,a,b:IN STD_LOGIC;q:OUT STD_LOGIC);END mux4;ARCHITECTURE body_mux4 OF mux4 ISsignal muxval:integer range 7 downto 0;BEGINprocess(i0,i1,i2,i3,a,b)begin
29、 muxval q q q q null;end case;end process;END body_mux4;,【例6-11】4 选1多路选择器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux4 ISPORT(i0,i1,i2,i3,a,b:IN STD_LOGIC;q:OUT STD_LOGIC);END mux4;ARCHITECTURE body_mux4 OF mux4 ISBEGINprocess(i0,i1,i2,i3,a,b)variable muxval:integer range 7 downto 0;begin mux
30、val:=0;if(a=1)then muxval:=muxval+1;end if;if(b=1)then muxval:=muxval+2;end if;case muxval is when 0=q q q q null;end case;end process;END body_mux4;,图6-8 例6-10 的RTL电路,例6-11 的RTL电路,图6-10 例6-10的错误的工作时序,图6-11 例6-11的正确工作时序,6.4 双向电路和三态控制电路设计,引入三态门有许多实际的应用,如CPU设计中的数据和地址总线的构建,RAM或堆栈的数据端口等。在VHDL设计中,如果用STD_
31、LOGIC数据类型Z对一个变量赋值,即会引入三态门,并在控制下可使其输出呈高阻态,这等效于使三态门禁止输出。一、三态门设计 例6-13是一个8位三态控制门电路的描述,当使能控制信号为1时,8位数据输出,为0时输出呈高阻态,语句中将高阻态数据“ZZZZZZZZ”向输出端口赋值,其综合结果如图6-13所示。,【例6-13】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY tri_s IS port(enable:IN STD_LOGIC;datain:IN STD_LOGIC_VECTOR(7 DOWNTO 0);dataout:OUT STD_LOG
32、IC_VECTOR(7 DOWNTO 0);END tri_s;ARCHITECTURE bhv OF tri_s ISBEGINPROCESS(enable,datain)BEGIN IF enable=1 THEN dataout=datain;ELSE dataout=ZZZZZZZZ;END IF;END PROCESS;END bhv;,图6-13 8位3态控制门电路,一般地,可以首先将信号定义为STD_LOGIC数据类型,将Z赋给这个变量来获得三态控制门电路,一个Z表示一个逻辑位。注意:10、由于Z在综合中是一个不确定的值,不同的综合器可能会给出不同的结果,所以建议尽可能不要将Z用
33、作比较值,或用作表达式或操作数。20、虽然VHDL语法规定不区分关键词的大小写,但当把表示高阻态的Z值赋给一个数据类型为STD_LOGIC的变量或信号时,Z必须大写这是因为在IEEE库中对数据类型STD_LOGIC的预定义已经将高阻态确定为大写Z。,二、双向端口设计 用INOUT模式设计双向端口也必须考虑三态的使用,因为双向端口的设计与三态端口的设计十分相似,都必须考虑端口的三态控制。这是由于双向端口在完成输入功能时,必须使原来呈输出模式的端口呈高阻态,否则,待输入的外部数据必会与端口处原有电平发生“线与”,导致无法将外部数据正确地读入,从而实现“双向”的功能。例6-14和例6-15是两个双向
34、端口的VHDL设计实例。,【例6-14】library ieee;use ieee.std_logic_1164.all;entity tri_state isport(control:in std_logic;in1:in std_logic_vector(7 downto 0);q:inout std_logic_vector(7 downto 0);x:out std_logic_vector(7 downto 0);end tri_state;architecture body_tri of tri_state isbeginprocess(control,q,in1)beginif(
35、control=0)then x=q;else q=in1;x=“ZZZZZZZZ”;-定义q为双向端口end if;x为三态控制输出口end process;end body_tri;,图6-14 例6-14的综合结果错误的逻辑电路,图6-13 例6-14的仿真波形图,无法输出,【例6-15】(以上部分同上例)process(control,q,in1)beginif(control=0)then x=q;q=ZZZZZZZZ;else q=in1;x=ZZZZZZZZ;-定义q为双向端口,x为三态控制输出口end if;end process;end body_tri;,图6-16 例6-
36、15的综合结果,图6-17 例6-15的仿真波形图,三、三态总线电路设计 为构成芯片内部的总线系统,必须设计三态总线驱动器电路,这可以有多种表达方法,但必须注意信号多驱动源的处理问题。,【例6-15】-试图设计一个8位4通道的三态总线驱动器(错误设计)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY tristate2 IS port(input3,input2,input1,input0:IN STD_LOGIC_VECTOR(7 DOWNTO 0);enable:IN STD_LOGIC_VECTOR(1 DOWNTO 0);output:OU
37、T STD_LOGIC_VECTOR(7 DOWNTO 0);END tristate2;ARCHITECTURE multiple_drivers OF tristate2 ISBEGIN,PROCESS(enable,input3,input2,input1,input0)BEGIN IF enable=“00”THEN output Z);END IF;IF enable=01 THEN output Z);END IF;IF enable=10 THEN output Z);END IF;IF enable=11 THEN output Z);END IF;END PROCESS;EN
38、D multiple_drivers;,图6-18 例6-16错误的综合结果,library ieee;use ieee.std_logic_1164.all;entity tri isport(ctl:in std_logic_vector(1 downto 0);datain1,datain2,datain3,datain4:in std_logic_vector(7 downto 0);q:out std_logic_vector(7 downto 0);end tri;architecture body_tri of tri isbegin q Z);q Z);q Z);q Z);en
39、d body_tri;,【例6-16】-试图设计一个8位4通道的三态总线驱动器(Max+plus不支持),图6-19 例6-17正确的综合结果,四、顺序条件语句IF语句 IF语句作为一种条件语句,它根据语句中所设置的一种或多种条件,有选择地执行指定的顺序语句,语句结构有四种:,(1)IF 条件句 Then 顺序语句 END IF;(2)IF 条件句 Then 顺序语句 ELSE 顺序语句 END IF;(3)IF 条件句 Then IF 条件句 Then.END IF END IF,(4)IF 条件句 Then 顺序语句 ELSIF IF 条件句 Then 顺序语句.ELSE 顺序语句 END
40、 IF,IF语句中至少应有一个条件句,“条件句”可以是一个BOOLEAN类型的标识符,如IF al THEN,或者是一个判别表达式,如IF ab+1 THEN,判别表达式输出的值,即判断结果的数据类型是BOOLEAN。IF语句根据条件句产生的判断结果是ture或是false,有条件地选择执行其后的顺序语句。,【例6-18】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY control_stmts ISPORT(a,b,c:IN BOOLEAN;output:OUT BOOLEAN);END control_stmts;ARCHITECTURE e
41、xample OF control_stmts IS BEGIN PROCESS(a,b,c)VARIABLE n:BOOLEAN;BEGIN IF a THEN n:=b;ELSE n:=c;END IF;output=n;END PROCESS;END example;,【例6-19】-8线-3线优先编码器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY coder IS PORT(din:IN STD_LOGIC_VECTOR(0 TO 7);output:OUT STD_LOGIC_VECTOR(0 TO 2);END coder;ARCH
42、ITECTURE behav OF coder IS SIGNAL SINT:STD_LOGIC_VECTOR(4 DOWNTO 0);BEGIN PROCESS(din)BEGIN IF(din(7)=0)THEN output=000;ELSIF(din(6)=0)THEN output=100;ELSIF(din(5)=0)THEN output=010;ELSIF(din(4)=0)THEN output=110;ELSIF(din(3)=0)THEN output=001;ELSIF(din(2)=0)THEN output=101;ELSIF(din(1)=0)THEN outpu
43、t=011;ELSE output=111;END IF;END PROCESS;END behav;,表6-2 8线-3线优先编码器真值表,6.5 进程语句结构,在一个结构体中,允许放置任意多个进程语句结构,而每一进程的内部是由一系列顺序语句来构成的。PROCESS语句结构包含(或者说引导)了一个代表着设计实体中部分逻辑行为的、独立的顺序语句描述的进程。PROCESS结构中的顺序语句,及其所谓的顺序执行过程只是相对于计算机中的软件行为仿真的模拟过程而言的,这个过程与硬件结构中实现的对应的逻辑行为是不完全相同的。PROCESS结构中既可以有有序逻辑的描述,也可以有组合逻辑的描述,它们都可以用顺
44、序语句来表达。,一、进程语句格式,PROCESS语句结构的一般表达格式如下 进程标号:PROCESS(敏感信号参数表)IS 进程说明部分 BEGIN 顺序描述语句 END PROCESS 进程标号;,注意:进程标号和敏感信号参数表旁的IS不是必须的!,二、PROCESS 组成,PROCESS语句结构,进程说明,顺序描述语句,敏感信号参数表,信号赋值语句,变量赋值语句,进程启动语句,子程序调用语句,顺序描述语句,进程跳出语句,三、进程要点,1.PROCESS为一无限循环语句,2.PROCESS中的顺序语句具有明显的顺序/并行运行双重性,3.进程必须由敏感信号的变化来启动,4.进程语句本身是并行语
45、句,5.信号是多个进程间的通信线,6.一个进程中只允许描述对应于一个时钟信号的同步时序逻辑,ENTITY mul ISPORT(a,b,c,selx,sely:IN BIT;data_out:OUT BIT);END mul;ARCHITECTURE ex OF mul IS SIGNAL temp:BIT;BEGINp_a:PROCESS(a,b,selx)-进程p-a BEGIN IF(selx=0)THEN temp=a;ELSE temp=b;END IF;END PROCESS p_a;p_b:PROCESS(temp,c,sely)-进程p-b BEGIN IF(sely=0)TH
46、EN data_out=temp;ELSE data_out=c;END IF;END PROCESS p_b;END ex;,【例6-20】,图6-20 例6-20的综合结果,6.6 仿真延时,VHDL中有两类延时模型能用于仿真建模,即固有延时和传输延时。一、固有延时 固有延时也称为惯性延时,是任何电子器件都存在的一种延时特性。固有延时的主要物理机制是分布电容效应。在惯性延时模型中,器件的输出确实都有一个固有的延时。当信号的脉宽(或信号的持续时间)小于器件的固有延时时,器件将对输入的信号不作任何反应(即有输入而无输出)。为了使器件对输入信号的变化产生响应,就必须使信号维持的时间足够长(即信号
47、的脉冲宽度必须大于器件的固有延时)。,在VHDL仿真和综合器中,固有延时是默认的延时,数学上是一个无穷小量,称为延时,或称仿真,这个延时小量的设置仅为了仿真,它是VHDL仿真器的最小分辨时间,并不能完全代表器件实际的惯性延时情况。在VHDL程序的语句中如果没有指明延时的类型与延时量,就意味着默认采用了这个固有延时量延时。在大多数情况下,这一固有延时量近似地反映了实际器件的行为。在所有当前可用的仿真器中,固有模式是最通用的一种,为了在行为仿真中比较逼近地模仿电路的这种特性,VHDL提供了有关的语句。,如 z=x XOR y AFTER 5ns;表示此赋值电路的惯性延时为5ns,即要求信号值x X
48、OR y 变化的稳定时间不能小于5ns 换句话说,x XOR y的值在发生变化5ns后才被赋给z,此前x或y的任何变化都是无效的。对于下句:z=x XOR y;则表明,x XOR y的值在时间段后才被赋给z。,二、传输延时 传输延时与固有延时的不同之处:传输延时表达的是输入与输出之间的一种绝对延时,传输延时并不考虑信号持续的时间,它仅仅表示信号传输推迟或延迟了一个时间段。对于器件来说,传输延时是由半导体延时特性决定的;对于连线来说,传输延时是有连线的介质特性和信号频率特性决定的。传输延时对延时器件、PCB板上的连线延时和ASIC上的通道延时的建模特别有用。,表达传输延时的语句如以下例句所示:z
49、=TRANSPORT x AFTER 10 ns;其中关键词TRANSPORT表示语句后的延时量为传输延时量,虽然产生传输延时与固有延时的物理机制不一样,但在行为仿真中,传输延时与固有延时造成的延时效应是一样的。在综合过程中,综合器将忽略AFTER后的所有延时设置。,三、仿真 由于综合器不支持延时语句,为了解决这一矛盾,VHDL仿真器和综合器将自动为系统中的信号赋值配置一足够小而又能满足逻辑排序的延时量(即仿真软件的最小分辨时间),这个延时量就称为仿真,或称延时,从而使并行语句和顺序语句中的并列赋值逻辑得以正确执行。由此可见,在行为仿真、功能仿真乃至综合器中,引入延时是必需的,仿真中延时的引入由EDA工具自动完成,无需设计者介入。以下是三个赋值语句示例:x=9;y=x;z=x AFTER 5ns;第三句信号是在5ns 后将x赋予z的,关键词AFTER后是延迟时间值。综合器在综合过程中将略去所设的延时值。,作 业P141 5-3,5-8,
链接地址:https://www.31ppt.com/p-5428637.html