第3章硬件描述语言VHDL基础

上传人:gu****n 文档编号:243134776 上传时间:2024-09-16 格式:PPT 页数:126 大小:353.50KB
返回 下载 相关 举报
第3章硬件描述语言VHDL基础_第1页
第1页 / 共126页
第3章硬件描述语言VHDL基础_第2页
第2页 / 共126页
第3章硬件描述语言VHDL基础_第3页
第3页 / 共126页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,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,语言设计系统一般采用自顶向下分层设计的方法,首先从系统级功能设计开始,对系统高层模块进行行为描述和功能仿真。系统的功能验证完成后,将抽象的高层设计自顶向下逐级细化,直到与所用可编程逻辑器件相对应的逻辑描述。,3.2 VHDL,语言程序结构,VHDL,语言程序可由实体,(Entity),说明、结构体,(Architecture),、程序包,(Package),、库,(Library),、配置,(Configuration)5,个部分组成。其中库、实体说明、结构体是一个,VHDL,语言程序的基本组成部分。,VHDL,语言把这个设计单元作为一个设计实体处理,一个设计实体只能唯一地对应一个设定单元。一个设计实体由实体说明和结构体组成。一个实体说明可以对应多个结构体。,【,例,3-1】,二选一,MUX,的,VHDL,描述。,-2 to 1,mux,VHDL,LIBRARY IEEE;,USE IEEE.STD_LOGIC_1164.ALL;,ENTITY,mux,IS,PORT(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,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 IS,GENERIC (,类属说明,);,PORT (,端口说明,);,实体语句部分,;,END ENTITY ;,其中“,”,中的部分是必选项,“, ”,中的部分是可选项,。,3.2.1,实体说明,例如,,4,位加法器作为一个设计实体的实体说明如下:,ENTITY,adder_ripple,IS,GENERIC (m: TIME:=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.,端口说明,(PORT),端口对应于电路图中元件符号的外部引脚。端口说明语句是对基本设计实体,(,单元,),与外部接口的描述,也可以说是对外部引脚信号的名称、数据类型和输入输出方向的描述。端口说明语句的一般格式如下:,PORT (,端口名,,端口名,:,模式,数据类型名;,端口名,,端口名,:,模式,数据类型名,),;,3.2.1,实体说明,注意:,(,1,)端口名是赋给每个外部引脚的名称,通常用一个或几个英文字母,或者用英文字母加数字命名。各端口名在实体中必须是唯一的,不能重复。,(,2,)模式用来说明信号的方向,详细的端口方向说明见下表。需要指出的是,,BUFFER,是,INOUT,的子集;做输入时,信号不是由外部驱动,而是从输出反馈得到。,方向定义,含 义,IN,输入,OUT,输出,(,结构体内不能再使用,),INOUT,双向,(,可以输入,也可以输出,),BUFFER,输出,(,结构体内可再使用,),,可以读或写,LINKAGE,不指定方向,无论哪一个方向都可以连接,3.2.1,实体说明,(,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),是对实体功能的具体描述。结构体主要是描述实体的硬件结构、元件之间的互连关系、实体所完成的逻辑功能以及数据的传输变换等方面的内容。,结构体对其实体的输入,/,输出关系描述有三种方式:行为描述方式,(behavioral),、数据流描述方式,(dataflow),和结构描述方式,(structure),。,最常用的是结构描述方式。,一个结构体的书写格式如下:,ARCHITECTURE OF IS,定义语句,;,BEGIN,END ,;,3.2.2,结构体,一个实体中可以具有一个结构体,也可以具有几个结构体。一个实体内部若有几个结构体,则结构体名不能重复。,结构体中的定义语句位于,ARCHITECTURE,和,BEGIN,之间,用于对结构体内部所使用的信号,(SIGNAL),、常数,(CONSTANT),、数据类型、元件,(COMPONENT),和过程,(PROCEDURE),等进行定义。,3.2.2,结构体,【,例,3-2】,一个,RS,触发器的结构体的行为描述方式。,ARCHITECTURE,rs_behav,OF,rsff,IS,BEGIN,q=,NOT(qb,AND set),;,qb,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,IS,GENERIC (,tpd:TIME,:=5 ns); -,tpd,=5 ns,PORT (,a,b,Cin:IN,STD_LOGIC;,S,Co:OUT,STD_ LOGIC);,END,full_adder,;,ARCHITECTURE,rtl,OF,full_adder,IS,SIGNAL,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,语句结构、,PROCESS,语句结构和,SUBPROGRAM,语句结构。,1.,块,(BLOCK),语句结构,BLOCK,的应用类似于将一个电路原理图分为几个子模块进行绘制,而其中每个子模块都可以是一个具体的电路原理图。也就是说,按照模块方式对结构体进行划分并不会改变电路的逻辑功能。设计者可以合理地将一个模块划分为数个区域,在每个区域中都能定义或描述局部信号、数据类型和常量。,1.,块,(BLOCK),语句结构,所有能在结构体的说明部分进行说明的对象都可以在,BLOCK,的说明部分进行说明。,BLOCK,语句的书写格式如下:,块标号,: BLOCK,卫式表达式,类属子句,类属接口表,;,端口子句,端口接口表,;,块说明部分,;,BEGIN,END BLOCK,块标号,;,【,例,3-5】,采用,BLOCK,语句来描述的计数器电路,LIBRARY IEEE,;,USE IEEE.STD_LOGIC_1164.ALL,;,USE IEEE.STD_LOGIC_UNSIGNED.ALL,;,ENTITY counter2 IS,PORT(clk:IN,STD_LOGIC;q1,q0:OUT STD_LOGIC),;,END counter2,;,ARCHITECTURE arch_counter2 OF counter2 IS,SIGNAL count:STD_LOGIC_VECTOR(1 DOWNTO 0);,BEGIN,counter: BLOCK,BEGIN,PROCESS(clk,) BEGIN,IF(clkEVENT,AND,clk,=1)THEN,IF (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,BIT),;,END,dlatch,;,ARCHITECTURE,latch_guard,OF,dlatch,IS,BEGIN,g1,:,BLOCK(clk,=1),BEGIN,q=GUARDED d AFTER 5ns,;,qb,GUARDED,NOT(d,) AFTER 5ns,;,END BLOCK g1,;,END,latch_guard,;,当卫式表达式为真时,,BLOCK,语句被执行,否则将跳过,BLOCK,语句。在,BLOCK,块中的信号传送语句前都要加一个前卫关键词,GUARDED,,以表明只有在条件满足时此语句才会执行。,2.,进程,(PROCESS),语句结构,用,PROCESS,语句描述电路结构的书写格式为:,进程标号,:PROCESS ,敏感信号表, IS,进程语句说明部分,;,BEGIN,END PROCESS,进程标号,;,2.,进程,(PROCESS),语句结构,进程标号是进程的命名,是可选项。敏感信号表列出了进程语句敏感的所有信号,任意一个敏感信号改变,进程中由顺序语句定义的行为就会重新执行一遍。进程说明部分对该进程所需的局部数据环境进行定义。,BEGIN,和,END PROCESS,之间是描述进程行为的顺序执行语句。,进程行为的结果可以赋给信号,通过信号可被其他的,PROCESS,或,BLOCK,读取或赋值。当执行完进程中最后一个语句后,执行过程将返回到进程的第一个语句,以等待下一次敏感信号变化。,2.,进程,(PROCESS),语句结构,一个结构体中可以含有多个,PROCESS,结构,每个进程可以在任何时刻被激活或者启动。而所有被激活的进程都是并行运行的,所以,PROCESS,结构本身是并行语句,。,【,例,3-7】,带敏感信号表的进程语句实例。,LIBRARY IEEE;,USE IEEE.STD_LOGIC_1164.ALL;,ENTITY,dff,IS,PORT (,d,clk,reset:IN,STD_LOGIC;,q:OUT,STD_LOGIC);,END,dff,;,ARCHITECTURE example OF,dff,IS,BEGIN,PROCESS(clk,reset,),BEGIN,IF reset=0THEN,q=0;,ELSIF (,clkEVENT,AND,clk,=1) THEN,q=d;,END IF;,END PROCESS;,END example;,异步复位的,D,触发器,3.,子程序,(SUBPROGRAM),语句结构,所谓子程序,就是在主程序调用它之后能将处理结果返回到主程序的程序模块,是一个,VHDL,程序模块,利用顺序语句来定义和完成各种算法;其含义与其他高级语句中的子程序概念相当,可以反复调用。在调用子程序时,要首先对其进行初始化,执行结束再调用则需再次初始化。因此,子程序内部的值是不能保持的。,在,VHDL,中有两种类型的子程序:过程,(Procedure),和函数,(Function),。,函数,(Function),函数语句的书写格式如下:,FUNCTION (,参数表,) RETURN IS,函数说明,;,BEGIN,RETURN (,表达式,);,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 STD_LOGIC_VECTOR IS,VARIABLE,temp:STD_LOGIC_VECTOR,;,BEGIN,IF(a,b)THEN,temp:=a,;,ELSE,temp:=b,;,END IF,;,RETURN temp,;,END,;,END,bpac,;,函数,(Function),对于上述包集合中定义的函数,假设某个结构体中有如下所示的一条语句:,peak=,max(data,peak,),;,此语句就是调用,FUNCTION,的语句。在包集合中的参数,a,和,b,,在这里用,data,和,peak,所代替。函数的返回值,tmp,被赋予,peak,。同时,由上面的例子可以看出,函数只能返回一个函数值。,过程,(Procedure),过程语句的书写格式如下:,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 IS,WHEN 0=decoderdecoderdecoderdecoder=B“1000”;,END CASE,;,decoder_out,=decoder;,END decoder;,过程,(Procedure),与函数相同的是,过程体中的参数说明部分只是局部的,其中的各种定义只能是用于过程体内部。过程体中的顺序语句部分可以包含任何顺序执行的语句,包括,WAIT,语句。但需要注意的是,如果一个过程是在进程中调用,且该进程已列出了敏感参量表,则不能在此过程中使用,WAIT,语句。,3.2.3,包集合、库及配置,除了实体和结构体外,包集合、库及配置是在,VHDL,语言中另外三个可以各自独立进行编译的设计元件。,1.,包集合,(Package),为了使一组数据类型、常量、子程序等被多个实体公用,,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 IS,TYPE,alu_op,IS(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,) RETURN REAL IS,BEGIN,RETURN(a+b+c)/3.0; -,求均值,END mean;,END example;,1.,包集合,(Package),自定义的包集合和标准包集合一样,也要通过调用才能使用。如要用上例中的,example,包集合,则要在实体说明前加上语句:,USE,WORK.example.ALL,;,2.,配置,(Configuration),配置,(Configuration),语句描述层与层之间的连接关系,以及实体与结构之间的连接关系。设计者可以利用这种配置语句来选择不同的结构体,使其与要设计的实体相对应。在仿真某一个实体时,可以利用配置来选择各种不同的结构体,进行性能对比试验,以得到性能最佳的结构体。,2.,配置,(Configuration),配置语句的基本书写格式如下:,CONFIGURATION,配置名,OF,实体名,IS,语句说明,END,配置名;,2.,配置,(Configuration),例如,上述,RS,触发器的结构体,若要选用行为式结构体,可在描述语句中加上下面这段配置说明。,CONFIGURATION,confr,OF,rsff,IS,FOR,rs_behav,;,END FOR,;,END,confr,;,3.,库,(Library),VHDL,语言中的库用来存放已编译过的设计单元,(,包括实体说明、结构体、配置说明、包集合,),,库中内容可以用作其他,VHDL,描述的资源。在,VHDL,语言中,库的说明总是放在设计单元的最前面:,LIBRARY,库名;,3.,库,(Library),在,VHDL,语言中库大致有,5,种:,IEEE,库、,STD,库、,ASIC,向量库、用户定义的库和,WORK,库。除,WORK,库外,其他,4,类库在使用前都要首先进行说明,第一个语句是,LIBRARY,库名,表明使用什么库。另外还要说明设计者要使用的是库中哪一个包集合以及包集合中的项目名。这样第,2,个语句的格式为:,USE,库名,.,程序包名,.,项目名,;,3.3 VHDL,常用语句,VHDL,的描述语句分为并行语句和顺序语句两种。并行语句主要用来描述模块之间的连接关系,顺序语句一般用来实现模型的算法部分。并行语句之间是并行的关系,当某个信号发生变化时,受此信号触发的所有语句同时执行。顺序语句则是严格按照书写的先后次序顺序执行。,3.3.1,并行语句,在,VHDL,语言中,并行语句主要包括:,并行信号赋值语句;,块语句;,进程语句;,过程调用语句;,参数传递语句(也称,GENERIC,语句);,元件例化语句;,生成语句;,并行断言语句。,1.,并行信号赋值语句,在,VHDL,语言中,并行信号赋值语句可分为以下,3,个,子类型:,并发信号赋值语句;,条件信号赋值语句;,选择信号赋值语句。,上面信号赋值语句的共同特点就是语句执行都是并发的。,(1),并发信号赋值语句,并发信号赋值语句在进程内部使用时,它作为顺序语句的形式出现,信号赋值语句在结构体的进程之外使用时,它作为并发语句的形式出现。一个并发信号赋值语句是一个等效进程的简略形式。,若有两个信号赋值语句:,q=,a+b,; -,描述加法器的行为,第,i,行程序,q=a*b; -,描述乘法器的行为。第,i+1,行程序,这个赋值语句是并发执行的,加法器和乘法器独立并行工作。第,i,行和第,i+1,行程序在仿真时都并发处理,从而真实地模拟了实际硬件模块中加法器、乘法器的工作情况。这就是信号赋值语句的并发性问题。,并发信号赋值语句等效一个进程,请分析下面,2,个程序段:,ARCHITECTURE example OF,signal_assignment,IS,BEGIN,q=a AND b AFTER 5 ns; -,信号代入语句,END example;,它的等效的进程可以表述为,:,ARCHITECTURE example OF,signal_assignment,IS,BEGIN,p1:PROCESS(a,b) -,敏感信号,a,,,b,BEGIN,q=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,表达式,n;,【,例,3-11】,用条件信号赋值语句设计四选一数据选择器。,LIBRARY IEEE;,USE IEEE.STD_LOGIC_1164.ALL;,ENTITY mux4 IS,PORT(d0,dl,d2,d3,a,b:IN STD_LOGIC;,q:OUT,STD_LOGIC);,END mux4;,ARCHITECTURE behave1 OF mux4 IS,SIGNAL sel:STD_LOGIC_VECTOR(1 DOWNTO 0);,BEGIN,sel,=b,a; -,经过并置操作,sel,成为二位向量,q=d0 WHEN,sel,=“00” ELSE,d1 WHEN,sel,=“01” ELSE,d2 WHEN,sel,=“10” ELSE,d3 WHEN,sel,=“11” ELSE,Z;,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,dl,d2,d3,a,b:IN STD_LOGIC;,q:OUT,STD_LOGIC);,END mux4;,ARCHITECTURE behave2 OF mux4 IS,SIGNAL,sel:INTEGER,;,BEGIN,WITH,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=0ELSE,2 WHEN a=0AND b=1ELSE,3 WHEN a=1AND b=1ELSE,4;,END behave2;,2.,元件例化语句,用,VHDL,语言实现一个大的系统设计时,层次化设计方法或者层次化设计思想是经常采用的。如果把一个大系统视为一个实体,那么在对这个实体的结构体描述时,除了使用子程序,(,过程和函数,),调用、,BLOCK,块语句之外,,COMPONENT,和,COMPONENT INSTANT,语句的联合使用最能体现结构体描述中的层次化设计思想。,2.,元件例化语句,COMPONENT,语句用来指明结构体所要调用的文件、单元或模块。一般被调用的元件、单元、模块的结构体描述程序都是已编程好的,甚至都是通过逻辑综合、模拟仿真后认为都是最优的。通常把这些已编程好的结构体描述程序视为是现成的元件。单元、模块的程序都存放在某库的程序包中。在进行目标中的结构体描述时,若要用到被调用的元件、单元、模块,只要使用,COMPONENT,语句就可以实现将这些低层元件嵌入到高一层次的结构体中。,2.,元件例化语句,COMPONENT,语句的书写格式如下,:,COMPONENT ,GENERIC ;,PORT ;,END COMPONENT;,COMPONENT INSTANT,语句的书写格式,:, GENERIC MAP (,参数映射,),PORT MAP(,端口映射,);,假设,WORK,库中名为,GATE,的程序包已经存放了一位全加器的,VHDL,程序,其程序如下,:,ENTITY adder is,PORT(a,b,cin:IN,STD_LOGIC;,cout,sum:OUT,STD_LOGIC);,END adder;,ARCHITECTIRE structure OF adder IS,SIGNAL,int:STD_LOGIC,;,BEGIN,int,=a XOR b AFTER 10 ns;,cout,=(a AND b) OR (,int,AND,cin,) AFTER 10 ns;,sum1 AND in GENERATE,middle_cell:adder,PORT MAP(a(i),b(i),carry(i-1),sum(i),carry(i,);,END 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,不连续区间,GENERATE,;,END GENERATE ,标号名,;,3.,生成语句,IF GENERATE,语句的书写形式如下:,标号名,: IF,条件,GENERATE,;,END GENERATE ,标号名,;,【,例,3-14】,用元件例化语句描述由,D,触发器构成移位寄存器的,VHDL,程序。,LIBRARY IEEE;,USE IEEE.STD_LOGIC_1164.ALL;,ENTITY,shift_register,IS,PORT(a,clk:IN,STD_LOGIC;,b:OUT,STD_LOGIC);,END,shift_register,;,ARCHITECTURE,four_bit_shift_register,OF,shift_register,IS,COMPONENT,dff,-,元件例化,dff,PORT(a,clk:IN,STD_LOGIC;,b:OUT,STD_LOGIC);,END COMPONENT;,SIGNAL s:STD_LOGIC_VECTOR(0 TO 4);,BEGIN,s(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,;,【,例,3-15】,用,FOR GENERATE,语句实现电路的,VHDL,程序。,LIBRARY IEEE;,USE IEEE.STD_LOGIC_1164.ALL;,ENTITY,shift_register,IS,PORT(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;,SIGNAL s:STD_LOGIC_VECTOR(0 TO 4);,BEGIN,s(0)=a: -,输入信号代入语句,registerl:FOR,i IN 0 TO 3 GENERATE,dffx: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 IS,GENERIC (,n:INTEGER,:=8);,PORT(a,clk:IN,STD_LOGIC;,b:OUT,STD_LOGIC);,END shift;,ARCHITECTURE,gen_shift,OF shift IS,COMPONENT,dff,PORT(d,clk:IN,STD_LOGIC;,q:OUT,STD_LOGIC);,END COMPONENT;,SIGNAL z:STD_LOGIC_VECTOR(1 TO(n-1);,BEGIN,g1:FOR i IN 0 TO(n-1)GENERATE,u0:IF i=0 GENERATE,dffx:dff,PORT MAP(a,clk,z(i+1);,END GENERATE;,u1:IF i=(n-1) GENERATE,dffx:PORT,MAP(z(i),clk,b,);,END GENERATE;,u2:IF(i /= 0)AND(i /= (n-1)GENERATE,dffx:PORT,MAP(z(i),clk,z(i+1);,END GENERATE;,END GENERATE;,END,gen_shift,;,3.3.2,顺序语句,顺序语句是相对于并行语句而言的。顺序语句的特点是:每一条顺序语句的执行,(,指仿真执行,),顺序是与它们的书写顺序相一致的。顺序语句只能出现在进程,(PROCESS),和子程序中,子程序包括函数,(FUNCTION),和过程,(PROCEDURE),。,顺序语句主要有:,顺序赋值语句;,WAIT,语句;,IF,语句;,CASE,语句;,LOOP,语句;,EXIT,语句;,RETURN,语句;,NULL,语句;,REPORT,语句;断言语句。,1.,顺序赋值语句,(,1,)变量赋值语句,在,VHDL,语言中,变量的说明和赋值只能在,VHDL,语言程序的顺序部分进行说明和使用,也就是只能在进程、过程和函数中进行。变量赋值语句的书写格式为:,目标变量,:=,表达式,;,对于变量赋值语句来说,赋值符号两边的目标变量和表达式的数据类型和长度必须保持一致,否则将会出现编译错误。,在变量赋值语句中,变量的赋值是直接的、立即生效的,因此在变量赋值语句中不允许出现附加延时。,(2),信号赋值语句,信号赋值语句只能在,VHDL,语言程序的并行部分进行说明,但可以用在并行部分,也可以用在顺序部分。,信号赋值语句的书写格式为:,目标信号,=,表达式,;,对于信号赋值语句来说,赋值符号两边的目标信号和表达式的数据类型和长度必须保持一致,否则将会出现编译错误。,在信号赋值语句中,信号赋值的执行和信号值更新之间至少有,DELTA,延时,只有延时过后信号才能够得到新值。,2. WAIT,语句,进程在仿真运行中总是处于两种状态之一:执行或挂起。进程状态的变化受,WAIT,语句控制,当进程执行到,WAIT,语句时就将被挂起,并设置好再次执行的条件。,WAIT,语句可以设置,4,种不同的条件:无限等待、时间到、条件满足以及敏感信号量变化。这几类条件可以混用,其书写格式如下:,WAIT -,无限等待,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,IS,PORT(clk,d:IN,STD_LOGIC;,q:OUT,STD_LOGIC);,END,dff,;,ARCHITECTURE,rtl,OF,dff,IS,BEGIN,PROCESS(clk,),BEGIN,IF (,clkEVENT,AND,clk,=1) THEN,q=d;,END IF;,END PROCESS;,END,rtl,;,3. IF,语句,(,2,),IF,THEN,ELSE,语句,其语句形式如下:,IF,标号,: IF THEN,;,ELSE,;,END IF IF,标号,;,【,例,3-18】,用,IF_THEN_ELSE,语句实现,D,触发至,T,触发器转换的,VHDL,程序。,LIBRARY IEEE;,USE IEEE.STD_LOGIC_1164.ALL;,ENTITY,tff,IS,PORT(T,clk:IN,STD_LOGIC;,q:BUFFER,STD_LOGIC);,END,tff,;,ARCHITECTURE,dff_tff,OF,tff,IS,BEGIN,PROCESS(clk,),BEGIN,IF (,clkEVENT,AND,clk,=1) THEN,IF (T=1) THEN,q=,NOT(q,);,ELSE,q=q;,END IF;,END IF;,END PROCESS;,END,dff_tff,;,3. IF,语句,(3) IF,THEN,ELSIF,ELSE,语句,其语句形式如下:,IF THEN,;,ELSIF THEN,;,ELSIF THEN,;,ELSE,;,END IF,4. CASE,语句,CASE,语句是另一种形式的条件控制语句。,CASE,语句根据条件变量或表达式的取值来选择执行哪个顺序处理语句。,CASE,语句的格式如下:,CASE,表达式,IS,WHEN,表达式的取值,1=,顺序处理语句,1;,WHEN,表达式的取值,2=,顺序处理语句,2;,WHEN OTHERS=,顺序处理语句,n;,END CASE;,【,例,3-19】,用,CASE,语句实现,3-8,线译码器的,VHDL,程序。,LIBRARY IEEE;,USE IEEE.STD_LOGIC_1164.ALL;,ENTITY decoder_3to8 IS,PORT(a,b,c,g1,g2,g3:IN STD_LOGIC;,y:OUT,STD_LOGIC_VECTOR(7 DOWNTO 0);,END decoder_3to8;,ARCHITECTURE,rtl,OF decoder_3to8 IS,SIGNAL indata:STD_LOGIC_VECTOR(2 DOWNTO 0);,BEGIN,indatayyyyyyyyy=“XXXXXXXX”;,END CASE;,ELSE,y=“11111111”;,END IF;,END PROCESS;,END,rtl,;,5. LOOP,语句,LOOP,语句使程序进行有规则的循环,常用的循环语句有,FOR,循环语句,(FOR,LOOP),和,WHILE,循环语句,(WHILE,LOOP),。退出循环使用,EXIT,语句,一旦执行,EXIT,语句,立即退出循环。,(,1,),FOR,LOOP,语句,FOR,LOOP,语句的书写格式如下:,LOOP,标号,: FOR,循环变量,IN,取值范围,LOOP,;,END LOOPLOOP,标号,;,其中循环变量的值在每次循环中都会发生变化,取值范围规定了在循环过程中,循环变量的重复次数。,【,例,3-20】,用,FOR_LOOP,语句描述的,8,位奇偶校验电路程序。,LIBRARY IEEE;,USE IEEE.STD_LOGIC_1164.ALL;,ENTITY,parity_check,IS,PORT(a:IN,STD_LOGIC_VECTOR(7 DOWNTO 0);,y:OUT,STD_LOGIC);,END,parity_check,;,ARCHITECTURE,rtl,OF,parity_check,IS,BEGIN,PROCESS(a,),VARIABLE,tmp:STD_LOGIC,;,BEGIN,tmp,:=0;,FOR i IN 0 TO 7 LOOP,tmp,:=,tmp,XOR,a(i,);,END LOOP;,y=,tmp,;,END PROCESS;,END,rtl,;,5. LOOP,语句,(,2,),WHILE,LOOP,语句,WHILE,LOOP,语句的书写格式如下:,LOOP,标号,: WHILE,条件,LOOP,;,END LOOPLOOP,标号,;,在该循环语句中,如循环条件为真,则执行循环,;,如果条件为假,则结束循环。,【,例,3-21】,用,WHILE_LOOP,语句描述的,8,位奇偶校验电路的程序。,LIBRARY IEEE;,USE IEEE.STD_LOGIC_1164.ALL;,ENTITY,parity_check,IS,PORT(a:lN,S
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!