1、第3章 硬件描述语言VHDL基础,硬件描述语言概述 VHDL语言程序结构 VHDL常用语句 VHDL语法基础,3.1硬件描述语言概述,VHDL硬件描述语言的英文全名是Very High Speed Integrated Circuit Hardware Description Language,即超高速集成电路硬件描述语言,以下简称为VHDL语言。使用VHDL语言可以实现数字电子系统的行为级描述,RTL(寄存器传输级)描述以及结构级描述。目前在国内外应用的硬件描述语言有许多种,其中应用最广泛的有VHDL语言和Verilog-HDL语言。,3.1硬件描述语言概述,运用VHDL语言设计系统一般采用
2、自顶向下分层设计的方法,首先从系统级功能设计开始,对系统高层模块进行行为描述和功能仿真。系统的功能验证完成后,将抽象的高层设计自顶向下逐级细化,直到与所用可编程逻辑器件相对应的逻辑描述。,3.2 VHDL语言程序结构,VHDL语言程序可由实体(Entity)说明、结构体(Architecture)、程序包(Package)、库(Library)、配置(Configuration)5个部分组成。其中库、实体说明、结构体是一个VHDL语言程序的基本组成部分。,VHDL语言把这个设计单元作为一个设计实体处理,一个设计实体只能唯一地对应一个设定单元。一个设计实体由实体说明和结构体组成。一个实体说明可以
3、对应多个结构体。,【例3-1】二选一MUX的VHDL描述。-2 to 1 mux VHDLLIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux ISPORT(d0,d1,sel:IN STD_LOGIC;f:OUT STD_LOGIC);END mux;ARCHITECTURE structure OF mux IS SIGNAL temp:STD_LOGIC;BEGIN,库说明,实体说明,端口说明,结构体,信号定义,P0:PROCESS(d0,d1,sel)VARIABLE templ,temp2,temp3:STD_LOGIC;BEGIN
4、templ:=d0 AND(NOT sel);temp2:=d1 AND sel;temp3:=templ OR temp2;temp=temp3;f=temp;END PROCESS P0;END structure;,进程,变量定义,3.2.1 实体说明,实体说明的书写格式如下所示:ENTITY ISGENERIC (类属说明); PORT (端口说明);实体语句部分;END ENTITY ;其中“”中的部分是必选项,“ ”中的部分是可选项。,3.2.1 实体说明,例如,4位加法器作为一个设计实体的实体说明如下:ENTITY adder_ripple ISGENERIC (m: TIME:
5、=5 ns);PORT(a,b: IN STD_LOGIC_VECTOR(3 DOWNTO 0);q: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Cout: OUT STD_ LOGIC);END adder_ripple;,3.2.1 实体说明,1.类属说明语句(GENERIC)类属说明语句必须放在端口说明语句之前,用以设定实体或元件的内部电路结构和规模,其书写格式如下:GENERIC (常数名:数据类型:=设定值;常数名:数据类型:=设定值);例如:GENERIC (m:TIME:=5 ns);指定了结构体内m的值为5ns。,3.2.1 实体说明,2.端口说明(PO
6、RT)端口对应于电路图中元件符号的外部引脚。端口说明语句是对基本设计实体(单元)与外部接口的描述,也可以说是对外部引脚信号的名称、数据类型和输入输出方向的描述。端口说明语句的一般格式如下:PORT (端口名,端口名:模式 数据类型名;端口名,端口名:模式 数据类型名);,3.2.1 实体说明,注意:(1)端口名是赋给每个外部引脚的名称,通常用一个或几个英文字母,或者用英文字母加数字命名。各端口名在实体中必须是唯一的,不能重复。(2)模式用来说明信号的方向,详细的端口方向说明见下表。需要指出的是,BUFFER是INOUT的子集;做输入时,信号不是由外部驱动,而是从输出反馈得到。,3.2.1 实体
7、说明,(3)数据类型名则是端口信号的取值类型,有: BIT:位类型,取值0、1,由STANDARD程序包定义; BIT_VECTOR:位向量类型,是BIT的组合; STD_LOGIC:工业标准的逻辑类型,取值0、1、X、Z等,由 STD_LOGIC_1164程序包定义; INTEGER:整数类型,可用作循环指针或常数,通常不用作I/O信号; BOOLEAN :布尔类型,取值FALSE、TRUE STD_LOGIC_VECTOR :工业标准的逻辑向量类型,是STD_LOGIC的组合;,3.2.2 结构体,结构体(Architecture) 是对实体功能的具体描述。结构体主要是描述实体的硬件结构、
8、元件之间的互连关系、实体所完成的逻辑功能以及数据的传输变换等方面的内容。 结构体对其实体的输入/输出关系描述有三种方式:行为描述方式(behavioral)、数据流描述方式(dataflow)和结构描述方式(structure)。最常用的是结构描述方式。,一个结构体的书写格式如下:ARCHITECTURE OF IS定义语句;BEGINEND ;,3.2.2 结构体,一个实体中可以具有一个结构体,也可以具有几个结构体。一个实体内部若有几个结构体,则结构体名不能重复。结构体中的定义语句位于ARCHITECTURE 和BEGIN之间,用于对结构体内部所使用的信号(SIGNAL)、常数(CONSTA
9、NT)、数据类型、元件(COMPONENT)和过程(PROCEDURE)等进行定义。,3.2.2 结构体,【例3-2】一个RS触发器的结构体的行为描述方式。ARCHITECTURE rs_behav OF rsff ISBEGINq=NOT(qb AND set);qb=NOT(q AND reset);END rs_behav;,是一个RS触发器的结构体的行为描述方式。,【例3-3】一个RS触发器的结构体的结构描述方式。 ARCHITECTURE rs_stru OF rsff ISCOMPONENT nand2PORT(a,b:IN BIT;c:OUT BIT);END COMPONENT
10、;BEGINu1:nand2 PORT MAP(a=set,b=qb,c=q);u2:nand2 PORT MAP(a=reset,b=q,c=qb);END rs_stru;,-是一个RS触发器的结构体的结构描述方式。,【例3-4】使用RTL描述方式的全加器VHDL程序 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY full_adder ISGENERIC (tpd:TIME:=5 ns); -tpd=5 nsPORT (a,b,Cin:IN STD_LOGIC;S,Co:OUT STD_ LOGIC);END full_adder;ARCH
11、ITECTURE rtl OF full_adder ISSIGNAL h:STD_LOGIC; -内部信号定义BEGIN h=a XOR b AFTER tpd;S=h XOR Cin AFTER tpd;Co=(a AND b)OR(h AND Cin) AFTER 2*tpd;END rtl;,3.2.2 结构体,在实际的硬件电路设计中,当电路的规模较大时,全部电路用一个模块来描述很不方便。一般情况下,是将整个电路分成若干相对独立的子模块来进行描述。VHDL语言的功能描述语句结构可以是含有五种不同类型、并以并行方式工作的语句结构。 VHDL语言中常用的三种子结构描述语句为BLOCK语句结
12、构、PROCESS语句结构和SUBPROGRAM语句结构。,1. 块(BLOCK)语句结构,BLOCK的应用类似于将一个电路原理图分为几个子模块进行绘制,而其中每个子模块都可以是一个具体的电路原理图。也就是说,按照模块方式对结构体进行划分并不会改变电路的逻辑功能。设计者可以合理地将一个模块划分为数个区域,在每个区域中都能定义或描述局部信号、数据类型和常量。,1. 块(BLOCK)语句结构,所有能在结构体的说明部分进行说明的对象都可以在BLOCK的说明部分进行说明。 BLOCK语句的书写格式如下:块标号: BLOCK卫式表达式类属子句类属接口表;端口子句端口接口表;块说明部分;BEGINEND
13、BLOCK块标号;,【例3-5】采用BLOCK语句来描述的计数器电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY counter2 ISPORT(clk:IN STD_LOGIC;q1,q0:OUT STD_LOGIC);END counter2;ARCHITECTURE arch_counter2 OF counter2 ISSIGNAL count:STD_LOGIC_VECTOR(1 DOWNTO 0);BEGINcounter: BLOCKBEGIN PROCESS(clk
14、) BEGINIF(clkEVENT AND clk=1)THENIF (count(0)=1 AND count(1)=1) THEN count=“00“; ELSE count=count+1;END IF;END IF;q1=count(1);q0=count(0);END PROCESS;END BLOCK counter;END arch_counter2;,在对程序进行仿真时,BLOCK语句中所描述的各条语句是并行执行的,执行顺序与书写顺序无关,【例3-6】含卫式表达式的VHDL程序。 ENTITY dlatch IS PORT (d,clk:IN BIT;q,qb:OUT BI
15、T); END dlatch; ARCHITECTURE latch_guard OF dlatch IS BEGINg1:BLOCK(clk=1)BEGINq=GUARDED d AFTER 5ns;qbGUARDED NOT(d) AFTER 5ns;END BLOCK g1; END latch_guard;,当卫式表达式为真时,BLOCK语句被执行,否则将跳过BLOCK语句。在BLOCK块中的信号传送语句前都要加一个前卫关键词GUARDED,以表明只有在条件满足时此语句才会执行。,2. 进程(PROCESS)语句结构,用PROCESS语句描述电路结构的书写格式为:进程标号:PROCES
16、S 敏感信号表 IS进程语句说明部分;BEGINEND PROCESS进程标号;,2. 进程(PROCESS)语句结构,进程标号是进程的命名,是可选项。敏感信号表列出了进程语句敏感的所有信号,任意一个敏感信号改变,进程中由顺序语句定义的行为就会重新执行一遍。进程说明部分对该进程所需的局部数据环境进行定义。BEGIN和END PROCESS之间是描述进程行为的顺序执行语句。 进程行为的结果可以赋给信号,通过信号可被其他的PROCESS或BLOCK读取或赋值。当执行完进程中最后一个语句后,执行过程将返回到进程的第一个语句,以等待下一次敏感信号变化。,2. 进程(PROCESS)语句结构,一个结构体
17、中可以含有多个PROCESS结构,每个进程可以在任何时刻被激活或者启动。而所有被激活的进程都是并行运行的,所以PROCESS结构本身是并行语句。,【例3-7】带敏感信号表的进程语句实例。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY dff ISPORT (d,clk,reset:IN STD_LOGIC;q:OUT STD_LOGIC);END dff;ARCHITECTURE example OF dff ISBEGINPROCESS(clk,reset)BEGIN IF reset=0THEN q=0;ELSIF (clkEVENT AND
18、 clk=1) THENq=d;END IF;END PROCESS;END example;,异步复位的 D触发器,3. 子程序(SUBPROGRAM)语句结构,所谓子程序,就是在主程序调用它之后能将处理结果返回到主程序的程序模块,是一个VHDL程序模块,利用顺序语句来定义和完成各种算法;其含义与其他高级语句中的子程序概念相当,可以反复调用。在调用子程序时,要首先对其进行初始化,执行结束再调用则需再次初始化。因此,子程序内部的值是不能保持的。 在VHDL中有两种类型的子程序:过程(Procedure)和函数(Function)。,函数(Function),函数语句的书写格式如下:FUNCTI
19、ON (参数表) RETURN IS函数说明;BEGINRETURN (表达式);END FUNCTION ;,【例3-8】一个在包集合中使用的函数例子。LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; PACKAGE bpac IS FUNCTION max(a:STD_LOGIC_VECTOR;b:STD_LOGIC_VECTOR)RETURN STD_LOGIC_VECTOR; END bpac; PACKAGE BODY bpac IS FUNCTION max(a:STD_LOGIC_VECTOR;b:STD_LOGIC_VECTOR)RETURN
20、 STD_LOGIC_VECTOR IS VARIABLE temp:STD_LOGIC_VECTOR; BEGINIF(ab)THENtemp:=a;ELSEtemp:=b;END IF;RETURN temp; END; END bpac;,函数(Function),对于上述包集合中定义的函数,假设某个结构体中有如下所示的一条语句:peak=max(data,peak); 此语句就是调用FUNCTION的语句。在包集合中的参数a和b,在这里用data和peak所代替。函数的返回值tmp被赋予peak。同时,由上面的例子可以看出,函数只能返回一个函数值。,过程(Procedure),过程语句
21、的书写格式如下:PROCEDURE (参数表) IS过程说明; BEGIN过程语句部分; ENDPROCEDURE ; 在PROCEDURE结构中,参数可以是IN、OUT、INOUT等多种模式。,【例3-9】一个由过程语句实现的译码器例子。 PROCEDURE decoder (code:INTEGER RANGE 0 TO 3;decoder_out:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) IS BEGIN VARIABLE decoder:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CASE code ISWHEN 0=decoderdeco
22、derdecoderdecoder=B“1000”;END CASE;decoder_out=decoder; END decoder;,过程(Procedure),与函数相同的是,过程体中的参数说明部分只是局部的,其中的各种定义只能是用于过程体内部。过程体中的顺序语句部分可以包含任何顺序执行的语句,包括WAIT语句。但需要注意的是,如果一个过程是在进程中调用,且该进程已列出了敏感参量表,则不能在此过程中使用WAIT语句。,3.2.3包集合、库及配置,除了实体和结构体外,包集合、库及配置是在VHDL语言中另外三个可以各自独立进行编译的设计元件。,1. 包集合(Package),为了使一组数据类
23、型、常量、子程序等被多个实体公用,VHDL提供了包集合的机制。包集合就像是公用的工具箱,各个实体都可使用其中定义的工具。包集合结构如下所示:PACKAGE 包集合名 IS说明语句END 包集合名;PACKAGE BODY 包集合名 IS说明语句END BODY;,1. 包集合(Package),为了方便设计,VHDL提供了一些标准的包集合。 LIBRARY IEEE; -打开IEEE库USE IEEE.STD_LOGIC_1164.ALL; -调用其中的STD_LOGIC_1164包集合,【例3-10】包集合的例子。-包集合说明PACKAGE example ISTYPE alu_op IS(
24、add,sub,mul,div,eq,gt,lt) ; -枚举类型 CONSTANT pi:REAL:=3.1415926; -常量CONSTANT delayl:TIME; COMPONENT nand2 -元件PORT(a,b:IN BIT;c:OUT BIT);END COMPONENT;FUNCTION mean(a,b,c:REAL) RETURN REAL; -函数 END example;,PACKAGE BODY example IS -包集合体CONSTANT delay1:TIME:=15ns; -定义延时常量的值FUNCTION mean(a,b,c:REAL) RETU
25、RN REAL ISBEGINRETURN(a+b+c)/3.0; -求均值END mean; END example;,1. 包集合(Package),自定义的包集合和标准包集合一样,也要通过调用才能使用。如要用上例中的example包集合,则要在实体说明前加上语句: USE WORK.example.ALL;,2. 配置(Configuration),配置(Configuration)语句描述层与层之间的连接关系,以及实体与结构之间的连接关系。设计者可以利用这种配置语句来选择不同的结构体,使其与要设计的实体相对应。在仿真某一个实体时,可以利用配置来选择各种不同的结构体,进行性能对比试验,以
26、得到性能最佳的结构体。,2. 配置(Configuration),配置语句的基本书写格式如下:CONFIGURATION 配置名 OF实体名 IS语句说明END 配置名;,2. 配置(Configuration),例如,上述RS触发器的结构体,若要选用行为式结构体,可在描述语句中加上下面这段配置说明。CONFIGURATION confr OF rsff ISFOR rs_behav;END FOR;END confr;,3. 库(Library),VHDL语言中的库用来存放已编译过的设计单元(包括实体说明、结构体、配置说明、包集合),库中内容可以用作其他VHDL描述的资源。在VHDL语言中,
27、库的说明总是放在设计单元的最前面: LIBRARY 库名;,3. 库(Library),在VHDL语言中库大致有5种:IEEE库、STD库、ASIC向量库、用户定义的库和WORK库。除WORK库外,其他4类库在使用前都要首先进行说明,第一个语句是LIBRARY 库名,表明使用什么库。另外还要说明设计者要使用的是库中哪一个包集合以及包集合中的项目名。这样第2个语句的格式为: USE 库名.程序包名.项目名;,3.3 VHDL常用语句,VHDL的描述语句分为并行语句和顺序语句两种。并行语句主要用来描述模块之间的连接关系,顺序语句一般用来实现模型的算法部分。并行语句之间是并行的关系,当某个信号发生变
28、化时,受此信号触发的所有语句同时执行。顺序语句则是严格按照书写的先后次序顺序执行。,3.3.1 并行语句,在VHDL语言中,并行语句主要包括: 并行信号赋值语句; 块语句; 进程语句; 过程调用语句; 参数传递语句(也称GENERIC语句); 元件例化语句; 生成语句; 并行断言语句。,1. 并行信号赋值语句,在VHDL语言中,并行信号赋值语句可分为以下3个子类型: 并发信号赋值语句; 条件信号赋值语句; 选择信号赋值语句。 上面信号赋值语句的共同特点就是语句执行都是并发的。,(1)并发信号赋值语句,并发信号赋值语句在进程内部使用时,它作为顺序语句的形式出现,信号赋值语句在结构体的进程之外使用
29、时,它作为并发语句的形式出现。一个并发信号赋值语句是一个等效进程的简略形式。,若有两个信号赋值语句: q=a+b; -描述加法器的行为,第i行程序q=a*b; -描述乘法器的行为。第i+1行程序这个赋值语句是并发执行的,加法器和乘法器独立并行工作。第i行和第i+1行程序在仿真时都并发处理,从而真实地模拟了实际硬件模块中加法器、乘法器的工作情况。这就是信号赋值语句的并发性问题。,并发信号赋值语句等效一个进程,请分析下面2个程序段:ARCHITECTURE example OF signal_assignment ISBEGINq=a AND b AFTER 5 ns; -信号代入语句END ex
30、ample; 它的等效的进程可以表述为:ARCHITECTURE example OF signal_assignment ISBEGINp1:PROCESS(a,b) -敏感信号a,bBEGINq=a AND b AFTER 5 ns;END RPOCESS pl; END example;,(2)条件信号赋值语句,条件信号赋值语句属于并发描述语句的范畴,可以根据不同的条件将不同的表达式的值赋给目标信号。条件信号赋值语句书写的一般格式为 :目标信号=表达式1 WHEN条件1 ELSE表达式2 WHEN条件2 ELSE表达式3 WHEN条件3 ELSE表达式n-1 WHEN条件n-1 ELSE
31、表达式n;,【例3-11】用条件信号赋值语句设计四选一数据选择器。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux4 ISPORT(d0,dl,d2,d3,a,b:IN STD_LOGIC;q:OUT STD_LOGIC);END mux4;ARCHITECTURE behave1 OF mux4 ISSIGNAL sel:STD_LOGIC_VECTOR(1 DOWNTO 0);BEGINsel=ba; -经过并置操作sel成为二位向量q=d0 WHEN sel=“00” ELSEd1 WHEN sel=“01” ELSEd2 WHEN
32、sel=“10” ELSEd3 WHEN sel=“11” ELSEZ;END behave1;,(3)选择信号赋值语句,选择信号赋值语句对选择条件表达式进行测试,当选择条件表达式取值不同时,将使信号表达式不同的值赋给目标信号。选择信号赋值语句的书写格式如下:WITH 选择条件表达式 SELECT目标信号=信号表达式1 WHEN 选择条件1信号表达式2 WHEN 选择条件2信号表达式n WHEN 选择条件n,【例3-12】用选择信号赋值语句设计四选一数据选择器。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux4 IS PORT (d0
33、,dl,d2,d3,a,b:IN STD_LOGIC;q:OUT STD_LOGIC); END mux4; ARCHITECTURE behave2 OF mux4 IS SIGNAL sel:INTEGER; BEGINWITH sel SELECT -选择信号赋值语句q=d0 WHEN 0,d1 WHEN 1,d2 WHEN 2,d3 WHEN 3,ZWHEN OTHERS;sel=0 WHEN a=0AND b=0ELSE -条件信号赋值语句1 WHEN a=1AND b=0ELSE2 WHEN a=0AND b=1ELSE3 WHEN a=1AND b=1ELSE4;END beha
34、ve2;,2. 元件例化语句,用VHDL语言实现一个大的系统设计时,层次化设计方法或者层次化设计思想是经常采用的。如果把一个大系统视为一个实体,那么在对这个实体的结构体描述时,除了使用子程序(过程和函数)调用、BLOCK块语句之外,COMPONENT和COMPONENT INSTANT语句的联合使用最能体现结构体描述中的层次化设计思想。,2. 元件例化语句,COMPONENT语句用来指明结构体所要调用的文件、单元或模块。一般被调用的元件、单元、模块的结构体描述程序都是已编程好的,甚至都是通过逻辑综合、模拟仿真后认为都是最优的。通常把这些已编程好的结构体描述程序视为是现成的元件。单元、模块的程序
35、都存放在某库的程序包中。在进行目标中的结构体描述时,若要用到被调用的元件、单元、模块,只要使用COMPONENT语句就可以实现将这些低层元件嵌入到高一层次的结构体中。,2. 元件例化语句,COMPONENT语句的书写格式如下:COMPONENT GENERIC ;PORT ;END COMPONENT;COMPONENT INSTANT语句的书写格式:GENERIC MAP (参数映射)PORT MAP(端口映射);,假设WORK库中名为GATE的程序包已经存放了一位全加器的VHDL程序,其程序如下:ENTITY adder isPORT(a,b,cin:IN STD_LOGIC;cout,s
36、um:OUT STD_LOGIC);END adder;ARCHITECTIRE structure OF adder ISSIGNAL int:STD_LOGIC;BEGINint=a XOR b AFTER 10 ns;cout=(a AND b) OR (int AND cin) AFTER 10 ns;sum=int XOR cin AFTER 10 ns; END structure;,【例3-13】调用WORK库中adder元件组成8位加法器的VHDL程序。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE WORK.GATE.ALL;ENTI
37、TY adder8 ISGENERIC (n:INTEGER:=8);PORT(a,b:IN STD_LOGIC_VECTOR(n DOWNTO 1);cin:IN STD_LOGIC;sum:OUT STD_LOGIC_VECTOR(n DOWNTO 1);cout:OUT STD_LOGIC);END adder8;ARCHITECTURE structure OF adder8 ISCOMPONENT adderPORT(a:IN STD_LOGIC;b:IN STD_LOGIC;cin:IN STD_LOGIC;sum:OUT STD_LOGIC;cout:OUT STD_LOGIC)
38、;END COMPONENT;SIGNAL carry:STD_LOGIC_VECTOR(1 TO n-1);,BEGIN gen:FOR i IN 1 TO n GENERATEfirst_bit:IF i=1 GENERATEfirst_cell:adder PORT MAP(a(i),b(i),cin,sum(i),carry(i); END GENERATE first_bit; middle_bits:IF i1 AND in GENERATE middle_cell:adder PORT MAP(a(i),b(i),carry(i-1), sum(i),carry(i); END
39、GENERATE middle_bits; ms_bit:IF i=n GENERATE ms_cell:adder PORT MAP(a(n),b(n),carry(n-1),sum(n),cout); END GENERATE ms_bit; END GENERATE gen; END structure;,3. 生成语句,生成(GENERATE)语句适用于将简单元件扩展成相同结构或规则结构的更大电路的描述。GENERATE语句有二种形式,一种是FOR GENERATE,另一种是IF GENERATE。 FOR GENERATE语句的书写形式如下:标号名: FOR 变量IN不连续区间GEN
40、ERATE;END GENERATE 标号名;,3. 生成语句,IF GENERATE 语句的书写形式如下:标号名: IF 条件GENERATE;END GENERATE 标号名;,【例3-14】 用元件例化语句描述由D触发器构成移位寄存器的VHDL程序。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY shift_register ISPORT(a,clk:IN STD_LOGIC;b:OUT STD_LOGIC);END shift_register;ARCHITECTURE four_bit_shift_register OF shift_r
41、egister ISCOMPONENT dff -元件例化dffPORT(a,clk:IN STD_LOGIC;b:OUT STD_LOGIC);END COMPONENT;SIGNAL s:STD_LOGIC_VECTOR(0 TO 4);BEGINs(0)=a;dffl:dff PORT MAP(s(0),clk,s(1);dff2:dff PORT MAP(s(1),clk,s(2); dff3:dff PORT MAP(s(2),clk,s(3);dff4:dff PORT MAP(s(3),clk,s(4);b=s(4);END four_bit_shift_register;,【例
42、3-15】 用FOR GENERATE语句实现电路的VHDL程序。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY shift_register ISPORT(a,clk:IN STD_LOGIC;b:OUT STD_LOGIC); END shift_register; ARCHITECTURE four_shift_register OF shift_register IS COMPONENT dff -元件例化语句 PORT(c d,clk:IN STD_LOGIC;q:OUT STD_LOGIC); END COMPONENT; SI
43、GNAL s:STD_LOGIC_VECTOR(0 TO 4); BEGINs(0)=a: -输入信号代入语句registerl:FOR i IN 0 TO 3 GENERATEdffx:dff PORT MAP(s(i),clk,s(i+1); -端口映射END GENERATE;b=s(4); -输出信号代入语句 END four_shift_register;,【例3-16】由IF GENERATE语句描述由D触发器扩展成移位寄存器的VHDL程序。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY shift ISGENERIC (n:INTE
44、GER:=8);PORT(a,clk:IN STD_LOGIC;b:OUT STD_LOGIC);END shift;ARCHITECTURE gen_shift OF shift ISCOMPONENT dffPORT(d,clk:IN STD_LOGIC;q:OUT STD_LOGIC);END COMPONENT;SIGNAL z:STD_LOGIC_VECTOR(1 TO(n-1);,BEGINg1:FOR i IN 0 TO(n-1)GENERATEu0:IF i=0 GENERATEdffx:dff PORT MAP(a,clk,z(i+1);END GENERATE;u1:IF
45、i=(n-1) GENERATEdffx:PORT MAP(z(i),clk,b);END GENERATE;u2:IF(i /= 0)AND(i /= (n-1)GENERATEdffx:PORT MAP(z(i),clk,z(i+1);END GENERATE;END GENERATE;END gen_shift;,3.3.2顺序语句,顺序语句是相对于并行语句而言的。顺序语句的特点是:每一条顺序语句的执行(指仿真执行)顺序是与它们的书写顺序相一致的。顺序语句只能出现在进程(PROCESS)和子程序中,子程序包括函数(FUNCTION)和过程(PROCEDURE)。 顺序语句主要有:顺序赋值
46、语句;WAIT语句;IF语句;CASE语句;LOOP语句;EXIT语句;RETURN语句;NULL语句;REPORT语句;断言语句。,1. 顺序赋值语句(1)变量赋值语句,在VHDL语言中,变量的说明和赋值只能在VHDL语言程序的顺序部分进行说明和使用,也就是只能在进程、过程和函数中进行。变量赋值语句的书写格式为:目标变量:=表达式; 对于变量赋值语句来说,赋值符号两边的目标变量和表达式的数据类型和长度必须保持一致,否则将会出现编译错误。 在变量赋值语句中,变量的赋值是直接的、立即生效的,因此在变量赋值语句中不允许出现附加延时。,(2) 信号赋值语句,信号赋值语句只能在VHDL语言程序的并行部
47、分进行说明,但可以用在并行部分,也可以用在顺序部分。 信号赋值语句的书写格式为:目标信号=表达式; 对于信号赋值语句来说,赋值符号两边的目标信号和表达式的数据类型和长度必须保持一致,否则将会出现编译错误。 在信号赋值语句中,信号赋值的执行和信号值更新之间至少有DELTA延时,只有延时过后信号才能够得到新值。,2. WAIT语句,进程在仿真运行中总是处于两种状态之一:执行或挂起。进程状态的变化受WAIT语句控制,当进程执行到WAIT语句时就将被挂起,并设置好再次执行的条件。WAIT语句可以设置4种不同的条件:无限等待、时间到、条件满足以及敏感信号量变化。这几类条件可以混用,其书写格式如下: WA
48、IT -无限等待 WAIT ON -敏感信号变化 WAIT UNTIL -条件满足 WAIT FOR -时间到,3. IF语句,IF语句是具有条件控制功能的语句,根据给出的条件,以及条件是否成立的结果来决定语句的执行顺序。IF语句有下面3种形式。(1) IF_THEN语句,其语句形式如下。IF标号: IF THEN;END IF IF标号;当程序执行到该IF语句时,要对该IF语句中所给出的条件进行判断。若条件成立,IF语句中的顺序处理语句将被执行;若条件不成立,程序则跳出IF语句,执行IF语句的结尾语句(END IF)之后的各条语句。,【例3-17】在进程中使用IF_THEN语句实现D触发器功能的VHDL程序。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY dff ISPORT(clk,d:IN STD_LOGIC;q:OUT STD_LOGIC);END dff;ARCHITECTURE rtl OF dff ISBEGIN PROCESS(clk)BEGINIF (clkEVENT AND clk=1) THENq=d;END IF;END PROCESS;END rtl;,