中国高校课件下载中心 》 教学资源 》 大学文库

《EDA技术》课程授课教案(讲稿)第8章 VHDL结构

文档信息
资源类别:文库
文档格式:PDF
文档页数:24
文件大小:229.26KB
团购合买:点击进入团购
内容简介
《EDA技术》课程授课教案(讲稿)第8章 VHDL结构
刷新页面文档预览

第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 ;

COUNT:STD LOGIC_VECTOR)return STD LOGIC_VECTOR;endSTDLOGIC UNSIGNEDLIBRARYIEEE;程序包体use IEEE.std _logic_1164.all ;use IEEE.std_ logic_arith.all ;packagebodySTDLOGIC_UNSIGNEDisfunction maximum (L, R:INTEGER) returnINTEGERisbeginifLR then return L;elsereturn R;end if,end;function"+"(L:STD LOGIC VECTOR;R:INTEGER)returnSTD_LOGIC_VECTORisVariable result : STD_LOGIC_VECTOR (L'range);Beginresult :=UNSIGNED(L) +R ;return std_ logic_vector(result) ;end ;endSTDLOGIC_UNSIGNED ;8.3.3VHDL转换函数表8-1IEEE库类型转换函数表功能函数名程序包:STD_LOGIC_1164to_stdlogicvector(A)由bit_vector类型的A转换为std_logic_vectorto_bitvector(A)由std_logic_vector转换为bit_vector由bit转换成std_logicto_stdlogic (A)to_bit(A)由std_logic转换成bit程序包:STDLOGIC_ARITH将整数integer转换成stdlogic_vector类型,A是convstdlogic_vector(A,位长)将stdlogic_vector转换成整数integerconv_integer(A)程序包:STDLOGICUNSIGNED由std_logic_vector转换成integerconv_integer(A)6

6 COUNT : STD_LOGIC_VECTOR ) return STD_LOGIC_VECTOR ; . end STD_LOGIC_UNSIGNED ; LIBRARY IEEE ; - 程序包体 use IEEE.std_logic_1164.all ; use IEEE.std_logic_arith.all ; package body STD_LOGIC_UNSIGNED is function maximum (L, R : INTEGER) return INTEGER is begin if L R then return L; else return R; end if; end; function "+" (L : STD_LOGIC_VECTOR ; R : INTEGER) return STD_LOGIC_VECTOR is Variable result : STD_LOGIC_VECTOR (L’range) ; Begin result := UNSIGNED(L) + R ; return std_logic_vector(result) ; end ; . end STD_LOGIC_UNSIGNED ; 8.3.3 VHDL 转换函数 表 8-1 IEEE 库类型转换函数表 函数名 功能 程序包: STD_LOGIC_1164 to_stdlogicvector(A) 由 bit_vector 类型的 A 转换为 std_logic_vector to_bitvector(A) 由 std_logic _vector 转换为 bit_vector to_stdlogic (A) 由 bit 转换成 std_logic to_bit(A) 由 std_logic 转换成 bit 程序包: STD_LOGIC_ARITH conv_std_logic_vector(A, 位长) 将整数 integer 转换成 std_logic_vector 类型,A 是 整数 conv_integer(A) 将 std_logic_vector 转换成整数 integer 程序包: STD_LOGIC_UNSIGNED conv_integer(A) 由 std_logic_vector 转换成 integer

【例8-5】LIBRARY IEEE:USE IEEE. std_logic_1164.ALL;ENTITY exg ISPORT (a,b : in bit_vector(3 downto O),: out std_logic_vector(3 downto 0);qend ;architecture rtl of exg isbeginq<=to_stdlogicvector(a andb);--将位失量数据类型转换成标准逻辑位矢量数据end;【例8-6]LIBRARYIEEE:USEIEEE.STD LOGIC 1164.ALL:USEIEEE.STD_LOGIC_ARITH.ALL;--注意使用了此程序包ENTITYaxamp ISPORT(a,b,c : IN integer range O to 15 ;:OUTstd_logic_vector(3downto0));qEND;ARCHITECTURE bhv OF axampISBEGINq<=conv_std_logic_vector(a,4)whenconv_integer(c)=8 elseconv_std_logic_vector(b,4);END;8.3.4VHDL过程过程首PROCEDURE过程名(参数表)PROCEDURE过程名(参数表)IS[说明部分]BIGIN过程体顺序语句;ENDPROCEDURE过程名PROCEDUREprol(VARIABLE a,b:INOUTREAL):PROCEDUREEpro2(CONSTANTal:ININTEGER;b1OUTVARIABLEINTEGER);PROCEDUREpro3(SIGNAL sig:INOUTBIT);7

7 【例 8-5】 LIBRARY IEEE; USE IEEE. std_logic_1164.ALL; ENTITY exg IS PORT (a,b : in bit_vector(3 downto 0); q : out std_logic_vector(3 downto 0)); end ; architecture rtl of exg is begin q<= to_stdlogicvector(a and b);-将位矢量数据类型转换成标准逻辑位矢量数据 end; 【例 8-6】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;-注意使用了此程序包 ENTITY axamp IS PORT(a,b,c : IN integer range 0 to 15 ; q : OUT std_logic_vector(3 downto 0) ); END; ARCHITECTURE bhv OF axamp IS BEGIN q <= conv_std_logic_vector(a,4) when conv_integer(c)=8 else conv_std_logic_vector(b,4) ; END; 8.3.4 VHDL 过程 PROCEDURE 过程名(参数表) - 过程首 PROCEDURE 过程名(参数表) IS [说明部分] BIGIN - 过程体 顺序语句; END PROCEDURE 过程名 PROCEDURE pro1 (VARIABLE a, b : INOUT REAL) ; PROCEDURE pro2 (CONSTANT a1 : IN INTEGER ; VARIABLE b1 : OUT INTEGER ) ; PROCEDURE pro3 (SIGNAL sig : INOUT BIT) ;

【例8-8】PROCEDUREEprg1(VARIABLEvalue:INOUTBIT_VECTOR(OTO7)ISBEGINCASE value ISWHEN"0000"=>value:"0101";WHEN"0101"=>value:"0000";WHENOTHERS=>value:"1III":ENDCASE:ENDPROCEDUREprgl ;【例8-9]PROCEDUREcomp(a,r:INREAL:m:ININTEGER:v1, v2: OUT REAL)ISVARIABLEcnt :INTEGER;BEGINvl :=1.6*a;赋初始值v2 := 1.0;赋初始值Ql: FOR cnt INLOOP1TOmv2 := v2 * vl ;EXITQIWHENv2>vl;--当v2>v1,跳出循环LOOPENDLOOPQIASSERT (v2<v1)REPORT"OUTOFRANGE"输出错误报告SEVERITY ERROR;END PROCEDUREcomp【例8-10】LIBRARYIEEE:USEIEEE.STD LOGIC1164.ALL:PACKAGE axamp IS--过程首定义PROCEDURE nand4a (SIGNAL a,b,c,d:IN STD LOGIC;SIGNAL y:OUT STD_LOGIC),END axamp,--过程体定PACKAGEBODYaxampIS义PROCEDUREnand4a(SIGNALa,b,c,d:INSTDLOGIC;SIGNALy:OUT STD LOGIC)ISBEGINy<= NOT(a AND b AND c AND d);RETURN;8

8 【例 8-8】 PROCEDURE prg1(VARIABLE value:INOUT BIT_VECTOR(0 TO 7)) IS BEGIN CASE value IS WHEN "0000" => value: "0101" ; WHEN "0101" => value: "0000" ; WHEN OTHERS => value: "1111" ; END CASE ; END PROCEDURE prg1 ; 【例 8-9】 PROCEDURE comp ( a, r : IN REAL; m : IN INTEGER ; v1, v2: OUT REAL) IS VARIABLE cnt : INTEGER ; BEGIN v1 := 1.6 * a ; - 赋初始值 v2 := 1.0 ; - 赋初始值 Q1 : FOR cnt IN 1 TO m LOOP v2 := v2 * v1 ; EXIT Q1 WHEN v2 > v1; - 当 v2 > v1,跳出循环 LOOP END LOOP Q1 ASSERT (v2 < v1 ) REPORT "OUT OF RANGE" - 输出错误报告 SEVERITY ERROR ; END PROCEDURE comp ; 【例 8-10】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; PACKAGE axamp IS -过程首定义 PROCEDURE nand4a (SIGNAL a,b,c,d : IN STD_LOGIC ; SIGNAL y : OUT STD_LOGIC ); END axamp; PACKAGE BODY axamp IS -过程体定 义 PROCEDURE nand4a (SIGNAL a,b,c,d : IN STD_LOGIC ; SIGNAL y : OUT STD_LOGIC ) IS BEGIN y<= NOT(a AND b AND c AND d); RETURN;

END nand4a;ENDaxamp;--主程序LIBRARYIEEE:USEIEEE.STDLOGIC1164.ALL:USE WORK.axamp.ALL;ENTITY EX ISPORT( e,f,g,h : IN STD_LOGIC ;X:OUT STD_LOGIC);END,ARCHITECTUREbhv OFEXISBEGIN并行调用过程nand4a(e,f,g,h,x) ;END,8.3.5VHDL重载过程【例8-11】PROCEDUREcalcu(vl,v2:INREAL;SIGNALout1:INOUTINTEGER);PROCEDUREcalcu(v1,v2:ININTEGER:SIGNAL out1 :INOUT REAL);calcu (20.15, 1.42, signl) ;调用第一个重载过程calcucalcu(23,320, sign2);--调用第二个重载过程calcu8.3.6子程序调用语句1.过程调用过程名[([形参名=>]实参表达式【,[形参名=>]实参表达式})];(1)将IN和INOUT模式的实参值赋给欲调用的过程中与它们对应的形参;(2)执行这个过程;(3)将过程中IN和INOUT模式的形参值返回给对应的实参。【例8-12】PACKAGEdatatypesIS定义程序包SUBTYPEdata_elementISINTEGERRANGE0TO3-定义数据类型TYPE data_array IS ARRAY (1 TO 3)OF data_element;ENDdata_types;USEWORK.data_types.ALL;--打开以上建立在当前工作库的程序包data_typesENTITY sortISPORT(in_array : IN data_array ;out_array : OUT data_array);END sort;9

9 END nand4a; END axamp; LIBRARY IEEE; -主程序 USE IEEE.STD_LOGIC_1164.ALL; USE WORK.axamp.ALL; ENTITY EX IS PORT( e,f,g,h : IN STD_LOGIC ; x : OUT STD_LOGIC ); END; ARCHITECTURE bhv OF EX IS BEGIN nand4a(e,f,g,h,x) ; 并行调用过程 END; 8.3.5 VHDL 重载过程 【例 8-11】 PROCEDURE calcu ( v1, v2 : IN REAL ; SIGNAL out1 : INOUT INTEGER) ; PROCEDURE calcu ( v1, v2 : IN INTEGER ; SIGNAL out1 : INOUT REAL) ; . calcu (20.15, 1.42, signl) ; - 调用第一个重载过程 calcu calcu (23, 320,sign2 ) ; - 调用第二个重载过程 calcu . 8.3.6 子程序调用语句 1. 过程调用 过程名[([形参名=> ]实参表达式 { ,[形参名=> ]实参表达式}) ]; (1) 将 IN 和 INOUT 模式的实参值赋给欲调用的过程中与它们对应的形参; (2) 执行这个过程; (3) 将过程中 IN 和 INOUT 模式的形参值返回给对应的实参。 【例 8-12】 PACKAGE data_types IS - 定义程序包 SUBTYPE data_element IS INTEGER RANGE 0 TO 3 ;- 定义数据类型 TYPE data_array IS ARRAY (1 TO 3) OF data_element; END data_types; USE WORK.data_types.ALL; -打开以上建立在当前工作库的程序包 data_types ENTITY sort IS PORT ( in_array : IN data_array ; out_array : OUT data_array); END sort;

ARCHITECTURE exmp OF sort ISBEGINPROCESS (in_array)-进程开始,设datatypes为敏感信号PROCEDUREswap(data:INOUTdata_array,--swap的形参名为data、low、highlow, high :ININTEGER)ISVARIABLEtemp :data_element ;BEGIN开始描述本过程的逻辑功能IF (data(low) > data(high) THEN检测数据temp := data(low) ;data(low) := data(high);data(high) := temp ;ENDIF ;END swap ;-过程swap定义结束--在本进程中定义变量my_arrayVARIABLE my_array :data_array;BEGIN进程开始将输入值读入变量my_array :=in_array ;swap(my_array,1,2),--my_array、1、2是对应于data、low、high的实参--位置关联法调用,第2、第3元swap(my_array, 2, 3);素交换-位置关联法调用,第1、第2元swap(my_array, 1,2);素再次交换out_arrayyTHEN tmp:=x, x:=y,y := tmp;END IF;END sort2;BEGIN10

10 ARCHITECTURE exmp OF sort IS BEGIN PROCESS (in_array) - 进程开始,设 data_types 为敏 感信号 PROCEDURE swap(data : INOUT data_array; - swap 的形参名为 data、 low、high low, high : IN INTEGER ) IS VARIABLE temp : data_element ; BEGIN - 开始描述本过程的逻 辑功能 IF (data(low) > data(high)) THEN - 检测数据 temp := data(low) ; data(low) := data(high); data(high) := temp ; END IF ; END swap ; - 过程 swap 定义结束 VARIABLE my_array : data_array ; - 在本进程中定义变量 my_array BEGIN - 进程开始 my_array := in_array ; - 将输入值读入变量 swap(my_array, 1, 2); - my_array、1、2 是对应于 data、low、high 的实参 swap(my_array, 2, 3); - 位置关联法调用, 第 2、第 3 元 素交换 swap(my_array, 1, 2); - 位置关联法调用, 第 1、第 2 元 素再次交换 out_array y THEN tmp := x; x := y; y := tmp; END IF; END sort2; BEGIN

共24页,试读已结束,阅读完整版请下载
刷新页面下载完整文档
VIP每日下载上限内不扣除下载券和下载次数;
按次数下载不扣除下载券;
注册用户24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
相关文档