EDA技术和VHDL设计第4章VHDL语言要素课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《EDA技术和VHDL设计第4章VHDL语言要素课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 技术 VHDL 设计 语言 要素 课件
- 资源描述:
-
1、1 1第4章 VHDL语言要素 第4章 VHDL语言要素 4.1 VHDL文字规则 4.2 数据对象 4.3 VHDL的数据类型 4.4 VHDL操作符 4.5 属性 2 2第4章 VHDL语言要素 4.1 VHDL文字规则文字规则VHDL文字主要包括数值型文字和标识符。数值型文字主要有数字型、字符串型。4.1.1 数值型文字数值型文字1数字型数字型数字型文字有多种表达方式,列举如下:(1)整数(Integer)。整数是十进制数,与算数整数相似,包括正整数、负整数和零,表示范围是-(231-1)(231-1),即-21474836472147483647。整数的表达方式举例:1,234,567
2、E2(=56700),12_345_678(=12345678)3 3第4章 VHDL语言要素 其中,数字间的下划线仅仅是为了提高文字的可读性,相当于一个空的间隔符,没有其他意义,也不影响文字本身的数值。(2)实数(Real)。实数也是十进制的数,但必须带有小数点。它类似于数学上的实数,或称浮点数,表示范围是-1.0E381.0E38。实数的表达方式举例:0.0,123.45,6.0,78.99E-2(=0.7899),12_345.678_999(=12345.678999)4 4第4章 VHDL语言要素(3)以数制基数表示的格式。用这种方式表示的数由五部分组成:第一部分,基数,用十进制数表
3、明所用数制;第二部分,数制隔离符号“#”;第三部分,所要表达的数;第四部分,指数隔离符号“#”;第五部分,用十进制数表示的指数,如果这一部分为0可以省去不写。以数制基数表示的文字表达方式举例:10#235#(十进制数表示,等于235)2#1110_1011#(二进制数表示,等于235)8#353#(八进制数表示,等于235)16#EB#(十六进制数表示,等于235)16#E#E1(十六进制数表示,等于16#E0#,等于2#11100000#,等于224)16#F.01#E2(十六进制数表示,等于16#F01#,等于3841.00)5 5第4章 VHDL语言要素(4)物理文字量。物理文字量包括时
4、间、电阻、电流等,但此类文字综合器不能接受,多用于仿真。物理文字量的表达方式举例:55 ns,177 A,23 m它一般由整数和单位两部分组成,整数与单位间至少留一个空格。6 6第4章 VHDL语言要素 2.字符串型字符串型字符是用单引号引起来的ASCII字符,可以是数值,也可以是符号或字母,如A、8、a、-。字符串是字符的一维数组,必须使用双引号引起来。VHDL中有两种字符串:文字字符串和数位字符串。(1)文字字符串。文字字符串即用双引号引起来的一串文字,举例:“STRING”,“Both A and B equal to 0“(2)数位字符串。数位字符串即位矢量,用双引号引起来的一维位(B
5、IT,VHDL预定义数据类型)数据,采用基数符加字符串的表达形式,举例:7 7第4章 VHDL语言要素 B“1_1101_0010”(二进制数组,位矢量长度是9)O“34”(八进制数组,位矢量长度是6,相当于B“011100”)X“1AB”(十六进制数组,位矢量长度是12)其中,B代表二进制基数符号,表示二进制数位0或者1,字符串中的每一位表示一个BIT;O代表八进制基数符号,字符串中的每一位代表一个八进制数,即3位BIT的二进制数;X代表十六进制基数符号,字符串中的每一位代表一个十六进制数,即一个4位的二进制数。8 8第4章 VHDL语言要素 分析下面表达方式的正确性:B“1000_1110
6、”-二进制数组,数组长度8,表达正确B“10001110”-二进制数组,数组长度8,表达正确“1000_1110”-表达错误,如果省去B,则不能加下划线“10001110”-表达正确1AB -表述错误,除二进制外,八进制和十六进制不能省去基数符9 9第4章 VHDL语言要素 4.1.2 标识符标识符VHDL中的标识符可以是常量、变量、信号、端口、子程序或参数的名称。使用标识符要遵守一定的法则,这不仅是对电子系统设计工程师的一个约束,同时也为各种EDA工具提供标准的书写规范,使之在综合仿真过程中不产生歧义,易于仿真。VHDL中的标识符分为基本标识符和扩展标识符两种。基本标识符的规则如下:(1)标
7、识符由字母(AZ,az)、数字(09)和下划线(_)组成。(2)任何标识符必须以英文字母开头。10 10第4章 VHDL语言要素(3)不允许出现多个连续的下划线,只能是单一下划线,且不能以下划线结束。(4)标识符不区分英文字母大小写。(5)VHDL定义的保留字或关键词,不能用作标识符。(6)VHDL中的注释文字一律由两个连续的连接线“-”开始,可以出现在任一语句后面,也可以出现在独立行。分析下面标识符的合法性:_decoder-非法标识符,起始不能是非英文字母3dop -非法标识符,起始不能是非英文字母largenumber 非法标识符,“”不能成为标识符的构成11 11第4章 VHDL语言要
8、素 sig_N -合法标识符state0 -合法标识符NOT-ACK -非法标识符,“-”不能成为标识符的构成Data_ _bus -非法标识符,不能含有多个下划线Copper_ _ -非法标识符,不能以下划线结束Return -非法标识符,关键字不能用作标识符tx_clk -合法标识符12 12第4章 VHDL语言要素 VHDL93标准还支持扩展标识符,以反斜杠来界定,免去了87标准中基本标识符的一些限制,如:可以以数字打头,允许包含图形符号,允许使用VHDL保留字,区分字母大小写等。扩展标识符举例:entity、2chip、EDA、eda、aabb。但目前仍有较多VHDL工具不支持扩展标识
9、符,所以本书仍以87标准为准。由于VHDL语言不区分大小写,在书写时一定要养成良好的书写习惯。一般而言,应用关键词时应大写,自行定义的标识符应小写。13 13第4章 VHDL语言要素 4.2 数数 据据 对对 象象在VHDL中,凡是可以赋予一个值的客体称为数据对象。数据对象是数据类型的载体,可以把它看做一个容器,能够接收不同数据类型的赋值。常用的数据对象有:常量(CONSTANT)、变量(VARIABLE)和信号(SIGNAL)。14 14第4章 VHDL语言要素 4.2.1 常量常量常量是指在设计描述中不会变化的值。常量的使用主要是为了使代码更容易阅读和修改。在VHDL描述中,一般用常量名代
10、替数值。常量是一个恒定不变的值,一旦作了数据类型和赋值定义后,在代码中就不能再改变,因而具有全局意义。常量声明的格式如下:CONSTANT 常量名:数据类型:=取值;15 15第4章 VHDL语言要素【例4-1】CONSTANT width_s:INTEGER:=8;-声明常量width_s,数据类型为整型,值为8CONSTANT delay:TIME:=25ns;-声明常量dealy作为延时时间25 nsCONSTANT fbus:BIT_VECTOR:=“010100”;-声明常量fbus为位矢量类型常量的使用注意以下几个要点:(1)常量的赋值必须符合声明的数据类型。(2)常量一旦赋值就不
11、能再改变。若要改变常量值,必须要改变设计,改变常量的声明。16 16第4章 VHDL语言要素(3)常量声明所允许的范围有实体、结构体、进程、子程序、块和程序包。(4)常量具有可视性规则,即常量的声明位置决定它的使用范围。如果常量是在程序包中声明的,则调用此程序包的所有设计实体都可以使用,此时具有最大的全局化特征;常量如果声明在设计实体中,则这个实体定义的所有结构体都可以使用;常量如果声明在结构体内,则只能用于该结构体;如果声明在某进程中,则只能在该进程中使用。17 17第4章 VHDL语言要素 4.2.2 变量变量变量用于对数据的暂时存储。变量是一个局部量,只能在进程和子程序中使用。变量声明的
12、格式如下:VARIABLE 变量名:数据类型:=初始值;【例4-2】VARIABLE count:INTEGER RANGE 0 TO 99:=0;-声明变量count,数据类型为整型,初值为0VARIABLE result:STD_LOGIC:=1;-变量result为标准逻辑位数据类型,初值为1VARIABLE x,y,z:STD_LOGIC_VECTOR(7 DOWNTO 0);-声明变量x、y、z为标准逻辑矢量数据类型,没有定义初值18 18第4章 VHDL语言要素 虽然变量可以在声明时赋予初始值,但综合器并不支持初始值的设置,使用时将忽略。初始值仅对仿真器有效。当变量在声明语句中没有
13、赋予初值时,可以通过变量赋值语句在使用时对其赋值。变量赋值语句的格式如下:目标变量名:=表达式;19 19第4章 VHDL语言要素【例4-3】VARIABLE x,y,z:STD_LOGIC_VECTOR(7 DOWNTO 0);-声明变量x、y、zx:=“01001010”;y:=“00010001”;z:=x(0 TO 3)&y(4 TO 7);需要注意的是,赋值语句中的表达式必须与目标变量具有相同的数据类型。变量在使用时还需注意以下几个要点:(1)变量是一个局部量,只用于进程和子程序。变量不能将信息带出对它作定义的设计单元。(2)变量的赋值是立即发生的,不存在任何延时的行为。2020第4
14、章 VHDL语言要素(3)VHDL语言规则不支持变量附加延时语句。(4)变量常用在实现某种运算的赋值语句中。变量赋值和初始化赋值都使用符号“:=”。(5)变量不能用于硬件连线。在VHDL 93标准中对变量的类型作了增加,引入了全程变量,可以把值传送到进程外部,参见例4-4。从分析可知,定义了一个全程变量v,用于在进程P0和P1间传递信息。需要注意的是,全程变量也不能作为进程的敏感参数,并且可能导致一些不确定性,使用全程变量必须小心。21 21第4章 VHDL语言要素【例4-4】2222第4章 VHDL语言要素 4.2.3 信号信号信号是电路内部硬件实体相互连接的抽象表示,可以实现进程之间的通信
15、。信号声明的格式如下:SIGNAL 信号名:数据类型:=初始值;【例4-5】SIGNAL sys_clk:BIT :=0;-声明位型的信号sys_clk,初始值为低电平SIGNAL temp:STD_LOGIC_VECTOR(7 DOWNTO 0);-信号temp,数据类型为标准逻辑矢量,没有设置初始值SIGNAL s1,s2:STD_LOGIC;-声明了两个STD_LOGIC类型的信号s1和s22323第4章 VHDL语言要素 与变量相同,对信号初始值的设置也不是必须的,并且仅在仿真中有效。一般在设计中对信号进行赋值,信号赋值语句的格式如下:目标信号名=表达式;【例4-6】SIGNAL a,
16、b,c,d:STD_LOGIC_VECTOR(7 DOWNTO 0);a=“10101010”;-以二进制形式将8个比特一次赋值完毕b=X“AA”;-以十六进制形式赋值,在VHDL 97标准中定义c(7 DOWNTO 4)=“1100”;-比特分割,信号c的高4位被赋值“1100”d(7)=1;-单比特赋值2424第4章 VHDL语言要素 信号的使用需要注意以下几个要点:(1)信号的声明范围是程序包、实体和结构体。信号不能在进程和子程序中声明,但可以使用。(2)与常量相似,信号也具有可视性规则。在程序包中声明的信号,对于所有调用此程序包的设计实体都可见;在实体中声明的信号,在其对应的所有结构体
17、中都可见;在结构体中声明的信号,此结构体内部都可见。(3)实体中定义的输入、输出端口也是信号,只是附加了数据流动的方向。2525第4章 VHDL语言要素(4)符号“:=”用于对信号赋初始值,符号“=”用于信号的代入赋值。代入赋值可以设置延时,如:a=“10101010”AFTER 5ns。(5)信号包括I/O引脚信号和IC内部缓冲信号,有硬件电路与之对应,所以即使没有设置延时,信号之间的传递也有实际的附加延时。(6)信号能够实现进程间的通信,即把进程外的信息带入进程内部,把进程内部的信息带出进程。所以,信号能够列入进程的敏感列表,而变量不能列入。2626第4章 VHDL语言要素(7)信号的赋值
18、可以出现在进程中,也可以直接出现在结构体的并行语句中,但它们的运行含义不同。前者属于顺序信号赋值,允许同一信号有多个驱动源(赋值源),但只有最后的赋值语句进行有效的赋值操作,如例4-7中的y被赋值为c;后者属于并行信号赋值,赋值操作是各自独立并行发生的,不允许对同一信号多次赋值,如例4-8中的y被赋值为a+b,z被赋值为c,不允许对y多次赋值。同样地,也不允许在不同的进程中对同一信号进行赋值操作。2727第4章 VHDL语言要素【例4-7】ARCHITECTURE bhv OF adder IS SIGNAL a,b,c,y,z:INTEGER;BEGIN PROCESS(a,b,c)BEGI
19、N y=a+b;y=c;END PROCESS;END bhv;2828第4章 VHDL语言要素【例4-8】ARCHITECTURE bhv OF adder ISSIGNAL a,b,c,y,z:INTEGER;BEGINy=a+b;z=c;END bhv;2929第4章 VHDL语言要素(8)在使用信号赋值语句时,可以一个信号定义几个值,见例4-9。这些值应一一枚举,中间使用逗号分开,AFTER后的延时值必须为升序。但需要特别注意的是,综合工具不支持这种描述方法,该描述更多地使用在仿真测试中。更多的例子可以参见第8章。【例4-9】时刻 输出信号c值c=0,0 01 AFTER 5ns,5
20、1a AFTER 10ns,10 ab AFTER 15ns;15 b3030第4章 VHDL语言要素 4.2.4 变量与信号的比较变量与信号的比较在VHDL语言中,变量和信号是常用的数据对象,在形式上非常相似,但本质上却有很大的差别。变量赋值语句用来给变量赋值或改变变量值,使用赋值符号“:=”,且只能在VHDL的顺序语句部分(进程和子程序)声明和使用。当给变量赋值时,赋值操作立即执行,该变量一直保留所赋值,直到下次赋值操作发生为止。变量一般用作局部数据的临时存储单元。31 31第4章 VHDL语言要素 信号赋值语句可以改变当前进程中信号的驱动值,使用赋值符号“=”。信号只能在VHDL并行语句
21、部分声明,但既可以用在并行语句部分,也可以用在顺序语句部分。当给信号赋值时,赋值操作并没有立即生效,必须要等待一个延时,在每个进程结束时才完成赋值。信号一般用作电路单元的互联。当然,变量类型和信号类型如果完全一致,数据类型也完全相同,允许二者相互赋值。例4-10和例4-11显示了信号和变量在进程中赋值的区别。由于实体定义部分完全与例4-10相同,所以例4-11只显示了结构体部分。两个例子的区别仅在于例4-10使用的是信号a和b,而例4-11使用的是变量a和b。3232第4章 VHDL语言要素【例4-10】3333第4章 VHDL语言要素 3434第4章 VHDL语言要素【例4-11】3535第
22、4章 VHDL语言要素 图4-1和图4-2分别是例4-10和例4-11综合后的RTL电路图,可以看出其结果有了较大的差别,这是由信号和变量不同的赋值特性所引起的。变量的赋值是立即执行没有延时的,所以a:=x和b:=a这两条语句能够立即执行。3636第4章 VHDL语言要素 图4-1 例4-10的RTL电路图 3737第4章 VHDL语言要素 图4-2 例4-11的RTL电路图 3838第4章 VHDL语言要素 信号的赋值是有延时的,当进程启动后,进程有固定的运行时间,在进程内的语句是顺序执行的。所有进程内的信号赋值语句均顺序启动各自的延时定时器(顺序启动的间隔几乎为0),准备在定时结束后执行赋
23、值操作。可以发现,只有执行到END PROCESS语句时,延时才结束,模拟器的时钟才能向前推进。因此,进程中所有信号的赋值操作几乎是在同时完成赋值的。所以,对于例4-9来说(仿真结果见图4-3),当第2个时钟上升沿到来后,启动一次进程,信号a能够在延时后获得新的输入信号x的值1,信号b也能在延时后完成赋值语句b=a-1操作,但此时对赋值语句b而言,a值仍然是原有的a值0,而不是新的a值1,这是因为新的a值是基本与b的赋值同时完成得到的,所以完成赋值操作后b值仍然为-1。同样地,对于输出信号y,也在延时后完成赋值语句y=b-2,得到y值为-3。对于两个例子赋值更新的数据可参见图4-3和图4-4。
24、可以看到,采用信号的例4-10比采用变量的例4-11慢了两个时钟周期,与RTL电路图的结构相符。3939第4章 VHDL语言要素 图4-3 例4-10的波形仿真结果 4040第4章 VHDL语言要素 图4-4 例4-11的波形仿真结果 41 41第4章 VHDL语言要素 分析例4-12代码片段,说明信号s_v的最后赋值结果。从例4-12的注释中可以看出,由于变量是立即赋值的,所以s_v(0)和s_v(1)得到了变量x和y第一次赋值,为“1”,随后变量x和y进行了第二次赋值,并将值传递给了s_v(4)和s_v(5),使得s_v(4)和s_v(5)为“0”。虽然信号s1和s2也分别有两次赋值操作,
25、但按照在同一进程中执行最后一条赋值语句的规则,s1和s2的值都是“0”,所以s_v(2)、s_v(3)、s_v(6)、s_v(7)均为“0”。所以完成赋值后,信号s_v应等于“00000011”。4242第4章 VHDL语言要素【例4-12】4343第4章 VHDL语言要素 4444第4章 VHDL语言要素 为便于读者分析,下面再列举两个实例进行比较。例4-13和例4-14的目的是完成一个移位寄存器,例4-14的实体部分与例4-13相同,这里略去。比较两个例子,可以发现信号和变量的基本区别:声明、使用的范围不同。这也是例4-14中的语句“q=reg”必须放在进程内的原因。观察两个例子的仿真结果
展开阅读全文