资源预览内容
第1页 / 共108页
第2页 / 共108页
第3页 / 共108页
第4页 / 共108页
第5页 / 共108页
第6页 / 共108页
第7页 / 共108页
第8页 / 共108页
第9页 / 共108页
第10页 / 共108页
亲,该文档总共108页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 第三章第三章 VHDL程序结构与要素程序结构与要素3.1 VHDL程序基本结构3.2 VHDL文字规则3.3 VHDL 基本数据对象与数据类型3.4 VHDL表达式与运算符第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 3.1 VHDL程序基本结构程序基本结构一个一个VHDL程序的基本单元是设计实体程序的基本单元是设计实体,它可以是一个简单的门电路,也可以是一个复杂的数字系统。它既能作为一个电路的功能模块而单独存在和运行,也可以被其它数字系统所调用,从而成为这个系统的一部分。不管其功能复杂程度,不管其功能复杂程度,VHDL程序的结构基本相同,程序的结构基本相同,一般由库、程序包、实体、结构体及配置语句构成。一般由库、程序包、实体、结构体及配置语句构成。其中实体和结构两部分是必需的,由这二部分即可构实体和结构两部分是必需的,由这二部分即可构成一个简单的成一个简单的VHDL程序。程序。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 为了便于程序的阅读和调试,对VHDL程序设计作如下约定:(1) 语句结构描述中方括号“ ”内的内容为可选内容。(2) 对于VHDL的编译器和综合器来说,程程序序文文字字的的大大小小写是不加区分的写是不加区分的。关键字一般使用大写。(3) 程序中的注释使用双横线“-”。在VHDL程序的任何一行中,双横线双横线“-”后的文字都不参加编译和综合后的文字都不参加编译和综合。 VHDL程序设计约定第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 2选选1数据选择器的数据选择器的VHDL程序程序2选1多路选择器是典型的组合电路,以此电路的VHD表述与设计说明相关的VHDL结构、语句表述、数据规则、语法特点。a和b分别为两个数据输入的端口名s为通道选择控制信号输入端的端口名y为输出端的端口名 “mux21a”是此器件的名称第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 SY 0a1b第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 【例例3-1】 2选选1多路选择器程序多路选择器程序 LIBRARY IEEE; -IEEE库库使用使用说说明明语语句句USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux21 IS -实实体体说说明部分明部分PORT(a,b : IN STD_LOGIC;s: IN STD_LOGIC;y: OUT STD_LOGIC);END ENTITY mux21;第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 【例例3-1】 2选选1多路选择器程序多路选择器程序ARCHITECTURE mux21a OF mux21 IS BEGINPROCESS(a,b,s)BEGINIF s=0 THEN y=a; ELSEy3)第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 3端口说明端口说明(PORT) 在电路图上,端端口口对对应应于于元元件件符符号号的的外外部部引引脚脚。端口说明语句是对一个实体界面的说明,也是对端口信号名、数据类型和端口模式的描述。语句的一般格式如下: PORT(端端口口名名,端端口口名名:端端口口模模式式 数数据据类类型型); 或 PORT(端口名端口名 :端口模式:端口模式 数据类型;数据类型; 端口名端口名 :端口模式:端口模式 数据类型数据类型 . );第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 端口名为自己定义的端口名称,端口名为自己定义的端口名称,端口模式说明端口模式说明数据通过该端口的流动方向,数据类型说明通过该数据通过该端口的流动方向,数据类型说明通过该端口的数据类型端口的数据类型如 PORT( a,b : IN STD_LOGIC;s: IN STD_LOGIC;y: OUT STD_LOGIC );第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 端口模式端口模式 方向定义含 义IN输入OUT输出(结构体内不能再使用)INOUT双向(可以输入,也可以输出)BUFFER输出(结构体内可再使用),可以读或写第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 BUFFER与与INOUT的区别在于:的区别在于:INOUT是双向信号,是双向信号,既可以输入,也可以输出,而既可以输入,也可以输出,而BUFFER也是实体的输出信号,也是实体的输出信号,但作输入用时,信号不是由外部驱动,而是从输出反馈得到但作输入用时,信号不是由外部驱动,而是从输出反馈得到,即BUFFER类的信号在输出外部电路的同时,也可以被实体本身的结构体读入,这种类型的信号常用来描述带反馈的逻辑电路,如计数器等。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 3.1.2 结构体结构体结结构构体体是是一一个个实实体体的的组组成成部部分分,是是对对实实体体功功能能的的具具体体描描述述。在在电电路路中中,如如果果实实体体代代表表一一个个器器件件符符号号,则结构体描述了这个符号的内部行为。则结构体描述了这个符号的内部行为。结结构构体体主主要要是是描描述述实实体体的的硬硬件件结结构构、元元件件之之间间的的互互连连关关系系、实实体体所所完完成成的的逻逻辑辑功功能能以以及及数数据据的的传传输输变变换换等等方方面面的的内内容容。具具体体编编写写结结构构体体时时,可可以以从从其其中中的的某一方面来描述,也可综合各个方面来进行描述。某一方面来描述,也可综合各个方面来进行描述。结构体不能单独存在,它必须有一个界面说明,结构体不能单独存在,它必须有一个界面说明,即一个实体。即一个实体。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 结构体的一般语句格式结构体的一般语句格式 ARCHITECTURE 结构体名结构体名 OF 实体名实体名 IS 说明语句说明语句 BEGIN 功能描述语句功能描述语句 END ARCHITECTURE 结构体名结构体名;其中,实体名必须是所在设计实体的名字,实体名必须是所在设计实体的名字,而而结构体名可以由设计者自己选择,结构体名可以由设计者自己选择,但当一个实体具但当一个实体具有多个结构体时,结构体的取名不可重复。有多个结构体时,结构体的取名不可重复。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 结构体说明语句结构体中的说明语句是对结构体的功能描述语句中结构体中的说明语句是对结构体的功能描述语句中将要用到的信号将要用到的信号(SIGNAL)、数据类型、数据类型(TYPE)、常数、常数(CONSTANT)、元件、元件(COMPONENT)、函数、函数(FUNCTION)和过和过程程(PROCEDURE)等加以说明的语句。等加以说明的语句。在一个结构体中说明和定义的数据类型、常数、元在一个结构体中说明和定义的数据类型、常数、元件、函数和过程只能用于这个结构体中,若希望其能件、函数和过程只能用于这个结构体中,若希望其能用于其他的实体或结构体中,则需要将其作为程序包用于其他的实体或结构体中,则需要将其作为程序包来处理。来处理。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 ARCHITECTURE behavioral OF example_dairu IS SIGNAL a, b, c, d : BIT ; SIGNAL temp0, temp1 : STD_LOGIC ;BEGIN . . .END ARCHITECTURE behavioral ;结构体的信号定义和端口说明语句相类似结构体的信号定义和端口说明语句相类似,应有应有信号的名称和数据类型的说明信号的名称和数据类型的说明,但不需要定义信号但不需要定义信号的模式,因为它是内部信号。的模式,因为它是内部信号。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 功能描述语句功能描述语句功能描述语句位于功能描述语句位于和和之间;具体描述结之间;具体描述结构体的行为及其连接关系。构体的行为及其连接关系。语句结构可以含有五种不同类型的,以并行方语句结构可以含有五种不同类型的,以并行方式工作。而在式工作。而在每一语句结构的内部可能含有并行运每一语句结构的内部可能含有并行运行的逻辑描述语句或顺序运行的逻辑描述语句。行的逻辑描述语句或顺序运行的逻辑描述语句。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 半加器半加器输输 入入输输出出被加数被加数A 加数加数 B和数和数S 进进位数位数C0 00 00 10 11 01 01 11 10 00 01 01 01 01 00 10 1 半加器的真值表中的半加器的真值表中的A和和B分别表示被加数和加数分别表示被加数和加数输入,输入,S为本位和输出,为本位和输出,C为向相邻高位的进位输出。为向相邻高位的进位输出。 第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 半加器的完整半加器的完整VHDL描述描述例例3-4 其中其中x、y为加数与被加数,为加数与被加数,s为和信号,为和信号,c为进位信号为进位信号ENTITY half_adder IS PORT( x,y : IN BIT; s: OUT BIT; c: OUT BIT);END ENTITY half_adder;ARCHITECTURE dataflow OF half_adder IS BEGIN s = x XOR y; c = x AND y;END ARCHITECTURE dataflow;第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 3.1.3 描述风格描述风格在在VHDL程序中,结构体具体描述了设计实体程序中,结构体具体描述了设计实体的行为和逻辑功能,对于相同的逻辑功能可以有不的行为和逻辑功能,对于相同的逻辑功能可以有不同的描述方式或实现方案。同的描述方式或实现方案。这些不同的描述方式或者说是建模方法,被称这些不同的描述方式或者说是建模方法,被称为描述风格,为描述风格,VHDL中一般有种常用的描述风格:中一般有种常用的描述风格:行为描述、数据流描述、结构描述、混合描述。行为描述、数据流描述、结构描述、混合描述。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 .行为描述行为描述如果程序的结构体只描述了所期望电路的功能或行为,如果程序的结构体只描述了所期望电路的功能或行为,即电路输入、输出间的转换行为,而没有包含任务实现这即电路输入、输出间的转换行为,而没有包含任务实现这些功能的硬件信息,这种描述风格称为行为描述。些功能的硬件信息,这种描述风格称为行为描述。行为描述是一种高层次的描述方式,设计者只需要关行为描述是一种高层次的描述方式,设计者只需要关注设计实体即功能单元正确的行为描述,无需关心硬件电注设计实体即功能单元正确的行为描述,无需关心硬件电路的结构形式,即编程与硬件无关,类似于高级编程语言路的结构形式,即编程与硬件无关,类似于高级编程语言的编程方式。的编程方式。将将VHDL的行为描述语句转换为门级电路由的行为描述语句转换为门级电路由VHDL开发开发工具自动完成,是综合器的任务。不同的综合器对于相同工具自动完成,是综合器的任务。不同的综合器对于相同的行为描述,有时会综合出的结果有较大的差别。的行为描述,有时会综合出的结果有较大的差别。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 选数据选择器的行为描述程序选数据选择器的行为描述程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux21 ISPORT(a,b,s : IN STD_LOGIC; y: OUT STD_LOGIC );END ENTITY mux21;ARCHITECTURE behav OF mux21 IS BEGIN PROCESS(a,b,s) BEGIN IF s=0 THEN y=a; ELSE y=b; END IF; END PROCESS;END ARCHITECTURE behav;第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 2. 数据流描述数据流描述数据流描述也称为数据流描述也称为RTL(寄存器传输级)描述(寄存器传输级)描述行为,行为,类似于布尔方程类似于布尔方程,它既表示某种行为,又隐,它既表示某种行为,又隐含结构信息,主要是指非结构化的并行描述语句。含结构信息,主要是指非结构化的并行描述语句。这种描述方式主要是反映数据经过一定的逻辑这种描述方式主要是反映数据经过一定的逻辑运算后在输入、输出间的传递,可以清楚地看到数运算后在输入、输出间的传递,可以清楚地看到数据的流动方向、路径和结果。据的流动方向、路径和结果。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 2选选1多路选择器数据流描述程序多路选择器数据流描述程序 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux21 IS PORT(a,b,s : IN STD_LOGIC; y: OUT STD_LOGIC );END ENTITY mux21;ARCHITECTURE dataflow OF mux21 IS BEGIN y=(a AND (NOT s) OR (b AND s);END ARCHITECTURE dataflow;第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 3.结构描述结构描述结构描述主要心元件或已完成的功能模块为基结构描述主要心元件或已完成的功能模块为基础,础,应用于采用元件例化的应用于采用元件例化的VHDL程序设计中。通程序设计中。通过描述元件及它们之间的相互连接关系,可以将各过描述元件及它们之间的相互连接关系,可以将各种子模块连接成更为复杂的功能模块或系统。种子模块连接成更为复杂的功能模块或系统。在结构描述中,元件间的连接是通过定义的端在结构描述中,元件间的连接是通过定义的端口界面来实现的,主要描述端口及其互联关系,因口界面来实现的,主要描述端口及其互联关系,因此,结构描述电能提高设计的效率,因为它可以将此,结构描述电能提高设计的效率,因为它可以将已有的设计成果方便的应用新的设计中,且结构清已有的设计成果方便的应用新的设计中,且结构清晰。晰。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 2选选1多路选择器结构描述程序多路选择器结构描述程序 -二输入与门二输入与门LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;ENTITY and21 IS PORT(i0,i1 : IN STD_LOGIC; q: OUT STD_LOGIC );END ENTITY and21;ARCHITECTURE one OF and21 IS BEGIN q=i0 AND i1; END ARCHITECTURE one;第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 -二输入或门二输入或门LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;ENTITY or21 IS PORT(i0,i1 : IN STD_LOGIC; q: OUT STD_LOGIC );END ENTITY or21;ARCHITECTURE one OF or21 IS BEGIN q=i0 OR i1; END ARCHITECTURE one;第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 -非门非门LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;ENTITY inv21 IS PORT(i0 : IN STD_LOGIC; q: OUT STD_LOGIC );END ENTITY inv21;ARCHITECTURE one OF inv21 IS BEGIN q= (NOT i0); END ARCHITECTURE one;第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux21 IS PORT(a,b,s : IN STD_LOGIC; y: OUT STD_LOGIC );END ENTITY mux21;ARCHITECTURE struct OF mux21 IS COMPONENT and21PORT (i0,i1 : IN STD_LOGIC; q: OUT STD_LOGIC); END COMPONENT;COMPONENT or21PORT (i0,i1 : IN STD_LOGIC; q: OUT STD_LOGIC);END COMPONENT;COMPONENT inv21 PORT (i0: IN STD_LOGIC; q: OUT STD_LOGIC); END COMPONENT;SIGNAL tmp1,tmp2,tmp3:STD_LOGIC;BEGIN u1: and21 PORT MAP (b, s,tmp1); u2: inv21 PORT MAP(s,tmp2); u3: and21 PORT MAP (a,tmp2,tmp3); u4: or21 PORT MAP(tmp1,tmp3,y);END ARCHITECTURE struct; 第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 4. 混合描述混合描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY xor21 IS PORT(i0,i1:IN STD_LOGIC; q: OUT STD_LOGIC);END ENTITY xor21;ARCHITECTURE behav OF xor21 IS BEGIN q=i0 XOR i1; END ARCHITECTURE behav;第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY half_adder IS PORT(a,b:IN STD_LOGIC; c,s: OUT STD_LOGIC);END ENTITY half_adder;ARCHITECTURE mix OF half_adder ISCOMPONENT xor21 IS PORT(i0,i1:IN STD_LOGIC; q:OUT STD_LOGIC); END COMPONENT; BEGIN c = a AND b; u1: xor21 PORT MAP(a,b,s); END ARCHITECTURE mix;第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 3.2 VHDL文字规则文字规则VHDL文字主要包括数值和标识符。文字主要包括数值和标识符。数值型文字数值型文字主要有数值型、字符串型、位串型。主要有数值型、字符串型、位串型。1数值型文字数值型文字 数字型文字的值有多种表达方式,现列举如下:数字型文字的值有多种表达方式,现列举如下:(1) 整数型文字整数型文字:整数文字都是十进制的数,如:整数文字都是十进制的数,如: 5,678,0,156E2(=15600), 45_234_287(=45234287) 数字间的下划线仅仅是为了提高文字的可读性,数字间的下划线仅仅是为了提高文字的可读性,相当于一个空的间隔符,而没有其他的意义,因而不相当于一个空的间隔符,而没有其他的意义,因而不影响文字本身的数值影响文字本身的数值第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 (2) 实数文字实数文字:实数文字也都是十进制的数,但必:实数文字也都是十进制的数,但必须带有小数点,如:须带有小数点,如: 188.993, 88_670_551.453_909(=88670551.453909), 1.0,44.99E-2(=0.4499),1.335,0.0(3) 以数制基数表示的文字:以数制基数表示的文字:用这种方式表示的数用这种方式表示的数由五个部分组成。第一部分,用十进制数标明数制由五个部分组成。第一部分,用十进制数标明数制进位的基数;第二部分,数制隔离符号进位的基数;第二部分,数制隔离符号“#”;第;第三部分,表达的文字;第四部分,指数隔离符号三部分,表达的文字;第四部分,指数隔离符号“#”;第五部分,用十进制表示的指数部分,这;第五部分,用十进制表示的指数部分,这一部分的数如果是一部分的数如果是0可以省去不写。可以省去不写。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 例如:例如:10#170# -(十进制数表示,等于十进制数表示,等于170)2#1111_1110# -(二进制数表示,等于二进制数表示,等于254)16#F.01#E+2 -(十六进制数表示,等于十六进制数表示,等于16#F01, 3841.00)(4) 物理量文字物理量文字(VHDL综合器不接受此类文字综合器不接受此类文字)。如:。如:60s(60秒秒),100m(100米米),k(千欧姆千欧姆),177A(177安培安培)第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 2. 字符串型文字 字符是用单引号引起来的字符是用单引号引起来的ASCII字符,可以是字符,可以是数值,也可以是符号或字母,如:数值,也可以是符号或字母,如:R,A,*,Z。 而字符串则是一维的字符数组,须放在双引号而字符串则是一维的字符数组,须放在双引号中。中。VHDL中有两种类型的字符串:文字字符串和中有两种类型的字符串:文字字符串和数位字符串。数位字符串。 (1) 文字字符串:文字字符串是用双引号引起文字字符串:文字字符串是用双引号引起来的一串文字,如:来的一串文字,如: “ERROR”,“BOTH S AND Q EQUAL TO L”,“BB$CC”第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 (2) 数位字符串:数位字符串也称位矢量,是数位字符串:数位字符串也称位矢量,是预定义的数据类型预定义的数据类型BIT的一位数组,它们所代表的的一位数组,它们所代表的是二进制、八进制或十六进制的数组,是二进制、八进制或十六进制的数组,其位矢量的其位矢量的长度即为等值的二进制数的位数。数位字符串的表长度即为等值的二进制数的位数。数位字符串的表示首先要有数制基数,然后将该基数表示的值放在示首先要有数制基数,然后将该基数表示的值放在双引号中,基数符以双引号中,基数符以“B”、“O”和和“X”表示,表示,并放在字符串的前面。它们的含义分别是:并放在字符串的前面。它们的含义分别是: B:二进制基数符号,表示二进制数位:二进制基数符号,表示二进制数位0或或1,在字符串中每一个位表示一个,在字符串中每一个位表示一个BIT。 O:八进制基数符号,在字符串中的第一个数:八进制基数符号,在字符串中的第一个数代表一个八进制数,即代表一个代表一个八进制数,即代表一个3位位(BIT)的二进制的二进制数。数。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 X:十六进制基数符号:十六进制基数符号(0F),代表一个十六,代表一个十六进制数,即代表一个进制数,即代表一个4位的二进制数。位的二进制数。 例如:例如:B“1_1101_1110” -二进制数数组,位矢数组二进制数数组,位矢数组长度是长度是9X“AD0” -十六进制数数组,位矢数组长度十六进制数数组,位矢数组长度是是12第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 下标下标用于指示数组型变量或信号的某一元素,下标语下标用于指示数组型变量或信号的某一元素,下标语句的书写格式是:句的书写格式是:标识符标识符(下标表达式下标表达式),其中标识符就是,其中标识符就是数组型变量或信号的名称,数组型变量或信号的名称,下标表达式的值必须是数组下下标表达式的值必须是数组下标范围内的一个值,可以是可计算的(此操作数可很容易标范围内的一个值,可以是可计算的(此操作数可很容易地进行综合)地进行综合) ,也可以是不可计算的(只能在特定的情况,也可以是不可计算的(只能在特定的情况下综合,且耗费资源较大),下综合,且耗费资源较大),如:如:SIGNAL A,B,C:BIT_VECTOR(0 TO 7);SIGNAL M:INTEGER RANGE 0 TO 3;SIGNAL Y,Z :BIT;Y=A(M); -M是不可计算型下标表示是不可计算型下标表示Z=B(3); -3是可计算型下标表示是可计算型下标表示第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 .下标段名下标段名下标段名则用于指示数组型变量或信号的某一段下标段名则用于指示数组型变量或信号的某一段元素元素,其语句格式如下:,其语句格式如下:标识符标识符(表达式表达式1 TO/DOWNTO 表达式表达式2);其中标识符就是数组型变量或信号的名称,下标其中标识符就是数组型变量或信号的名称,下标表达式的值必须是数组下标范围内的一个值,必须表达式的值必须是数组下标范围内的一个值,必须是可计算的。是可计算的。TO表示数组下标序列由低到高;表示数组下标序列由低到高;DOWNTO表示数组下标序列由高到低,表示数组下标序列由高到低,符合且要求符合且要求下标段中的两个表达式值的方向必须与原数组一致。下标段中的两个表达式值的方向必须与原数组一致。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 SIGNAL b :STD_LOGIC_VECTOR(DOWNTO);SIGNAL c,e :STD_LOGIC_VECTOR(0 TO 9);SIGNAL f :STD_LOGIC_VECTOR(0 TO 7);SIGNAL q :STD_LOGIC_VECTOR(4 DOWNTO);.q= b (DOWNTO 3); c(0 TO 3)=“1011”; e(0 TO 5)=f (2 TO 7);第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 5.注释注释为了增加程序的可读性,要在程序中增加注释行,以字符-开始的文字不参加程序的编译,仅仅是对程序的说明第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 3.2.2 标识符标识符标识符用来定义常数、变量、信号、端口、子程序或标识符用来定义常数、变量、信号、端口、子程序或参数的名字。参数的名字。.有效字符:有效字符:26个大小写英文字母、数字个大小写英文字母、数字09、下、下划线划线“_”。 2. 基本标识符:基本标识符:以英文字母开头,不连续使用下划以英文字母开头,不连续使用下划线线“_”,不以下划线,不以下划线“_”结尾的字符串,标识符中结尾的字符串,标识符中的英语字母不分大小写。的英语字母不分大小写。 3. VHDL的保留字不能用于作为标识符使用。的保留字不能用于作为标识符使用。如:如:DECODER_1,FFT,Sig_N,NOT_ACK,State0,Idle是合法的标识符;而是合法的标识符;而_DECODER_1,2FFT,SIGNal,NOT,RETURN则是非法的标识符。则是非法的标识符。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 3.3 VHDL基本数据对象和数据类型基本数据对象和数据类型 VHDL是一种强类型语言,是一种强类型语言,要求设计实体中的要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,量都必须具有确定的数据类型,并且相同数据类型并且相同数据类型的量才能互相传递和作用。的量才能互相传递和作用。VHDL作为强类型语言作为强类型语言的好处是使的好处是使VHDL编译或综合工具很容易地找出设编译或综合工具很容易地找出设计中的各种常见错误。计中的各种常见错误。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 3.3. VHDL数据对象数据对象VHDL主要有类基本的数据对象:主要有类基本的数据对象:常量常量(CONSTANT)、变量、变量(VARIABLE)、信号、信号(SIGNAL)和文件。和文件。前三种数据对象是设计中常用的基本数据对象,都可以进行前三种数据对象是设计中常用的基本数据对象,都可以进行赋值,只有文件类型的数据对象不能通过赋值来更新内容,文赋值,只有文件类型的数据对象不能通过赋值来更新内容,文件可以作为参数向子程序传递,也可通过子程序对文件进行读件可以作为参数向子程序传递,也可通过子程序对文件进行读和写操作。和写操作。常量只能在说明的时候赋值,且只能赋值一次;常量只能在说明的时候赋值,且只能赋值一次;变量和信号变量和信号都可以连续赋值都可以连续赋值,常量和变量可以从传统的计算机高级语言中,常量和变量可以从传统的计算机高级语言中找到对应的数据类型,其语言行为与高级语言中的变量和常量找到对应的数据类型,其语言行为与高级语言中的变量和常量十分相似。十分相似。但信号是具有更多的硬件特征的特殊数据对象,是但信号是具有更多的硬件特征的特殊数据对象,是VHDL中最有特色的语言要素之一中最有特色的语言要素之一.第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 从设计的硬件电路系统来看,信号和变量相当从设计的硬件电路系统来看,信号和变量相当于电路系统中的门级连线或连线上的信号值。于电路系统中的门级连线或连线上的信号值。从语法、功能以及在仿真综合中的表现来看,从语法、功能以及在仿真综合中的表现来看,变量和信号有明显的区别;变量更多的体现为一种变量和信号有明显的区别;变量更多的体现为一种局部量,一种信息过渡的暂时载体,最终的信息传局部量,一种信息过渡的暂时载体,最终的信息传输以及模块界面间的通信都是由信号来完成的。信输以及模块界面间的通信都是由信号来完成的。信号更多地体现出一种全局的对象,对应更多的硬件号更多地体现出一种全局的对象,对应更多的硬件结构。结构。在许多情况下,综合后所对应的电路中信号和在许多情况下,综合后所对应的电路中信号和变量并没有很大的区别,在满足一定条件的进程中,变量并没有很大的区别,在满足一定条件的进程中,二者综合后都能引入寄存器。二者综合后都能引入寄存器。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 1. 常量常量常量的定义和设置主要是为了使设计实体中的常常量的定义和设置主要是为了使设计实体中的常数更容易阅读和修改。数更容易阅读和修改。如模块中需要多次使用某一个固定值,就可以定如模块中需要多次使用某一个固定值,就可以定义一个常数,只要修改常量定义处的值,然后重新编义一个常数,只要修改常量定义处的值,然后重新编译后就可方便地改变设计实体的硬件结构。例如,将译后就可方便地改变设计实体的硬件结构。例如,将总线的宽度定义为一个常量,只要修改这个常量就能总线的宽度定义为一个常量,只要修改这个常量就能很容易地改变总线宽度,从而改变硬件结构。很容易地改变总线宽度,从而改变硬件结构。常量在使用前必须要加以定义说明,一旦说明赋常量在使用前必须要加以定义说明,一旦说明赋值后,在程序中就不能再改变,是一个恒定不变的值,值后,在程序中就不能再改变,是一个恒定不变的值,具有全局意义。具有全局意义。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 常量的定义形式如下:常量的定义形式如下:CONSTANT 常量名:数据类型常量名:数据类型=表达式;表达式;常量名由设计者自行定义,表达式的数据类型必须和常量名由设计者自行定义,表达式的数据类型必须和定义的数据类型一致定义的数据类型一致例如:例如:CONSTANTFBUSBIT_VECTOR=“01011”;CONSTANT VCCREAL=5.0;CONSTANT DELYTIME=25ns;CONSTANT widthinteger=16;第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 常量定义语句所允许的设计单元有实体、结构体、常量定义语句所允许的设计单元有实体、结构体、程序包、块、进程和子程序。程序包、块、进程和子程序。常量的可视性(即常量的使用范围),取决于它常量的可视性(即常量的使用范围),取决于它被定义的位置:被定义的位置:在在程序包程序包中中定义的常量具有最大全局化特征,可定义的常量具有最大全局化特征,可以用在调用此程序包的所有设计实体中;以用在调用此程序包的所有设计实体中;定义在设计定义在设计实体中实体中的常量,其有效范围为这个实的常量,其有效范围为这个实体定义的所有的结构体;体定义的所有的结构体;定义在设计实体的某一定义在设计实体的某一结构体中结构体中的常量,则只能的常量,则只能用于此结构体;用于此结构体;定义在结构体的某一单元的常量,如一个定义在结构体的某一单元的常量,如一个进程中进程中,则这个常量只能用在这一进程中。则这个常量只能用在这一进程中。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 .变量变量变量是一个在程序中数值可以改变的数据对象。变量是一个在程序中数值可以改变的数据对象。1. 变量是一个局部量,只能在进程和子程序中使用;变量是一个局部量,只能在进程和子程序中使用;变量不能将信息带出对它作出定义的当前设计单元。变量不能将信息带出对它作出定义的当前设计单元。2. 变量的赋值是一种理想化的数据传输,是立即发变量的赋值是一种理想化的数据传输,是立即发生,不存在任何延时的行为。生,不存在任何延时的行为。3. 变量常用在实现某种算法的赋值语句中变量常用在实现某种算法的赋值语句中。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 定义变量的语法格式如下:定义变量的语法格式如下:VARIABLE 变量名:数据类型:变量名:数据类型:=初始值;初始值;初始值不是必需的,设定的初始值只在仿真时有初始值不是必需的,设定的初始值只在仿真时有效,在综合过程中综合器将略去所有的初始值。效,在综合过程中综合器将略去所有的初始值。VARIABLE A:INTEGER; -定义定义A为整数型为整数型变量变量VARIABLE B,C:INTEGER:=2; -定义定义B和和C为整型变量,初始值为为整型变量,初始值为2第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 在程序中,在程序中,变量数值的改变是通过变量赋值来变量数值的改变是通过变量赋值来实现的实现的,其赋值语句的语法格式如下:,其赋值语句的语法格式如下:目标变量名目标变量名:=表达式;表达式;VARIABLE a,e : REAL :=1.0 ;VARIABLE b : STD_LOGIC(0 TO 3) ;VARIABLE c : INTEGER ;e := 2.25;b := “1001” ;b(o TO 1) := (1 , 0 ) ;变量作为局部量,其适用范围仅限于定义了变变量作为局部量,其适用范围仅限于定义了变量的进程或子程序中。量的进程或子程序中。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 3. 信号信号 信号是描述硬件系统的基本数据对象,它更多信号是描述硬件系统的基本数据对象,它更多地对应于硬件结构,主要用于实体、结构体、或设地对应于硬件结构,主要用于实体、结构体、或设计实体间的信息交流,它类似于电路中的导线。计实体间的信息交流,它类似于电路中的导线。 信号的使用和定义范围是实体、结构体和程序信号的使用和定义范围是实体、结构体和程序包。在进程和子程序中不允许定义信号。包。在进程和子程序中不允许定义信号。信号作为一种数值容器,不但可以容纳当前值,信号作为一种数值容器,不但可以容纳当前值,也可以保持历史值。这一属性与触发器的记忆功能也可以保持历史值。这一属性与触发器的记忆功能有很好的对应关系。有很好的对应关系。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 信号的定义格式信号的定义格式SIGNAL 信号名:信号名: 数据类型数据类型=初始值;初始值;信号初始值的设置不是必需的,而且初始值仅在信号初始值的设置不是必需的,而且初始值仅在VHDL的行为仿真中有效。的行为仿真中有效。 SIGNAL S1:STD_LOGIG=0;SIGNAL S2,S3:BIT; SIGNAL S4:STD_LOGIC_VECTOR(15 DOWNTO 0);与变量相比,信号的硬件特征更为明显,它具有全局性与变量相比,信号的硬件特征更为明显,它具有全局性特性。例如,在程序包中定义的信号,对于所有调用此特性。例如,在程序包中定义的信号,对于所有调用此程序包的设计实体都是可见的;在实体中定义的信号,程序包的设计实体都是可见的;在实体中定义的信号,在其对应的结构体中都是可见的。在其对应的结构体中都是可见的。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 程序中对信号赋值的格式是:程序中对信号赋值的格式是:信号名信号名=表达式;表达式;SIGNAL tmp1,tmp2,tmp3 : STD_LOGIC ;.Tmp1 = tmp2 AFTER 10ns ;Tmp2 = tmp3 ;可以用可以用AFTER设置信号的延时,在综合时被忽略。设置信号的延时,在综合时被忽略。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 在同一进程中,允许对信号多次赋值,但只有最后一在同一进程中,允许对信号多次赋值,但只有最后一次赋值语句有效。次赋值语句有效。(进程外不允许对同一信号进行多(进程外不允许对同一信号进行多次赋值)次赋值)SIGNAL a,b,c,d : INTEGER ;.PROCESS(a,b)BEGINc = a*b ;d = a+b;c = a+1 ;END PROCESS.结果:结果:c = a+1 第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 LIBRARY IEEE; -IEEE库使用说明语句USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux21 IS -实体说明部分PORT(a,b : IN STD_LOGIC;s: IN STD_LOGIC;y1,y2: OUT STD_LOGIC);END ENTITY mux21;ARCHITECTURE mux21a OF mux21 IS -结构体说明部分BEGIN-PROCESS(a,b,s)-BEGINy1= a;y2= a; y2= b;y2B)的结果是布尔量的结果是布尔量TRUE,反之为,反之为FALSE。综合器将其变为。综合器将其变为1或或0信号值,对应于硬件信号值,对应于硬件系统中的一根线。系统中的一根线。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 (10)枚举类型数据类型)枚举类型数据类型枚举类型数据的书写格式为枚举类型数据的书写格式为 TYPE 数据类型名数据类型名 IS (元素,元素,元素,元素,.)这这类类数数据据应应用用广广泛泛,可可以以用用字字符符来来代代替替数数字字,简简化化了了逻逻辑辑电电路路中中状状态态的的表表示示。例例如如,描描述述一一周周每每一一天天状状态态的的逻逻辑辑电电路路时时,可以定义如下:可以定义如下: TYPE week IS (sun,mon,tue,wed,thr,fri,sat); 再比如,设某控制器的控制过程可用五个状态表示,再比如,设某控制器的控制过程可用五个状态表示,则描述该控制器时可以定义一个名为则描述该控制器时可以定义一个名为con_states的数据类型:的数据类型: TYPE con_states IS (st0,st1,st2,st4,st4,st5);第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 在结构体的在结构体的“ARCHITECTURE”与与“BEGIN”之间定之间定义此数据类型后,义此数据类型后,在该结构体中就可直接使用了,如在该结构体中就可直接使用了,如设该控制器需要用到两个名为设该控制器需要用到两个名为 current_stat和和next_stat的信号,这两个信号的数据类型为的信号,这两个信号的数据类型为con_states,则可以定义为则可以定义为 SIGNAL current_stat,next_stat:on_states; 此后在结构体中就可对此后在结构体中就可对current_stat,next_stat赋值,如描述使赋值,如描述使current_stat信号状态变为信号状态变为st4的赋值的赋值语句为语句为 current_stat=st4 ;第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 (11) 数组数组(Array)数组是将相同类型的数据集合在一起所形成的一个新的数组是将相同类型的数据集合在一起所形成的一个新的数据类型,既可以是一维的,也可以是二维的。数组定义的数据类型,既可以是一维的,也可以是二维的。数组定义的书写格式为书写格式为TYPE 数据类型名数据类型名 IS ARRAY 范围范围 OF 原数据类型;原数据类型;在在这这里里,如如果果数数据据类类型型这这一一项项没没有有被被指指定定,则则使使用用整整数数数数据据类类型型;若若需需用用整整数数类类型型外外的的其其他他数数据据类类型型,则则在在制制定定数数据范围前加数据类型名。例如有数组定义为据范围前加数据类型名。例如有数组定义为 TYPE dat_bus IS ARRAY(15 DOWNTO 0) OF BIT;第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 该数组名称为该数组名称为data_bus,共有共有16个元素,下个元素,下标分别是标分别是15、14、1、0,各元素可分别表示,各元素可分别表示为为dat_bus(15)、dat_bus(0)。 除了一维数组外,除了一维数组外,VHDL还可以定义二维、还可以定义二维、三维数组,如定义一个三维数组,如定义一个16个字节、每字节个字节、每字节8位的位的存储空间的二维数组,可以定义存储空间的二维数组,可以定义TYPE ram_16x8 IS ARRAY (0 TO 15) OF STD_LOGIC_VECTOR(7 DOWNTO 0);第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 VHDL的预定义数据类型的预定义数据类型不能用于综合的:时间及其它物理类型不能用于综合的:时间及其它物理类型错误等级类型错误等级类型存取类型存取类型文件类型文件类型第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 2. 数据类型转换数据类型转换VHDL是一种强类型语言,要求设计实体中的每一个常是一种强类型语言,要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,并且相同数据类型的量才能互相传递和作定的数据类型,并且相同数据类型的量才能互相传递和作用。用。VHDL作为强类型语言的好处是使作为强类型语言的好处是使VHDL编译或综合工编译或综合工具很容易地找出设计中的各种常见错误。具很容易地找出设计中的各种常见错误。即使对于非常接近的数据类型的数据对象,在相互操作即使对于非常接近的数据类型的数据对象,在相互操作时,也需要进行数据类型转换。时,也需要进行数据类型转换。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 ()用类型标记实现类型转换()用类型标记实现类型转换类型标记就是数据类型的名称类型标记就是数据类型的名称,只能用于关系密切的类型之间进行类型转换。如实型和整型之间。Variable a : integer ;Variable b : real ;.a := integer(b);b := real(a);第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 遵循以下规则:遵循以下规则: (1) 实数类型和整数类型相互转换时,如果实实数类型和整数类型相互转换时,如果实数转换为整数,则转换结果是最接近的一个整型数。数转换为整数,则转换结果是最接近的一个整型数。 (2)枚举型不能被转换。枚举型不能被转换。 (3)数组类型之间要采用类型标记进行转换,数组类型之间要采用类型标记进行转换,要求数组维数相同,且数组元素的数据类型也相同。要求数组维数相同,且数组元素的数据类型也相同。数组的下标范围由作为类型标记的数组类型决定,数组的下标范围由作为类型标记的数组类型决定,并与其保持一致。并与其保持一致。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 type array1 is array(o to 5) of integer;type array2 is array(o to 10) of integer;type array3 is array(positive range ) of integer;variable m_array : array1;variable n_array : array2;variable l_array : array3;m_array := array1(n_array);l_array := array3(n_array);n_array分别被转换成下标范围的数组;下标范分别被转换成下标范围的数组;下标范围没有限制,只要求是正整数的数组。围没有限制,只要求是正整数的数组。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 ()用类型转换函数实现类型()用类型转换函数实现类型VHDL中提供了一些类型转换函数,能将一种属于某种数据类型的数据对象转换成属于另一种数据类型的数据对象。STD_LOGIC_1164程序包提供的转换函数:TO_STDLOGICVECTOR(A) BIT_VECTOR STD_LOGIC_VECTORTO_BITVECTOR(A) STD_LOGIC_VECTOR BIT_VECTORTO_STDLOGIC(A) BIT STD_LOGIC TO_BIT(A) STD_LOGIC BIT 第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 STD_LOGIC_ARITH程序包提供的类型转换函数程序包提供的类型转换函数CONV_STD_LOGIC_VECTOR(A) 把整型、有符号数、无符号数类型转换成标准逻辑位把整型、有符号数、无符号数类型转换成标准逻辑位矢量类型矢量类型CONV_INTEGER(A)把有符号数、无符号数类型转换成整数类型把有符号数、无符号数类型转换成整数类型STD_LOGIC_UNSIGNED程序包提供的类型转换函数程序包提供的类型转换函数CONV_INTEGER(A)把标准逻辑位矢量类型转换成整数类型把标准逻辑位矢量类型转换成整数类型第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 3.4 VHDL表达式与运算符表达式与运算符VHDL语言中表达式与其它编程语言一样,都语言中表达式与其它编程语言一样,都是由运算符和各种运算对象连接而成的式子,其中是由运算符和各种运算对象连接而成的式子,其中运算符也称为操作符,运算对象也称为操作数。运算符也称为操作符,运算对象也称为操作数。VHDL语言中主要有类运算符:(1)逻辑运算符)逻辑运算符 (2)关系运算符)关系运算符(3)算术运算符)算术运算符 (4)并置运算符)并置运算符运算符可以通过名称、功能、操作数、操作数的类型及结果值来定义。操作数的类型必须和运算符的类型相匹配。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 1. 逻辑运算符逻辑运算符 在在IEEE库的库的STD_LOGIC_1164程序包中对逻辑程序包中对逻辑运算符进行了重新定义,运算符进行了重新定义,STD_LOGIC和和STD_LOGIC_VECTOR数据类型也可进行逻辑运算数据类型也可进行逻辑运算。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 2. 关系运算符关系运算符对矢量数据,总是自左向右按位进行比较。对矢量数据,总是自左向右按位进行比较。如如果两个数据长度不同,且较短的位矢量数据与较长果两个数据长度不同,且较短的位矢量数据与较长的数据前面部分相同,则认为较短的位矢量小于较的数据前面部分相同,则认为较短的位矢量小于较长的位矢量。长的位矢量。“1010”“0111” ; “0110”“10” ; “101”“10100” ;第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 3. 算术运算符算术运算符 并置运算符并置运算符(&)的操作数的数据类型是一维数组,的操作数的数据类型是一维数组,可以利用并置符将普通操作数或数组组合起来形成各可以利用并置符将普通操作数或数组组合起来形成各种新的数组。种新的数组。例如例如“VH”&“DL”的结果为的结果为“VHDL”;0&1的结果为的结果为“01”,连接操作常用于字,连接操作常用于字符串,要注意并置操作前后的数组长度应一致。符串,要注意并置操作前后的数组长度应一致。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 其中其中SLL是将位矢向左移,右边跟进的位补零;是将位矢向左移,右边跟进的位补零;SRL的功能恰好与的功能恰好与SLL相反;相反;ROL和和ROR的移位方的移位方式稍有不同,它们移出的位将用于依次填补移空的式稍有不同,它们移出的位将用于依次填补移空的位,执行的是自循环式移位方式;位,执行的是自循环式移位方式;SLA和和SRA是算术是算术移位操作符,其移空位用最初的首位来填补。移位操作符,其移空位用最初的首位来填补。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 4.运算符的优先级运算符的优先级第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 5. 操作符的使用说明操作符的使用说明(1) 严格遵循在基本操作符间操作数是同数据类型严格遵循在基本操作符间操作数是同数据类型的规则;严格遵循操作数的数据类型必须与操作符的规则;严格遵循操作数的数据类型必须与操作符所要求的数据类型完全一致的规则。所要求的数据类型完全一致的规则。(2) 注意操作符之间的优先级别。当一个表达式中注意操作符之间的优先级别。当一个表达式中有两个以上的算符时,可使用括号将这些运算分组。有两个以上的算符时,可使用括号将这些运算分组。(3) VHDL共有共有7种基本逻辑操作符,对于数组型种基本逻辑操作符,对于数组型(如如STD_LOGIC_VECTOR)数据对象的相互作用数据对象的相互作用是按位进行的。一般情况下,经综合器综合后,逻是按位进行的。一般情况下,经综合器综合后,逻辑操作符将直接生成门电路。信号或变量在这些操辑操作符将直接生成门电路。信号或变量在这些操作符的直接作用下,可构成组合电路。作符的直接作用下,可构成组合电路。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 (4) 关系操作符的作用是将相同数据类型的数据对关系操作符的作用是将相同数据类型的数据对象进行象进行数值比较数值比较(=、/=)或关系排序判断或关系排序判断(、 、=),并将结果以布尔类型,并将结果以布尔类型(BOOTLEAN)的数据表示出来,的数据表示出来,即即TRUE或或FALSE两种。对于数组或记录类型的操作数,两种。对于数组或记录类型的操作数,VHDL编译器将逐位比较对应位置各位数值的大小而进编译器将逐位比较对应位置各位数值的大小而进行比较或关系排序。行比较或关系排序。就综合而言,简单的比较运算就综合而言,简单的比较运算(= 和和 /=)在实现硬件在实现硬件结构时,比排序操作符构成的电路芯片资源利用率要高。结构时,比排序操作符构成的电路芯片资源利用率要高。(5) 在表在表3.2中所列的中所列的17种算术操作符可以分为求和种算术操作符可以分为求和操作符、求积操作符、符号操作符、混合操作符、移位操作符、求积操作符、符号操作符、混合操作符、移位操作符等五类操作符。操作符等五类操作符。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 求和操作符包括加减操作符和并置操作符。求和操作符包括加减操作符和并置操作符。加减加减操作符的运算规则与常规的加减法是一致的,操作符的运算规则与常规的加减法是一致的,VHDL规定它们的操作数的数据类型是整数。对于规定它们的操作数的数据类型是整数。对于大于位宽为大于位宽为4的加法器和减法器,的加法器和减法器,VHDL综合器将调综合器将调用库元件进行综合。用库元件进行综合。在综合后,由加减运算符在综合后,由加减运算符(+,-)产生的组合逻辑产生的组合逻辑门所耗费的硬件资源的规模都比较大,但当加减运门所耗费的硬件资源的规模都比较大,但当加减运算符的其中一个操作数或两个操作数都为整型常数,算符的其中一个操作数或两个操作数都为整型常数,则只需很少的电路资源。则只需很少的电路资源。并置运算符并置运算符(&)的操作数的数据类型是一维数组,的操作数的数据类型是一维数组,可以利用并置符将普通操作数或数组组合起来形成可以利用并置符将普通操作数或数组组合起来形成各种新的数组。在实际运算过程中,要注意并置操各种新的数组。在实际运算过程中,要注意并置操作前后的数组长度应一致。作前后的数组长度应一致。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 求积操作符包括求积操作符包括* (乘乘)、/(除除)、MOD(取模取模)和和REM(取取余余)四种操作符。四种操作符。VHDL规定,乘与除的数据类型是整数和实规定,乘与除的数据类型是整数和实数数(包括浮点数包括浮点数)。在一定条件下,还可对物理类型的数据对。在一定条件下,还可对物理类型的数据对象进行运算操作。象进行运算操作。 但需注意的是,虽然在一定条件下,乘法和除法运算是但需注意的是,虽然在一定条件下,乘法和除法运算是可综合的,但从优化综合、节省芯片资源的角度出发,最好可综合的,但从优化综合、节省芯片资源的角度出发,最好不要轻易使用乘除操作符。对于乘除运算可以用其他变通的不要轻易使用乘除操作符。对于乘除运算可以用其他变通的方法来实现。方法来实现。 操作符操作符MOD和和REM的本质与除法操作符是一样的,因此,的本质与除法操作符是一样的,因此,可综合的取模和取余的操作数必须是以可综合的取模和取余的操作数必须是以2为底数的幂。为底数的幂。MOD和和REM的操作数数据类型只能是整数,运算操作结果也是整的操作数数据类型只能是整数,运算操作结果也是整数。数。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 符号操作符符号操作符“+”和和“-”的操作数只有一个,的操作数只有一个,操作数的数据类型是整数,操作符操作数的数据类型是整数,操作符“+”对操作数对操作数不作任何改变,操作符不作任何改变,操作符“-”作用于操作数后的返作用于操作数后的返回值是对原操作数取负,在实际使用中,取负操作回值是对原操作数取负,在实际使用中,取负操作数需加括号。如:数需加括号。如:Z:=X*(-Y);。;。混合操作符包括乘方混合操作符包括乘方“*”操作符和取绝对值操作符和取绝对值“ABS”操作符两种。操作符两种。VHDL规定,它们的操作数规定,它们的操作数数据类型一般为整数类型。乘方数据类型一般为整数类型。乘方(*)运算的左边可运算的左边可以是整数或浮点数,但右边必须为整数,而且只有以是整数或浮点数,但右边必须为整数,而且只有在左边为浮点时,其右边才可以为负数。一般地,在左边为浮点时,其右边才可以为负数。一般地,VHDL综合器要求乘方操作符作用的操作数的底数综合器要求乘方操作符作用的操作数的底数必须是必须是2。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 六种移位操作符号六种移位操作符号SLL、SRL、SLA、SRA、ROL和和ROR都是都是VHDL93标准新增的运算符,在标准新增的运算符,在1987标准中没有。标准中没有。VHDL93标准规定移位操作符作用标准规定移位操作符作用的操作数的数据类型应是一维数组,并要求数组中的的操作数的数据类型应是一维数组,并要求数组中的元素必须是元素必须是BIT或或BOOLEAN的数据类型,移位的位的数据类型,移位的位数则是整数。数则是整数。在在EDA工具所附的程序包中重载了移位工具所附的程序包中重载了移位操作符以支持操作符以支持STD_LOGIC_VECTOR及及INTEGER等等类型。移位操作符左边可以是支持的类型,右边则必类型。移位操作符左边可以是支持的类型,右边则必定是定是INTEGER型。如果操作符右边是型。如果操作符右边是INTEGER型常型常数,移位操作符实现起来比较节省硬件资源。数,移位操作符实现起来比较节省硬件资源。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 操作符可以用以产生电路操作符可以用以产生电路。就提高综合效率而言,就提高综合效率而言,使用常量值或简单的一位数据类型能够生成较紧凑的使用常量值或简单的一位数据类型能够生成较紧凑的电路,而表达式复杂的数据类型电路,而表达式复杂的数据类型(如数组如数组)将相应地生将相应地生成更多的电路。成更多的电路。如果组合表达式的一个操作数为常数,如果组合表达式的一个操作数为常数,就能减少生成的电路;如果两个操作数都是常数,在就能减少生成的电路;如果两个操作数都是常数,在编译期间,相应的逻辑被压缩掉,或者被忽略掉,而编译期间,相应的逻辑被压缩掉,或者被忽略掉,而生成了零个门。生成了零个门。在任何可能的情况下,使用常数意味着设计描述在任何可能的情况下,使用常数意味着设计描述将不会包含不必要的函数,并将被快速的综合,产生将不会包含不必要的函数,并将被快速的综合,产生一个更有效的电路实现方案。一个更有效的电路实现方案。第第3 3章章 VHDLVHDL程序结构与要素程序结构与要素 重载操作符重载操作符 为了方便各种不同数据类型间的运算,为了方便各种不同数据类型间的运算,VHDLVHDL允许用户对原允许用户对原有的基本操作符重新定义,赋予新的含义和功能,从而建立一有的基本操作符重新定义,赋予新的含义和功能,从而建立一种新的操作符,这就是重载操作符,定义这种操作符的函数称种新的操作符,这就是重载操作符,定义这种操作符的函数称为重载函数。为重载函数。事实上,在程序包事实上,在程序包STD_LOGIC_UNSIGNEDSTD_LOGIC_UNSIGNED中已定义中已定义了多种可供不同数据类型间操作的算符重载函数。了多种可供不同数据类型间操作的算符重载函数。 SynopsysSynopsys的程序包的程序包STD_LOGIC_ARITHSTD_LOGIC_ARITH、STD_LOGIC_UNSIGNEDSTD_LOGIC_UNSIGNED和和STD_LOGIC_SIGNEDSTD_LOGIC_SIGNED中已经为许多类型的运算重载了算术运算中已经为许多类型的运算重载了算术运算符和关系运算符,因此只要引用这些程序包,符和关系运算符,因此只要引用这些程序包,SINGENDSINGEND、UNSIGENDUNSIGEND、STD_LOGIC STD_LOGIC 和和 INTEGERINTEGER之间即可混合运算;之间即可混合运算;INTEGERINTEGER、STD_LOGICSTD_LOGIC和和 STD_LOGIC_VECTORSTD_LOGIC_VECTOR之间也可以混合运算。之间也可以混合运算。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号