




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章VHDL硬件描述语言(一)一、基本结构二、语言要素三、顺序语句四、并行语句一、基本结构1、实体2、结构体基本结构VHDL设计VHDL文件库及程序包(Packages)声明在设计或实体中将用到的常数,数据类型,元件及子程序等实体(Entities)
声明到其实体及其设计的接口,即定义本设计的输入/出端口结构体(Architectures)
定义了实体的实现。即电路的具体描述基本结构/举例说明例、一个一位二进制全加器设计。半加器全加器H_ADDERABSOCOABCOSO&&H_ADDERABSOCOH_ADDERABSOCOAINBINCYSUMCINDEFABCF_ADDERAINBINSUMCYCIN基本结构/举例说明/VHDL语言描述或门LIBRARYIEEE;--库,程序包调用USEIEEE.STD_LOGIC_1164.ALL;ENTITYMYOR2IS--实体OR2描述PORT(A,B:INSTD_LOGIC;C:OUTSTD_LOGIC);ENDMYOR2;ARCHITECTUREART1OFMYOR2ISBEGIN--结构体描述C<=AORB;ENDART1;ABC基本结构/举例说明/VHDL语言描述半加器描述LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYH_ADDERIS--实体H_ADDER描述PORT(A,B:INSTD_LOGIC;CO,SO:OUTSTD_LOGIC);ENDH_ADDER;ARCHITECTUREART2OFH_ADDERISBEGIN--结构体描述SO<=(AORB)AND(ANANDB);CO<=NOT(ANANDB);ENDART2;H_ADDERABSOCO基本结构/举例说明/VHDL语言描述全加器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYF_ADDERIS--实体F_ADDER描述PORT(AIN,BIN,CIN:INSTD_LOGIC;CY,SUM:OUTSTD_LOGIC);ENDF_ADDER;ARCHITECTUREART3OFF_ADDERISCOMPONENTH_ADDER--元件调用声明PORT(A,B:INSTD_LOGIC;CO,SO:OUTSTD_LOGIC);ENDCOMPONENT;基本结构/举例说明/VHDL语言描述COMPONENTMYOR2PORT(A,B:INSTD_LOGIC;C:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALD,E,F:STD_LOGIC;--信号申明BEGIN--元件连接申明U1:H_ADDERPORTMAP(A=>AIN,B=>BIN,CO=>D,SO=>E);U2:H_ADDERPORTMAP(A=>E,B=>CIN,CO=>F,SO=>SUM);U3:OR2PORTMAP(A=>D,B=>F,C=>CY);ENDART3;基本结构/举例说明/VHDL语言描述元件连接对照U1:H_ADDERPORTMAP(A=>AIN,B=>BIN,CO=>D,SO=>E);U2:H_ADDERPORTMAP(A=>E,B=>CIN,CO=>F,SO=>SUM);U3:MYOR2PORTMAP(A=>D,B=>F,C=>CY);H_ADDERABSOCOH_ADDERABSOCOAINBINCYSUMCINDEFABC基本结构/举例说明/VHDL语言描述说明该设计包括三个实体OR2——2输入或门;H_ADDER——半加器;F_ADDER——全加器。其中:F-ADDER是顶层实体,其它两个实体(子实体)为顶层实体服务。每个实体含有:库、程序包和结构体。结构体对实体功能进行定义。实体定义的元件可以通过COMPONENT…ENDCOMPONENT元件调用申明,PORTMAP()元件例化,信号SIGNAL的定义以及引脚连线进行元件装配。基本结构/实体VHDL设计VHDL文件程序包(Packages)声明在设计或实体中将用到的常数,数据类型,元件及子程序等实体(Entities)
声明到其他实体及其他设计的接口,即定义本设计的输入/出端口结构体(Architectures)
定义了实体的实现。即电路的具体描述基本结构/实体实体是一个设计实体的表层设计单元,其功能是对这个设计实体与外部电路进行接口描述,它规定了设计单元的输入输出接口信号或引脚,是设计实体经封装后对外的一个通信界面。VHDL表达的所有设计均与实体有关,实体是设计中最基本的模块。实体中定义了该设计所需的输入/输出信号,信号的输入/输出类型被称为端口模式,同时,实体中还定义他们的数据类型。实体说明单元的常用语句结构如下:ENTITY实体名IS【GENERIC(类属表);】【PORT(端口表);】——常用END实体名;基本结构/实体/类属类属(GENERIC)类属参数为设计实体和外部环境之间提供静态数据传输通道,实际上就是整个设计中所要使用的一个常数。一般用来规定端口的大小、I/O引脚的指派、实体中子元件的数目和实体的定时特性。类属参数说明语句必须放在端口说明语句前面。类似于C语言中的“#define”。书写格式如下:GENERIC(常数名:数据类型[:=设定值];常数名:数据类型[:=设定值];…常数名:数据类型[:=设定值]);注意:最后一个类属定义后面,不可加“;”。基本结构/实体/端口端口(PORT)书写格式如下:PORT(端口名:端口模式 数据类型;…端口名:端口模式 数据类型);端口名是赋给每个外部引脚信号的名称,由设计者自行命名,在实体中唯一;端口模式常用的有4种:IN:只可输入的引脚;OUT:只可输出的引脚;INOUT:双向引脚;BUFFER:输出引脚,但同时用作内部输入和反馈。注意:最后一个端口定义后面,不可加“;”。基本结构/实体/举例说明ENTITYMYENTISGENERIC(WIDTH:INTEGER:=16);PORT(CLK:INSTD_LOGIC;ADBUS:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0));ENDMYENT;如果改变了类属WIDTH的值,结构体中所有相关的定义将同时改变,由此将改变整个设计实体的硬件结构。基本结构/结构体VHDL设计VHDL文件程序包(Packages)声明在设计或实体中将用到的常数,数据类型,元件及子程序等实体(Entities)
声明到其他实体及其他设计的接口,即定义本设计的输入/出端口结构体(Architectures)
定义了实体的实现。即电路的具体描述基本结构/结构体结构体是对实体功能的具体描述,因此它一定要跟在实体的后面。一个完整的、能够被综合实现的VHDL设计必须有一个实体和对应的结构体。一个实体和其对应结构体可构成一个完整的VHDL设计。一个实体可对应一个结构体或多个结构体。语句格式如下:ARCHITECTURE结构体名OF实体名IS【定义语句】内部信号、常数、数据类型,函数等的定义GEGIN【并行处理语句】【进程语句】END结构体名;实体名必须是所在设计实体的名字,自行命名结构体名。基本结构/结构体结构体(Architecture)声明区(Declarations)信号声明;声明用于该结构体的类型,常数,元件,子程序。并发语句信号赋值(SignalAssignments)计算结果,并赋值给信号元件例化(ComponentInstantiations)调用另一个实体所描述的电路。即元件调用过程调用(ProcedureCalls)调用一个预先定义好的一个算法。进程(Processes)定义一个新算法实现电路功能。进程中只有顺序语句,语句按放置的顺序执行。基本结构/结构体/举例说明ARCHITECTUREbehaveOFcntm16ISBEGINco<=‘1’when(qcnt=“1111”andci=‘1’)else
‘0’;PROCESS(clk,nreset) --进程(敏感信号表)BEGINIF(nreset='0')THEN--顺序语句qcnt<="0000"; ELSIF(clk'EVENTANDclk='1')THENif(ci='1')thenqcnt<=qcnt+1;endif;ENDIF;
ENDPROCESS;ENDbehave;基本结构/实体与结构体之间的关系整个芯片→一个完整的VHDL设计程序;芯片外部(外壳+引脚)→实体引脚→端口芯片内部(电路)→结构体二、语言要素1、文字规则2、数据对象3、数据类型4、运算符文字规则/关键字关键字——VHDL中有许多保留字,它们在程序中有特殊的含义。设计者不能使用这些关键字作为自己的标识符。ABSDOWNTOLIBRARYPOSTPONEDSRLACCESSSLSELINKAGEPROCEDURESUBTYPEAFTERELSIFLITERALPROCESSTHENALIASENDLOOPPURETOALLENTITYMAPRANGETRANSPORTANDEXITMODRECORDTYPEARCHITECTUREFILENANDREGISTERUNAFFECTEDARRAYFORNEWREJECTUNITSASSERTFUNCTIONNEXTREMUNTILATTRIBUTEGENERATENORREPORTUSEBEGINGENERICNOTRETURNVARIABLEBLOCKGROUPNULLROLWAITBODYGUARDEDOFRORWHENBUFFERIFONSELECTWHILEBUSIMPUREOPENSEVERITYWITHCASEINORSIGNALXNORCOMPONENTINERTIALOTHERSSHAREDXORCONFIGURATIONINOUTOUTSLACONSTANTISPACKAGEALLDISCONNECTLABELPORTSRA文字规则/标识符标识符——由大小写英文字母、阿拉伯数字和下划线组成使用时注意以下几点:VHDL不区分大小写;标识符必须以字母开头;下划线不能放在结尾;下划线不能连用;不能使用关键字;不同的综合系统还定义了各自的子程序,子程序名也不能作为标识符。例如:合法:rs_a_1、show_new_state、COUT不合法:2as、_ab1、a__cd、out文字规则/数字型文字整数文字:都是十进制的数例如:456,134E2(=13400),8_123_456_789,0注意:“_”——为了提高数字的可读性,相当于一个空的间隔符,没有其它意义,不影响数值。实数文字:十进制数+小数点例如:23.4,1_234.567,123.45E-2(=1.2345),0.0以数制基数表示的文字:基数:2~16进制基数(十进制数)#数值文字#E指数(十进制数,若是0可省略),例如10#170#=170×1002#1111_1110#=254×2016#E#E1=16#E0#=224=14×16116#F.01#E+2=16#F01#=3841.00文字规则/字符串型文字字符——用‘’引起来的ASCII字符,可以是数值、符号和字母。字符串——是一维的字符数组,必须放在“”中。VHDL中有两种类型的字符串:文字字符串——用“”引起来的一串文字。例如“VHDLSYMBOL”、“abcd”数位字符串——也称位矢量、位串,是被“”引起来的数字序列,其前加上数制基数说明符,实际上是预定义的数据类型BIT的一维数组。例如二进制:B“0110_1110”八进制:O“117”十六进制:X“FFE0”文字规则/下标名及下标段名下标名——指示数组型变量或信号的某一个元素;类似于C语言中的数组元素的表示方法。下标段名——指示数组型变量或信号的某一段元素。语句格式如下:数组型变量或信号名(表达式1【TO/DOWNTO表达式2】);TO表示数组下标序列由低到高DOWNTO表示数组下标序列由高到低例如:SIGNALA,B,C:BIT_VECTOR(0TO7);SIGNALY:BIT;Y<=B(3);--单个元素赋值C(0TO3)<=A(4TO7);--分段赋值C(4TO7)<=A(0TO3);--分段赋值文字规则/文法格式关键字和标识符的大小写格式等同,即不区分大小写;注释是以“--”(双短横线)开始,只对本行有效;每一条语句以“;”结束,在文本的一行中,可以写多条语句,一般只写一条语句;除关键字和标识符的自身中间不能插入空格外,其它地方可插入任意数目的空格。数据对象/信号信号——是一种用于连接并发要素(例如元件、进程及并发赋值语句)的对象,相当于原理图或电路板上用于连接元件的导线。从信号说明的位置来分,可分为:端口信号和内部信号。内部信号声明语法格式:SIGNAL信号名:数据类型【:=初始值】;例如:SIGNALbusa:STD_LOGIC_VECTOR(15DOWNTO0):=(OTHERS=>‘Z’);注意:“:=”表示对信号赋初值,可用于仿真,不用于综合。信号使用的两种方法:在两个元件之间使用信号传递信息——导线;信号赋值语句。格式为:目标信号名<=表达式;信号可看作是一个数值容器,既可容纳当前值,又可保持历史值。信号赋值存在延时。数据对象/变量变量——VHDL顺序语句中存放中间值的对象。变量声明语法格式如下:VARIABLE变量名:数据类型【:=初始值】;例如:VARIABLEDET:BIT:=‘0’;变量赋值格式:目标变量名:=表达式;例如:y:=a+b;变量只能在进程、函数和过程中使用,属于局部对象。变量赋值立即有效,不产生延时。数据对象/变量/信号与变量的区别声明形式不同。信号声明关键字为SIGNAL;而变量为VARIABLE。声明位置不同。信号声明在在子程序、进程外部;而变量在子程序、进程内部。赋值符号不同。信号赋值符为“<=”;变量赋值符为“:=”。在进程中,信号赋值在进程结束时起作用,而变量赋值是立即起作用。即在一个进程中多次为一个信号赋值,只有最后一个会起作用,而当为变量赋值时,变量的值立即改变。数据对象/变量/信号与变量的区别例如:ARCHITECTUREARTOFSIGISSIGNALD:STD_LOGIC;BEGIN PROCESS(A,B,C) BEGIN D<=A; X<=CANDD; D<=B; Y<=CANDD; ENDPROCESS;ENDART;ARCHITECTUREARTOFVARISBEGIN PROCESS(A,B,C)
VARIABLED:STD_LOGIC; BEGIN D:=A; X<=CANDD; D:=B; Y<=CANDD; ENDPROCESS;ENDART;X<=CANDB;Y<=CANDBX<=CANDA;Y<=CANDB数据对象/常量常量——是一个固定的值,在整个仿真期间其值不能改变,一旦赋值就不能再改变。常量说明格式如下:CONSTANT常量名:类型说明:=表达式;例如:CONSTANTSTEP:INTEGER:=2;常量一般在结构体描述、程序包说明、实体说明、过程说明、函数调用说明和进程说明中使用。常量声明可以放在设计的任意位置,但作用范围不同。全局常量:声明放在外部程序包内;若限制再某个程序段内,则应该将声明放在相应的结构体、块、进程和子程序内。数据类型VHDL具有很强的数据类型,是一种强类型语言。VHDL语言的数据类型的定义相当严格,不同类型之间的数据不能直接代入,即使数据类型相同,位长不同时也不能直接代入。在VHDL标准中描述了四种数据类型:标量类型、复合类型、存取类型、文件类型。在VHDL中,除了很多预定义的数据类型可直接使用外,用户还可以自定义数据类型。预定义的VHDL数据类型在VHDL的标准程序包STANDARD和STD_LOGIC_1164及其它的标准程序包中作了定义,并可在设计中随时调用;用户自定义的数据类型以及子类型的基本元素一般仍属于VHDL的预定义数据类型。注意:VHDL综合器并不支持所有的预定义和自定义数据类型。如:REAL、TIME、FILE、ACCES等。数据类型/VHDL预定义数据类型VHDL预定义数据类型都是在VHDL标准程序包STANDARD种定义的,在使用时已经自动包含进VHDL的源文件中,所以不必通过USE语句调用。布尔(BOOLEAN)数据类型——枚举类型两种可能取值:TRUE(真)和FALSE(假)预定义:TYPEBOOLEANIS(FALSE,TRUE);位(BIT)数据类型——枚举类型两种可能取值:‘1’和‘0’预定义:TYPEBITIS(‘0’,‘1’);位矢量(BIT_VECTOR)数据类型——基于BIT类型的数组预定义:TYPEBIT_VECTORIS
ARRAY(NATURAL<>)OFBIT;使用位矢量必须注明位宽。例如:SIGNALABUS:BIT_VECTOR(7TO0);数据类型/VHDL预定义数据类型字符(CHARACTER)数据类型用‘’引起来,区分大小写。整数(INTEGER)类型:正整数、负整数和零。32位,最大取值范围:-231~231VHDL仿真器——有符号处理;VHDL综合器——有符号处理。自然数(NATURAL)和正整数(POSITIVE)数据类型SUBTYPENATURALISINTEGERRANGE0TOINTEGER’HIGH;SUBTYPEPOSITIVEISINTEGERRANGE1TOINTEGER’HIGH;实数(REAL)数据类型:有正负,有小数点。TYPEREALISRANGE-1.0E+38TO+1.0e+38;数据类型/VHDL预定义数据类型字符串(STRING)数据类型时间(TIME)数据类型——物理类型物理单位定义格式:TYPE物理类型名IS范围;UNITS基本单位;单位;ENDUNITS;错误等级类型数据类型/IEEE预定义标准逻辑位与矢量在IEEE库的程序包STD_LOGIC_1164中定义了两个非常重要的数据类型。标准逻辑位STD_LOGIC数据类型——常用预定义:TYPESTD_LOGICIS(‘U’,‘X’,‘0’,‘1’,‘Z’,‘W’,‘L’,‘H’,‘-’);——枚举类型‘U’-初始值,‘X’-不定,‘0’-0,‘1’-1,‘Z’-高阻,‘W’-弱信号不定,‘L’-弱信号0,‘H’-弱信号1,‘-’-不可能情况。程序包STD_LOGIC_1164中定义了STD_LOGIC型逻辑运算符AND、NAND、OR、NOR和NOT的重载函数,以及用于BIT与STD_LOGIC相互转换的函数。标准逻辑矢量STD_LOGIC_VECTOR数据类型——常用预定义:TYPESTD_LOGIC_VECTORISARRAY(NATURALRANGE<>)OFSTD_LOGIC;同位宽、同数据类型的矢量间才能相互赋值。数据类型/其它预定义标准数据类型在IEEE库的程序包STD_LOGIC_ARITH中定义了另三种数据类型。无符号(UNSIGNED)型:用于无符号数运算预定义:TYPEUNSIGNEDISARRAY(NATRUALRANGE<>)OFSTD_LOGIC;例如:VARIABLEA:UNSIGNED(0TO8);有符号(SIGNED)型:用于有符号数运算预定义:TYPESIGNEDISARRAY(NATRUALRANGE<>)OFSTD_LOGIC;例如:VARIABLEA:SIGNED(0TO8);A(0)是符号位小整型(SMALL_INT)预定义:TYPESMALL_INTISINTEGERRANGE0TO1;数据类型/用户自定义数据类型用户定义的数据类型的一般格式:TYPE数据类型名IS数据类型定义【OF基本数据类型】;SUBTYPE子类型名IS基本数据类型RANGE约束范围;枚举(ENUMERATED)类型格式:TYPE数据类型名IS(元素,元素,…);例:TYPEweekIS(Sun,Mon,Tue,wed,Thu,Fri,Sat);例:TYPESTD_LOGICIS(‘U’,‘X’,’0’,‘1’,‘Z’,‘W’,‘L’,‘H’,‘-’);整数(INTEGER)类型格式:TYPE数据类型名IS数据类型定义约束范围例:TYPEdigitISINTEGERRANGE0TO9数据类型/用户自定义数据类型实数(REAL)类型格式:TYPE数据类型名IS数据类型定义约束范围例:TYPEcurrentISREALRANGE-1E4TO1E4数组(ARRAY)类型格式:TYPE数据类型名ISARRAY范围OF原数据类型名;例:TYPEwordISARRAY(1TO8)OFSTD_LOGIC;时间(TIME)类型格式:TYPE数据类型名IS范围UNITS基本单位单位;ENDUNITS;数据类型/用户自定义数据类型记录(RECODE)类型将不同的数据类型放在一块,就是记录类型数据。格式:TYPE数组类型名ISRECORD元素名:数据类型名;元素名:数据类型名;…ENDRECORD;数据类型/数据类型转换函数/程序包说明STD_LOGIC_1164包
TO_STDLOGICVECTOR(A)由BIT_VECTOR转换成STD_LOGIC_VECTORTO_BITVECTOR(A)由STD_LOGIC_VECTOR转换成BIT_VECTORTO_LOGIC(A)由BIT转换成STD_LOGICTO_BIT(A)由STD_LOGIC转换成BITSTD_LOGIC_ARITH包CONV_STD_LOGIC_VECTOR(A,位长)由INTEGER,UNSIGNED和SIGNED转换成STD_LOGIC_VECTORCONV_INTEGER(A)由UNSIGNED和SIGNED转换成INTEGERSTD_LOGIC_UNSIGNED包CONV_INTEGER(A)STD_LOGIC_VECTOR转换成INTEGER运算符优先级类型运算符说明运算符说明低逻辑AND与NOR或非OR或XOR异或NAND与非XNOR同或关系=等于<=小于等于/=不等于>大于<小于>=大于等于加减+加法-减法并置&并置符号+正号-负号乘法*乘法/除法MOD求模REM求余其它**指数ABS绝对值NOT非SLL逻辑左移SRL逻辑右移SLA算术左移高SRA算术右移ROL循环左移ROR循环右移运算符/并置运算符&——组合操作数构建一个数组。操作数可以是数值型数据也可以是一个数组或一个数组元素,常用于字符串和位串的连接或数组的合并与修改。例如SIGNALx1,x2:BIT_VECTOR(7DOWNTO0);SIGNALy1:BIT_VECTOR(3DOWNTO0);SIGNALy2:BIT;SIGNALz1:BIT_VECTOR(15DOWNTO0);SIGNALz2:BIT_VECTOR(11DOWNTO0);SIGNALz3:BIT_VECTOR(8DOWNTO0);z1<=x1&x2;z2<=x2&y1;z3<=x2&y2;运算符/移位运算符SLA——算术左移,SRA——算术右移方法:空缺位用当前位补充。例如:x=10101110;y1<=xSLA3;y2<=xSRA5;结果:y1=01110000,y2=11111101。SLL——逻辑左移,SRL——逻辑右移方法:空缺位用‘0’补充。例如:x=10101110;y1<=xSLL3;y2<=xSRL5;结果:y1=01110000,y2=00000101。ROL——循环左移,ROR——循环右移方法:空缺位用移出位补充。例如:x=10101110;y1<=xROL3;y2<=xROR5;结果:y1=01110101,y2=01110101。三、顺序语句1、赋值语句2、分支控制语句3、循环控制语句4、同步控制语句5、其它语句顺序语句顺序语句——只能用在进程和子程序中,它和其他高级语言一样,其语句是按照语句的出现的顺序加以执行的。进程语句本身是一个并行语句,但在进程内部的所有语句都是顺序语句;子程序包括函数和过程,也是由一系列顺序语句构成。顺序语句/赋值语句信号赋值目的信号量<=信号量表达式;变量赋值目的变量:=表达式;注意:在进程内,信号和变量具有根本的行为差别。变量赋值立即生效;信号赋值不能立即生效,直到相应的进程被挂起。顺序语句/分支控制语句IF语句简单IF语句结构格式:IF条件THEN顺序执行语句ENDIF;例如:D触发器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDIS PORT(CP,D:INSTD_LOGIC; Q:OUTSTD_LOGIC);ENDD;ARCHITECTUREARTOFDISBEGINPROCESS(CP)BEGINIFCP‘EVENTANDCP='1'THENQ<=D;ENDIF;ENDPROCESS;ENDART;顺序语句/分支控制语句/IF语句双路选择结构格式:IF条件THEN顺序执行语句1ELSE顺序执行语句2ENDIF;例如:二选一LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux21ISPORT(d0,d1,sel:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux21;ARCHITECTUREartOFmux21ISBEGINPROCESS(d0,d1,sel)BEGINIFsel='1'THENq<=d1;ELSEq<=d0;ENDIF;ENDPROCESS;ENDart;顺序语句/分支控制语句/IF语句多路选择结构格式:IF条件THEN顺序执行语句ELSIF条件THEN顺序执行语句…ELSIF条件THEN顺序执行语句ELSE顺序执行语句ENDIF;例如:四选一LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYMUX41ISPORT(DIN:INSTD_LOGIC_VECTOR(3DOWNTO0);SEL:INSTD_LOGIC_VECTOR(1DOWNTO0);Q:OUTSTD_LOGIC);ENDmux41;ARCHITECTUREARTOFmux41ISBEGINPROCESS(DIN,SEL)BEGINIFSEL=“00”THENQ<=DIN(0);ELSIFSEL=“01”THENQ<=DIN(1);ELSIFSEL=“10”THENQ<=DIN(2);ELSEQ<=DIN(3);ENDIF;ENDPROCESS;ENDART;顺序语句/分支控制语句/CASE语句CASE语句从许多不同语句的序列中选择其中之一执行。——类似C语言中的“switch”。CASE表达式ISWHEN条件表达式1=>顺序处理语句1;…WHEN条件表达式n=>顺序处理语句n;WHENOTHERS=>顺序处理语句n+1ENDCASE;其中WHEN的条件表达式可以有3种形式:WHEN值=>顺序处理语句WHEN值|值|值|…|值=>顺序处理语句WHEN值TO值=>顺序处理语句注意:各个条件表达式必须相互排斥。顺序语句/分支控制语句/CASE语句例如:四选一数据选择器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYMUX41ISPORT(DIN:INSTD_LOGIC_VECTOR(3DOWNTO0);SEL:INSTD_LOGIC_VECTOR(1DOWNTO0);Q:OUTSTD_LOGIC);ENDmux41;ARCHITECTUREARTOFmux41ISBEGINPROCESS(DIN,SEL)BEGINCASESELISWHEN“00”=>Q<=DIN(0);WHEN“01”=>Q<=DIN(1);WHEN“10”=>Q<=DIN(2);WHENOTHERS=>Q<=DIN(3);ENDPROCESS;ENDART;区别:IF语句:条件有先后之分CASE语句:没有先后之分顺序语句/循环控制语句/LOOP语句FORLOOP结构——固定循环次数【标号:】FOR循环变量IN循环下限TO循环上限LOOP顺序语句序列ENDLOOP【标号】;说明:循环次数由循环上下限决定;循环变量的值从循环下限开始,每循环一次自动指向下一个循环变量值;当循环变量值大于循环上限时循环结束;对FORLOOP结构,默认循环变量位i,不用声明。顺序语句/循环控制语句/LOOP语句例:8位奇偶校验电路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYCRC8ISPORT(x:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDCRC8;ARCHITECTUREARTOFCRC8ISBEGINPROCESS(x)VARIABLEtmp:STD_LOGIC;BEGINtmp:='0';FORiIN0TO7LOOPtmp:=tmpXORx(i);ENDLOOP;y<=tmp;ENDPROCESS;ENDART;FORiIN0TO7LOOPIFx(i)=‘1’THENtmp:=NOTtmp;ENDIF;ENDLOOP;顺序语句/循环控制语句/LOOP语句WHILELOOP结构【标号:】WHILE条件LOOP顺序处理语句ENDLOOP【标号】;
在该语句中,如果条件为真,则进行循环,否则结束循环。适合于仿真,综合比较困难。例:8位奇偶校验电路PROCESS(x)VARIABLEtmp:STD_LOGIC;BEGINtmp:='0';i:=0;WHILEi<8LOOPtmp:=tmpXORx(i);ENDLOOP;y<=tmp;ENDPROCESS;顺序语句/循环控制语句/LOOP语句无限循环语句——不常用【标号:】LOOP…EXITWHEN(条件表达式);ENDLOOP;当括号中的条件表达式为真时,退出循环。顺序语句/循环控制语句/EXIT语句EXIT语句,用于LOOP语句中实现提前终止循环。类似于C语言中的“break;”。语法格式有三种:EXIT;EXIT标号;EXIT标号WHEN条件表达式;例如:PROCESS(a)VARIABLEint_a:INTEGER;BEGINint_a:=aFORiIN0TO31LOOPIF(int_a<=0)THEN
EXIT;ELSEint_a:=int_a-1;q(I)<=3.1416/REAL(a*i);ENDIFENDLOOP;y<=q;ENDPROCESS;顺序语句/循环控制语句/NEXT语句NEXT语句用于LOOP语句中跳出本次循环,直接进入下一循环周期。类似于C语言中的“continue;”。NEXT【标号】【WHEN条件表达式】;例如:PROCESS(a,b)CONSTANTmax_limit:INTEGER:=255BEGINFORiIN0TOmax_limitLOOPIF(done(i)=TRUE)THENNEXT;ELSEdone(i):=TRUE;ENDIF;q(i)<=a(i)ANDb(i);ENDLOOP;ENDPROCESS;顺序语句/同步控制语句进程在仿真运行中总是处于两种状态:执行或挂起。进程状态的变化受到同步控制语句——WAIT语句的制约,当进程执行到等待语句时,被挂起,并设置好再次执行的条件。WAIT语句适合于仿真,不适合于综合。WAIT语句根据条件的不同可分为4类:WAIT;——无限等待,不常用WAITON信号【,信号,…】;——敏感信号量变化WAITUNTIL条件表达式;——条件满足WAITFOR时间表达式;——时间到顺序语句/同步控制语句WAITON信号【,信号,…】;——敏感信号量变化例如注意:这两种方式等价,但不能同时使用。如果PROCESS语句已有敏感信号量列表,则在进程中不能再使用WAITON语句,反之就不能有敏感信号量列表。PROCESS(a,b)BEGINy<=aANDb;ENDPROCESS;PROCESSBEGINy<=aANDb;WAITONa,b;ENDPROCESS;顺序语句/同步控制语句格式:WAITUNTIL条件表达式;当进程执行到该语句时,被挂起;若条件表达式为真时,进程将被启动,继续执行WAITUNTIL后面的语句。例PROCESSBEGINRESET_LOOP:LOOPWAITUNTILCLK’EVENTANDCLK=‘1’;NEXTRESET_LOOPWHEN(RESET=‘1’);ENDLOOPRESET_LOOP;ENDPROCESS;注意:WAITUNTIL语句隐含一个敏感信号列表,就是条件表达式所包含的信号,任何一个敏感信号发生改变时,就立即对条件表达式进行测试。顺序语句/同步控制语句格式:WAITFOR时间表达式;当进程执行到该语句时,被挂起;经过时间表达式所指定的等待时间以后,进程将被启动,程序就开始继续执行WAITFOR语句后面的语句。例如PROCESSBEGINWAITFOR30ns;CLK1<=NOTCLK1;ENDPROCESS;注意:如果时间表达式的值为0,则WAITFOR就相当于无限循环语句,电路仿真时将出现死机现象。顺序语句/同步控制语句多条件WAIT语句例:WAITONnmi,interruptUNTIL((nmi=TRUE)OR(interrupt=TRUE))FOR5us;该等待有三个条件:第一,信号nmi和interrupt任何一个有一次刷新动作;第二,信号nmi和interrupt任何一个为真;第三,等待5us。只要一个以上的条件被满足,进程就被启动。超时等待若在程序中所设置的等待条件永远不会满足,则进程就永远不能启动。为防止进入无限等待情况,应做一些处理。顺序语句/子程序调用语句在进程中允许对子程序进行调用。——顺序语句子程序包括过程和函数,可以在VHDL的结构体或程序包中的任何位置对子程序进行调用。过程调用过程名【(【形参1名=>】实参1,【形参2名=>】实参2,…【形参n名=>】实参n)】;注意:形参与实参的关联方法有两种:位置关联法——上面去掉“【形参名=>】”;名字关联法——如上面的形式。函数调用与过程调用相似,调用函数将返回一个指定数据类型的值,函数的参量只能式输入值。顺序语句/其它语句断言语句(ASSERT)ASSERT条件表达式【REPORT错误信息】【SEVERITY错误级别】;执行到断言语句时,判断条件。若条件满足就继续执行,否则输出错误信息和错误级别信息。例如:ASSERT(tiaojian=‘1’)REPORT“somethingwrong”SEVERITYERROR;空语句(NULL)格式:NULL;在有些情况下不需要执行任何动作,就可以用空语句。四、并行语句1、进程语句2、块语句3、并行信号赋值语句4、并行过程调用语句5、元件例化语句6、生成语句并行语句/进程语句进程(PROCESS)格式:【进程标号:】PROCESS(【敏感信号表】)【进程说明区】BEGIN【进程程序区】ENDPROCESS【进程标号】;在一个结构体中多个PROCESS语句可以同时并行的执行,该语句有如下特点:可以和其它进程语句同时执行,并可以存取结构体和实体中所定义的信号;进程中的所有语句都按照顺序执行;为启动进程,在进程中必须包含一个敏感信号表或WAIT语句;进程之间的通信是通过信号量来实现的。并行语句/进程语句ARCHITECTUREARTOFCNT12ISSIGNALQ:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALRST,DLY:STD_LOGIC;BEGINCOUT<=NOTQ(3)ANDDLY;RST<='1'WHENQ=12ORCLR='1'ELSE '0';QOUT<=Q;PROCESS(CLK,RST)BEGINIFRST='1'THENQ<="0000";ELSIFCLK'EVENTANDCLK='1'THENDLY<=Q(3);IFENA='1'THENQ<=Q+1;ENDIF; ENDIF;ENDPROCESS;ENDART;并行语句/块语句块(BLOCK)语句是一个并行语句,而它所包含的一系列语句也是并行语句,这些并行语句的执行与次序无关。标号:BLOCK块头【声明语句】;BEGIN【并行处理语句】;ENDBLOCK标号名;块头——主要用于信号的映射及参数的定义,通常通过GENERIC语句、GENERICMAP以及PORT和PORTMAP语句来实现;声明语句——与结构体的声明语句相同,主要是对该块所要用到的客体进行声明。可以声明的项目有USE子句、子程序声明及子程序体、类型声明、常数声明、信号声明、元件声明等。并行语句/块语句例如:BLK1:BLOCKGENERIC(GB1,GB2:TIME);GENERICMAP(GB1=>L-TIME,GB2=>S-TIME);PORT(PB1:INBIT;PB2:INOUTBIT);PORTMAP(PB1=>B1,PB2=>A1);CONSTANTDELAY:TIME:=1ms;SIGNALS1:BIT;BEGINS1<=PB1AFTERDELAY;PB2<=S1AFTERGB1,B1AFTERGB2;ENDBLOCKBLK1;并行语句/块语句B1:BLOCKSIGNALS:BIT;BEGINS<=AANDB;B2:BLOCKSIGNALS:BIT;BEGINS<=AANDB;B3:BLOCKBEGINZ<=S;ENDBLOCKB3;ENDBLOCKB2;Y<=S;ENDBLOCKB1;注意:BLOCK语句可以嵌套,内层BLOCK能够使用外层BLOCK所声明的信号,而外层BLOCK不能使用内层BLOCK中声明的信号。并行语句/并行信号赋值语句简单信号赋值语句格式:信号名<=表达式【AFTERTIME】;信号赋值语句在进程中使用是顺序语句,但是在进程外即在结构体中使用就是并行语句。当赋值号“<=”右边表达式中的信号发生变化时,赋值语句被激活。可见,一条并行信号赋值语句相当于一个进程。例如:两个等价ARCHITECTUREARTOFa_varISBEGINOutput<=a(I);ENDART;ARCHITECTUREARTOFa_varISBEGINPROCESS(a,I)BEGINOutput<=a(I);ENDPROCESS;ENDART;并行语句/并行信号赋值语句条件信号赋值语句格式:目标信号量<=表达式1WHEN条件表达式1ELSE表达式2WHEN条件表达式2ELSE…表达式nWHEN条件表达式n;注意:最后一行中的“条件表达式n”可以写作“OTHERS”,以确保WHEN子句能够覆盖所有可能的条件;所列出的条件有一个隐含的优先级,先列出的优先级最高,最后给出的条件优先级最低。并行语句/并行信号赋值语句/条件信号赋值语句例如:四选一电路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux41ISPORT(i0,i1,i2,i3,a,b:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux41;ARCHITECTUREaOFmux414ISSIGNALsel:STD_LOGIC_VECTOR(1DOWNTO0);BEGINsel<=b&a;q<=i0WHENsel="00"ELSEi1WHENsel="01"ELSEi2WHENsel="10"ELSEi3WHENOTHORS;ENDa;并行语句/并行信号赋值语句选择信号赋值语句WITH选择条件表达式SELECT目标信号量<=表达式1WHEN选择条件1表达式2WHEN选择条件2…表达式nWHEN选择条件n;注意:最后一行中的“选择条件n”可以写作“OTHERS”,以确保WHEN子句能够覆盖所有可能的条件;选择信号赋值语句没有隐含的优先级。并行语句/并行信号赋值语句/选择信号赋值语句例如:四选一电路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux41ISPORT(SEL:INSTD_LOGIC_VECTOR(1DOWNTO0);DIN:INSTD_LOGIC_VECTOR(3DOWNTO0);Q:OUTSTD_LOGIC);ENDmux41;ARCHITECTUREbOFmux41ISBEGINWITHSELSELECTQ<=DIN(0)WHEN“00”,DIN(1)WHEN“01”,DIN(2)WHEN“10”,DIN(3)WHENOTHERS;ENDb;并行语句/并行过程调用语句并行过程调用语句出现在结构体内,是一种可以在进程之外执行的过程调用语句。——并行语句过程调用语句可以并发执行,但要注意如下问题:并行过程调用是一个完整的语句,在它之前可以加标号;并行过程调用语句应带有IN,OUT或INOUT的参数,他们应该列在过程名后的括号内;并行过程调用可以有多个返回值,但其必须通过过程中所定义的输出参数带回;结构体内的并行过程调用语句也由敏感信号量(括号内的输入参数)的变化来启动。与进程相比不同之处在于:过程的内容(过程内部的顺序语句)可以保留在别处,在整个设计内可以重复使用。并行语句/元件例化语句元件例化就是对元件的调用。元件声明格式:COMPONENT元件实体名PORT(元件端口信息);ENDCOMPONENT;元件例化格式:元件标号:实体名(元件名)PORTMAP(接口信号实参表);元件标号是指所定义的元件例化的名称;实体名(元件名)是以前设计的实体,或者是在零件库中所包含的元件;接口信号实参表用来建立端口名和实体内信号的映射关系,,一般有三种方式:位置映射、名称映射和混合映射。并行语句/元件例化语句例如:COMPONENTAND2PORT(X,Y:INBIT;Z:OUTBIT);ENDCOMPONENT;…SIGNALA,B,C:BIT;…U1:AND2PORTMAP(A,B,C);--位置映射U2:AND2PORTMAP(X=>A,Y=>B,Z=>C);--名称映射U3:AND2PORTMAP(A,B,Z=>C);--混合映射并行语句/生成语句生成(GENERATE)语句提供了一种简便的方法来创建并发语句的0个或多个范例。语句格式如下:格式一:用于规则结构的设计标号名:FOR变量IN范围GENERATE【并发处理语句】ENDGENERATE
【标号名】;范围:整型表达式1TO/DOWNTO整型表达式2。变量:默认是I。
格式二:用于不规则结构的设计标号名:IF条件GENERATE【并发处理语句】ENDGENERATE【标号名】;并行语句/生成语句例如:…COMPONENTCOMPPORT(X:INSTD_LOGIC;Y:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALA,B:STD_LOGIC_VECTOR(0TO7);…GEN:FORIINA’RANGEGENERATEU1:COMPPORTMAP(X=>A(I),Y=>B(I));ENDGENERATEGEN;谢谢观看/欢迎下载BYFAITHIMEANAVISIONOFGOODONECHERISHESANDTHEENTHUSIASMTHATPUSHESONETOSEEKITSFULFILLMENTREGARDLESSOFOBSTACLES.BYFAITHIBYFAITH一本万利工程1、背景驱动2、盈利策略3、选菜试菜4、价值创造5、完美呈现6、成功面试7、持续改造(一)、一本万利工程的背景驱动
1、什么是一本万利
2、餐饮时代的变迁菜单经验的指导方针运营市场定位的体现经营水平的体现体现餐厅的特色与水准沟通的工具餐厅对顾客的承诺菜单承诺的六大表现1、名字的承诺2、质量的承诺3、价格的承诺4、规格标准的承诺5、外文翻译的准确6、保证供应的承诺
1、顾客满意度餐厅价值、价格、合理感、愉快感、安心感、美味感、便利感、满足感、有价值感、喜悦感、特别感2-2、初期投资餐厅面积、保证金、设备投资、店铺装潢、器具用品投资、制服选定、菜单制作2-1、开业准备厨具、供应商选定、设计、用品选定、餐厅配置、员工训练、餐厅气氛、促销方式3、经营数据营业额、客流量、成本率、人均消费、顾客回头率、出品速度、人事费用菜单内容决定决定相关相关决定决定决定决定以菜单为导向的硬件投资
1、餐厅的装修风格2、硬件设施服务操作3、餐厅动线4、餐具与家俬5、厨房布局6、厨房设备菜单设计正果1、能诱导顾客购买你想让他买的餐点2、能迅速传达餐厅要表达的东西3、双赢:顾客喜欢、餐厅好卖餐厅时代的变迁食物时代硬体时代软体时代心体时代食物食品饥食饱食品质挑食品味品食品德惧食体验人们正在追寻更多的感受,更多的意义更多的体验,更多的幸福(二)盈利策略1、组建工程团队2、确定核心价值3、确定盈利目标4、确定客单价5、设计盈利策略6、确定核心产品谁来设计菜单?产品=做得出来的物品商品=卖得出去的物品商家=产品具备商品附加值物(什么产品)+事(满足顾客何种需求)从物到事从食物到餐饮从吃什么到为什么吃产品本身决定一本,产品附加值决定万利从生理到心理从物质到精神从概念到五觉体验创造产品的五觉附加值体验何来
一家企业以服务为舞台以商品为道具,让消费者完全投入的时候,体验就出现了PART01物=你的企业卖什么产品+事=能满足顾客何种需求?确定核心价值理念核心价值理念1、卖什么样的菜2、卖什么样的氛围?3、如何接待顾客?卖给谁?卖什么事?卖什么价?企业目标的设定1、理论导向的目标设定2、预算3、制定利润目标费用营业额亏损区利润区临界点变动费用总费用营业额曲线费用线X型损益图利润导向的目标设定确定目标设定营业收入=固定成本+目标利润1-变动成本率-营业税率例:A餐厅每月固定成本40万,变动成本50%,营业税率5.5%,目标利率每月8万,问A餐厅的月营业收入:月营收入=(40+8)÷(1-50%-5.5%)=48÷0.445=108万测算损益平衡点保本线=固定成本1-变动成本率-营业税率例:A餐厅保本线=40÷(1-50%-5.5%)
=40÷0.445
=90万定价的三重意义2、向竞争对手发出的信息和信号1、是利润最大化和最重要的决定因素3、价格本事是价值的体现定价由此开始1、评估产品、服务的质量2、寻求顾客价值与平衡点3、以价值定义市场确定客单价盈利占比策略
占比策略内部策略销售占比占比策略内部策略10%40%10%20%20%(三)、选菜试菜1、ABC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年vfp测试题及答案
- 2025年中级地质勘查试题及答案
- 2025年保安三级考试试题及答案
- 2025年郑大微积分试题及答案
- 2025年质量员之土建质量专业管理实务通关考试题库带答案解析
- 2025年龙南小学面试题及答案
- 2025年神经焦虑测试题及答案
- 2025年上海设计面试题及答案
- 2026版高考化学一轮总复习考点突破第二章物质的量第7讲一定物质的量浓度溶液的配制考点2配制一定物质的量浓度溶液及误差分析
- 2025年建筑工程技术人员招聘题目及答案
- 2025-2030全球集装箱绑扎系统行业调研及趋势分析报告
- 人教版小学英语单词表(打印版)
- 防鼠疫知识培训
- 足浴城租赁合同范例
- 《安全监察概论》课件
- 玻璃屋顶漏水维修施工方案
- 2025年中考历史复习专项训练:中国近代史材料题40题(原卷版)
- 有限空间作业气体检测记录表
- 广东省房屋建筑工程竣工验收技术资料统一用表讲解(2024版)恒智天成软件
- 北京市知识产权局所属事业单位2024年招聘工作人员笔试历年典型考题及考点剖析附带答案详解
- 2024年广西交通投资集团招聘历年(高频重点提升专题训练)共500题附带答案详解
评论
0/150
提交评论