VHDL入门•QUARTUSII要求文件名与实体名相同•取名规则–不要使用VHDL关键字来命名用户自己的定义–VHDL实体名只能以英文字母开头,后面跟英文字母或数字或下划线,连续两个减号为注释符–字母大小写无关注意事项VHDL基本组成VHDL设计文件的基本组成部分实体Entity结构体Architecture配置Configuration包集合Package库Library完整的VHDL程序实体部分描述设计系统的外部接口信号(即输入/输出信号)结构体用于描述系统的内部电路配置用于从库中选取所需元件安装到设计单元的实体中包集合存放各设计模块能共享的数据类型、常数、子程序等库用于存放已编译的实体、结构体、包集合和配置VHDL程序基本结构•库Library–存放已编译的实体、结构体、配置、包集合•实体Entity–描述系统的外部接口信号–端口说明:名称,类型,方向•结构体Architecture–描述系统的行为,结构形式实体表达ENTITY实体名ISGENERIC(类属参数表);PORT(端口表);ENDENTITY实体名;端口表端口名:端口模式数据类型;端口名:端口模式数据类型大小写无关,同一条语句中的几个端口名之间用逗号分隔。语句结尾用分号分隔,末一个不要分号。例:PORT(A,B,S:INBIT;Y:OUTBIT);端口模式INOUTINOUTBUFFER数据类型BITINTEGERBOOLEANSTD_LOGIC与文件名同GENERIC说明可省,外部环境与实体之间的通信,用于规定端口大小,元件数量等元件说明COMPONENTlpm_counterGENERIC(lpm_direction:STRING;lpm_modulus:NATURAL;lpm_port_updown:STRING;lpm_type:STRING;lpm_width:NATURAL);PORT(clock:INSTD_LOGIC;cout:OUTSTD_LOGIC;q:OUTSTD_LOGIC_VECTOR(4DOWNTO0));ENDCOMPONENT;元件例化cout=sub_wire0;q=sub_wire1(4DOWNTO0);lpm_counter_comp:lpm_counterGENERICMAP(lpm_direction=UP,lpm_modulus=10,lpm_port_updown=PORT_UNUSED,lpm_type=LPM_COUNTER,lpm_width=26)PORTMAP(clock=clock,cout=sub_wire0,q=sub_wire1);例将参数化计数模块例化成十进制累加计数器PORT说明端口模式inininoutoutbufferinoutmodemodeCOMPONENTPORT说明端口模式•例s是元件内部的信号正确错误s=a;a=s;b=s;s=b;s=c;c=s;Ifs=‘1’thend=a;Elseb=d;a:inb:outc:bufferd:inout标准数据类型VHDL提供的10种标准数据类型•Integer(整数)。取值范围为-(231-1)~(231-1)。一个整数类型和要被综合进逻辑的信号或变量在其范围上应有约束。例如:variablea:integerrange–255to255;•Real(实数)。取值范围为-1.0E+38~+1.0E+38。和整数一样,实数能被约束。由于实数运算需要大量的资源,因此综合工具常常并不支持实数类型。•Bit(位)。只有两种取值,即‘0‘和‘1’,可用于描述信号的取值。•Bit_Vector(位矢量)。是用双引号括起来的一组数据,每位只有两种取值:0和1。在其前面可加以数制标记,如X(16进制)、B(2进制、默认)、O(8进制)等。位矢量常用于表示总线的状态。标准数据类型Cont.Character(字符)。是用单引号括起来的一个字母、数字、空格或一些特殊字符(如$、@、%等)。字符区分大、小写字母。•String(字符串)。是用双引号括起来的一个字符序列。字符串区分大、小写字母。常用于程序的提示和结果说明等。•Time(时间)。时间的取值范围从-(231-1)~(231-1)。时间由整数值、一个以上空格以及时间单位组成。常用的时间单位有:fs、ns、μs、ms、s、min、hr等。时间常用于指定时间延时和标记仿真时刻。综合工具对时间量不支持•Boolean(布尔量).又称逻辑量。有TRUE(真)、FALSE(假)两种状态。用于关系运算和逻辑运算标准数据类型Cont.•Natural(自然数)和Positive(正整数)。是整数类型的子类型。自然数取值范围为0~(231-1);正整数是大于0的整数。•SeverityLevel(错误等级)。错误等级分为:NOTE(注意)、WARNING(警告)、ERROR(出错)、FAILURE(失败)四级,用于仿真时提示系统的错误等级。以上数据类型是VHDL种标准的数据类型,在编程时可以直接引用。如果用户需使用其它的数据类型,则必须调用相应的库或进行自定义。标准数据类型数据类型含义整数整数32位,取值范围:-(231-1)~(231-1)实数浮点数,取值范围:-1.0e+38~1.0e+38位逻辑’0’或’1’位矢量位矢量,用双引号括起来的一组数据布尔量逻辑“真”或“假”,用TRUE和FALSE标记字符ASCII字符字符串字符矢量时间时间单位fs,ps,ns,μs,ms,sec,min,hr自然数、正整数整数的子集:自然数取值范围为0~(231-1);正整数是大于0的整数错误等级Note,warning,error,failureSTD_LOGIC数据类型IEEE库STD_LOGIC_1164程序包中定义,STD_LOGIC类型和STD_LOGIC_VECTOR类型。STD_LOGIC类型的数据可以具有九种取值’U’:初始值’X’:不定态’0’:强制0’1’:强制1’Z’:高阻态’W’:弱信号不定态’L’:弱信号0’H’:弱信号1’-’:不可能情况(可忽略值)大写STD_LOGIC数据类型•STD_LOGIC_1164约定LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;标准位型STD_LOGIC‘0’,‘1’,‘Z’高阻,‘X’不定……九值标准位矢量型STD_LOGIC_VECTOR(上边界DOWNTO下边界)设计库和标准程序包•库和包库包内容IEEESTD_LOGIC_1164数据类型STD_LOGIC,STD_LOGIC_VECTORIEEESTD_LOGIC_SIGNED使用STD_LOGIC_VECTOR形态的函数如同有符号数据类型IEEESTD_LOGIC_UNSIGNED使用STD_LOGIC_VECTOR形态的函数如同无符号数据类型IEEESTD_LOGIC_ARITH使用转换函数CONV_INTEGERCONV_SIGNEDCONV_UNSIGNED工作库WORK位于当前工程目录下设计库和标准程序包LIBRARYieee;USEieee.std_logic_1164.all;库程序包数据类型的转换•在VHDL程序中,不同类型的对象不能代入,因此要进行类型转换。类型转换的方法有:–类型标记法。用类型名称来实现关系密切的标量类型之间的转换。例如:VARIABLEx:INTEGER;VARIABLEy:REAL;赋值语句使用类型标记实现类型转换:x:=INTEGER(y);y:=REAL(x)。数据类型的转换Cont.•类型函数法.VHDL程序包中提供了多种转换函数,使得某些类型的数据之间可以相互转换,以实现正确的赋值操作。常用的类型转换函数有:–CONV_INTEGER():将STD_LOGIC_VECTOR类型转换成INTEGER类型。由STD_LOGIC_UNSIGNED程序包定义–CONV_STD_LOGIC_VECTOR():将INTEGER类型、UNSIGNED类型或SIGNED类型转换成STD_LOGIC_VECTOR类型。由STD_LOGIC_ARITH程序包定义–TO_BIT():将STD_LOGIC类型转换成BIT类型。由STD_LOGIC_1164程序包定义–TO_BIT_VECTOR():将STD_LOGIC_VECTOR类型转换BIT_VECTOR类型。–TO_STD_LOGIC():将BIT类型转换成STD_LOGIC类型。–TO_STD_LOGIC_VECTOR():将BIT_VECTOR类型转换成STD_LOGIC_VECTOR类型。运算符•算术运算符:包括一元算术运算符和二元算术运算符。–一元算术运算符:+(正号)、—(负号)、ABS(求绝对值)–二元算术运算符:+、—、*、/、MOD(求模)、REM(求余)、**(指数运算)运算符•关系运算符:=、/=、<、<=、>、>=•逻辑运算符:包括一元逻辑运算符和二元逻辑运算符。一元逻辑运算符包括:NOT二元逻辑运算符包括:AND、OR、NAND、NOR、XOR•并置运算符:&,用于将多个位连接成为位矢量–例如:DBUS<=D0&D1&D2&D3,即DBUS<=(D0,D1,D2,D3)运算符•运算符的优先级顺序为:NOT、ABS、**;REM、MOD、/、*;—(负)、+(正);&、—(减)、+(加);>=、<=、>、<、/=、=;XOR、NOR、NAND、OR、AND•在编写VHDL程序时,必须保证操作数的数据类型与运算符所要求的数据类型一致操作符•VHDL中的操作符:=赋值符:用于将数据传给信号。:=赋值符:用于将数据传给变量。该赋值符也用于为信号、变量、常量等指定初值。=符号:在WHEN语句中出现,其含义是“THEN(则)”。结构体表达ARCHITECTURE结构体名OF实体名IS[说明语句]BEGIN(功能描述语句)ENDARCHITECTURE结构体名;可省略相同结构体•结构体由一个以上的并发语句组成。每个并发语句表示一个功能单元,多个并发语句实现的硬件与书写顺序无关。ARCHITECTURE结构体名OF实体名ISBEGIN--并发语句A--并发语句B--…………END结构体名;并发语句种类并发信号赋值语句=条件信号赋值语句WHEN选择信号赋值语句SELECT进程语句PROCESS………(赋值即代入)(并发即并行)所有并发语句都是并发(平行、同时)执行的,与书写顺序无关信号赋值语句•并发信号赋值语句信号量=敏感信号量表达式;例:S=AXORB;C=AANDB;C=AANDB;S=AXORB;这两条语句实现的硬件是同时执行,与书写的先后次序无关下列语句错误:S=AXORB;S=AANDB;错误原因:对同一个信号多重并发驱动Error:Can'tresolvemultipleconstantdriversfornetS赋值符号和数据比较符号•赋值符号=•赋值符号两边数据类型、取值范围必须严格保持一致条件信号赋值•条件信号赋值语句目标信号=表达式1WHEN条件1ELSE表达式2………WHEN条件2ELSE表达式N;C=AXORBWHENS='1'ELSEAANDB;WHENELSE条件赋值•可以放在进程中也可以放在进程外•顺序性:条件测试按书写的先后顺序进行•优先级:书写在先的语句优先级高d=awhenp1=‘1’elsebwhenp2=‘1’elsec;当P1=‘1’,P2=‘1’时,输出的是第一个条件WHENELSE条件赋值关于“优先级”举例:74LS1488/3优先编码器ABCDEFGHY优先级XXXXXXX0000最高XXXXXX01001XXXXX011010XXXX0111011XXX01111100XX011111101X011111111001111111111最低例74LS1488/3优先编码器y=000whenh='0'else001wheng='0'else010whenf