VHDL的语言要素.ppt

上传人:小飞机 文档编号:6522930 上传时间:2023-11-08 格式:PPT 页数:41 大小:270.50KB
返回 下载 相关 举报
VHDL的语言要素.ppt_第1页
第1页 / 共41页
VHDL的语言要素.ppt_第2页
第2页 / 共41页
VHDL的语言要素.ppt_第3页
第3页 / 共41页
VHDL的语言要素.ppt_第4页
第4页 / 共41页
VHDL的语言要素.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《VHDL的语言要素.ppt》由会员分享,可在线阅读,更多相关《VHDL的语言要素.ppt(41页珍藏版)》请在三一办公上搜索。

1、本章内容提要 VHDL 的标识符 数据对象 数据类型 运算操作符,第3章 VHDL的语言要素,3.1 VHDL的标识符,标识符是最常用的命名符,标识符可以是常数、变量、信号、端口、子程序、实体、结构体的名称等;VHDL的标识符有两种,基本标识符(VHDL87版)和扩展标识符(VHDL93版)。VHDL93版对VHDL87版的标识符语法规则进行了扩展,形成了VHDL93版的标识符语法规则,以反斜杠“”界定,VHDL基本标识符的命名必须遵循如下规则:基本标识符由字母、数字和下划线组成 第一个字符必须是字母 最后一个字符不能是下划线 不允许连续2个下划线 保留字(关键字)不能用于标识符 大小写是等效

2、的下面是合法的标识符:Decoder_1,fft,sig_N,state,aaa,一、基本标识符,扩展标识符用反斜杠来界定,可以以数字打头;例:74ls173,controller_docode 都是合法的标识符允许包含图形符号和空格;例:$500&T,A OR B 都是合法的标识符允许多个下划线相邻;例:out_entity 是合法的标识符扩展标识符区分大小写,且与短标识符不同;例:adder,Adder,adder是不同的标识符扩展标识符的名字如果含有一个反斜杠,则用相邻的两个反斜杠来代表它;例:text表示该扩展标识符的名称是text,二、扩展标识符,VHDL的保留字(VHDL87版),

3、3.2 VHDL的数据对象,凡是可以被赋值的对象就称为数据对象。VHDL中有以下4类数据对象:变量(VARIABLE)常量(CONSTANT)信号(SIGNAL)文件*(FILE)包含在VHDL93 标准中,变量和常量与其它计算机高级语言中所说的变量和常量是一致的,而信号则是VHDL特有的数据对象;在电子电路设计中,这3类对象通常具有一定的物理含义,信号对应的代表数字电路中的一根硬件连接线;常数对应于数字电路中的电源和地等;变量无直接的对应关系,通常只用来暂时的保存某些信号的值。,对象声明的一般格式,对象类型 对象名:数据类型:=初始值 CONSTANT INTEGER VARIABLE BI

4、T SIGNAL,CONSTANT 常量名:数据类型:=表达式;说明:常量名的命名遵循VHDL标识符的命名规则;常量在设计中一旦被赋值就不能再改变;常量的数据类型可以是标量型和复合型,但不能是文件型和存取型(Access);常量可以在实体、结构体、程序包、进程、块和子程序的说明部分中被定义。常量的使用范围取决于它被定义的位置。,一、常量(CONSTANT),1.常量声明格式:,CONSTANT VCC:REAL:=5.0;CONSTANT PI:REAL:=3.14;CONSTANT DELAY_time:TIME:=10 ns;CONSTANT ROM_size:INTEGER:=16#FF

5、FF#;,2.常量声明示例:,二、变量(VARIABLE),1.变量的声明格式:VARIABLE 变量名:数据类型 约束条件:=初始值;2.变量的赋值格式:目标变量名:=表达式;说明:变量允许多次赋值,且赋值立即生效,不能产生附加延时(它是一种理想化的数据传输过程);变量定义时允许设置初始值,但在综合时,综合器将略去所有的初始值;对变量进行赋值时,目标变量可以是单值变量,也可以是数组型变量;在VHDL中,变量只能在进程和子程序(过程和函数)中使用,它是一个局部量。,3、变量使用示例:,VARIABLE x,y,z:INTEGER;VARIABLE COUNT:INTEGER RANGE 0 T

6、O 255:=10;VARIABLE a,b:BIT_VECTOR(0 to 7);b:=”1010101”;a:=b;a(3 to 6):=(1,1,0,1);-注意赋值符号两边的位宽必须相等a(0 to 5):=b(2 to 7);a(7):=0;注意上例中对数组中单个元素赋值和多个元素赋值时的差异。,信号是VHDL语言独有的数据对象,信号相当于电路中元件之间的连线,或者认为是电路内部的某一节点。信号除了没有数据流动方向的说明以外,其它性质与实体的端口概念是一致的。,1.信号声明格式:SIGNAL 信号名:数据类型 约束条件:表达式;2.信号赋值格式:信号名=表达式;,三、信号(SIGNA

7、L),信号的赋值符号是“=”,但赋初值符号也是“:=”;信号没有方向性:可以被赋值,也可被读取;信号通常在实体、结构体和包集合中定义,但不能在进程和子程序中定义;信号赋值不是立即发生的,需要经过一个特定的延时量后才有效;在进程中,只能将信号列入敏感表,而不能将变量列入敏感表;在一个进程中,允许对同一信号有多个驱动源(即对其进行多次赋值),但只有最后的赋值语句有效;,信号的使用说明:,library ieee;use ieee.std_logic_1164.all;use;entity test isport(a,b:in integer range 0 to 7;c,d:out integer

8、 range 0 to 15);end entity test;architecture behav of test is signal cc,dd:integer range 0 to 15;beginprocess(a,b)begin cc=a+b;-赋值语句不会执行 dd=a-b;cc=a-b;-最后一个赋值语句有效 c=cc;d=dd;end process;end behav;,3、信号的使用示例:多个驱动源对同一信号赋值,定义了两个信号cc,dd,MAX+plusII警告:Found multiple assignments to the same signal in a Proc

9、ess Statementonly the last assignment will take effect.,端口其实也是信号,变量赋值立即生效,而信号赋值需要在delta()延时量(延时:系统自动设置一个微小延时量)系统或者用户指定的延时周期后(用AFTER子句 指定)才生效这是信号和标量的本质区别所在;信号不允许在进程和子程序中声明,而变量(不包括共享变量)只能在进程和子程序中使用;赋值符号不同:信号的赋值符号是“=”,而变量的赋值符号为“:=”;在进程(PROCESS)中,只能把信号列入敏感信号表,而不能将变量列入敏感表;,4、信号和变量的区别,signal d:std_logic;b

10、eginProc_A:process(a,b,c,d)begin d=a;x=b+d;d=c;y=b+d;end process Proc_A;,Proc_B:process(a,b,c,d)variable d:std_logic;begin d:=a;x=b+d;d:=c;y=b+d;end process Proc_B;,例1:思考以下两个进程的运行结果有何不同?,进程Proc_A运行结果为:x=b+c;y=b+c;,进程Proc_B运行结果为:x=b+a;y=b+c;,process(reset,clk)variable aa,bb:integer range 0 to 9;begin

11、if reset=1 then aa:=1;bb:=0;elsif rising_edge(clk)then if aa=1 then bb:=4;end if;if bb=4 then aa:=5;end if;end if;a=aa;b=bb;end process;end;,process(reset,clk)beginif reset=1 then aa=1;bb=0;elsif rising_edge(clk)then if aa=1 then bb=4;end if;if bb=4 then aa=5;end if;end if;a=aa;b=bb;end process;end;

12、,例2:思考以下两个进程的运行结果有何不同?,重要结论:,在进程中,变量赋值语句一旦被执行,目标变量立即被赋予新值,在执行下一条语句时,改变量的值为上一句新赋的值,而信号的赋值语句即使被执行也不会使信号立即发生代入,下一条语句执行时,仍然使用原来的信号值,信号是在进程挂起时才发生代入的。,四、VHDL 的数据对象的赋值,集合操作(整体赋值),集合操作-采用序号,集合操作-采用others,注意:OTHERS必须放在最后。,3.3 VHDL的数据类型,VHDL是一种强类型语言,要求在设计实体中的各个数据对象必须具有确定的数据类型,并且只有相同数据类型的操作数才能进行赋值或运算。VHDL的数据类型

13、有以下4大类型:,预定义数据类型(标准数据类型)是VHDL中最常用、最基本的数据类型,这些数据类型大部分在VHDL的标准程序包STANDARD和STD_LOGIC_1164中定义。用户自定义数据类型 用户自行定义的数据类型,其基本元素仍属于预定义数据类型。,根据数据类型产生的来源,上述四大类数据类型可分成:,一、预定义数据类型,以上十种类型是VHDL中的标准类型(在标准程序包STANDARD中定义)使用时不需作显式声明,可以直接使用。,二、其它预定义数据类型,1、标准逻辑位类型(STD_LOGIC)标准逻辑位数据类型是扩展的BIT类型,在IEEE1164标准中预定义了该数据类型:Type st

14、d_logic is(U,X,0,1,Z,W,L,H,-);该类型能比较全面地包括数字电路中信号会出现的几种状态,因此一般情况把这种类型代替bit。2、标准逻辑位矢量类型(STD_LOGIC_VECTOR)STD_LOGIC_VECTOR是基于STD_LOGIC 数据类型的一维数组,数组中的每一个元素都是以上定义的一位STD_LOGIC。,定义时须指明无符号整数的位数,最左边位为最高位。例如:SIGNAL x:UNSIGNED(0 TO 3);-4位无符号整数定义 不能用UNSIGNED定义负数;UNSIGNED数据和STD_LOGIC_VECTOR数据可以进行相互转换,如:SIGNAL A,

15、B:STD_LOGIC_VECTOR(1 DOWNTO 0);SIGNAL E,F:UNSIGNED(1 DOWNTO 0);E=UNSIGNED(A);B=STD_LOGIC_VECTOR(F);,3、UNSIGNED无符号整数类型,4、SIGNED有符号数类型,SIGNED 数据类型表示一个有符号的数值,综合器将其解释为补码,最高位是符号位。如:SIGNAL x,y:UNSIGNED(0 TO 3);-4位无符号整数定义 x=“0011”x 的值为3 y=”1011”y 的值为5,UNSIGNED整数数据类型除了具有数值运算的好处外,还具有也STD_LOGIC_VECTOR相似的逻辑运算特

16、性。这种特点使它在诸如计数器、分频器等的电路设计中应用广泛。,三、VHDL的自定义数据类型,VHDL允许用户为设计需要自定义新的数据类型,用户自定义数据类型的定义格式如下:TYPE 数据类型名 IS 数据类型定义 OF 基本数据类型;TYPE 数据类型名 IS 数据类型定义;,例:TYPE st1 IS ARRAY(0 TO 15)OF STD_LOGIC;TYPE week IS(sun,mon,tue,wed,thu,fri,sat);,VHDL中用户可以定义的数据类型有:枚举类型enumberated、整数型integer/实数型real数组类型array、纪录类型record、时间类型

17、time、文件类型file、存取类型access,列举数据对象可能存在的值,一般用于定义状态机的状态:例如:Type states is(idle,start,running,pause,stop)Signal current_state:states;IEEE1076标准中预定义了两个枚举类型:Type boolean is(False,True)Type bit is(0,1)Signal a:bit;综合时综合器将其转换为二进制编码。,1.枚举数据类型,整数/浮点数类型在VHDL中已经预定义过,这里的自定义整数/浮点数类型实际上是它一个子类型,定义格式如下:TYPE数据类型名 IS IN

18、TEGER/REAL 约束范围;如:TYPE digit IS INTEGER RANGE 0 TO 9;SIGNAL ge_wei,shi_wei,bai_wei:digit;TYPE current IS REAL RANGE-1E4 to 1E4;,2.整数/浮点数类型,VHDL允许定义两种不同类型的数组:限定性数组和非限定性数组;限定性数组定义格式:TYPE 数组名 IS ARRAY(数组范围)OF 数据类型;如:TYPE word IS ARRAY(15 DOWNTO 0)OF STD_LOGIC;非限定性数组的定义格式:TYPE 数组名 IS ARRAY(数组下标名 RANGE)O

19、F 数据类型;如:TYPE bit_vector IS ARRAY(NATURAL RANGE)OF BIT;VARIABLE:va:bit_vector(1 to 8);VARIABLE:vb:bit_vector(1 to 4);,3.数组类型,定义格式:TYPE 记录类型名IS RECORD 元素名:元素数据类型;元素名:元素数据类型;END RECORD 记录类型名;记录对象的赋值:整体赋值:位置关联方式或名字关联方式 单个元素进行赋值:使用“.”圆点操作符号,4.记录类型,TYPE RegName IS(AX,BX,CX,DX);-定义一枚举类型RegNameTYPE Operati

20、on IS RECORD-定义一记录类型Operation Mnemonic:STRING(1 TO 10);OpCode:BIT_VECTOR(3 DOWNTO 0);Op1 Op2 Res:RegName;END record;VARIABLE Instr1 Instr2:Operation;Instr1:=(ADD AX BX,0001,AX,BX,AX);-位置关联方式Instr2:=(OpCode=“0010”,Mnemonic=“ADD AX BX”,OTHERS=BX);-名字关联方式Instr2.Mnemonic:=MUL AX BX;-对记录中单个元素赋值,记录类型使用示例:

21、,5.用户定义的子类型,是对已定义的数据类型,做一些范围限制而形成的一种新的数据类型,定义格式如下:SUBTYPE 子类型名 IS 基本数据类型 RANGE 约束范围例:subtype digit is integer range 0 to 9;subtype iobus is std_logic_vector(7 downto 0);signal addr:iobus;signal data_bus:iobus;,6.数据类型之间的转换,VHDL 是一种强类型语言,不同数据类型的数据对象在相互操作时必须进行转换(Conversion);在VHDL语言的标准程序包中,提供了一些常用的类型转换函

22、数来实现不同数据类型之间的转换。注意,在VHDL程序中要使用到那一个转换函数,必须在库及程序包声明中包括该程序包。(1)std_logic_1164程序包提供的类型转换函数 to_stdlogicvector(a)、to_bitvector(a)、to_bit(a)、to_stdlogic(a)(2)std_logic_unsigned程序包提供的类型转换函数 conv_integer(a)(3)std_logic_arith程序包提供的类型转换函数 conv_std_logic_vector(a)conv_integer(a),3.4 VHDL的运算操作符,在VHDL 中包含以下四类运算操作

23、符:逻辑运算符(Logical Operator)AND、OR、NAND、NOR、XOR、NOT 关系运算符(Relational Operator)=、/=、=算术运算符(Arithmetic Operator)+、-、*、/等 并置运算符(Concatenation Operator)&,一、逻辑运算符,逻辑运算符中,NOT运算符的优先级最高,其他运算符AND、OR、NAND、NOR、XOR 之间无优先级顺序在,等号和不等号(=和/=)适用于所有数据类型的对象之间的比较。两个位矢量类型的对象进行比较时,自左向右,按位比较。信号赋值符号和小于等于符的符号都是=,具体含义要根据上下文判断;从综合角度而言,简单的比较运算(=和/=)在实现硬件结构时,比排序运算符构成的芯片资源利用效率要高;关系运算符两边的数据对象的类型必须一致(也有例外),但位长不一定相同;,二、关系运算符,除了+、-、*、/之外,还有mod(求模)、rem(取余)、*(乘方)、abs(取绝对值);真正能综合成逻辑电路的只有“+”、“-”和“*”,其它运算综合成逻辑电路很困难;应慎重使用乘/除法运算符。,三、算术运算符,四、并置运算符,并置运算符(,注意:在使用运算符时,要特别注意各运算符操作数的数据类型和优先级,The End of Chapter,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号