当前位置:首页 > EDA技术所有实验代码
例1-1是2选1多路选择器的VHDL完整描述,即可以直接综合出实现相应功能的逻辑
电路及其功能器件。 图1-1 mux21a实体 图1-2 mux21a结构体
图1-1是此描述对应的逻辑图或者器件图,图中,a和b分别是两个数据输入端的端口名,s为通道选择控制信号输入端的端口名,y为输出端的端口名。“mux21a”是此器件的名称,这类似于“74LS138”、“CD4013”等器件的名称。电路图图1-2是例1-1综合后获得的电路,因而可以认为是多路选择器“mux21a”内部电路结构。 由例1-1可见,此电路的VHDL描述由两大部分组成:
1、由关键词ENTITY 引导,以 END ENTITY mux21a结尾的语句部分,称为实体。实体描述电路器件的外部情况及各信号端口的基本性质。图1-1可以认为是实体的图形表达。
2、由关键词ARCHITECTURE引导,以END ARCHITECTURE one结尾的语句部分,称为结构体。结构体描述电路器件的内部逻辑功能或电路结构。图1-2是此结构体的原理图表达。
【例1-2】 【例1-4】
ENTITY mux21a IS ENTITY mux21a IS PORT ( a, b : IN BIT; PORT ( a, b : IN BIT; s : IN BIT; s : IN BIT; y : OUT BIT ); y : OUT BIT ); END ENTITY mux21a; END ENTITY mux21a;
ARCHITECTURE one OF mux21a IS ARCHITECTURE one OF mux21a IS SIGNAL d,e : BIT; BEGIN
BEGIN IF s = '0' THEN
d <= a AND (NOT S) ; y <= a ; ELSE e <= b AND s ; y <= b ; y <= d OR e ; END IF;
END ARCHITECTURE one ; END PROCESS;
【例1-3】 END ARCHITECTURE one ; . . .
ARCHITECTURE one OF mux21a IS BEGIN
y<=(a AND(NOT s)) OR (b AND s); END ARCHITECTURE one ;
在VHDL结构体中用于描述逻辑功能和电路结构的语句分为顺序语句和并行语句两部分,顺序语句的执行方式十分类似于普通软件语言的程序执行方式,都是按照语句的前后排列方式顺序执行的。而在结构体中的并行语句,无论有多少行,都是同时执行的,与语句的前后次序无关。
例1-1中的逻辑描述是用一句WHEN_ELSE结构的并行语句表达的。它的含义是,当满足条件s='0',即s为低电平时a输入端的信号传送至y ,否则,即s为高电平时,b 输
入端的信号传送至y 。
也可以用其他的语句形式来描述以上相同的逻辑行为。例1-2和例1-3中的功能描述语句都是并行语句,是用布尔方程的表达式来描述的。其中的“AND”、“OR”、“NOT”分别是逻辑与、或、非的意思。 例1-4则给出了用顺序语句IF_THEN_ELSE表达的功能描述。
以上4例用不同的语句表达方式描述了相同的逻辑功能,都能被综合成图1-2的电路结构。其电路功能可以从图1-3的时序波形中看出,分别向a和b端输入两个不同信号的频率fa和fb(fa > fb),当s为高电平时,y输出fb,而当s为低电平时,y输出fa。显然,图1-3的波型证实了VHDL逻辑设计的正确性。
需要指出的是,以上各例的实体和结构体分别是以“END ENTITY xxx”和“END ARCHITECTURE xx ”语句结尾的,这是符合VHDL的IEEE STD 1076_1993版的语法要求的。若根据VHDL’87版本,IEEE STD 1076_1987的语法要求,这两条结尾语句只需写成“END ;”和“END xx”。但考虑到目前绝大多数常用的EDA工具中的VHDL综合器都兼容两种VHDL版本的语法规则,且许多最新的VHDL方面的资料,仍然使用VHDL’87版本语言规则。因此,出于实用的目的,对于以后出现的示例,不再特意指出VHDL两种版本的语法差异处。但对于不同的EDA工具,仍需根据设计程序不同的VHDL版本表述,在综合前作相应的设置。
1.1.1 VHDL语言现象说明
这里将对例1-1/2/3/4中出现的语言现象作出说明和归纳:
图1-3 mux21a功能时序波形
1、实体表达
VHDL完整的,可综合的程序结构,必须完整地表达出一片专用集成电路ASIC器件的端口结构和电路功能用,无论是一片74LS138还是一片CPU,都必须包含实体和结构体两个最基本的语言结构,这里将含有完整程序结构(包含实体和结构体)的VHDL表述称为设计实体。如前所述,实体描述的是电路器件的端口构成和信号属性,它的最简表式如下:
【例1-5】
ENTITY e_name IS
PORT ( p_name : port_m data_type; . . .
p_namei : port_mi data_type ); END ENTITY e_name;
或:
【例1-6】
ENTITY e_name IS
PORT ( p_name : port_m data_type; . . .
p_namei : port_mi data_type ); END e_name;
上下两种表式的唯一区别是IEEE93/87标准不同。前者为IEEE93标准、而后者是IEEE87,一般VHDL综合器都兼容两种不同标准。上式中ENTITY、IS、PORT和END ENTITY都是描述实体的关键词,在实体描述中必须包含这些关键词,编辑中,关键词不分大写和小写。
2、实体名
例1-5/1-6中的e_name是实体名,具体取名由设计者自定。由于实体名实际上表达的是该设计电路的器件名,所以最好根据相应电路的功能来确定,如4位二进制计数器,实体名可取为counter4b;8位二进制加法器,实体名可取为adder8b等等。需要特别注意的是,一般不应用数字或中文定义实体名,也不应用与EDA工具库中已定义好的元件名作为实体名,如or2、latch等,也不能用数字带头的实体名,如74LSX。 3、PORT语句和端口信号名
描述电路的端口及其端口信号,必须用端口语句PORT()引导,并在语句结尾处加分号\;\。例1-5/1-6中的p_name是端口信号名,也由设计者自己确定,如例7-1中的端口信号名分别是a、b、s和y。 4、端口模式
例1-5/1-6中的port_m表达端口模式,可综合的端口模式有4种,它们分别是“IN”、“OUT”、“INOUT”和“BUFFER”,用于定义端口上数据的流动方向和方式:
?IN :IN定义的通道为单向只读模式,规定数据只能通过此端口被读入实体中。 ?OUT :OUT定义的通道为单向输出模式,规定数据只能通过此端口从实体向外流出,或者说可以将实体中的数据向此端口赋值。
?INOUT :INOUT定义的通道确定为输入输出双向端口,即从端口的内部看,可以对此端口进行赋值,也可以通过此端口读入外部的数据信息;而从端口的外部看,信号既可以从此端口流出,也可以向此端口输入信号,如RAM的数据端口,单片机的I/O口。在实际电路描述中,INOUT模式的正确使用还应该考虑其它因素,详细情况将在后文介绍。 ?BUFFER :BUFFER的功能与INOUT类似,区别在于当需要输入数据时,只允许内部回读输出的信号,即允许反馈。如计数器的设计,可将计数器输出的计数信号回读,以作下一计数值的初值。与INOUT模式相比,BUFFER回读(输入)的信号不是由外部输入的,而是由内部产生,向外输出的信号。BUFFER的使用示例将在下章介绍。
在例1-1中,a、b、s的端口模式都定义为IN,y的端口模式定义为OUT; 5、数据类型BIT
例1-5/1-6中的data_type是数据类型名。例1-1中,端口信号a、b、s和y的数据类型都定义为BIT。 VHDL作为一种强类型语言,任何一种数据对象(信号、变量、常数)必须严格限定其取值范围,即对其传输或存储的数据类型作明确的界定。这对于大规模电路描述的排错是十分有益的。在VHDL中,预先定义好的数据类型有多种,如整数数据类型INTEGER、布尔数据类型BOOLEAN、标准逻辑位数据类型STD_LOGIC和位数据类型BIT等。
BIT数据类型的信号规定的取值范围是逻辑位'1'和'0'。在VHDL中,逻辑位0和1的表达必须加单引号' ',否则VHDL综合器将0和1解释为整数数据类型INTEGER。 BIT数据类型可以参与逻辑运算或算术运算,其结果仍是位的数据类型。VHDL综合器用一个二进制位表示BIT。将例7-1中的端口信号a、b、s和y的数据类型都定义为BIT,即表示a、b、s和y的取值范围,或者说是数据变化范围被限定在逻辑位'1'和'0'之间。 BIT数据类型的定义或者说是解释包含在VHDL标准程序包STANDARD中,而程序包STANDARD包含于VHDL标准库STD中。
6、结构体表达
结构体的一般表达如以下例1-7/1-8所示: 【例1-7】
ARCHITECTURE arch_name OF e_name IS (说明语句) BEGIN
(功能描述语句)
END ARCHITECTURE arch_name ;
或: 【例1-8】
ARCHITECTURE arch_name OF e_name IS (说明语句) BEGIN
(功能描述语句) END arch_name ;
和例1-5/1-6一样,上下两种表式的唯一区别是IEEE93/87标准不同。前者为IEEE93标准、而后者是IEEE87。上式中ARCHITECTURE、OF、IS、BEGIN和END ARCHITECTURE都是描述结构体的关键词,在描述中必须包含,arch_name是结构体名。 (说明语句)包括在结构体中需要说明和定义的数据对象、数据类型、元件调用声明等等。(说明语句)并非是必须的,(功能描述语句)则不同,结构体中必须给出相应的电路功能描述语句,可以是并行语句,顺序语句或它们的混合。
一般地,一个可综合的,完整的VHDL程序有比较固定的结构。设计实体中,一般首先出现的是各类库及其程序包的使用声明,包括未以显式表达的工作库WORK库的使用声明,然后是实体描述,然后是结构体描述,而在结构体中可以含有不同的逻辑表达语句结构。这里对一个相对完整的VHDL程序设计构建称为设计实体。 7、信号传输(赋值)符号和数据比较符号
例1-1中的表达式y<=a表示输入端口a的数据向输出端口y传输;但也可以解释为信号a向信号y赋值。在VHDL仿真中赋值操作y<=a并非立即发生的,而是要经历一个模拟器的最小分辨时间 ? 后,才将a的值赋予y 。在此不妨将 ? 看成是实际电路存在的固有延时量。VHDL要求赋值符“<=”两边的信号的数据类型必须一致。 例1-1中,条件判断语句WHEN_ELSE通过测定表式s='0'的比较结果,以确定由哪一端口向y赋值。条件语句WHEN_ELSE的判定依据是表式s='0'输出的结果。表式中的等号“=”没有赋值的含义,只是一种数据比较符号。其表式输出结果的数据类型是布尔数据类型BOOLEAN,它的取值分别是:
true(真) 和 false(伪)
即当s为高电平时,表式“s='0'”输出“false”; 当s为低电平时,表式“s ='0'”输出“true”。在VHDL综合器或仿真器中分别用'1'和'0'表达true和false。布尔数据不是数值,只能用于逻辑操作或条件判断。用于条件语句的判断表式可以是一个值,也可以是更复杂的逻辑或运算表达式,如:
IF a THEN .. -- 注意,a的数据类型必须是boolean IF (s1='0')AND(s2='1')OR(c
例1-2中出现的文字AND、OR和NOT是逻辑操作符号。VHDL共有七种基本逻辑操作符,它们是AND(与)、OR(或)、NAND(与非)、NOR(或非)、XOR(异或)、XNOR(同或)和NOT(取反)。信号在这些操作符的作用下,可构成组合电路。逻辑操作符所要求的操作数(操作对象)的数据类型有三种,即BIT、BOOLEAN和STD_LOGIC。
与其它硬件描述语言用符号表达逻辑操作符不同,VHDL中直接用对应的英语文字表达逻辑操作符号,这更明确显示了VHDL作为硬件行为描述语言的特征。 9、IF_THEN条件语句
共分享92篇相关文档