《华北电力大学科技学院电子设计自动化课件6vhdl词法.ppt》由会员分享,可在线阅读,更多相关《华北电力大学科技学院电子设计自动化课件6vhdl词法.ppt(121页珍藏版)》请在三一办公上搜索。
1、第6章VHDL词法,6.1 VHDL 基本常识6.2 VHDL标示符6.3 VHDL 数据类型6.4 VHDL 数据对象6.5 VHDL运算符,6.1 VHDL 的基本常识,1.VHDL中的英文字母不区分大小写。2.VHDL中区分大小写的场合有:用单引号括起来的字符 用双引号括起来的字符串 扩展标示符3.VHDL 中的注释符号为2个连续的-,即-。,6.2 VHDL 标示符,标示符用来定义一个事物的名称以便同其他事物区分开来。VHDL 定义了两种标示符:1)基本标示符 2)扩展标示符。,6.2 VHDL 标示符,1)基本标示符,基本标示符的命名规则有:合法字符有3类:英文字母、数字和下划线 最
2、前面应该是英文字母 不能连续使用下划线 不能用下划线结束 不能使用VHDL的关键字/保留字,6.2 VHDL 标示符,1)基本标示符,基本标示符使用错误情况举例:SIGNAL a_bus:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL 302_bus:-数字开头的名字是错误的SIGNAL b_bus:-符号不能作为名称的字母,是错误的SIGNAL a_bus:.-_符号在名称中不能连着使用,故是错误的SIGNAL b_bu8_:-_符号不能在名称最后使用,故是错误的,2)扩展标示符,扩展标示符的命名规则有:标示符的首尾要加反斜杠“”来限定。比如VHDL 允许使用ASCI
3、I码中的任意字符和图形符号。比如%、对字符的顺序没有限制,允许使用保留字。比如234abc、library 用双反斜杠“”表示标示符中的反斜杆字符“”。比如1005=20 区分大小写。比如ABC与Abc代表不同的扩展标示符 扩展标示符和基本标示符不同。比如ABC与ABC不同,6.2 VHDL 标示符,6.3 VHDL数据类型,VHDL提供了多种标准的数据类型用户可以自定义数据类型VHDL是强类型语言不同类型之间的数据不能直接代入同类型但不同位长不能直接代入,6.3 VHDL数据类型,VHDL语言的数据类型主要有4类:(1)标量类型(Scalar Type)(2)复合类型(Composite T
4、ype)(3)存取类型(Access Type)(4)文件类型(File Type),6.3 VHDL数据类型,(1)标量类型(Scalar Type),标量类型,枚举类型(Enumeration Type),整数类型(Integer Type),浮点类型(Floating Point Type),物理类型(Physical Type),离散类型(Discrete Type),数值类型(Numeric Type),6.3 VHDL数据类型,(2)复合类型(Composite Type),复合类型,数组类型(Array Type),记录类型(Record Type),6.3 VHDL数据类型,V
5、HDL在包集合STANDARD中预订义了一些数据类型,主要有11种:枚举类型:CHARACTER BIT BOOLEAN SEVERITY LEVEL 整数类型:INTEGER NATURAL POSITIVE,6.3 VHDL数据类型,物理类型:TIME 浮点类型:REAL 数组类型:STRING BIT_VECTOR,6.3.1 预定义数据类型,VHDL预定义数据类型包含在STD库的STANDARD包集合中,不需要声明库和包集合可以直接使用这些数据类型。STD库是VHDL的标准库。STD库中还有另一个包集合TEXTIO,使用TEXTIO包集合时,需要首先声明STD库和TEXTIO包集合,才
6、能使用该包集合中预定义的数据。,6.3.1 预定义数据类型,1、整数(Integer),占32位,数值在-2147483647到2147483647之间整数不能看作位矢量,也不能按位来进行访问对整数一般不能用逻辑操作符,可以使用转换函数将整数转换成位矢量,再进行逻辑操作。例如:0,1,217,512,2、实数(Real)实数的范围-1.0E+38+1.0E+38实数在书写时必须有小数点例如:5.0,1.25,3.14,3、位(BIT)注意位值表示 0,1位值可以显式说明:BIT(1)、BIT(0),4、位矢量(BIT_VECTOR)位矢量是用双引号括起来的一组位数据 一般用位矢量数据表示总线状
7、态 例如:001100 B 001_101_010 9位二进制位串 X A_F0_FC 20位十六进制位串 O 3701 12位八进制位串 B:二进制 X:十六进制 O:八进制,5、布尔量(BOOLEAN)有两种状态:“真”(TRUE)“假”(FLASE)它没有数值的含义,不能进行逻辑运算状态可以由关系运算产生,6、字符(Character)字符量通常用单引号括起来 字符中的大、小写认为是不一样的字符可以是az的任一字母,09中任何一个数以及空白或者特殊字符¥,$,%等等可以显式声明 如:CHARACTER(1),7、字符串(String)字符串是由双引号括起来的一个字符序列,也称为字符矢量或
8、字符串数组 例如:“integer range”字符串常用于程序的提示和说明,8、时间(Time)时间是一个物理量数据 完整的时间量数据应包含整数和单位两个部分,而且整数和单位之间至少应留一个空格 在系统仿真时,用它表示信号延时,从而使模型系统更能逼近实际系统的运行环境 时间预定义包含在包集合STANDARD中,单位为fs,ps,ns,us,ms,sec,min,hr 例:20 ns,40 us,TYPE time is RANGE-1E18 to 1E18 UNITS fs;ps=1000 fs;ns=1000 ps;us=1000 ns;ms=1000 us;sec=1000 ms;min
9、=60 sec;hr=60 min;END UNITS;,9、错误等级(Severity level)错误等级数据类型一般用来表征系统的状态共有4种状态:注意(Note)、警告(warning)、错误(Error)、失败(Failure)在系统仿真过程中来提示系统当前的工作情况与assertion语句和report语句结合使用,10、自然数(Natural)NATURAL是整数的子类 NATURAL类数据只能取0和正整数。在STANDARD包集合中对NATURAL做了如下定义:SUBTYPE NATURAL IS INTEGER RANGE 0 TO INTEGERHIGH;,11、正整数(P
10、ositive)POSITIVE是整数的子类 POSITIVE 类数据只能取大于0的整数。在STANDARD包集合中对POSITIVE做了如下定义:SUBTYPE NATURAL IS INTEGER RANGE 1 TO INTEGERHIGH;,约束区间 在VHDL仿真过程中,首先要检查赋值语句中的类型和区间,任何一个信号和变量的赋值均须落入给定的约束空间中,也就是说要落入有效数值的范围内。约束区间的说明通常跟在数据类型说明的后面。例:INTEGER RANGE 100 DOWNTO 1;BIT_VECTOR(3 DOWNTO 0);REAL RANGE 2.0 TO 30.0;,可由用户
11、定义的数据类型:1)枚举(Enumerated)类型;2)整数(Integer)类型;3)浮点(Floating)数类型;4)数组(Array)类型;5)存取(Access)类型;6)文件(File)类型;7)记录(Recode)类型;8)物理(Physical)类型;,6.3.2 用户定义的数据类型,定义的语法格式:,TYPE 数据类型名,数据类型名 数据类型定义;,6.3.2 用户定义的数据类型,SUBTYPE 子类型名 IS 数据类型名 范围;,TYPE 数据类型名 IS(元素,元素,);,例:TYPE week IS(sun,mon,tue,wed,thu,fri,sat);,1)枚举
12、类型,定义格式:,TYPE 数据类型名 IS ARRAY 范围 OF 数组元素数据类型名;,(1)数组类型如果没有指定范围的数据类型,则默认为INTEGER类型的。例如:TYPE byte_8 IS ARRAY(0 TO 7)OF STD_LOGIC;TYPE byte_8 IS ARRAY(INTEGER 0 TO 7)OF STD_LOGIC;以上两行代码是等价的。(2)除整数类型外,范围的数据类型也可以使用其它数据类型。使用时需要显式的声明范围的数据类型。例如:自定义枚举类型TYPE week IS(mon,tue,wed,thr,fri,sat,sun);TYPE lesson_lis
13、t IS(chinese,english,math,physic,chemical,music);TYPE lesson_chart IS ARRAY(week mon TO fri)OF lesson_list;,2)数组类型,定义格式:,(3)如果没有指定范围时,需要在定义该数据类型的信号、变量等时指定范围。例如:STD_LOGIC_VECTOR在包集合STD_LOGIC_1164中的有如下定义:TYPE STD_LOGIC_VECTOR IS ARRAY(NATURAL RANGE)OF STD_LOGIC;RANGE 表示没有范围限制。因此,在定义STD_LOGIC_VECTOR类型的
14、信号、变量时需要指定具体的范围。SIGNAL temp:STD_LOGIC_VECTOR(7 DOWNTO 0);-8位STD_LOGIC_VECTOR类型,2)数组类型,(4)多维数组范围的声明方法 N维数组需要N个范围来声明。二维数组一般用来描述存储器。一个范围表示字数,一个范围表示字长。大于二维的数组不能综合,只能用于仿真建模。例如:TYPE ram IS ARRAY(0 TO 127,7 DOWNTO 0)OF STD_LOGIC;,2)数组类型,例:TYPE word IS ARRAY(INTEGER 1 TO 8)OF STD_LOGIC;TYPE memarray IS ARRA
15、Y(0 TO 5,7 DOWNTO 0)OF STD_LOGIC;CONSTANT romdata:memarray:=(0,0,0,0,0,0,0,0),(0,1,1,1,0,0,0,1),(0,0,0,0,0,1,0,1),(1,0,1,0,1,0,1,0),(1,1,0,1,1,1,1,0),(1,1,1,1,1,1,1,1);SIGNAL data_bit:STD_LOGIC;data_bit=romdata(3,7);,2)数组类型,TYPE 数据类型名 IS RECODE 元素名:数据类型名;元素名:数据类型名;.END RECODE;,数组是同一类型数据集合起来的形成的,而记录则
16、是将不同类型的数据和数据名组织在一起形成的新客体。,3)记录类型,定义格式:,TYPE bank IS RECORD addr0:STD_LOGIC_VECTOR(7 DOWNTO 0);addr1:STD_LOGIC_VECTOR(7 DOWNTO 0);r0:INTEGER;inst:instruction;END RECORD;,3)记录类型,SUBTYPE 数据类型名 IS INTEGER RANGE 取值范围;,例:SUBTYPE digit IS INTEGER RANGE 0 TO 9;,4)整数类型,定义格式:,SUBTYPE 数据类型名 IS REAL RANGE 取值范围;
17、,例:SUBTYPE current IS REAL RANGE-1.0 E4 TO 1.0 E4;,5)实数类型,定义格式:,6.3.3 IEEE 预定义数据类型,当使用这两种数据类型时,在程序中必须写出库说明语句和使用包集合说明语句:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;,IEEE 标准定义了两种数据类型:“STD_LOGIC”“STD_LOGIC_VECTOR”,1)STD_LOGIC数据类型,STD_LOGIC数据类型有9种不同取值:U初始值;X不定;00;11;Z高阻;W弱信号不定;L弱信号0;H弱信号1;_不可能情况;,TYPE STD_
18、LOGIC_VECTOR IS ARRAY(NATURAL RANGE)OF STD_LOGIC;RANGE表示没有范围限制,该种情况下,范围由信号说明等语句指定;例如:SIGNAL aaa:STD_LOGIC_VECTOR(3 DOWNTO 0);在函数和过程语句中,若使用无限制范围的数组时,其范围一般由调用者所传递的参数来确定。,2)STD_LOGIC_VECTOR数据类型,STD_LOGIC_VECTOR是一个数组类型。,NATURAL RANGE有2种定义方法:STD_LOGIC_VECTOR(初始值TO 结束值);-升区间 STD_LOGIC_VECTOR(初始值DOWNTO 结束值
19、);-降区间例如:STD_LOGIC_VECTOR(7 DOWNTO 0);STD_LOGIC_VECTOR(0 TO 7);,2)STD_LOGIC_VECTOR数据类型,1.STD_LOGIC_VECTOR的值只能是二进制 BIT_VECTOR可以是二进制、八进制、十六进制2.STD_LOGIC_VECTOR里面的元素为STD_LOGIC类型,所以每个元素有9种取值,而BIT_VECTOR里面的元素为BIT类型,所以只有2种取值。,STD_LOGIC_VECTOR与BIT_VECTOR的区别:,2)STD_LOGIC_VECTOR数据类型,SIGNAL a:BIT_VECTOR(11 DO
20、WNTO 0);SIGNAL b:STD_LOGIC_VECTOR(11 DOWNTO 0);a=X A8;十六进制值可以赋予位矢量b=X A8;语法错,十六进制值不能赋予标准逻辑矢量b=TO_STDLOGICVECTOR(X AF7);b=TO_STDLOGICVECTOR(O 5177);八进制转换b=TO_STDLOGICVECTOR(B 1010_1111_0111);,2)STD_LOGIC_VECTOR数据类型,6.3.4 数据类型的转换,在VHDL语言中,数据类型的定义是相当严格的,不同类型的数据不能进行运算和直接代入。为了实现正确的代入操作,必须将要代入的数据类型进行类型转换。
21、,1)STD_LOGIC_1164包集合,BIT,STD_LOGIC_VECTOR,TO _STDLOGICVECTOR(A),功能:,TO_BITVECTOR(A),TO_STDLOGIC(A),BIT,TO_BIT(A),STD_LOGIC_VECTOR,BIT_VECTOR,STD_LOGIC,STD_LOGIC,BIT_VECTOR,功能:,功能:,功能:,2)STD_LOGIC_ARITH 包集合,CONV_STD_LOGIC_VECTOR(A,位长),功能:,CONV_INTEGER(A),INTERER/UNSINGED/SIGNED,STD_LOGIC_VECTOR,功能:,I
22、NTEGER,UNSINGED/SIGNED,3)STD_LOGIC_UNSIGNED 包集合,CONV_INTEGER(A),INTEGER,STD_LOGIC_VECTOR,功能:,6.4 VHDL 数据对象,数据对象:可以被赋予一个值的客体。VHDL数据对象的种类:信号(Signal)变量(Variable)常数(Constant)文件(File),6.4.1 常数(CONSTANT),常数是一个固定的值常数说明是对某一常数名赋予一个固定的值,CONSTANT 常数名:数据类型:表达式;,常数说明的一般格式:,例:CONSTANT Vcc:REAL:=5.0;,6.4.1 常数(CONS
23、TANT),常数使用的注意事项:常数可以在包集合、实体、构造体内声明常数一旦被赋值就不能再改变常数所赋的值应和定义的数据类型一致,例:CONSTANT Vcc:REAL:=0100;是错误的,6.4.2 信号(signal),例:SIGNAL tmp:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL SYS_CLK:BIT:=1;,SIGNAL 信号名:数据类型:初始值;,信号说明的一般格式:,信号是电子电路内部硬件连接的抽象。它除了没有数据流动方向说明外,其他性质与实体的“端口”一致。,信号名=表达式;,信号的赋值格式:,6.4.2 信号(signal),信号的使用注意
24、事项:信号通常在构造体、包集合和实体中说明 信号代入时可以附加延时。如s1=s2 after 10 ns;,6.4.3 变量(variable),1.共享变量(shared variable),SHARED VARIABLE 变量名:类型名:初始值;,例:shared variable x:std_logic:=0;,architecture sample of tests is shared variable notclk:std_logic;signal clk:std_logic;begin p1:process(clk)is begin if clkevent and clk=1 th
25、en notclk:=0;end if;end process p1;p2:process(clk)is begin if clkevent and clk=1 then notclk:=1;end if;end process p2;end architecture sample;,2.局部变量,例:VARIABLE count:INTEEGER RANGE 0 TO 255:=10;VARIABLE X,Y:INTEEGER;,VARIABLE 变量名:数据类型:初始值;,变量说明的一般格式:,2.局部变量,使用变量时需要注意问题:变量的使用场合:进程或子程序 变量赋值符号为:=变量在赋值
26、时不能产生附加延时;例如:tem3:=tem1+tem2 after 10 ns;-错误语句,3.信号和变量代入的区别,1、赋值的形式 变量赋值符为::=信号赋值符为:=,3.信号和变量代入的区别,2、声明场合信号一般声明在 PACKAGE、ENTITY、ARCHITECTURE 中。变量一般声明在PROCESS、FUNCTION、PROCEDURE中。,3.信号和变量代入的区别,3、延时语句的使用信号赋值时可以使用延时语句 变量赋值时不能使用延时语句,3.信号和变量代入的区别,4、赋值的过程(PROCESS或子程序内)变量赋值:立即生效 变量赋值语句一旦被执行,变量立即被赋予新值。在执行下一
27、条语句时,该变量的值为新值。信号赋值:代入过程和代入语句的处理是分开进行的 信号赋值语句被执行时,信号仍保持原值。执行下一条语句时,信号的值为原值。到进程结束时,信号被赋予新值。如果多次赋值,取最后代入的值作为最终代入值。,PROCESS(A,B,C,D)IS BEGIN D=A;X=B+D;D=C;Y=B+D;END PROCESS;,PROCESS(A,B,C)ISVARIABLE D:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN D:=A;X=B+D;D:=C;Y=B+D;END PROCESS;,X=B+C;Y=B+C;,X=B+A;Y=B+C;,3.信号和变量
28、代入的区别,执行第一条语句前,1)信号的处理与代入过程,3.信号和变量代入的区别,执行第一条语句d=a;之后,3.信号和变量代入的区别,执行第二条语句x=b+d;之后,3.信号和变量代入的区别,执行第三条语句d=c;之后,3.信号和变量代入的区别,执行第四条语句y=b+d;之后,3.信号和变量代入的区别,赋值是并行执行的,所以执行结果如下:,3.信号和变量代入的区别,执行第一条语句前,2)变量的处理与代入过程,3.信号和变量代入的区别,执行第一条语句d:=a;之后,3.信号和变量代入的区别,执行第二条语句x=b+d;之后,3.信号和变量代入的区别,执行第三条语句d:=c;之后,3.信号和变量代
29、入的区别,执行第四条语句y=b+d;之后,3.信号和变量代入的区别,信号赋值是并行执行的,所以执行结果如下:,ENTITY mux IS PORT(d0,d1,sel:IN BIT;q:OUT BIT);END ENTITY mux;ARCHITECTURE connect OF mux IS BEGIN PROCESS(d0,d1,sel)IS VARIABLE tem1,tem2,tem3:BIT;BEGIN tem1:=d0 and sel;tem2:=(not sel)and d1;tem3:=tem1 or tem2;q=tem3;END PROCESS;END ARCHITECTU
30、RE connect;,ENTITY mux IS PORT(d0,d1,sel:IN BIT;q:OUT BIT);END ENTITY mux;ARCHITECTURE connect OF mux IS SIGNAL tem1,tem2,tem3:BIT;BEGIN PROCESS(d0,d1,sel)IS BEGIN tem1=d0 and sel;tem2=(not sel)and d1;tem3=tem1 or tem2;q=tem3;END PROCESS;END ARCHITECTURE connect;,变量与信号的区别,1.文件类型定义的格式,TYPE 类型名 IS FIL
31、E OF 元素类型名;,例如:TYPE index IS INTEGER RANGE 0 TO15;TYPE int_ftype IS FILE OF index;,6.4.4 文件,元素类型代表文件中元素的数据类型,FILE对元素数据类型的使用有一定的要求。数据类型不能是文件(FILE)类型、存取(ACESS)类型、保护(PROTECTED)类型。,文件是一种用来定义代表主机中文件格式的客体。,VHDL语言中提供了一个预先定义的包集合:文本输入/输出包集合:TEXTIO。TEXTIO包集合中包含有对文本文件进行读写的过程和函数。TEXTIO定义了处理文本文件的数据类型,包括行(LINE)、文
32、本(TEXT)、侧(SIDE)3种,以及NATURAL的子类型WIDTH。TEXTIO按行对文件进行处理,一行为一个字符串,并以回车、换行符作为结束符。,2.文件操作语句,在使用TEXTIO包集合时,需要做一下说明:,2.文件操作语句,TEXTIO对用于处理文本文件的数据类型作了具体说明。在读写文本文件时要使用数据类型line(行)。line的结构是TEXTIO对文件进行操作的基本单位。对文件进行读操作时,首先读一行字符,并把它放到line 数据类型的结构中,而后再按字段进行处理。对文件进行写操作时,首先在行数据暂存区按字段建立line结构,然后再将line的数据写到文件中去。,2.文件操作语
33、句,TEXTIO中定义了操作文件的过程和函数,包括:打开文件 从文件中读一行 从一行中读一个数据 写一行到文件 写一个数据到一行 文件结束检查,2.文件操作语句,打开文件,FILE tb_text:TEXT OPEN READ_MODE IS tb_text.txt;-以读操作方式打开名称为tb_text.txt的文件,FILE tb_text:TEXT OPEN WRITE_MODE IS tb_text_o.txt;-以写操作方式打开名称为tb_text.txt的文件,2.文件操作语句,从文件中读一行,READLINE(文件变量,行变量);,SIGNAL clk:STD_LOGIC;SIG
34、NAL din:STD_LOGIC_VECTOR(7 DOWNTO 0);VARIABLE li:LINE;FILE invector:TEXT OPEN READ_MODE is“tb_text.txt”;READLINE(invector,li);-利用READLINE语句,从文件变量invector 所指定的文件tb_text.txt中读一行数据,将它放到li行变量中。,2.文件操作语句,从一行中读一个数据,READ(行变量,数据变量);,利用READ语句可以从一行中取出一个字符,放到所指定的数据变量(信号)中。,2.文件操作语句,写一行到文件,WRITELINE(文件变量,行变量),2
35、.文件操作语句,写一个数据到一行,WRITE(行变量,数据变量);,WRITE(行变量,数据变量,起始位置,字符数);,2.文件操作语句,写一个数据到一行,HWRITE、OWRITE,2.文件操作语句,文件结束检查,ENDFILE(文件变量),6.5 VHDL运算操作符,1、逻辑运算 logical 2、算术运算 arithmetic3、关系运算 relational4、移位运算符 shift5、并置运算 concatenation,要求:操作数的类型与操作符要求的类型一致,6.5.1 逻辑运算符,NOT 非AND与 OR 或NAND与非NOR或非XOR异或XNOR 同或,逻辑运算中操作数的数
36、据类型可以为BIT、BOOLEAN、STD_LOGIC,以及一维数组BIT_VECTOR和STD_LOGIC_VECTOR。双目逻辑运算符两边的操作数的数据类型相同,位宽相同。逻辑运算按位进行运算,结果的数据类型与操作数的类型相同。逻辑运算中应注意优先级问题,当一个表达式中含有两种以上的逻辑运算符时,应用括号对这些运算进行分组。如果只含有AND、OR、XOR三种逻辑运算符中的一种逻辑运算符则不需要使用括号分组。单目逻辑运算符NOT的优先级在所有的逻辑运算中最高。,6.5.2 算术运算符,使用算术运算符需要注意的问题:单目算术运算符或称一元算术运算符(+、-、ABS)的操作数可以是INTEGER、REAL、PHYSICAL。加法、减法的操作数可以是数值(Numeric)类型:INTEGER、REAL、PHYSICAL。乘法、除法的操作数可以为整数和浮点数类型 求模、取余的操作数可以为整数类型,求模、取余,乘方,6.5.3 关系运算符,关系运算符为二元运算符,运算结果为布尔型。在没有使用对关系运算符重载的包集合时,要求运算符左右两边操作数的数据类型必须相同。关系运算符对数组类型数据比较时,比较过程按从左到右的顺序进行。为了避免出现错误,应尽量保持操作数位长一致。,6.5.4 移位运算符,6.5.5 并置运算符,并置就是用符号&进行位的连接。,