子程序及描述风格.ppt
3.6 子程序,子程序由一组顺序语句组成,是为了在程序中重复使用而设立的。在结构体中定义的子程序对于该结构体来说是局部的,即不能被其它设计层次的结构体调用。如果要在其它结构体中调用同一个子程序,就需要把子程序定义到程序包中。,VHDL中的子程序有两类:过程(PROCEDURE):过程通过其接口返回0个或多个值。函数(FUNCTION):函数直接返回单个值。子程序包含两部分:即子程序声明和主体部分。在程序包中声明子程序时,子程序声明必须要在程序包首中,子程序主体必须要在程序包体中。,一、函数的定义与引用,函数语句的作用是输入若干参数,通过函数运算求值,最后返回一个值。函数语句的格式为:FUNCTION 函数名(参数表)RETURN 数据类型;-函数首FUNCTION 函数名(参数表)RETURN 数据类型 IS-函数体 子程序声明部分;BEGIN 顺序语句;END 函数名;,函数首是程序包与函数的接口界面。如果要将一个函数组织成程序包入库,则必须定义函数首,且函数首应放在程序包的说明部分,而函数体应放在程序包的包体内。如果只在一个结构体中定义并调用函数,则只需定义函数体即可。参数表中为参数名、参数类别及数据类型,函数的参数为信号或常数,默认情况为常数;在RETURN后面的数据类型为函数返回值的类型;子程序声明项用来说明函数体内引用的对象和过程;顺序语句就是函数体,用来定义函数的功能。,LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYfunISPORT(A:IN std_logic _Vector(0 TO 2);M:OUT std_logic _Vector(0 TO 2);ENDfun;ARCHITECTURE art OF fun IS FUNCTION sam(X,Y,Z:BIT)RETURN BIT IS BEGIN RETURN(X AND Y)OR Z;END 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;END art;,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;END FUNCTION max;-结束FUNCTION语句END;-结束PACKAGE BODY语句,LIBRARY IEEE;-函数应用实例USE IEEE.STD_LOGIC_1164.ALL;USE;ENTITY axamp ISPORT(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 ISBEGINout1=max(dat1,dat2);-用在赋值语句中的并行函数调用语句PROCESS(dat3,dat4)BEGINout2=max(dat3,dat4);-顺序函数调用语句END PROCESS;END;,二、过程的定义与引用,过程的作用是传递信息,即通过参数进行内外的信息传递。其中参数需说明(信号、变量及常量)类别、类型及传递方向。过程定义的格式为:PROCEDURE 过程名(参数声明)IS子程序声明部分;BEGIN顺序语句;END PROCEDURE 过程名;其中:参数声明指明了输入、输出端口的数目和类型。参数声明的语法格式为:参数名:方式方式参数类型有inoutinoutbuffer 等四种。,在PROCEDURE结构中,参数可以是输入也可以是输出。在没有特别指定的情况下,“IN”作为常数;而“OUT”和“INOUT”则看作“变量”进行拷贝。在过程语句执行结束后,如没有特别说明,输出和输入输出参数将按变量对待将值传递给调用者的变量。如果调用者需要输出和输入输出作为信号使用,则在过程参数定义时要指明是信号。例如:PROCEDURE shift(din:IN STD_LOGIC_VECTOR;SIGNAL dou:OUT STD_LOGIC_VECTOR;q:INOUT INTEGER)IS BEGIN.END shift;,LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYfun ISPORT(A:IN std_logic _Vector(0 TO 2);M:OUT std_logic _Vector(0 TO 2);ENDfun;ARCHITECTURE art1 OF fun IS PROCEDURE sam1(X,Y,Z:IN BIT;N:OUT BIT)IS BEGIN N:=(X AND Y)OR Z;END sam1;,过程应用实例,BEGINsam1(A(0),A(1),A(2),N(0);sam1(A(2),A(0),A(1),N(1);sam1(A(1),A(2),A(0),N(2);M(0)=N(0);-等效于:M=N(2),在PROCEDURE结构中,参数可以是输入也可以是输出。而FUNCTION语句中括号内的所有参数都是输入参数或输入信号,因此在括号内指明端口方向的“IN”可以省略。FUNCTION的输入值由调用者拷贝到输入参数中,如果没有特别指定,在FUNCTION语句中按常数处理。通常各种功能的FUNCTION语句的程序都被集中在包集合(Package)中。,3.7 VHDL的描述风格,行为描述方式 数据流描述方式(RTL描述方式)结构化描述方式,VHDL语言是通过结构体具体描述整个设计实体的逻辑功能。,通常结构体有四种不同的描述方式:,VHDL通过这四种不同的描述方式从不同的侧面描述结构体的功能。前三种是最基本的描述方式,他们组合起来就成为混合描述方式。,行为描述方式(behavior)数据流描述方式(dataflow)或寄存器RTL描述方式 结构化描述方式(structural)混合描述方式。,全加器的输入输出关系,全加器框图,下面结合一个全加器来说明这四种描述风格,全加器的端口示意图如图所示,其输入输出关系如表所示。,一、行为描述方式,行为描述输入与输出间转换的行为,不需包含任何结构信息,它对设计实体按算法的路径来描述。,行为级描述,也称为算法级描述,它不是对某一个器件的描述,而是对整个设计单元的数学模型描述,所以属于一种高层次描述方式。,例:基于全加器真值表采用行为描述方式设计的全加器(1位二进制数全加),LIBRARY IEEE;ENTITY full_adder IS GENERIC(tpd:TIME:=10 ns);PORT(x,y,c_in:IN STD_LOGIC;Sum,c_out:OUT STD_LOGIC);END full_adder;,ARCHITECTURE behav OF full_adder ISBEGIN PROCESS(x,y,c_in)VARIABLE n:INTEGER;CONSTANT sum_vector:STD_LOGIC_VECTOR(0 TO 3):=“0101”;CONSTANT carry_vector:STD_LOGIC_VECTOR(0 TO 3):=“0011”;,BEGIN n:=0;IF x=1 THEN n:=n+1;END IF;,IF y=1 THEN n:=n+1;END IF;IF c_in=1 THEN n:=n+1;END IF;sum=sum_vector(n)AFTER 2*tpd;c_out=carry_vector(n)AFTER 3*tpd;END PROCESS;END behav;,对照真值表解释程序,(0 TO 3),sum_vector初值为“0101”,carry_vector初值为“0011”,(0 TO 3),输入 输出c_in x y c_out sum 0 0 0 0 00 0 1 0 10 1 0 0 10 1 1 1 01 0 0 0 11 0 1 1 01 1 0 1 01 1 1 1 1,行为级描述只描述设计电路的功能或电路的行为,而没有指明或实现这些行为的硬件结构;或者说行为级描述只表示输入输出之间的转换行为,它不包含任何结构信息。行为级描述通常指顺序语句描述,即含有进程的非结构化的逻辑描述。行为级描述的设计模型定义了系统的行为,通常由一个或多个进程构成,每一个进程又包含了一系列的顺序语句。,数据流描述也叫RTL的描述方式,采用寄存器硬件一一对应的直接描述,或者采用寄存器之间的功能描述。RTL描述方式建立在并行信号赋值语句描述的基础上,描述数据流的运动路径、运动方向和运动结果。RTL描述方式是真正可以进行逻辑综合的描述方式。RTL描述方式既可描述时序电路,又可描述组合电路。,二、数据流描述方式,对于全加器,用布尔方程描述其逻辑功能如下:,s=x XOR y sum=s XOR c_in c_out=(x AND y)OR(s AND c_in),输入 输出c_in x y c_out sum 0 0 0 0 00 0 1 0 10 1 0 0 10 1 1 1 01 0 0 0 11 0 1 1 01 1 0 1 01 1 1 1 1,例:采用数据流描述方式的全加器,LIBRARY IEEE;ENTITY full_adder IS GENERIC(tpd:TIME:=10 ns);PORT(x,y,c_in:IN STD_LOGIC;Sum,c_out:OUT STD_LOGIC);END full_adder;,ARCHITECTURE dataflow OF full_adder ISBEGIN s=x XOR y AFTER tpd;sum=s XOR c_in AFTER tpd;c_out=(x AND y)OR(s AND c_in)AFTER 2*tpd;END dataflow;,Architecture dataflow1 of eqcomp4 is begin equal=1 when a=b else 0;end dataflow1;,Architecture dataflow2 of eqcomp4 is beginequal=not(a(0)xor b(0)and not(a(1)xor b(1)and not(a(2)xor b(2)and not(a(3)xor b(3);end dataflow2;,当a和b的宽度发生变化时,需要修改设计,当宽度过大时,设计非常繁琐,描述输入信号经过怎样的变换得到输出信号,使用RTL描述方式应注意问题,PROCESS(sel)BEGINIF(sel=1)THEN y=0;ELSE y=1;END IF;END PROCESS;,PROCESS(sel)BEGINIF(sel=0)THEN y=1;ELSE y=0;END IF;END PROCESS;,当sel=X时,前一个输出的y值为1,后一个却变成了0。,(一)“X”状态的传递:所谓“X”状态的传递,不确定信号的传递,它将使逻辑电路产生不确定的结果。“不确定状态”在RTL仿真时是允许出现的,但在逻辑综合后的门级电路仿真中是不允许出现的。,PROCESS(sel)BEGINIF(sel=1)THEN y=0;ELSIF(sel=0)THEN y=1;ELSE y=X;END IF;END PROCESS;,(二)寄存器RTL描述的限制:禁止在一个进程中存在两个边沿检测 的寄存器描述;禁止使用IF语句中的 ELSE 项;寄存器描述中必须代入信号值。,PROCESS(clk1,clk2)BEGINIF(clk1 EVENT AND clk1=1)THEN y=a;END IF;IF(clk2 EVENT AND clk2=1)THEN z=b;END IF;END PROCESS;,在一个进程中不允许引入两个边沿检测的寄存器进行描述!,PROCESS(clk)BEGINIF(clkEVENT AND clk=1)THEN y=a;ELSE-禁止使用 y=b;END IF;END PROCESS;,PROCESS(clk)VARIABLE tmp:STD_LOGIC;BEGINIF(clkEVENT AND clk=1)THEN tmp:=a;END IF;y=tmp;END PROCESS;,禁止使用ELSE!,必须代入信号值!,不可能有这样的硬件电路与之对应!,结构化描述方式就是在多层次的设计中,高层次的设计可以调用低层次的设计模块,或直接用门电路设计单元来构成一个复杂逻辑电路的方法。利用结构化描述方法将已有的设计成果方便地用于新的设计中,能大大提高设计效率。在结构化描述中,建模的焦点是端口及其互连关系。,结构化描述的建模步骤如下:,(1)元件说明(2)元件例化(3)元件配置,元件说明用于描述局部接口,元件例化是要相对于其他元件来放置该元件,元件配置用于指定元件所用的设计实体,三、结构描述方式,architecture struct of eqcomp4 isbegin U0:xnor2 port map(a(0),b(0),x(0);U1:xnor2 port map(a(1),b(1),x(1);U2:xnor2 port map(a(2),b(2),x(2);U3:xnor2 port map(a(3),b(3),x(3);U4:and4 port map(x(0),x(1),x(2),x(3),equal);end struct;,类似于电路的网络表,将各个器件通过语言的形式进行连接,与电路有一一对应的关系。一般用于大规模电路的层次化设计时。,结构体结构描述方式,对于上图给出的全加器端口结构,可以认为它是由两个半加器和一个或门组成的。,基于上图所示的结构,可以写出全加器的结构化描述设计程序如下。,例:全加器的结构化描述,LIBRARY IEEE;ENTITY half_adder IS GENERIC(tpd:TIME:=10 ns);PORT(in1,in2:IN STD_LOGIC;sum,carry:OUT STD_LOGIC);END half_adder;,ARCHITECTURE behavioral OF half_adder ISBEGINPROSESS(in1,in2)BEGIN sum=in1 XOR in2 AFTER tpd;carry=in1 AND in2 AFTER tpd;END PROCESS;END behavioral;,半加器设计,LIBRARY IEEE;ENTITY or_gate IS GENERIC(tpd:TIME:=10 ns);PORT(in1,in2:IN STD_LOGIC;out1:OUT STD_LOGIC);END or_gate;ARCHITECTURE structural OF or_gate ISBEGIN out1=in1 OR in2 AFTER tpd;END structural;,或门设计,LIBRARY IEEE;ENTITY full_adder IS GENERIC(tpd:TIME:=10 ns);PORT(x,y,c_in:IN STD_LOGIC;Sum,c_out:OUT STD_LOGIC);END full_adder;,ARCHITECTURE structural OF full_adder IS COMPONENT half_adder PORT(in1,in2:IN STD_LOGIC;sum,carry:OUT STD_LOGIC);END COMPONENT;,COMPONENT or_gate PORT(in1,in2:IN STD_LOGIC;out1:OUT STD_LOGIC);END COMPONENT;,SIGNAL a,b,c:STD_LOGIC;FOR u1,u2:half_adder USE ENTITY WORK.half_adder(behavioral);FOR u3:or_gate USE ENTITY WORK.or_gate(structural);BEGIN u1:half_adder PORT MAP(x,y,b,a);u2:half_adder PORT MAP(c_in,b,sum,c);u3:or_gate PORT MAP(c,a,c_out);END structural;,对于一个复杂的电子系统,可以将其分解为若干个子系统,每个子系统再分解成模块,形成多层次设计。这样,可以使更多的设计者同时进行合作。,在多层次设计中,每个层次都可以作为一个元件,再构成一个模块或系统,可以先分别仿真每个元件,然后再整体调试。,所以说结构化描述不仅是一种设计方法,而且是一种设计思想,是大型电子系统高层次设计的重要手段。,三种描述方式比较,结构体的三种描述方式,习题与思考题1 完成一个D触发器的设计 2 利用构造体的结构化描述方式完成一个4位的移位寄存器的设计。提示信息:4位移位寄存器可以由4个1位的移位寄存器(D触发器)级联而成。,D,CP,Q,D,CP,Q,D,CP,Q,D,CP,Q,DIN,CLK,Q3,Q0,Q1,Q2,