《第5讲VHDL语言要素1.ppt》由会员分享,可在线阅读,更多相关《第5讲VHDL语言要素1.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第5 5讲讲 VHDLVHDL语言要素(语言要素(1 1)本讲知识点:本讲知识点:VHDLVHDL文字规则文字规则VHDLVHDL的对象的对象VHDLVHDL标准数据类型标准数据类型1VHDLVHDL语言要素语言要素 VHDLVHDL的文字规则的文字规则 与其他计算机高级语言一样,VHDL也有自己的文字规则1.1.基本标识符基本标识符 标识符主要用来为端口、信号、变量、子程序、常数和参数等命名。2 有效的字符:包括26个大小写英文字母,数字包括09 以及下划线“_”任何标识符必须以英文字母开头 下划线“_”的前后必须有英文字母或数字 标识符中的英语字母不分大小写 标识符的命名不能与保留字(关
2、键字)相同其规则如下:其规则如下:例:例:_Decoder_1,2FFT,sig_#n ,return Decoder_1,FFT,sig_n,Not_ACK 32.2.扩展标识符(扩展标识符(9393标准):标准):以反斜杠来界定,免去了87标准中基本标识符的一些限制。可以以数字打头,允许包含图形符号,允许使用VHDL保留字,区分字母大小写等。如:74LS163、Sig_#N、entity、ENTITY4注意:写程序时,应用关键字时用大写,定义的标识符用小写。或者关键字用小写,定义的标识符用大写,以便于区分。3.3.结束标志与注释结束标志与注释每个逻辑行以一个分号作为结束标志。注释语句用“”
3、开始到本行结束的一段文字来进行一段的描述可以放在源程序中的任何位置。注释不是设计功能描述的一部分,所以不会被编译。5VHDLVHDL对象对象 VHDL是一种硬件描述语言,硬件电路的工作过程实际上是信号的传输和存储的过程,所以VHDL最基本的描述对象是信号信号信号信号。为了便于描述,还定义了另外三类数据对象:变量、常量变量、常量变量、常量变量、常量和文件。1.1.常量(常量(CONSTANTCONSTANT)定 义:常 量 也 称 常 数,是 指 在 设 计 实 体 中 不 会 发 生 变化的值。作用:增加了设计文件的可读性和可维护性。6常量定义的一般表述:CONSTANT 常量名:数据类型:=
4、表达式;例如:CONSTANT a,b:INTEGER:=2;注意:注意:v常量可以在程序包、实体说明、结构体和进程的说明区域进行说明。v常量定义的同时进行赋初值,一旦被赋值就不能再改变v常量所赋的值应与其所定义的数据类型一致,否则出错7常量的使用范围取决于它被定义的位置常量的使用范围取决于它被定义的位置:(1)程序包中定义的常量具有最大的全局化特性,可以用在程序包中定义的常量具有最大的全局化特性,可以用在调用此程序包的所有设计实体中;调用此程序包的所有设计实体中;(2)设计实体中定义的常量,其有效范围为这个实体定义的设计实体中定义的常量,其有效范围为这个实体定义的所有的结构体;所有的结构体;
5、(3)设计实体中某一结构体中定义的常量只能用于此结构体;设计实体中某一结构体中定义的常量只能用于此结构体;(4)结构体中某一单元定义的常量,如一个进程中,这个常结构体中某一单元定义的常量,如一个进程中,这个常量只能用在这一进程中。量只能用在这一进程中。82.2.变量(变量(VARIABLEVARIABLE)变变量量主主要要用用于于对对暂暂时时数数据据进进行行存存储储,它它不不能能将将信息带出对它作出定义的当前单元。信息带出对它作出定义的当前单元。定义变量的一般表述:定义变量的一般表述:VARIABLE VARIABLE 变量名:数据类型变量名:数据类型 :=:=初始值初始值;例:例:VARIA
6、BLE a:STD_LOGIC;VARIABLE a:STD_LOGIC;VARIABLE b,c:INTEGER:=2;VARIABLE b,c:INTEGER:=2;VARIABLE count1,count2,count3:INTEGER VARIABLE count1,count2,count3:INTEGER range 0 to 255:=0;range 0 to 255:=0;9变量赋值格式:变量赋值格式:变量名变量名 :=:=表达式;表达式;例:例:a:=“1010101”;-a:=“1010101”;-位矢量赋位矢量赋值值 b:=0;-b:=0;-位赋值位赋值 x:=100.
7、0;-x:=100.0;-实数赋值实数赋值注意:注意:(1 1)赋值语句右边的表达式必须是一个与目)赋值语句右边的表达式必须是一个与目标变量具有标变量具有相同数据类型相同数据类型的数值。的数值。(2 2)变量是一个)变量是一个局部量局部量,只能在进程和子程,只能在进程和子程序中使用。序中使用。10(3)变量定义的时候尽管可以直接赋初值,但系变量定义的时候尽管可以直接赋初值,但系统往往忽略。建议变量对象定义后再进行赋值。统往往忽略。建议变量对象定义后再进行赋值。(4 4)变量的赋值是一种理想化的数据传输,是)变量的赋值是一种理想化的数据传输,是立即发生立即发生的,不存在任何延时的行为。的,不存在
8、任何延时的行为。11例例VARIABLE x,y:REAL;VARIABLE a,b:BIT_VECTOR(0 TO 7);x:=100.0;-实数赋值,实数赋值,x是实数变量是实数变量y:=1.5+x;-运算表达式赋值,运算表达式赋值,y也是实数变量也是实数变量a:=b;a:=”1010101”;-位矢量赋值,位矢量赋值,a的数据类型是位矢量的数据类型是位矢量a(3 TO 6):=(1,1,0,1);-段赋值段赋值a(0 TO 5):=b(2 TO 7);a(7):=0;-位赋值位赋值123.3.信号(信号(SIGNALSIGNAL)信信号号是是描描述述硬硬件件系系统统的的基基本本数数据据对
9、对象象,它它是是设设计计实实体体中中并并行行语语句句模模块块间间动动态态交交换换数数据据的的手手段段。在在物物理理上上信信号号对对应应着着硬硬件件设设计计中中的的一一条条连连接接线线。它它除除了了没没有有数数据据流流动动方方向向说说明明以以外外,其其他他性性质质与与实实体体的的端口(端口(PortPort)概念一致。概念一致。信号定义语句格式:信号定义语句格式:SIGNAL SIGNAL 信号名:信号名:数据类型数据类型 :=:=初始值初始值 ;13例:例:SIGNAL SIGNAL clkclk:std_logicstd_logic:=0;:=0;SIGNAL a:integer range
10、 0 to 15;SIGNAL a:integer range 0 to 15;SIGNAL data:std_logic_vector(15 SIGNAL data:std_logic_vector(15 downtodownto 0);0);信号的使用和定义范围是实体、结构体和程序信号的使用和定义范围是实体、结构体和程序包。包。注意!信号定义的时候尽管可以直接赋初值,但系统往注意!信号定义的时候尽管可以直接赋初值,但系统往往忽略。建议信号对象定义后再进行赋值。往忽略。建议信号对象定义后再进行赋值。14在程序中在程序中:(1)信号值的代入采用信号值的代入采用“=”代入符,而且信号代代入符,而
11、且信号代入时可以附加延时。入时可以附加延时。(2)变量赋值时用变量赋值时用“:=”,不可附加延时。,不可附加延时。(3)信号的初始赋值符号仍是信号的初始赋值符号仍是“:=”。例:例:X=Y AFTER 10 ns;-X,Y都是信号,且都是信号,且Y的值经过的值经过10ns延延时以后才被代入时以后才被代入X。信号是一个全局量,它可以用来进行进程之间的通信。信号是一个全局量,它可以用来进行进程之间的通信。15说明:说明:说明:说明:l 同一信号不能在两个进程中赋值。同一信号不能在两个进程中赋值。l 在同一进程中,可以允许多次对同一信号赋在同一进程中,可以允许多次对同一信号赋值。即在同一进程中存在多
12、个同名的信号被赋值。值。即在同一进程中存在多个同名的信号被赋值。但是因为信号的赋值是有延时的,其结果只是最但是因为信号的赋值是有延时的,其结果只是最后的赋值语句被启动。后的赋值语句被启动。16SIGNALSIGNAL a,b,c,y,za,b,c,y,z:integer;:integer;PROCESSPROCESS(a,b,c(a,b,c)BEGINBEGIN y=a*b;-y=a*b;-不对不对y y进行赋值进行赋值 z=z=c-yc-y;y=b;-y y=b;-y的最后赋值的最后赋值END PROCESSEND PROCESS;17信号与变量的区别信号与变量的区别(2)赋值符不同)赋值符
13、不同信号信号 signal count:std_logic_vector(7 downto 0);变量变量 variable tema:std_logic_vector(3 downto 0);信号在结构体中声明;变量在进程中声明信号在结构体中声明;变量在进程中声明(1)声明的形式与位置不同)声明的形式与位置不同count=“00000000”,count=“ZZZZZZZZ”count=tema;tema:=0000;18(3)赋值生效的时间不同赋值生效的时间不同信号:进程结束时信号:进程结束时变量:立即生效变量:立即生效(4)进程对信号敏感,对变量不敏感)进程对信号敏感,对变量不敏感(5)
14、作用域不同)作用域不同信号可以是多个进程的全局信号,变量只信号可以是多个进程的全局信号,变量只在定义后的顺序域可见在定义后的顺序域可见19label1:label1:processprocessvariablevariable a,b:integera,b:integer;beginbegin wait untilwait until clkclk=1 1;a:=10;a:=10;b:=20;b:=20;a:=b;a:=b;b:=a;b:=a;end processend process;signalsignal a,b:integera,b:integer;label2:label2:pro
15、cessprocess(a,b)(a,b)beginbegin a=10;a=10;b=20;b=20;wait forwait for 10ns 10ns a=b;a=b;b=a;b=a;wait forwait for 10ns 10nsend processend process;分析下面两个程序中分析下面两个程序中a,ba,b的结果的结果结果结果:a=b=20:a=b=20结果结果:a=20,b=10:a=20,b=1020library ieee;use ieee.std_logic_1164.all;entity bcv isport(a,b,c:in std_logic;x,y:
16、out std_logic);end bcv;architecture m2 of bcv isbeginprocess(a,b,c)variable d:std_logic;begin d:=a;x=c xor d;d:=b;y=c xor d;end process;end m2;ABCXY练习练习结果:结果:x=c xor b,y=c xor b x=c xor a,y=c xor barchitecture m1 of bcv issignal d:std_logic;beginprocess(a,b,c)begin d=a;x=c xor d;d=b;y=c xor d;end pr
17、ocess;end m1;212.6 VHDL2.6 VHDL数据类型和子类型数据类型和子类型 前面介绍了前面介绍了VHDLVHDL的数据对象,对于每一个对象来的数据对象,对于每一个对象来说,都要指定其数据类型,因此,说,都要指定其数据类型,因此,VHDLVHDL需要提供用来需要提供用来指定对象的数据类型。指定对象的数据类型。VHDLVHDL的强类型特性,使得的强类型特性,使得VHDLVHDL在进行硬件描述时在进行硬件描述时具有很高的灵活性。具有很高的灵活性。VHDLVHDL的强类型特性主要体现在以下几个方面:的强类型特性主要体现在以下几个方面:22v 每一对象只能具有一个数据类型且只能具有那
18、每一对象只能具有一个数据类型且只能具有那个数据类型的值。个数据类型的值。v 对某对象进行操作的类型必须与该对象的类型对某对象进行操作的类型必须与该对象的类型相匹配。相匹配。v 不同类型之间的数据不能直接代入,即使数据不同类型之间的数据不能直接代入,即使数据类型相同,而位长不同也不能进行代入。类型相同,而位长不同也不能进行代入。23 标量类型:标量类型:是最基本的数据类型,通常用于描述是最基本的数据类型,通常用于描述一个单值数据对象。标量类型包括:实数类型、整一个单值数据对象。标量类型包括:实数类型、整数类型、枚举类型和时间类型。数类型、枚举类型和时间类型。复合类型:复合类型:由细小的数据类型复
19、合而成,如可由由细小的数据类型复合而成,如可由标量类型复合而成。复合类型主要有数组型和记录标量类型复合而成。复合类型主要有数组型和记录型。型。子类型:子类型:是上述基本类型的子集,是对已有的数是上述基本类型的子集,是对已有的数据类型加以限制。据类型加以限制。VHDLVHDL中的数据类型可分为五大类:中的数据类型可分为五大类:24 上述五大类数据类型又可分成在现成程序包中上述五大类数据类型又可分成在现成程序包中可以随时获得的可以随时获得的预定义数据类型预定义数据类型和和用户自定义数用户自定义数据类型据类型两类。预定义数据类型是两类。预定义数据类型是VHDLVHDL中最常用、中最常用、最基本的数据
20、类型,这些数据类型都已在最基本的数据类型,这些数据类型都已在VHDLVHDL的的标准程序包标准程序包StandardStandard和和std_logic_1164std_logic_1164及其它的及其它的标准程序包中作了定义标准程序包中作了定义,可在设计中随时调用。可在设计中随时调用。文件类型:文件类型:不同类型的数据和数据名组织在一起不同类型的数据和数据名组织在一起形成新的数据对象。形成新的数据对象。存取类型:存取类型:为数据对象提供存取方式。为数据对象提供存取方式。252.6.1 2.6.1 文字文字 (1)整数:整数都是十进制的数 如:5,156E2(=15600),45_234_2
21、87(=45234287)(2)实数:实数也都是十进制的数,但必须带有小数点,如:88_670_551.453_909(=88670551.453909),1.0,44.99E-2(=0.4499)26(3)以数值基数表示的数:用这种方式表示的数由五部分组成:基#整数#指数 第一部分:用十进制数标明数值进位的基数;第二部分:数值隔离符“#”;第三部分:表达的数值;第四部分:指数隔离符“#”;第五部分:用十进制数表示的指数部分,若为0可省略不写。27例如:例如:10#17#;-(表示第三部分为十进制数,等于17)16#FE#;-(表示第三部分十六进制数,等于254)2#1111_1110#;-(
22、表示第三部分为二进制数,等于 254)8#376#;-(表示第三部分为八进制数,等于254)16#E#1;-(表示十六进制数,等于14161,等于224)28(4)字符 是用单引号括起来的ASC码,一般情况下VHDL对字母的大小写不敏感,但对字符的大小写是敏感的,例:A 和 a 是不同的。(5)字符串 是用双引号括起来的字符序列,在VHDL中字符串常用来作为说明文字出现。例:“it is time out”,“ERROR”,“Both S and Q equal to 1”注意:“a”和 a是不同的29B:二进制基数符号,可以省略O:八进制基数符号X:十六进制基数符号(0F)采用位串的优点是为
23、了增加源代码的可读性。例:例:B1_1101_1110-二进制数数组,位矢数组长度是9O15 -八进制数数组,位矢数组长度是6(6)位串位串是用双引号括起来的数字序列,数字序列前面加上一个基数说明符:30XAD0-十六进制数数组,位矢数组长度是12101_010_101_010-二进制数数组,位矢数组长度是120AD0 -表达错误,缺X(7)物理文字 由整数或实数文字与表示物理单位的标识符组成,如:3.5 ns。31(8)下标名及下标段名 下标名下标名用于指示数组型变量或信号的某一元用于指示数组型变量或信号的某一元素,如:素,如:a(2),b(n)下标段名下标段名则用于指示数组型变量或信号的某
24、一则用于指示数组型变量或信号的某一段元素,其语句格式如下:段元素,其语句格式如下:数组类型信号名或变量名数组类型信号名或变量名(表达式表达式1 TO/DOWNTO 表达式表达式2);32SIGNAL A,B,C:BIT_VECTOR(0 TO 7);SIGNAL M:INTEGER RANGE 0 TO 3;SIGNAL Y,Z:BIT;Y=A(M);-M是不可计算型下标表示是不可计算型下标表示Z=B(3);-3是可计算型下标表示是可计算型下标表示C(0 TO 3)=A(4 TO 7);-以段的方式进行赋值以段的方式进行赋值C(4 TO 7)=A(0 TO 3);-以段的方式进行赋值以段的方式
25、进行赋值如下是下标名及下标段名使用示例:如下是下标名及下标段名使用示例:331.VHDL1.VHDL的预定义数据类型的预定义数据类型 (1 1)整数)整数(INTEGER)(INTEGER)数据类型数据类型:正整数、负整数:正整数、负整数和零。可以使用预定义的运算操作符,和零。可以使用预定义的运算操作符,但不能按位但不能按位访问,也不能进行逻辑操作访问,也不能进行逻辑操作。在在VHDLVHDL中,整数的取值范围是中,整数的取值范围是2147483647214748364721474836472147483647 仿真时:将其作为有符号数处理。综合时:作为仿真时:将其作为有符号数处理。综合时:作
26、为无符号数处理。无符号数处理。例:例:SIGNAL a:INTEGER RANGE 0 TO 9;SIGNAL a:INTEGER RANGE 0 TO 9;VHDLVHDL的预定义数据类型都是在的预定义数据类型都是在VHDLVHDL标准程序包标准程序包STANDARDSTANDARD中定义的。中定义的。34(2 2)实数)实数(REAL)(REAL)数据类型:数据类型:类似于数学中的实数,或称为浮点数,通常情类似于数学中的实数,或称为浮点数,通常情况下实数类型仅能用于况下实数类型仅能用于VHDLVHDL的仿真,综合器一般的仿真,综合器一般不支持实数。不支持实数。(3 3)位)位(BIT)(B
27、IT)数据类型数据类型:属于枚举型,取值只能:属于枚举型,取值只能是是11和和00。(4 4)位矢量)位矢量(BIT_VECTOR)(BIT_VECTOR)数据类型数据类型:是:是BITBIT的数的数组,使用位矢量必须注明位宽。例:组,使用位矢量必须注明位宽。例:signal a:signal a:bit_vector(7 bit_vector(7 downtodownto 0)0);35(5)布尔)布尔(BOOLEAN)数据类型:数据类型:属于枚举型,取属于枚举型,取值为值为false和和true。(6)字符)字符(CHARACTER)数据类型数据类型:字符类型通:字符类型通常用单引号引起来
28、。如:常用单引号引起来。如:a。字符类型区分大小写,。字符类型区分大小写,这一点和标识符的大小写是不同的。这一点和标识符的大小写是不同的。(7)字符串)字符串(STRING)数据类型:数据类型:字符串必须用双引号标明。例:字符串必须用双引号标明。例:VARIABLE str:STRING(1 TO 7);str:=a b c d ;36(8 8)时间)时间(TIME)(TIME)数据类型数据类型 VHDLVHDL中唯一的预定义物理类型是时间。完中唯一的预定义物理类型是时间。完整的时间类型包括整数和物理量单位两部分,整整的时间类型包括整数和物理量单位两部分,整数和单位之间至少留一个空格,例:数和
29、单位之间至少留一个空格,例:55 ms,20 ns55 ms,20 ns等。等。(9 9)错误等级()错误等级(severity levelseverity level)错误等级类型数据用来表征系统的状态共错误等级类型数据用来表征系统的状态共有有4 4种:种:NOTENOTE(注意)(注意)WARNINGWARNING(警告)(警告)ERRORERROR(出(出错)错)FAILUREFAILURE(失败)。(失败)。(1010)自然数()自然数(naturalnatural),正整数(),正整数(positivepositive)372.IEEE2.IEEE预定义标准逻辑位与矢量预定义标准逻辑
30、位与矢量(1 1)标准逻辑位)标准逻辑位STD_LOGICSTD_LOGIC数据类型数据类型(2 2)标准逻辑矢量)标准逻辑矢量(STD_LOGIC_VECTOR)(STD_LOGIC_VECTOR)数据类型数据类型 std_logic_vectorstd_logic_vector是是std_logicstd_logic的数组形式。的数组形式。因为是因为是ieeeieee的预定义数据类型,使用时必须先打开的预定义数据类型,使用时必须先打开ieeeieee库。库。即:即:library library ieeeieee;use ieee.std_logic_1164.all;use ieee.s
31、td_logic_1164.all;38std_logicstd_logic是一个是一个9 9值的逻辑。其取值为:值的逻辑。其取值为:U U 未初始化状态;未初始化状态;X X 不定态;不定态;O O 逻辑逻辑0 0;1 1 逻辑逻辑1 1;Z Z 高阻态;高阻态;W W 弱不定态;弱不定态;L L 弱弱0 0;H H 弱弱1 1;-无关态;无关态;39练习:练习:1.1.执行下列语句后执行下列语句后Q Q的值等于()的值等于()。SIGNAL E:STD_LOGIC_VECTOR(2 TO 5);SIGNAL E:STD_LOGIC_VECTOR(2 TO 5);SIGNAL Q:STD_L
32、OGIC_VECTOR(9 DOWNTO 2);SIGNAL Q:STD_LOGIC_VECTOR(9 DOWNTO 2);EE1 1,4=,4=0 0,OTHERS=,OTHERS=1 1););QE(2),4=E(3),5=QE(2),4=E(3),5=1 1,7=E,7=E(5),OTHERS=E(4);(5),OTHERS=E(4);A A “1101101111011011”B.B.“0010110100101101”C.C.“1101100111011001”D.D.“0010110000101100”402.定义信号定义信号 A1,A2,A3,A4,A5,A6,A7,A8其中每一
33、位信号均为标准逻辑型其中每一位信号均为标准逻辑型定义信号定义信号B,其数据类型为标准逻辑型。其数据类型为标准逻辑型。定义信号定义信号C,数据类型为整数型。数据类型为整数型。给给A、B赋值,其中赋值,其中A的值为的值为11001101;B的的 值为值为0。3.3.P54 P54 第第4 4、5 5题题41Library IEEEUse ieee.std_logic_1164.allSignal A:std_logic_vector(1 to 8)Signal B:std_logicSignal C:integerLibrary StdUse std.standard.allA=“11001101”B=042