第八章-VHDL状态机_第1页
第八章-VHDL状态机_第2页
第八章-VHDL状态机_第3页
第八章-VHDL状态机_第4页
第八章-VHDL状态机_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章VHDL结构电子信息工程学院董素鸽主要内容VHDL实体、结构体VHDL子程序VHDL库VHDL程序包VHDL配置VHDL文字规则VHDL数据类型VHDL操作符8.1/8.2VHDL实体结构体设计实体为电路描述的整体,包含实体和结构体。设计库结构体实体设计实体子程序8.3VHDL子程序子程序(SUBPROGRAM)是一个VHDL程序模块。该模块利用顺序语句来完成定义和某些算法描述。(类似于进程)子程序可以作为一个模块被定义在程序包、结构体和进程中。子程序函数过程定义调用8.3.1VHDL函数用户自定义函数和库中预定义函数自定义函数格式FUNCTION函数名(参数表)RETURN数据类型

--函数首FUNCTION函数名(参数表)RETURN数据类型IS--函数体

[说明部分]BEGIN

顺序语句ENDFUNCTION函数名;在进程或结构体中定义的函数不必定义函数首,在程序包中必须定义函数首索引实物Mux21“*”如何定义函数?如何使用定义好的函数?

例8-1在程序包中定义一个函数Libraryieee;Useieee.std_logic_1164.all;Packagepackexpis--定义程序包

functionmax(a,b:in

std_logic_vector)--定义函数首

returnstd_logic_vector;functionfunc1(a,b,c:real)--定义函数首

returnreal;function“*”(a,b:integer)--定义函数首

returninteger;functionas2(signalin1,in2:real)--定义函数首

returnreal;End;函数首放在程序包的声明部分,建立一个程序包中函数的索引例8-1函数体的定义Packagebodypackexpisfunctionmax(a,b:in

std_logic_vector)--定义函数体

returnstd_logic_vectorisbeginifa>bthenreturna;elsereturnb;endif;endfunctionmax;end;函数体的定义放在程序包的内容声明部分例8-1函数调用部分Libraryieee;Useieee.std_logic_1164.all;Usework.packexp.all;EntityaxampisPort(data1,data2:instd_logic_vector(3downto0);data3,data4:instd_logic_vector(3downto0);out1,out2:outstd_logic_vector(3downto0));end;Architecturebhvofaxampisbeginout1<=max(data1,data2);process(data3,data4)beginout2<=max(data3,data4);endprocess;end;调用函数,可顺序,可并行例8-2

在结构体中定义和调用函数实例LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYfuncISPORT(a:INSTD_LOGIC_VECTOR(0TO2);m:OUTSTD_LOGIC_VECTOR(0TO2));ENDENTITYfunc;ARCHITECTUREdemoOFfuncISFUNCTIONsam(x,y,z:STD_LOGIC)RETURNSTD_LOGICISBEGINRETURN(xANDy)ORz;ENDFUNCTIONsam;BEGIN

PROCESS(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));ENDPROCESS;ENDARCHITECTUREdemo;函数体的定义放在architecture和begin之间函数定义及调用总结1、在程序包中定义函数用PACKAGE声明一个程序包,并将所要定义的函数的函数首放在程序包声明部分,创建索引。该程序包包含在默认工程工作库WORK中在程序包结构部分定义函数的函数体在设计实体中打开声明的程序包,在电路描述时调用函数2、在结构体中定义的函数在ARCHITECTURE和BEGIN之间定义函数体在电路描述中调用函数8.3.2VHDL重载函数运算符的重载--如何由来?重载函数,即允许所定义的函数具有相同的函数名,但函数中定义的操作数具有不同的数据类型。以操作数数据类型区分的同名函数称为重载函数(OVERLOADEDFUNCTION)重载函数如何定义和使用重载函数?

例8-3重载函数定义及调用实例LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEpackexpISFUNCTIONmax(a,b:IN

STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTOR;FUNCTIONmax(a,b:IN

BIT_VECTOR)RETURNBIT_VECTOR;FUNCTIONmax(a,b:IN

INTEGER)RETURNINTEGER;END;例8-3函数体定义部分PACKAGEBODYpackexpISFUNCTIONmax(a,b:INSTD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTORISBEGINIFa>bTHENRETURNa;ELSERETURNb;ENDIF;ENDFUNCTIONmax;FUNCTIONmax(a,b:ININTEGER)RETURNINTEGERISBEGINIFa>bTHENRETURNa;ELSERETURNb;ENDIF;ENDFUNCTIONmax;FUNCTIONmax(a,b:INBIT_VECTOR)RETURNBIT_VECTORISBEGINIFa>bTHENRETURNa;ELSERETURNb;ENDIF;ENDFUNCTIONmax;END;例8-3函数调用部分LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEWORK.packexp.ALL;ENTITYaxampISPORT(a1,b1:INSTD_LOGIC_VECTOR(3DOWNTO0);a2,b2:INBIT_VECTOR(4DOWNTO0);a3,b3:ININTEGERRANGE0TO15;c1:OUTSTD_LOGIC_VECTOR(3DOWNTO0);c2:OUTBIT_VECTOR(4DOWNTO0);c3:OUTINTEGERRANGE0TO15);END;ARCHITECTUREbhvOFaxampISBEGIN

c1<=max(a1,b1);

c2<=max(a2,b2);

c3<=max(a3,b3);END;运算符的重载VHDL不允许不同数据类型的操作数间直接操作或运算。当对不同数据类型的操作数运算时,怎么办?在程序包STD_LOGIC_UNSIGNED中预定义了运算符重载函数,这些函数对不同数据类型间的操作数运算做了定义。在使用运算符重载函数时,打开STD_LOGIC_UNSIGNED程序包即可运算符重载函数长什么样?没有调用函数如何进行函数重载?例8-4函数名即运算符,因此,在不同数据类型操作时,运算符本身已经暗含了函数的调用调用运算符重载函数,打开IEEE.STD_LOGIC_UNSIGNED程序包WHY?8.3.3VHDL转换函数VHDL是一种强类型语言,当数据类型不一致时,需要转换一致才能给信号赋值或完成各种运算操作。对于强类型语言,需要预定义类型转换函数,在操作数类型不一致时,调用类型转换函数。在VHDL的IEEE库中,预定义了很多类型转换函数,主要是数据类型转换函数。如需VHDL库以外的新的转换函数,则需要用户自己定义。VHDL预定义转换函数

表8-1IEEE库类型转换函数表VHDL预定义转换函数使用实例

例8-5LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYexgIS

PORT(a,b:INBIT_VECTOR(3DOWNTO0);q:OUTSTD_LOGIC_VECTOR(3DOWNTO0));END;ARCHITECTURErtlOFexgISBEGINq<=TO_STDLOGICVECTOR(aANDb);END;例8-6用户自定义转换函数

例8-70-255自然数转换为8位二进制数例8-7自定义转换函数的调用实例8.3.4VHDL决断函数决断函数用于解决信号被多个驱动源驱动时,驱动信号间的竞争问题。决断函数通过决断条件来确定多驱动源的信号具体被哪一个驱动源驱动。8.3.5VHDL过程函数子程序过程过程与函数有诸多相似之处,但也有不同过程的定义,调用方法VHDL过程定义过程的定义也分为过程首和过程体过程语句的格式:PROCEDURE过程名(参数表)--过程首PROCEDURE过程名(参数表)IS[说明部分]BEGIN--过程体

顺序语句;ENDPROCEDURE过程名;同函数一样,在结构体和进程中定义的过程不需要过程首,而在程序包中必须定义过程首。VHDL过程中的参数表函数定义参数表:functionmax(a,b:in

std_logic_vector)--输入参数表returnstd_logic_vector;--返回值(输出)过程定义参数表:PROCEDUREpro1(VARIABLE

a,b:INOUTREAL);PROCEDUREpro2(CONSTANTa1:ININTEGER;

VARIABLE

b:OUTINTEGER);PROCEDUREpro3(SIGNAL

sig:INOUTBIT);VHDL过程参数表参数类型:数据对象常数,变量,信号参数工作模式:IN,OUT,INOUT工作模式:默认为IN参数类型:模式为IN时,默认为常量,模式为INOUT或OUT时,默认为变量VHDL过程的定义

例8-8例8-9VHDL过程的调用顺序调用和并行调用顺序调用相当于在顺序语句中插入了一条顺序语句并行调用相当于一个进程,当过程体中定义的任一IN或INOUT的目标参量发生改变时,将启动过程。VHDL过程定义及调用实例

例8-10例8-10调用部分区别于函数调用c1<=max(a1,b1);8.3.6VHDL重载过程两个或两个以上有相同的过程名不同的参数表的过程成为重载过程(OVERLOADEDPROCEDURE)PROCEDUREcalcu(v1,v2:INREAL;SIGNALout1:INOUTINTEGER);PROCEDUREcalcu(v1,v2:ININTEGER;SIGNALout1:INOUTREAL);…calcu(20.15,1.42,sign1);calcu(23,320,sign2);…8.3.7子程序调用语句子程序调用包含函数调用和过程调用过程调用与函数调用的区别:过程调用直接将过程名及参数表作为一条语句使用函数调用是将函数作为一个一条语句中的一个因子,即一个操作数或者是一个赋值源等。在实际的工程开发中,子程序的定义与调用一般分别进行,子程序首和子程序体的定义放在公共的程序包中,调用者打开程序包即可调用子程序。过程调用格式过程调用格式:过程名[([形参名=>]实参表达式{,[形参名=>]实参表达式})];两种关联方式:名字关联法和位置关联法PROCEDUREcalcu(v1,v2:INREAL;SIGNALout1:INOUTINTEGER);calcu(v1=>20.15,v2=>1.42,out1=>sign1);--名字关联calcu(20.15,1.42,sign1);--位置关联过程调用完成的工作:1、传递输入参数给形参2、执行该过程3、传递输出的形参给对应的实参过程调用实例

例8-12例8-12例8-13过程调用实例2

顺序调用8.3.8并行过程调用语句例8-15对例8-15中定义的过程进行调用子程序定义及调用总结函数、过程的定义、调用函数与过程相同点函数与过程不同点函数、过程的定义总结均可以定义在程序包,结构体或进程中在程序包中定义的函数或过程需要有函数首或过程首,在结构体和进程中定义的不需要有函数首或过程首在程序包中定义函数或过程,首先在声明程序包部分定义函数首或过程首在函数包体部分描述函数体或过程体在结构体中定义的函数或过程定义在ARCHITECTURE和BEGIN之间函数、过程定义的不同函数定义的参数表均为输入参数,函数输出参数以返回值的形式functionmax(a,b:in

std_logic_vector)--输入参数表returnstd_logic_vector;--返回值(输出)过程定义参数表可以为输入和输出参数,过程没有返回值,输出直接通过输出参数传递PROCEDUREpro1(VARIABLE

a,b:INOUTREAL);函数、过程的调用总结定义在程序包中的函数或过程,在调用前将程序包打开定义在结构体或进程中的函数或过程,直接调用函数和过程的调用都可以是并行调用或顺序调用函数的调用作为语句因子出现c1<=max(a1,b1);过程的调用单独为一条语句calcu(20.15,1.42,sign1);END8.4VHDL库VHDL库:存放预定义的数据类型,子程序,设计实体等公共信息包的仓库设计库:用户设定的文件目录所对应的WORK库资源库:常规元件和标准模块存放的库IEEESTDWORKVITALIEEE库最常用的设计库,包含有IEEE标准的程序包和其他一些支持工业标准的程序包STD_LOGIC_1164STD_LOGIC_ARITHSTD_LOGIC_SIGNEDSTD_LOGIC_UNSIGNEDIEEE库不是VHDL的标准库,使用时,需显式打开STD库存放标准程序包和文件操作相关的程序包的库STANDARDTEXTIO(文件输入输出程序包)STD库符合VHDL标准,默认打开,不必显式打开WORK库存放用户设计和定义的一些设计单元和程序包的库,用户自己的工作库默认为用户设计工程存放的文件夹该库不允许设定在根目录下,因此每一个工程必须对应一个文件夹该库默认打开,不需显式打开VITAL库该库中存放了仿真精度相关的程序包,使用VITAL库可以提高门级仿真时的精度VITAL_TIMINGVITAL_PRIMITIVED一般不需要打开此库库的用法放在实体设计的最前面需要显式打开的库用LIBRARY关键词打开用USE语句调用库中的程序包USE库名.程序包名.项目名;(打开程序包中的特定项目)USE库名.程序包名.ALL;(打开程序包中的所有项目)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.STD_ULOGIC;USEIEEE.STD_LOGIC_1164.RISING_EDGE;使用USE库名.程序包名.ALL;这种方法会极大的浪费时间和资源WHY?库的用法最好的库设置方法是自定义一个资源库,把以往相关的设计资料分类装入自建的资源库备用WORK库只作为当前的设计库,每次设计前把与当前设计相关的资料装入WORK中,包括标准库的有用资料。复制资料源程序到WORK库所在的文件夹,编译即可用。USEWORK.STD_LOGIC_1164.ALL;8.5VHDL程序包预定义程序包:存放VHDL预定义好的数据类型,子程序,元器件等用户自定义程序包:用户自己设计的用于存放公共的数据类型,子程序,元器件等的包程序包的基本组成:常数说明VHDL数据类型说明元件定义子程序程序包的结构程序包分程序包首和程序包体程序包结构:PACKAGE程序包名IS--程序包首

程序包首说明部分END程序包名;PACKAGEBODY程序包名IS--程序包体

程序包体说明部分及包体内容END程序包名;程序包体为非必须内容,当程序包中没有元件和子程序说明时,不需要有程序包体几个主要的预定义程序包STD_LOGIC_1164最常用的程序包,定义了常用的基本数据类型、子类型和函数的定义STD_LOGIC_ARITH扩展了三个新的数据类型,定义了相关的算术运算符和数据类型转换函数STD_LOGIC_UNSIGNEDSTD_LOGIC_SIGNED定义有符号和无符号相关的运算操作符STANDSRD定义基本的数据类型,子类型和函数TEXTIO文件输入输出操作相关程序包程序包应用实例例8-16程序包定义方法及定义内容例8-17无程序包体的程序包定义及使用先定义,再打开,再使用程序包中的内容8.6VHDL配置为设计实体指定结构体或为例化元件实体制定希望的结构体一个设计实体可以对应不同的结构体,通过配置可以验证不同结构体的优劣配置格式:CONFIGURATION配置名OF实体名IS配置说明END配置名;实例8.7VHDL文字规则数字字符串标识符下标名8.7VHDL文字规则数字:整数:十进制数5,678,0,156E2=1560045_234_287=45234287实数:带有小数点的数(不可综合)1.335,88_607_551.453_90944.99E-2以数制基数表示的数字:基数#数据#10#170#16#FE#字符串字符是用单引号括起来的ASCII字符,可以是数值,也可以是符号或字母‘R’,‘a’,‘*’,‘Z’,‘11’,‘0’字符串是一维的字符数组,需放在双引号中字符串有数位字符串和文字字符串文字字符串“ERROR”,“BothSandQequalto1”数位字符串基数符“数据”B“1_1101_1110”O“15”X“AD0”标识符标识符是常数,变量,信号,端口,子程序或参数的名字等书写规则:有效字符包括26个大小写英文字母,数字0-9,以及下划线“_”只能以英文字母起始字母不分大小写下划线不能连用下标名下标名用于只是数组型变量或信号的某一元素标识符(表达式)y<=a(m);z<=a(3)如果下标名的表达式不是具体的数值,可能会造成不可计算,资源浪费也较大,因此,如不是必须,尽量不使用未知表达式做下标名8.8VHDL数据类型VHDL数据类型有预定义数据类型和自定义数据类型VHDL数据类型可以分为4大类:标量型:实数、整数、枚举、时间复合类型:数组型,记录型存取类型:为数据对象提供存取方式文件类型:提供多值存取类型预定义数据类型布尔(BOOLEAN)类型TYPEBOOLEANIS(FALSE,TURE);位(BIT)数据类型TYPEBITIS(‘0’,‘1’);位矢量(BIT_VECTOR)类型TYPEBIT_VECTORISARRAY(NATURALRANGE<>)OFBIT;预定义数据类型字符(CHARACTER)类型用单引号括起来,区分大小写,‘B’,‘b’整数(INTEGER)类型有符号,无符号整数,用RANGE限定范围实数(REAL)类型浮点数,1.6,只能仿真,不能综合。用数字电路表示浮点数常困难预定义数据类型字符串(STRING)类型用双引号标明,可以综合时间(TIME)类型VHDL中唯一的预定义物理数据类型,只能用于仿真,不能综合文件(FILES)类型传输大量数据时一般使用文件类型,比如时序仿真的激励信号和仿真波形输出等,在TEXTIO程序包中定义了文件I/O传输方法8.8.2IEEE预定义标准逻辑位与矢量1.标准逻辑位STD_LOGIC数据类型9种取值2.标准逻辑矢量STD_LOGIC_VECTOR数据类型数组型数据类型IEEE库不是VHDL的标准库,因此在IEEE中定义的这两个数据类型在使用时要显式打开其所在的库和程序包8.8.3其他预定义标准数据类型在程序包STD_LOGIC_ARITH中定义了三个新的数据类型,分别是:无符号型(UNSIGNED)有符号型(SIGNED)小整型(SMALL_INT)对于无符号数,所有位都是有效数据为,对于有符号数,最左位为符号位UNSIGNED(0TO10)“10000000001”=1025SIGNED(0TO10)“10000000001”=-18.8.4VHDL数组类型一维多维(综合器只支持一维)数组元素:任何一种数据类型数组长度:可以限定,可以非限定TYPE数组名ISARRAY(数组范围)OF数据类型;TYPE数组名ISARRAY(数组下标名RANGE<>)OF数据类型;例8-18,8-19,8-20例8-18LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYampISPORT(a1,a2:INBIT_VECTOR(3DOWNTO0);c1,c2,c3:INSTD_LOGIC_VECTOR(3DOWNTO0);b1,b2,b3:INTEGERRANGE0TO15;d1,d2,d3,d4:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDamp;…d1<=TO_STDLOGICVECTOR(a1ANDa2);--(1)d2<=CONV_STD_LOGIC_VECTOR(b1,4)WHENCONV_INTEGER(b2)=9elseCONV_STD_LOGIC_VECTOR(b3,4);--(2)d3<=c1WHENCONV_INTEGER(c2)=8ELSEc3;--(3)d4<=c1WHENc2=8elsec3;--(4)…例8-19LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYdecoder3to8ISPORT(input:INSTD_LOGIC_VECTOR(2DOWNTO0);output:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDdecoder3to8;ARCHITECTUREbehaveOFdecoder3to8ISBEGINPROCESS(input)BEGINoutput<=(OTHERS=>'0');output(CONV_INTEGER(input))<='1';ENDPROCESS;ENDbehave;例8-20FUNCTIONTo_bit(s:std_ulogic;xmap:BIT:='0')RETURNBIT;FUNCTIONTo_bitvector(s:std_logic_vector;xmap:BIT:='0')RETURNBIT_VECTOR;FUNCTIONTo_bitvector(s:std_ulogic_vector;xmap:BIT:='0')RETURNBIT_VECTOR;下面是转换函数To_bitvector的函数体:FUNCTIONTo_bitvector(s:std_logic_vector;xmap:BIT:='0')RETURNBIT_VECTORISALIASsv:std_logic_vector(s'LENGTH-1DOWNTO0)ISs;VARIABLEresult:BIT_VECTOR(s'LENGTH-1DOWNTO0);BEGINFORiINresult'RANGELOOPCASEsv(i)ISWHEN'0'|'L'=>result(i):='0';WHEN'1'|'H'=>result(i):='1';WHENOTHERS=>result(i):=xmap;ENDCASE;ENDLOOP;RETURNresult;END;8.9VHDL操作符逻辑操作符(LogicOperator)关系操作符(RelationalOperator)算术操作符(ArithmeticOperator)符号操作符(SignOperator)VHDL操作符使用规则严格遵循在基本操作符间操作数是同数据类型的规则当操作数数据类型不同时,要使用运算符的重载严格遵循操作数的数据类型必须与操作符所要求的数据类型完全一致的规则VHDL操作符优先级逻辑运算符使用规则:1、位宽要相等2、运算符相同且为AND,OR,XOR时,不需要加括号,其余情况需要加括号例8-21SIGNALa,b,c:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALd,e,f,g:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALh,I,j,k:STD_LOGIC;SIGNALl,m,n,o,p:BOOLEAN;...a<=bANDc;--b、c相与后向a赋

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论