第8章VHDL结构8.1VHDL实体实体说明单元的一般语句结构:ENTITY实体名IS[GENERIC(类属表)][PORT(端口表)]ENDENTITY实体名;VHDL实体作为一个设计实体(独立的电路功能结构)的组成部分,其功能是对这个设计实体与外部电路进行接口描述。实体是设计实体的表层设计单元,实体说明部分规定了设计单元的输入输出接口信号或引脚,它是设计实体对外的一个通信界面。实体的具体表述和用法已在前面有过详细例解,这里不再重复。8.2结构体结构体的组成部分是:对数据类型、常数、信号、子程序和元件等元素的说明部分。描述实体逻辑行为的、以各种不同的描述风格表达的功能描述语句。以元件例化语句为特征的外部元件(设计实体)端口间的连接。1.结构体的一般语言格式ARCHITECTURE结构体名OF实体名IS[说明语句]BEGIN[功能描述语句]ENDARCHITECTURE结构体名;2.结构体说明语句对结构体的功能描述语句中将要用到的信号、数据类型、常数、元件、函数和过程等加以说明。在一个结构体中说明和定义的数据类型、常数、元件、函数和过程只能用于这个结构体中。如果希望这些定义也能用于其他的实体或结构中,需要将其作为程序包来处理。3.功能描述语句结构进程语句:定义顺序语句模块。信号赋值语句:将处理的结果向信号或端口赋值。子程序调用语句:调用过程或函数,并将结果赋值于信号。元件例化语句:对其他的设计实体作元件调用声明。1
1 第 8 章 VHDL 结构 8.1 VHDL 实体 实体说明单元的一般语句结构: ENTITY 实体名 IS [GENERIC ( 类属表 );] [PORT ( 端口表 );] END ENTITY 实体名; VHDL 实体作为一个设计实体(独立的电路功能结构)的组成部分,其功能 是对这个设计实体与外部电路进行接口描述。实体是设计实体的表层设计单元, 实体说明部分规定了设计单元的输入输出接口信号或引脚,它是设计实体对外的 一个通信界面。实体的具体表述和用法已在前面有过详细例解,这里不再重复。 8.2 结构体 结构体的组成部分是: 对数据类型、常数、信号、子程序和元件等元素的说明部分。 描述实体逻辑行为的、以各种不同的描述风格表达的功能描述语句。 以元件例化语句为特征的外部元件(设计实体)端口间的连接。 1. 结构体的一般语言格式 ARCHITECTURE 结构体名 OF 实体名 IS [说明语句] BEGIN [功能描述语句] END ARCHITECTURE 结构体名; 2. 结构体说明语句 对结构体的功能描述语句中将要用到的信号、数据类型、常数、元件、函数 和过程等加以说明。 在一个结构体中说明和定义的数据类型、常数、元件、函数和过程只能用于 这个结构体中。 如果希望这些定义也能用于其他的实体或结构中,需要将其作为程序包来处 理。 3. 功能描述语句结构 进程语句:定义顺序语句模块。 信号赋值语句:将处理的结果向信号或端口赋值。 子程序调用语句:调用过程或函数,并将结果赋值于信号。 元件例化语句:对其他的设计实体作元件调用声明
8.3VHDL子程序(SUBPROGRAM)子程序是一个VHDL程序模块,利用顺序语句来定义和完成算法。子程序不能向进程那样可以从本结构体的并行语句或进程结构中直接读取信号值,或者向信号赋值。子程序可以在程序包、结构体和进程中定义。只有在程序包中定义的子程序可以被其他不同的设计所调用。子程序调用的目的是更有效地完成重复性的工作。综合后将映射于目标芯片中的一个相应的电路模块。子程序有两种类型:过程和函数。8.3.1VHDL函数(FUNCTION)函数的语言表达格式如下:--函数首数据类型FUNCTION函数名(参数表)RETURN函数体FUNCTION函数名(参数表)RETURN数据类型IS「说明部分1BEGIN顺序语句;ENDFUNCTION函数名:在进程和结构体中不必定义函数首,而在程序包中必须定义函数首。【例8-1]LIBRARYIEEE:USEIEEE.STDLOGIC1164.ALL:PACKAGEpackexpIS--定义程序包FUNCTION max(a,b : IN STD LOGIC VECTOR)-定义函数首RETURN STD LOGIC VECTOR;FUNCTION func1 (a,b,c : REAL)--定义函数首RETURNREAL;FUNCTION"*"(a,b:INTEGER)--定义函数首RETURNINTEGERFUNCTION as2 (SIGNAL inl,in2:REAL)-定义函数首RETURNREAL;END;PACKAGEEBODYpackexpISFUNCTION max(a,b : IN STD LOGIC_VECTOR)-定义函数体RETURNSTDLOGICVECTORISBEGINIFa>b THENRETURN a,ELSERETURN b;END IF:2
2 8.3 VHDL 子程序(SUBPROGRAM) 子程序是一个 VHDL 程序模块,利用顺序语句来定义和完 成算法。 子程序不能向进程那样可以从本结构体的并行语句或进程结构中直接读取 信号值,或者向信号赋值。 子程序可以在程序包、结构体和进程中定义。只有在程序包中定义的子程序 可以被其他不同的设计所调用。 子程序调用的目的是更有效地完成重复性的工作。综合后将映射于目标芯片 中的一个相应的电路模块。 子程序有两种类型:过程和函数。 8.3.1 VHDL 函数(FUNCTION) 函数的语言表达格式如下: -函数首 FUNCTION 函数名(参数表) RETURN 数据类型 - 函数体 FUNCTION 函数名(参数表)RETURN 数据类型 IS [ 说明部分 ] BEGIN 顺序语句 ; END FUNCTION 函数名; 在进程和结构体中不必定义函数首,而在程序包中必须定义函数首。 【例 8-1】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; PACKAGE packexp IS -定义程序包 FUNCTION max( a,b : IN STD_LOGIC_VECTOR) -定义函数首 RETURN STD_LOGIC_VECTOR ; FUNCTION func1 ( a,b,c : REAL ) -定义函数首 RETURN REAL ; FUNCTION "*" ( a ,b : INTEGER ) -定义函数首 RETURN INTEGER ; FUNCTION as2 (SIGNAL in1 ,in2 : REAL ) -定义函数首 RETURN REAL ; END ; PACKAGE BODY packexp IS FUNCTION max( a,b : IN STD_LOGIC_VECTOR) -定义函数体 RETURN STD_LOGIC_VECTOR IS BEGIN IF a > b THEN RETURN a; ELSE RETURN b; END IF;
ENDFUNCTIONmax;--结束FUNCTION语句END,--结束PACKAGEBODY语句LIBRARYIEEE:-函数应用实例USE IEEE.STD LOGIC 1164.ALL;USE WORK.packexp.ALL;ENTITY axamp ISPORT(dat1,dat2 :IN STD_LOGIC_VECTOR(3DOWNTO0);dat3,dat4 : IN STD LOGIC_VECTOR(3 DOWNTO 0);out1,out2:OUT STD LOGIC_VECTOR(3DOWNTO0));END;ARCHITECTURE bhv OF axamp ISBEGINoutl<=max(dat1,dat2);--用在赋值语句中的并行函数调用语句PROCESS(dat3,dat4)BEGINout2 <= max(dat3,dat4);--顺序函数调用语句ENDPROCESS:END;[3:0][3:0][dat4[3.0]3:0)[3:0][dat3[3.0]max.out2out213:0out2[3:0][3:0][3:0]dat2[3:0][3:0][3:0]dat1[3:0]:max.out1out1[3:0]图8-1例8-1的逻辑电路图【例8-2】LIBRARYIEEEUSE IEEE.STD LOGIC_1164.ALL;ENTITY func ISPORT(a:IN STD LOGIC_VECTOR (Oto2);m:OUTSTDLOGICVECTOR(Oto2)):ENDENTITYfuncARCHITECTURE demo OF func IS3
3 END FUNCTION max; -结束 FUNCTION 语句 END; -结束 PACKAGE BODY 语句 LIBRARY IEEE; - 函数应用实例 USE IEEE.STD_LOGIC_1164.ALL; USE WORK.packexp.ALL ; ENTITY axamp IS PORT(dat1,dat2 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); dat3,dat4 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); out1,out2 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END; ARCHITECTURE bhv OF axamp IS BEGIN out1 <= max(dat1,dat2); -用在赋值语句中的并行函数调用语句 PROCESS(dat3,dat4) BEGIN out2 <= max(dat3,dat4); -顺序函数调用语句 END PROCESS; END; 图 8-1 例 8-1 的逻辑电路图 【例 8-2】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY func IS PORT ( a : IN STD_LOGIC_VECTOR (0 to 2 ) ; m : OUT STD_LOGIC_VECTOR (0 to 2 ) ); END ENTITY func ; ARCHITECTURE demo OF func IS
FUNCTIONsam(xy,z:STDLOGIC)RETURNSTDLOGICISBEGINRETURN(xANDy)OR z;END FUNCTION sam ;BEGINPROCESS(a)BEGINm(0)= sam(a(0), a(1), a(2));m(1)= sam(a(2), a(0), a(1));m(2)= sam(a(1),a(2),a(0) );END PROCESS ;ENDARCHITECTURE demo;结构体内定义了完成某种算法的函数,进程中调用了此函数,该函数没有函数首。8.3.2重载函数(OVERLOADEDFUNCTION)允许以相同的函数名定义函数,但要求函数中定义的操作数具有不同的数据类型,以便调用时用以分辨不同功能的同名函数,即同样名称的函数可以用不同的数据类型作为此函数的参数定义多次,以此定义的函数称为重载函数。【例8-3]LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEpackexpIS--定义程序包FUNCTIONmax(a,b : IN STD_LOGIC_VECTOR)--定义函数首RETURNSTDLOGICVECTORFUNCTION max(a,b : IN BIT_VECTOR)--定义函数首RETURNBITVECTOR:FUNCTION max(a,b :ININTEGER)-定义函数首RETURNINTEGER ;END;PACKAGEBODYpackexpISFUNCTIONmax(a,b : IN STD_LOGIC_VECTOR)---定义函数体RETURNSTDLOGICVECTORISBEGINIFa>bTHENRETURNa.ELSERETURN b;END IF:--结束FUNCTION语句ENDFUNCTION max;FUNCTION max(a,b : ININTEGER)--定义函数体RETURNINTEGER ISBEGINIF a>b THEN RETURNa,ELSERETURNb;END IF;4
4 FUNCTION sam(x ,y ,z : STD_LOGIC) RETURN STD_LOGIC IS BEGIN RETURN ( x AND y ) OR z ; END FUNCTION sam ; BEGIN PROCESS ( a ) BEGIN m(0) = sam( a(0), a(1), a(2) ) ; m(1) = sam( a(2), a(0), a(1) ) ; m(2) = sam( a(1), a(2), a(0) ) ; END PROCESS ; END ARCHITECTURE demo ; 结构体内定义了完成某种算法的函数,进程中调用了此函数,该函数没有函 数首。 8.3.2 重载函数(OVERLOADED FUNCTION) 允许以相同的函数名定义函数,但要求函数中定义的操作数具有不同的数据 类型,以便调用时用以分辨不同功能的同名函数,即同样名称的函数可以用不同 的数据类型作为此函数的参数定义多次,以此定义的函数称为重载函数。 【例 8-3】 LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; PACKAGE packexp IS -定义程序包 FUNCTION max( a,b :IN STD_LOGIC_VECTOR) -定义函数首 RETURN STD_LOGIC_VECTOR ; FUNCTION max( a,b :IN BIT_VECTOR) -定义函数首 RETURN BIT_VECTOR ; FUNCTION max( a,b :IN INTEGER ) -定义函数首 RETURN INTEGER ; END; PACKAGE BODY packexp IS FUNCTION max( a,b :IN STD_LOGIC_VECTOR) -定义函数体 RETURN STD_LOGIC_VECTOR IS BEGIN IF a > b THEN RETURN a; ELSE RETURN b; END IF; END FUNCTION max; -结束 FUNCTION 语句 FUNCTION max( a,b :IN INTEGER) -定义函数体 RETURN INTEGER IS BEGIN IF a > b THEN RETURN a; ELSE RETURN b; END IF;
--结束FUNCTION语句ENDFUNCTIONmax;FUNCTION max(a,b : IN BIT_VECTOR)-定义函数体RETURNBIT VECTORISBEGINIFa>b THENRETURN a,ELSERETURN b;END IF:ENDFUNCTION max;--结束FUNCTION语句--结束PACKAGEBODY语句END;以下是调用重载函数max的程序:LIBRARY IEEE;USEIEEE.STD LOGIC_1164.ALL;USEWORK.packexp.ALL;ENTITY axampISPORT(a1,bl :IN STD LOGIC VECTOR(3DOWNTOO):a2,b2 :IN BIT_VECTOR(4DOWNTO0);a3,b3:ININTEGERRANGE0TO15cI:OUTSTDLOGIC VECTOR(3DOWNTOO);c2 : OUT BIT_VECTOR(4 DOWNTO 0);c3:OUTINTEGERRANGE0TO15);END;ARCHITECTURE bhv OF axamp ISBEGINcl<=max(al,bI);--对函数max(a,b:INSTD_LOGIC_VECTOR)的调用c2<=max(a2,b2);--对函数max(a,b :INBIT_VECTOR)的调用c3<=max(a3,b3);--对函数max(a,b :ININTEGER)的调用END,例8-4是程序包useIEEE.stdlogicUNSIGNED中的部分函数结构,说明部分只列出了4个函数的函数首,在程序包体部分只列出了对应的部分内容,程序包体部分的UNSIGNED()函数是从USEIEEE.stdlogic_arith库中调用的。在程序包体中的最大整型数检出函数maximum函数只有函数体,没有函数首,因为它只在程序包中调用。【例8-4】-程序包首LIBRARYIEEE;USE IEEE.std logic_1164.all ;USE IEEE.std logic_arith.all ;PACKAGESTDLOGIC_UNSIGNEDisfunction"+" (L: STD_LOGIC_VECTOR;R:INTEGER)returnSTDLOGIC_VECTOR;function"+"(L:INTEGER;R:STD LOGIC VECTOR)returnSTDLOGICVECTOR;function"+"(L:STD LOGIC_VECTOR;R:STD LOGIC)return STD_LOGIC_VECTOR ;function SHR(ARG : STD LOGIC VECTOR :5
5 END FUNCTION max; -结束 FUNCTION 语句 FUNCTION max( a,b :IN BIT_VECTOR) -定义函数体 RETURN BIT_VECTOR IS BEGIN IF a > b THEN RETURN a; ELSE RETURN b; END IF; END FUNCTION max; -结束 FUNCTION 语句 END; -结束 PACKAGE BODY 语句 - 以下是调用重载函数 max 的程序: LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; USE WORK.packexp.ALL; ENTITY axamp IS PORT(a1,b1 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); a2,b2 : IN BIT_VECTOR(4 DOWNTO 0); a3,b3 : IN INTEGER RANGE 0 TO 15; c1 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); c2 : OUT BIT_VECTOR(4 DOWNTO 0); c3 : OUT INTEGER RANGE 0 TO 15); END; ARCHITECTURE bhv OF axamp IS BEGIN c1 <= max(a1,b1); -对函数 max( a,b :IN STD_LOGIC_VECTOR)的调用 c2 <= max(a2,b2); -对函数 max( a,b :IN BIT_VECTOR) 的调用 c3 <= max(a3,b3); -对函数 max( a,b :IN INTEGER) 的调用 END; 例 8-4 是程序包 use IEEE.std_logic_UNSIGNED 中的部分函数结构,说明部 分只列出了 4 个函数的函数首,在程序包体部分只列出了对应的部分内容,程序 包体部分的 UNSIGNED()函数是从 USE IEEE.std_logic_arith 库中调用的。在 程序包体中的最大整型数检出函数 maximum 函数只有函数体,没有函数首,因 为它只在程序包中调用。 【例 8-4】 LIBRARY IEEE ; - 程序包首 USE IEEE.std_logic_1164.all ; USE IEEE.std_logic_arith.all ; PACKAGE STD_LOGIC_UNSIGNED is function "+" (L : STD_LOGIC_VECTOR ; R : INTEGER) return STD_LOGIC_VECTOR ; function "+" (L : INTEGER; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR ; function "+" (L : STD_LOGIC_VECTOR ; R : STD_LOGIC ) return STD_LOGIC_VECTOR ; function SHR (ARG : STD_LOGIC_VECTOR ;