EDA技术实用教程.ppt
EDAEDA技术技术实用教程实用教程第第6章章 VHDL设计进阶设计进阶第第6 6章章 VHDLVHDL设计进阶设计进阶6.1 46.1 4位加法计数器的位加法计数器的VHDLVHDL描述描述一、一、一、一、4 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;第第6 6章章 VHDLVHDL设计进阶设计进阶注意注意:(1)表面上)表面上BUFFER具有双向端口具有双向端口INOUT的功能,但实的功能,但实际上其输入功能是不完整的,它只能将自己输出的信号再反际上其输入功能是不完整的,它只能将自己输出的信号再反馈回来,并不含有馈回来,并不含有IN的功能。的功能。(2)VHDL规定加规定加,减等算术符减等算术符+,-对应的操作数对应的操作数(如式如式a+b中的中的a和和b)的数据类型只能是的数据类型只能是INTEGER(除非对算术操作符有除非对算术操作符有一些特殊的说明一些特殊的说明,如重载函数的利用如重载函数的利用).(3)表达式)表达式Q=Q+1的右项与左向并非处于相同的时刻的右项与左向并非处于相同的时刻内,对于时序电路,前者的结果出现于当前时钟周期;后者,内,对于时序电路,前者的结果出现于当前时钟周期;后者,即左项要获得当前的即左项要获得当前的Q+1,需等待下一个时钟周期。需等待下一个时钟周期。第第6 6章章 VHDLVHDL设计进阶设计进阶二、二、二、二、整数、自然数和正整数数据类型整数、自然数和正整数数据类型整数、自然数和正整数数据类型整数、自然数和正整数数据类型 整数类型整数类型INTEGER INTEGER 的元素包括正整数、负整数和零。的元素包括正整数、负整数和零。在在VHDLVHDL中,整数的取值范围是中,整数的取值范围是-2147483647+2147483647-2147483647+2147483647,即可用,即可用3232位有符号的二进制数表示。位有符号的二进制数表示。注意:注意:通常通常VHDLVHDL仿真器将仿真器将INTEGERINTEGER类型作为有符号数处理,类型作为有符号数处理,而而VHDLVHDL综合器则将综合器则将INTEGERINTEGER作为无符号数处理。作为无符号数处理。在使用整数时,在使用整数时,VHDLVHDL综合器要求必须使用综合器要求必须使用RANGERANGE字句为所字句为所定义的数限定范围,然后根据所限定的范围来决定表示此信号定义的数限定范围,然后根据所限定的范围来决定表示此信号或变量的二进制数的位数或变量的二进制数的位数因为VHDL综合器无法综合未限定范围的整数类型的信号或变量。第第6 6章章 VHDLVHDL设计进阶设计进阶 在例6-1中的语句 Q:BUFFER INTEGER RANGE 15 DOWNTO 0;即限定Q的取值范围是0-15共16个值,可用4位二进制数来表示,因此,VHDL综合器即将Q综合成由四条信号线构成的总线方式信号:Q(3)、Q(2)、Q(1)和Q(0)。第第6 6章章 VHDLVHDL设计进阶设计进阶整数常量的书写方式示例如下:整数常量的书写方式示例如下:1 1 十进制整数十进制整数0 0 十进制整数十进制整数3535 十进制整数十进制整数1010E3E3 十进制整数十进制整数1000100016#16#D9#D9#十六进制整数十六进制整数D9HD9H8#720#8#720#八进制整数八进制整数720 O O 2#11010010#2#11010010#二进制整数二进制整数11010010B11010010B第第6 6章章 VHDLVHDL设计进阶设计进阶 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为 Q:BUFFER POSITIVE RANGE 15 DOWNTO 0,仍然能综合出相同的计数器电路来。与与BIT、BIT-VECTOR一样,整数类型一样,整数类型INTEGER、NATURAL和和POSITIVE都定义在都定义在VHDL标准程序包标准程序包STANDARD中,中,是默认打开的是默认打开的。第第6 6章章 VHDLVHDL设计进阶设计进阶三、三、三、三、4 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);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 6章章 VHDLVHDL设计进阶设计进阶例例6-2特点:特点:(1)若输入和输出为标准逻辑位若输入和输出为标准逻辑位STD_LOGIC和标准逻辑位和标准逻辑位矢量矢量STD_LOGIC_VECTOR,必须利用必须利用LABRARY语句和语句和USE语语句,打开程序包句,打开程序包STD_LOGIC_1164。如例6-2中的CLK和Q。(2)Q的端口模式是OUT,由于没有输入的端口模式特性,因此不能如例6-1那样直接用Q=Q+1中。考虑到计数器必须建立一个用于计数累加的寄存器,因此在计数器内部先定义一个信号在计数器内部先定义一个信号SIGNAL(类似于节点),语句表达上可以在结构体的ARCHITECTURE和BEGIN之间定义一个信号:SIGNAL Q1:STD_LOGIC_VECTOR(3 DOWNTO 0)第第6 6章章 VHDLVHDL设计进阶设计进阶 由于Q1是内部的信号,不必像端口信号那样定义它们的端口模式,即Q1的数据流动是不受方向限制的。因此可以在在Q1=Q1+1中用信号中用信号Q1来完成累加的任务,然后将累加的结来完成累加的任务,然后将累加的结果用语句果用语句Q=Q1向端口向端口Q输出。输出。于是,在例6-2的不完整的IF条件语句中,Q1变成了内部加法计数器的数据端口。第第6 6章章 VHDLVHDL设计进阶设计进阶(3)考虑到VHDL不允许在不同数据类型的操作数之间进行直接操作或运算,而Q1=Q1+1中数据传输符中数据传输符=右边加号的两个右边加号的两个操作数分属不同的数据类型操作数分属不同的数据类型:Q1(逻辑矢量)+1(整数),不满足算术符“+”对应的操作数必须是整数类型,且相加和也为整数类型的要求,因此必须对对Q1=”、“”、“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;CQ=CQI;-将计数值向端口输出将计数值向端口输出 END PROCESS;END behav;第第6 6章章 VHDLVHDL设计进阶设计进阶图图6-3 例例6-3的的RTL电路电路第第6 6章章 VHDLVHDL设计进阶设计进阶图图6-4 例例6-3的工作时序的工作时序第第6 6章章 VHDLVHDL设计进阶设计进阶二、二、二、二、相关语法相关语法相关语法相关语法 1.1.变量变量 变量变量VARIABLEVARIABLE与信号与信号SIGNALSIGNAL一样,都属于数据对象,一样,都属于数据对象,在此程序中的功能与信号相似。但在此程序中的功能与信号相似。但变量的赋值符号与信号的变量的赋值符号与信号的赋值符号是不同的赋值符号是不同的,信号的赋值符号是信号的赋值符号是“=”,“XOTHERS=X)为为了了简简化化表表达达才才使使用用短短语语“(“(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);这条语句等同于这条语句等同于d1X)”还可以给位矢量的某一部分位赋还可以给位矢量的某一部分位赋值之后再使用值之后再使用OTHERS给剩余的位赋值给剩余的位赋值,例如:d21.4=1,OTHERS=0,此赋值语句的意义是给位矢量d2的第1位和第4位赋值为1,而其余位赋值为0。下例是用省略赋值操作符“(OTHERS=X)”给d2赋其他信号的值:d1e(3),3=e(5),OTHERS=e(1);这个矢量赋值语句也可以改写为使用连接符连接符的语句(假设d1的长度为5位):fX)”的描述方法要优于的描述方法要优于“”的描述方法的描述方法,因为后者的缺点是赋值依赖于矢量的长度,当长度改变时必须重新排序。第第6 6章章 VHDLVHDL设计进阶设计进阶三、三、三、三、带有并行置位的移位寄存器带有并行置位的移位寄存器带有并行置位的移位寄存器带有并行置位的移位寄存器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SHFRT IS -8位右移寄存器位右移寄存器 PORT(CLK,LOAD:IN STD_LOGIC;DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);QB:OUT STD_LOGIC );END SHFRT;【例【例6-4】8位右移移位寄存器位右移移位寄存器第第6 6章章 VHDLVHDL设计进阶设计进阶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 1);END IF;END IF;QB=REG8(0);END PROCESS;-输出最低位输出最低位END behav;第第6 6章章 VHDLVHDL设计进阶设计进阶图图6-5 例例6-4的工作时序的工作时序(1 1)在第)在第一个时钟到来时,一个时钟到来时,LOADLOAD恰为高电平恰为高电平(2 2)第二个时钟,以及以后的时钟信号都是移位时钟)第二个时钟,以及以后的时钟信号都是移位时钟,高位置高位置1 1(3 3)第二个时钟后,)第二个时钟后,QBQB输出了右移出的第输出了右移出的第2 2个位个位11第第6 6章章 VHDLVHDL设计进阶设计进阶常数定义的一般表述:常数定义的一般表述:CONSTANT 常数名:数据类型常数名:数据类型:=表达式表达式;6.3 6.3 数据对象数据对象DATA OBJECTSDATA OBJECTS 在VHDL中,数据对象有三类,即常量(CONSTANT)、变量(VARABLE)和信号(SIGNAL)。一、常数(一、常数(一、常数(一、常数(CONSTANTCONSTANTCONSTANTCONSTANT)常数的定义和设置主要是为了使程序更容易阅读和修改。常数的定义和设置主要是为了使程序更容易阅读和修改。例如,将逻辑位的宽度定义为一个常量,只要修改这个常量就能很容易地改变宽度,从而改变硬件结构。在程序中,常量是一个恒定不变的值,一旦作了数据类在程序中,常量是一个恒定不变的值,一旦作了数据类型和赋值定义后,在程序中不能在改变,因而具有全局性意型和赋值定义后,在程序中不能在改变,因而具有全局性意义。义。第第6 6章章 VHDLVHDL设计进阶设计进阶例如:CONSTANT FBT:STD_LOGIC_VECTOR:=“010110”;-标准位矢量类型 CONSTANT DATAIN:INTEGER:=15-整数类型 VHDL要求所定义的常量数据类型必须与表达式的数据类型要求所定义的常量数据类型必须与表达式的数据类型一致。一致。常量的可视性规则常量的可视性规则即常量的使用范围取决于它被定义即常量的使用范围取决于它被定义的位置。的位置。*如果在程序包程序包中,常量具有最大的的全局化特征,可以用在调用此程序包的所有设计实体中;*常量如果定义在设计实体设计实体中,其有效范围为这个实体定义的所有的结构体(多结构体);*如果常量定义在设计实体的某一结构体某一结构体中,则只能用于此结构体;*如果常量定义在结构体的某一单元结构体的某一单元,如一个进程中,则这个常量只能用在这一进程中。第第6 6章章 VHDLVHDL设计进阶设计进阶定义变量的一般表述:定义变量的一般表述:VARIABLE 变量名变量名:数据类型数据类型:=初始值初始值;二、变量(二、变量(二、变量(二、变量(VARIABLEVARIABLE)在在VHDL语法规则中,变量是一个局部量,只能在语法规则中,变量是一个局部量,只能在进程进程和和子程序子程序中使用。中使用。变量不能将信息带出对它作出定义的当前结构中。变量不能将信息带出对它作出定义的当前结构中。变量的赋值是一种理想化的数据传输,是立即发生的,不变量的赋值是一种理想化的数据传输,是立即发生的,不存在任何延时的行为。存在任何延时的行为。变量的主要作用是在进程中作为临时的数据存储单元。变量的主要作用是在进程中作为临时的数据存储单元。例如例如:VARIABLE a:INTEGER RANGE 0 TO 15;VARIABLE d:STD_LOGIC;分别定义a的取值范围从0到15的整数型变量;d为标准位类型的变量。第第6 6章章 VHDLVHDL设计进阶设计进阶 变量赋值的一般表述为;变量赋值的一般表述为;目标变量名目标变量名:=表达式;表达式;注意:注意:10 变量赋值符号是变量赋值符号是“:=”,变量数值的改变是通过变,变量数值的改变是通过变量赋值来实现的。量赋值来实现的。20 赋值语句右方的赋值语句右方的“表达式表达式”必须是一个与必须是一个与“目标变目标变量名量名”具有相同数据类型的数值,这个表达式可以是一个运算具有相同数据类型的数值,这个表达式可以是一个运算表达式,也可以是一个数值。表达式,也可以是一个数值。30 通过赋值操作,新的变量值的获得是立刻发生的。通过赋值操作,新的变量值的获得是立刻发生的。40 变量赋值语句左边的目标变量可以是单值变量,也变量赋值语句左边的目标变量可以是单值变量,也可以是一个变量的集合,如位矢量类型的变量。可以是一个变量的集合,如位矢量类型的变量。例如例如:VARIABLE x,y:INTEGER RANGE 15 DOWNTO 0;VARIABLE a,b:STD_LOGIC_VECTOR(7 DOWNTO 0);x:=11;y:=2+x;-运算表达式赋值,y也是实数变量 a:=b a(0 TO 5):=b(2 TO 7);第第6 6章章 VHDLVHDL设计进阶设计进阶信号定义格式:信号定义格式:SIGNAL 信号名:信号名:数据类型数据类型:=初始值初始值;三、信号(三、信号(三、信号(三、信号(SIGNALSIGNAL)信号是描述硬件系统的基本数据对象,它类似于连接线信号是描述硬件系统的基本数据对象,它类似于连接线。信号可以作为设计实体中并行语句模块间的信息交流通道。信号作为一种数值容器,不但可以容纳当前值,也可以保信号作为一种数值容器,不但可以容纳当前值,也可以保持历史值持历史值与触发器的记忆功能有很好的对应关系,只是不必注明信号上数据流动的方向。信号初始值的设置不是必须的信号初始值的设置不是必须的,而且初始值仅在VHDL的行为仿真中有效。除了没有方向说明外,信号信号与实体的端口(Port)概念是一致的,它可以看成是实体内部(可以看成是实体内部(设计器件内部设计器件内部)的端口)的端口。信号的使用和定义范围是实体、结构体和程序包,在进程和子程序的顺信号的使用和定义范围是实体、结构体和程序包,在进程和子程序的顺序语句中不允许定义信号。序语句中不允许定义信号。第第6 6章章 VHDLVHDL设计进阶设计进阶 当信号定义了数据类型和表达式后,在VHDL设计中就能对信号进行赋值了。信号的赋值语句表达式信号的赋值语句表达式为:目标信号名目标信号名=表达式;表达式;这里的“表达式”可以是一个运算表达式,也可以是数据对象(变量、信号或常量)。数据信息的传入可以设置延时量。信号的赋值可以出现在一个进程中,也可以直接出现在信号的赋值可以出现在一个进程中,也可以直接出现在结构体的并行语句结构中,但它们运行的含义是不一样的。结构体的并行语句结构中,但它们运行的含义是不一样的。前者属前者属顺序信号赋值顺序信号赋值(这时的信号赋值操作要视进程是否已被启动);后者属后者属并行信号赋值并行信号赋值(其赋值操作是各自独立并行地发生的)。在进程中,可以允许同一信号有多个驱动源(赋值源),在进程中,可以允许同一信号有多个驱动源(赋值源),即在同一进程中存在多个同名的信号被赋值,其结果只有最即在同一进程中存在多个同名的信号被赋值,其结果只有最后的赋值语句被启动,并进行赋值操作。后的赋值语句被启动,并进行赋值操作。第第6 6章章 VHDLVHDL设计进阶设计进阶例如: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 6章章 VHDLVHDL设计进阶设计进阶表表6-1 信号与变量赋值语句功能的比较信号与变量赋值语句功能的比较四、进程中的信号与变量赋值语句四、进程中的信号与变量赋值语句四、进程中的信号与变量赋值语句四、进程中的信号与变量赋值语句 从硬件电路系统来看,从硬件电路系统来看,变量和信号相当于逻辑电路系统中的连线和连变量和信号相当于逻辑电路系统中的连线和连线上的信号值;常量相当于电路中的恒定电平,如线上的信号值;常量相当于电路中的恒定电平,如GND或或VCC接口。接口。从行为仿真和从行为仿真和VHDL语句功能上看语句功能上看,信号与变量具有比较明显的区别,信号与变量具有比较明显的区别,其差异主要表现在接受与保持信号的方式和信息保持与传递的区域大小上。其差异主要表现在接受与保持信号的方式和信息保持与传递的区域大小上。表6-1在三方面对信号与变量作了比较,之后给出了一些实例。第第6 6章章 VHDLVHDL设计进阶设计进阶【例【例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 QQ:STD_LOGIC;BEGIN IF CLKEVENT AND CLK=1 THEN QQ:=D1;END IF;Q1=QQ;END PROCESS;END;第第6 6章章 VHDLVHDL设计进阶设计进阶【例例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章章 VHDLVHDL设计进阶设计进阶图图6-6 例例6-6 的的RTL电路电路第第6 6章章 VHDLVHDL设计进阶设计进阶【例【例6-7】SIGNAL in1,in2,e1,.:STD_LOGIC;.PROCESS(in1,in2,.)VARIABLE 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 6章章 VHDLVHDL设计进阶设计进阶【例【例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_LOGIC;BEGIN PROCESS(CLK)BEGIN IF CLKEVENT AND CLK=1 THEN A=D1;B=A;Q1=B;END IF;END PROCESS;END;第第6 6章章 VHDLVHDL设计进阶设计进阶图图6-7 例例6-8 的的RTL电路电路 第第6 6章章 VHDLVHDL设计进阶设计进阶【例【例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 CLKEVENT AND CLK=1 THEN A:=D1;B:=A;Q1=B;END IF;END PROCESS;END;第第6 6章章 VHDLVHDL设计进阶设计进阶【例【例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 muxval=0;if(a=1)then muxval=muxval+1;end if;if(b=1)then muxval q q q q null;end case;end process;END body_mux4;第第6 6章章 VHDLVHDL设计进阶设计进阶【例【例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 muxval:=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 6章章 VHDLVHDL设计进阶设计进阶图图6-8 例例6-10 的的RTL电路电路第第6 6章章 VHDLVHDL设计进阶设计进阶例例6-11 的的RTL电路电路第第6 6章章 VHDLVHDL设计进阶设计进阶图图6-10 例例6-10的错误的工作时序的错误的工作时序图图6-11 例例6-11的正确工作时序的正确工作时序第第6 6章章 VHDLVHDL设计进阶设计进阶6.4 6.4 双向电路和三态控制电路设计双向电路和三态控制电路设计 引入三态门有许多实际的应用,如CPU设计中的数据和地址总线的构建,RAM或堆栈的数据端口等。在在VHDL设计中,如果用设计中,如果用STD_LOGIC数据类型数据类型Z对对一个变量赋值,即会引入三态门,并在控制下可使其输出呈一个变量赋值,即会引入三态门,并在控制下可使其输出呈高阻态,这等效于使三态门禁止输出。高阻态,这等效于使三态门禁止输出。一、三态门设计一、三态门设计一、三态门设计一、三态门设计 例6-13是一个8位三态控制门电路的描述,当使能控制信号为1时,8位数据输出,为0时输出呈高阻态,语句中将高阻态数据“ZZZZZZZZ”向输出端口赋值,其综合结果如图6-13所示。第第6 6章章 VHDLVHDL设计进阶设计进阶【例【例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_LOGIC_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 6章章 VHDLVHDL设计进阶设计进阶图图6-13 8位位3态控制门电路态控制门电路第第6 6章章 VHDLVHDL设计进阶设计进阶 一般地,可以首先将信号定义为一般地,可以首先将信号定义为STD_LOGIC数据类型,数据类型,将将Z赋给这个变量来获得三态控制门电路,一个赋给这个变量来获得三态控制门电路,一个Z表表示一个逻辑位。示一个逻辑位。注意:注意:10、由于、由于Z在综合中是一个不确定的值,不同的综在综合中是一个不确定的值,不同的综合器可能会给出不同的结果,所以合器可能会给出不同的结果,所以建议尽可能不要将建议尽可能不要将Z用作比较值,或用作表达式或操作数用作比较值,或用作表达式或操作数。20、虽然、虽然VHDL语法规定不区分关键词的大小写,但当把语法规定不区分关键词的大小写,但当把表示高阻态的表示高阻态的Z值赋给一个数据类型为值赋给一个数据类型为STD_LOGIC的变的变量或信号时,量或信号时,Z必须大写必须大写这是因为在IEEE库中对数据类型STD_LOGIC的预定义已经将高阻态确定为大写Z。第第6 6章章 VHDLVHDL设计进阶设计进阶二、双向端口设计二、双向端口设计二、双向端口设计二、双向端口设计 用用INOUT模式设计双向端口也必须考虑三态的使用,因模式设计双向端口也必须考虑三态的使用,因为双向端口的设计与三态端口的设计十分相似,都必须考虑为双向端口的设计与三态端口的设计十分相似,都必须考虑端口的三态控制。端口的三态控制。这是由于双向端口在完成输入功能时,必须使原来呈输这是由于双向端口在完成输入功能时,必须使原来呈输出模式的端口呈高阻态,否则,待输入的外部数据必会与端出模式的端口呈高阻态,否则,待输入的外部数据必会与端口处原有电平发生口处原有电平发生“线与线与”,导致无法将外部数据正确地读,导致无法将外部数据正确地读入,从而实现入,从而实现“双向双向”的功能。的功能。例6-14和例6-15是两个双向端口的VHDL设计实例。第第6 6章章 VHDLVHDL设计进阶设计进阶【例【例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(control=0)then x=q ;else q=in1;x=“ZZZZZZZZ”;-定义q为双向端口end if;x为三态控制输出口end process;end body_tri;第第6 6章章 VHDLVHDL设计进阶设计进阶图图6-14 例例6-14的综合结果的综合结果错误的逻辑电路第第6 6章章 VHDLVHDL设计进阶设计进阶图图6-13 例例6-14的仿真波形图的仿真波形图无法输出第第6 6章章 VHDLVHDL设计进阶设计进阶【例【例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 6章章 VHDLVHDL设计进阶设计进阶图图6-16 例例6-15的综合结果的综合结果第第6 6章章 VHDLVHDL设计进阶设计进阶图图6-17 例例6-15的仿真波形图的仿真波形图第第6 6章章 VHDLVHDL设计进阶设计进阶三、三、三、三、三态总线电路设计三态总线电路设计三态总线电路设计三态总线电路设计 为构成芯片内部的总线系统,必须设计三态总线驱动器电路,这可以有多种表达方法,但必须注意信号多驱动源的处理问题。【例【例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:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END tristate2;ARCHITECTURE multiple_drivers OF tristate2 ISBEGIN第第6 6章章 VHDLVHDL设计进阶设计进阶PROCESS(enable,input3,input2,input1,input0)BEGIN IF enable=“00”THEN output=input3;-连续四个IF ELSE output Z);END IF;IF enable=01 THEN output=input2;ELSE output Z);END IF;IF enable=10 THEN output=input1;ELSE output Z);END IF;IF enable=11 THEN output=input0;ELSE output Z);END IF;END PROCESS;END multiple_drivers;第第6 6章章 VHDLVHDL设计进阶设计进阶图图6-18 例例6-16错误的综合结果错误的综合结果第第6 6章章 VHDLVHDL设计进阶设计进阶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);end body_tri;【例【例6-16】-试图设计一个8位4通道的三态总线驱动器(Max+plus不支持)第第6 6章章 VHDLVHDL设计进阶设计进阶图图6-19 例例6-17正确的综合结果正确的综合结果第第6 6章章 VHDLVHDL设计进阶设计进阶四、四、四、四、顺序条件语句顺序条件语句顺序条件语句顺序条件语句IFIF语句语句语句语句 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 IF第第6 6章章 VHDLVHDL设计进阶设计进阶 IF语句中至少应有一个条件句,语句中至少应有一个条件句,“条件句条件句”可以是可以是一个一个BOOLEAN类型的标识符,如类型的标识符,如IF al THEN ,或或者是一个判别表达式,如者是一个判别表达式,如IF ab+1 THEN ,判别表判别表达式输出的值,即判断结果的数据类型是达式输出的值,即判断结果的数据类型是BOOLEAN。IF语句根据条件句产生的判断结果是语句根据条件句产生的判断结果是ture或是或是false,有条件地选择执行其后的顺序语句。有条件地选择执行其后的顺序语句。第第6 6章章 VHDLVHDL设计进阶设计进阶【例【例6-18】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY co