硬件描述语言VHDL概述硬件描述语言VHDL概述.ppt_第1页
硬件描述语言VHDL概述硬件描述语言VHDL概述.ppt_第2页
硬件描述语言VHDL概述硬件描述语言VHDL概述.ppt_第3页
硬件描述语言VHDL概述硬件描述语言VHDL概述.ppt_第4页
硬件描述语言VHDL概述硬件描述语言VHDL概述.ppt_第5页
已阅读5页,还剩155页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、硬件描述语言VHDL概述,硬件描述语言VHDL概述,VHDL基本结构,数据对象、类型及运算符,顺序语句、并行语句,子程序,程序包与设计库,硬件描述语言VHDL概述,HDL最早是Iverson公司于1962年提出,到上世纪80年代被各个ASIC芯片厂商广泛采用。1982年各ASIC芯片厂商相继开发出自己的HDL。如Silvar-lisco公司的HHDL、Zycad公司的ISP、Gateway Design Automation(现改为Cadence Design System)公司的Verilog等等。另外,还有许多一些高等院校及科研机构也开发了许多版本的HDL,有名的有美国国防部开发的VHDL

2、(VHSIC HDL)、日本电子工业振兴协会的UDL/I等,硬件描述语言(Hardware Description Language,HDL,为了标准化HDL,1987年底,IEEE确认美国国防部开发的VHDL为标准硬件描述语言(IEEE-1076)。之后,各EDA公司研制的硬件电路设计工具逐渐向VHDL靠拢。1993年,IEEE对VHDL进行了修订,公布了新版本的VHDL(即IEEE-107-1993)。现在VHDL和Verilog作为IEEE的两个标准,硬件描述语言VHDL概述,VHDL语言是美国国防部在20世纪80年代初为实现其高速集成电路计划(Very High Speed Integ

3、rated Circuit,VHSIC)而提出的硬件描述语言(Hardware Description Language,HDL),称为VHDL,VHDL的主要优点是,1.覆盖面广,描述能力强,是一个多层次的硬件描述语言,2.VHDL有良好的可读性,即可以被计算机接受,也容易被理解,3. 生命期长。VHDL的硬件描述与工艺技术无关,不会因工艺变化而使描述过时。与工艺技术有关的参数可通过VHDL提供的属性加以描述,工艺改变时,只需修改相应程序中的属性参数即可,硬件描述语言VHDL概述,4.支持大规模设计的分解和已有设计的再利用,一个大规模设计不可能一个人独立完成,它将由多人,多项目组来共同完成。

4、VHDL为设计的分解和设计的再利用提供了有力的支持,5.VHDL已成为IEEE承认的一个工业标准,事实上已成为通用硬件描述语言。目前,大多数的EDA工具几乎在不同程度上都支持VHDL,这样给VHDL的进一步推广和应用创造了良好的环境,6.VHDL可以支持自上而下(Top Down)和基于库(Library-Based)的设计方法,而且还支持同步电路、异步电路、FPGA等的设计。其范围之广是其它HDL所不能比拟的,硬件描述语言VHDL概述- 一,一、 VHDL基本结构,先看一个程序例子: 设计一个3-8译码器,1.参数部分库、程序包、配置,2.接口部分实体说明,硬件描述语言VHDL概述- 一,a

5、rchitecture behavior of dec is begin process(sel,en) begin yy(0)y(1)y(2)y(3)y(4)y(5)y(6)y(7)NULL; end case; end if; end process; end behavior,3.描述部分结构体,硬件描述语言VHDL概述- 一,VHDL语言把任意复杂的一个系统看成为一个模块,一个模块可主要分为三个组成部分: 1.参数部分库、程序包、配置 2.接口部分实体说明 3.描述部分结构体,或者说一个VHDL程序总是包含三个部分: 1.参数部分库、程序包、配置 2.接口部分实体说明 3.描述部分结构

6、体,硬件描述语言VHDL概述- 一,一个VHDL程序的前面部分总是有语句,有关库、程序包、配置的作用及使用方法在后面讲述,LIBRARY ieee; 使用IEEE标准库 USE ieee.std_logic_1164.all; 打开一个程序包 (程序包名为ieee.std_logic_1164.all,有些程序还需要加以下语句: USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.all,硬件描述语言VHDL概述- 一,数字系统中的基本单元,在VHDL中称做设计实体(design entity)。一个基本设计单元,简单的可以是一个

7、门,复杂一点的可以是一个微处理器、一块印刷电路板上所有电路或者是整个数字系统,设计实体由两部分组成:实体说明和结构体,实体说明规定了设计单元的输入输出接口信号或引脚。 结构体定义了设计单元的具体构造和操作(行为,硬件描述语言VHDL概述- 一,基本格式,1.1 实体说明,方括弧内可有可无,硬件描述语言VHDL概述- 一,1.类属参数说明,类属参数说明必须放在端口说明之前,用于为设计实体和其外部环境通信的静态信息提供通道,可以定义端口的大小、实体中子元件的数目、实体的定时特性等,例: GENERIC (m: Time:=1 ns,该语句指定了结构体内的m为Time类型,其值为ns,若随后的结构体

8、内有语句,q= tmp after m,则表示tmp送入q有一个延迟时间1ns,硬件描述语言VHDL概述- 一,2.端口说明,端口说明用于为设计实体和其外部环境的动态通信提供通道。也可以说是对外部引脚信号的名称、数据类型、输入输出方向的描述,一般书写格式为,1)端口名,端口名是赋予每个外部引脚的名称,通常用一个或几个英文字母,或者用英文字母加数字命名,硬件描述语言VHDL概述- 一,端口方向用来定义外部引脚的信号方向是输入还是输出,2)端口方向,注意:“OUT”和“BUFFER”都可以定义输出端口,但它们之间是有区别的,硬件描述语言VHDL概述- 一,在VHDL语言中有10中数据类型,但是在逻

9、辑电路设计中只用到两种:BIT和BIT_VECTOR,3)数据类型,BIT数据类型是位逻辑数据类型,其取值只能是两个逻辑值(“1”和“0”)中的一个,BIT_VECTOR数据类型是位数组逻辑数据类型,其取值是一组二进制位的值,硬件描述语言VHDL概述- 一,基本格式,1.2 结构体,该结构体唯一的名称,缺省为behavioral,该结构体对应的实体,方括弧内可有可无,硬件描述语言VHDL概述- 一,1.结构体名称的命名,结构体名称是对本结构体的命名,它是该结构体的唯一名称。OF后面紧跟的实体名表明了该结构体所对应的是哪一个实体。用IS来结束结构体的命名,结构体的名称可以自由命名。但在大多数时候

10、,通常把结构体的名称命名为behavioral(行为)、dataflow(数据流)或者structural(结构)。表示结构体的3种描述方式,2.说明语句,定义语句位于ARCHITECTURE和BEGIN之间,用于对结构体内部所使用的信号、常数、数据类型和函数进行定义,硬件描述语言VHDL概述- 一,3.并行语句,并行语句处于语句BEGIN和END之间,具体描述了本结构体的行为(功能)及其连接关系(内部结构,并行语句的描述方式有4种,1)算法描述。 2)数据流描述。 3)结构描述。 4)混合描述,属行为描述(功能描述,也属行为描述(功能描述,描述内部结构,兼有功能描述和内部结构描述,硬件描述语

11、言VHDL概述- 一,1)算法描述(也有称为“行为描述”方式,算法描述属行为描述。是描述方式中较容易接受的。完全把硬件的设计软件化了。 行为描述表示输入与输出间转换的行为。无需包含任何结构信息,硬件描述语言VHDL概述- 一,算法描述如下,ARCHITECTURE behavior OF reg IS BEGIN process (ck, reset, preset) begin if reset=0 then q=0; elsif preset=0 then q=1; elsif ckevent and ck=1 then q=d; end if; end process; END beha

12、vior,process为进程语句,括号内信号是进程的激活条件,进程常用来描述实体或其内部部分硬件的行为,硬件描述语言VHDL概述- 一,2)数据流描述(也有称为“寄存器传输描述”方式,数据流描述表示行为,也隐含表示结构。它反映从输入数据到输出数据之间所发生的逻辑变换,ENTITY mux IS PORT (d0,d1: IN BIT; sel: IN BIT; q: OUT BIT); END mux; ARCHITECTURE dataflow OF mux IS BEGIN q=(d0 AND sel) OR (NOT sel AND d1); END dataflow,硬件描述语言VH

13、DL概述- 一,3)结构描述,结构描述给出实体内部结构,即所包含的模块或元件及其互连关系以及与实体外部引线的对应关系,和: s=a xor b,进位:c=a and b,硬件描述语言VHDL概述- 一,半加器的描述如下,ARCHITECTURE struct_ha OF half_adder IS COMPONENT and_gate PORT(a1,a2: IN Bit;a3: OUT Bit); END COMPONENT; COMPONENT xor_gate PORT(x1,x2: IN Bit;x3: OUT Bit); END COMPONENT; BEGIN g1: and_ga

14、te PORT MAP(a,b,c); g2: xor_gate PORT MAP(a,b,s); END struct_ha,程序中COMPONENT 为元件说明语句,说明元件的名称及端口特性。该结构体中由两条并行的元件例化(引用)语句组成。 PORT MAP为端口映射,指明所含元件之间以及元件与实体端口之间的连接关系。被例化的元件称为例元(and_gate和xor_gate,硬件描述语言VHDL概述- 一,4)混合描述,在一个结构体中,行为描述与结构描述可以混合使用。即元件例化语句可与其他并行语句共处于同一个结构体内,ARCHITECTURE struct_ha OF half_adder

15、 IS COMPONENT and_gate PORT(a1,a2: IN Bit;a3: OUT Bit); END COMPONENT; BEGIN s= a XOR b; g1: and_gate PORT MAP(a,b,c); END struct_ha,硬件描述语言VHDL概述- 二,二、 数据对象、类型及运算符,2.1 对象类别与定义,在VHDL语言中,有四类对象: 1)CONSTANT(常量),可用于定义延迟、功耗、电源(即5V)、地(0V)等参数。只能进行一次赋值。 2)VARIABLE(变量),常用于高层次抽象的算法描述中。可多次赋值。 3)SIGNAL(信号),对应某一条

16、硬件连线,可多次赋值。 4)FILE(文件),相当于文件指针,用于对文件的读写操作。(很少用到,硬件描述语言VHDL概述- 二,1.常量(CONSTANT,常量是一个固定值。所谓常量说明就是对某一常量名赋予一个固定值。通常赋值在程序开始前进行,该值的数据类型则在说明语句中指明。一般格式如下,CONSTANT 常量名: 数据类型: =表达式,硬件描述语言VHDL概述- 二,2.变量(VARIABLE,变量只能在进程语句、函数语句和过程语句结构中使用,它是一个局部量。在仿真过程中,变量的赋值是立即生效。一般格式如下,VARIABLE 变量名: 数据类型: 约束条件:=初始值,方括弧内可有可无,硬件

17、描述语言VHDL概述- 二,3.信号(SIGNAL,信号是电子电路内部硬件连接的抽象。它除了没有数据流动方向说明以外,其他性质几乎和前面所述的“端口”概念一样。信号通常在构造体、包集合和实体中说明。一般格式如下,SIGNAL 信号名: 数据类型: 约束条件:=初始值,方括弧内可有可无,硬件描述语言VHDL概述- 二,4.关于信号和变量值代入的区别,信号和变量值的代入不仅形式不同,而且其操作过程也不同。 在变量的赋值语句中,该语句一旦被执行,其值立即被赋予变量。在执行下一条语句时,该变量的值就为上一句新赋的值。变量的赋值符为“:=”。 信号代入语句采用“=”代入符,该语句即使被执行也不会使信号立

18、即发生代入。下一条语句执行时,仍使用原来的信号值。由于信号代入语句是同时进行处理的,因此,实际代入过程和代入语句的处理是分开进行的,硬件描述语言VHDL概述- 二,例:信号值的代入,PROCESS(a,b,c,d) BEGIN d=a; x=b+d; d=c; y=b+d; END PROCESS,结果是:x=b+c; y=b+c,上例中,虽然信号代入语句进行了处理,但实际代入过程是在进程执行完后进行的,因此最后所代入的值作为最终代入值。因为d的最终值是c,所以x的最终值是b+c,硬件描述语言VHDL概述- 二,例:变量值的代入,PROCESS(a,b,c) VARIABLE D:Std_lo

19、gic_vector(3 Downto 0); BEGIN d:=a; x=b+d; d:=c; y=b+d; END PROCESS,结果是:x=b+a; y=b+c,上例中,变量的值一经赋值就变成新的值。因此x的最终值是b+a,硬件描述语言VHDL概述- 二,2.2 数据类型,在VHDL语言中,一个对象只能具有一个数据类型,施加于该对象的操作必须与该类型相匹配。 VHDL提供多种标准的数据类型。在此基础上,用户还可以自定义数据类型,1.标准的数据类型,有十种标准的数据类型,分别是整数、实数、位、位矢量、布尔量、字符、字符串、时间、错误等级、大于等于零的整数或正整数,硬件描述语言VHDL概述

20、- 二,1)整数(Integer,整数与数学中的整数含义相同。VHDL中,整数的表示范围是-2 147 483 6472 147 483 647,即从-(231-1)到(231-1)。 VHDL是一个强类型语言,要求在赋值语句中的数据类型必须匹配。整数的例子: +136,+12 456,-457,2)实数(Real,在进行算法研究或者实验时,作为对硬件方案的抽象手段,常用实数四则运算。实数的定义值范围是-1.0E+38 +1.0E+38。实数有正负数,书写时一定要有小数点。实数的例子: -1.0 ,+2.5 ,-1.0E38,硬件描述语言VHDL概述- 二,3)位(Bit,在数字系统中,信号值

21、通常用一个位来表示。位值的表示方法是,用字符0或者1(将值放在单引号中)表示之。位与整数中的0和1不同,1和0仅仅表示一个位的两种取值。 位数据可以用来描述系统中总线的值,4)位矢量(Bit_vector,位矢量是用双引号括起来的一组位数据。例如: “001100” X”00BB,X表示是十六进制,用位矢量数据表示总线状态最形象也最方便,硬件描述语言VHDL概述- 二,5)布尔量(Boolean,一个布尔量具有两种状态,“真”或者“假”。虽然布尔量也是二值枚举量,但它和位不同,没有数值的含义,也不能进行算术运算。它能进行关系运算。例如,它可以在IF语句中被测试,测试结果产生一个布尔量TRUE或

22、FALSE。 如果某个信号或者变量被定义为布尔量,那么在仿真中将自动地对其赋值进行核查。一般这一类型的数据的初始值总为FALSE,硬件描述语言VHDL概述- 二,6)字符(Character,字符也是一种数据类型,所定义的字符量通常用单引号括起来,如A。一般情况下VHDL对大小写不敏感,但是对字符量中的大、小写字符则认为是不一样的。例如,B不同于b。 字符量中的字符可以是az中的任一个字母,09中的任一个数以及空白或者特殊字符,如$,%等等。 包集合STANDARD中给出了预定义的128个ASCII码字符类型,不能打印的用标识符给出。字符1与整数1和实数1.0都是不同的,7)字符串(Strin

23、g,字符串是用双引号括起来的一个字符序列,它也称字符矢量或字符串数组。常用于程序的提示和说明,硬件描述语言VHDL概述- 二,8)时间(Time,时间是一个物理量数据。完整的时间量数据应包含整数和单位两部分,而且整数和单位之间至少应留以后、个空格的位置。例 55 sec,2 min等。在包集合STANDARD中给出了时间的预定义,其单位是fs,ps,ns,s,ms,sec,min,hr。(飞秒,皮秒,纳秒,微秒,毫秒,秒,分钟,小时,9)错误等级(Severity level,错误等级类型数据用来表征系统的状态,它共有4种:NOTE(注意),WARNING(警告),ERROR(出错),FAIL

24、URE(失败)。在系统仿真过程中可以用这4种状态来提示系统当前的工作情况,硬件描述语言VHDL概述- 二,10)大于等于零的整数(Natural),正整数(Positive,这两类数据是整数的子类,Natural类数据只能取值0和0以上的正整数;而Positive则只能为正整数,以上这10种标准的数据类型,在编程中可直接引用。如果用户需使用这10种以外的数据类型,则必须进行自定义。 由于VHDL语言属于强类型语言,在仿真过程中,首先要检查赋值语句中的类型和区间,任何一个信号和变量的赋值均须落入给定的约束区间中,也就是说要落入有效数值的范围中。约束区间的说明通常跟在数据类型说明的后面,例如,In

25、teger RANGE 100 DOWNTO 1 Bit_vector (3 DOWNTO 0) Real RANGE 2.0 to 30.0,DOWNTO表示下降,硬件描述语言VHDL概述- 二,2.用户定义的数据类型,在VHDL语言中,使用户最感兴趣的一个特点是,可以由用户自己来定义数据类型。右用户定义的数据类型的定义书写格式为,TYPE 数据类型名 ,数据类型名 数据类型定义,可由用户定义的数据类型有,枚举(Enumerated)类型 .整数型(Integer)类型 .实数(Real)类型 .浮点数(Floating)类型 .数组(Array)类型 .存取(Access)类型 .文件(F

26、ile)类型 .记录(Recode)类型 .时间(Time)类型,硬件描述语言VHDL概述- 二,1)枚举(Enumerated)类型,在逻辑电路中,所有的数据都是用“1”和“0”来表示的,但是人们在考虑逻辑关系时,只有数字往往是不方便的。在VHDL语言中,可以用符号名来代替数字。例如,在表示一周每一天状态的逻辑电路中,可以假定“000”为星期天,“001”为星期一。这对阅读程序是不太方便的。为此,可以定义一个叫“week”的数据类型,TYPE week IS (sun,mon,tue,wed,thu,fri,sat,由于上述的定义,凡是用于代表星期二的日子都可以用tue来代替,阅读比较直观,

27、使用时也不易出错,枚举类型数据的定义格式为,TYPE 数据类型名 IS (元素,元素,如:TYPE std_logic IS (U,X,0,1,Z,W,L,H,硬件描述语言VHDL概述- 二,2)整数类型,实数类型(Integer,Real,整数类型在VHDL语言中已存在,这里定义的是用户所定义的整数类型,实际上可以认为是整数的一个子类。例如,在一个数码管上显示数字,其值只能取09的整数。如果由用户定义一个用于数码显示的数据类型,则可写为,TYPE digit IS Integer RANGE 0 TO 9,由此,可以总结出整数或实数用户定义数据类型的格式可写为,TYPE 数据类型名 IS 数

28、据类型定义 约束范围,硬件描述语言VHDL概述- 二,3)用户定义的数据类型例子,TYPE bit3 IS (0,1,Z,定义枚举类型,TYPE word IS ARRAY (31 DOWNTO 0) OF Bit,定义数组类型,TYPE matrix IS ARRAY (1 TO 8, 1 TO 8) OF Real,定义二维数组,TYPE voltage IS RANGE 0.0 TO 10.0,定义子类型(实型,TYPE complex IS RECORD re: Real; im: Real; END RECORD,定义记录类型,硬件描述语言VHDL概述- 二,4)IEEE标准“STD

29、_LOGIC”、”STD_LOGIC_VECTOR,在VHDL语言中,标准的数据类型“BIT”是一个逻辑型的数据类型,这类数据取值只能是0或1。由于不存在不定状态X,故不便于仿真。另外,由于它也不存在高阻状态,因此也很难用它来描述双向数据总线。 为此IEEE在1993年制订出新的标准(IEEE STD1164),使得“STD_LOGIC”型(标准逻辑数据类型)数据可以具有如下的9种不同的值,U, 未初始化的 X, 强未知的 强 强 Z, 高阻态 W, 弱未知 L, 弱 H, 弱 _, 忽略,硬件描述语言VHDL概述- 二,5)IEEE标准”STD_LOGIC_ARITH,在VHDL语言中,综合

30、工具配带的扩展包集合中,定义了一些有用的数据类型,如无符号数据类型UNSINGED、有符号数据类型SIGNED等。 这些类型在”STD_LOGIC_ARITH”中定义,有符号数据类型(SIGNED,SIGNED数据类型表示一个有符号的数值,综合器进行综合时将其解释成补码,它的最高位是符号位,例如,SIGNED(“1010”) 代表-6 SIGNED(“0101”) 代表+5,5 VARIABLE var:SIGNED(0 TO 10) 表示变量var有11 位,最左位var(0)是符号位,硬件描述语言VHDL概述- 二,无符号数据类型(UNSIGNED,UNSIGNED数据类型代表一个无符号的

31、数值,在综合中将其解释为二进制数,其最左位是最高位。例如,UNSIGNED(“1011”) 代表十进制的11 SIGNAL sig: UNSIGNED (5 DOWNTO 0) 最高位sig(5) VARIABLE var:UNSIGNED (0 TO 15) 最高位为var(0,如果要定义一个变量或信号的数据类型为UNSIGNED,则其位矢量长度越长,所代表的数值也越大。如一个4位变量的最大值为15,一个8位变量的最大值为255,0是它们的最小值。 不能用UNSIGNED定义负数,硬件描述语言VHDL概述- 二,5)数据类型的转换,在VHDL语言中,数据类型的定义是相当严格的,不同类型的数据

32、是不能进行运算和直接代入的。 为了实现正确的代入操作,必须将代入的数据进行类型转换。这就是所谓类型变换。 变换函数通常由VHDL语言的包集合提供。 例如在“STD_LOGIC_1164”,”STD_LOGIC_ARITH”和 ”STD_LOGIC_UNSIGNED”的包集合中提供了如下的数据类型变换函数,STD_LOGIC_UNSIGNED包集合,函数名 功能,CONV_INTEGER(A,由STD_LOGIC_VECTOR转换成INTEGER,注意: STD_LOGIC中的1和H转成INTEGER的1,0和L转为0,其余的也转为0,硬件描述语言VHDL概述- 二,STD_LOGIC_1164

33、包集合,函数名 功能,TO_STDLOGICVECTOR(A,由BIT_VECTOR转换为STD_LOGIC_VECTOR,TO_BITVECTOR(A,由STD_LOGIC_VECTOR 转换为BIT_VECTOR,TO_STDLOGIC(A,由BIT转换为STD_LOGIC,TO_BIT(A,由STD_LOGIC 转换为BIT,硬件描述语言VHDL概述- 二,STD_LOGIC_ARITH包集合,函数名 功能,CONV_STD_LOGIC_VECTOR(A,位长,CONV_INTEGER(A,由UNSIGNED,SIGNED 转换为INTEGER,硬件描述语言VHDL概述- 二,VHDL中

34、类型的转换必须通过类型表识符显式的进行,VARIABLE i: Integer; VARIABLE r: Real; SIGNAL s0: Bit:=0; SIGNAL s1: Bit:=1; SIGNAL s_array: Bit_Vector (0 TO 1); i:=Integer(r); r:=Real(i); s_array=Bit_Vector(s0,s1,例如,硬件描述语言VHDL概述- 二,2.3 常数的表示,VHDL语言中的数有整数、浮点数、字符、字符串、位串及物理数六种类型。 整数和浮点数均可用十进制、十六进制、八进制和二进制表示。十六进制中会出现数符AF。整数和浮点数均可

35、含十进制指数,两者的区别仅在于,整数无小数点,浮点数含小数点。 十进制数的定义格式为: 整数.整数指数,整数可表示为: 数字下划线数字,指数可表示为: E+(或-)整数,注意:在相邻的数字之间插入下划线,对十进制数值并无影响,而且允许在数字之前冠以若干个零,但是不允许在数字中存在空格。,硬件描述语言VHDL概述- 二,12 合法 000012 合法(等效于12) 12_345 合法(等效于12345) 1.2_345 合法(等效于1.2345) 3E5 合法 3.4E-7 合法 12 345 非法,例如,硬件描述语言VHDL概述- 二,非十进制数的定义格式为,基数#基于该基的整数.基于该基的整

36、数#E指数,基数必须为十进制形式的整数,指数也必须为十进制形式的整数,基于该基的整数可表示为: 扩展数字下划线扩展数字,扩展数字:数字(或字母AF,注意:对以基表示的数而言,在相邻的数字之间插入下划线对其数值并无影响。基数的最小值是2,最大值是16。,硬件描述语言VHDL概述- 二,16#1#E3 合法(等效于十进制数4096) 8#1#E3 合法(等效于十进制数64 ) 2#1#E3 合法(等效于十进制数8) 16#3E8# 合法(等效于十进制数1000) 8#1750# 合法(等效于十进制数1000) 2#1111101000# 合法(等效于十进制数1000) 16#0.F#E0 合法(等

37、效于十进制数0.9375) 2#1.1111_1111#E4 合法(等效于十进制数31.9375,例如:整数值255的表示方法,2#1111_1111# 等效于(2#11111111#) 8#00377# 等效于(8#377#) 016#0FF# 等效于(16#FF,又例,硬件描述语言VHDL概述- 二,字符、字符串和位串均用ASCII字符表示,单个字符用单引号括起来,如0、1、Z,字符串则用双引号括起来,如“abcd,位串是用字符形式表示的多位数码,是用双引号括起来的一串数字序列,序列前冠以B(二进制)、O(八进制)和X(十六进制)的基数说明。如 B“101010101” O“525” X“

38、155” 表示的都为十进制数的341,硬件描述语言VHDL概述- 二,2.4 运算符,VHDL中提供功能强大的运算符,可分为4类:逻辑运算符、算术运算符、关系运算符、其它运算符,硬件描述语言VHDL概述- 二,从 高 到 低,硬件描述语言VHDL概述- 二,从 高 到 低,可使用圆括号改变运算次序,硬件描述语言VHDL概述- 二,1.逻辑运算符,在VHDL中逻辑运算符共有6种,它们分别为: NOT取反; AND与;OR或; NAND与非;NOR或非;XOR异或,这6种逻辑运算符可以对“STD_LOGIC”和“BIT”等的逻辑型数据、“STD_LOGIC_VECTOR”逻辑型数组及布尔型数据进行

39、逻辑运算。必须注意,运算符的左边和右边,以及代入的信号的数据类型必须是相同的,在VHDL中,当一个语句中存在两个以上的逻辑表达式时,左右没有优先级差别(不象C语言中运算有自左至右的优先级顺序的规定)。例如,在下例中,如去掉式中的括号,那么从语法上来说是错误的: X=(a AND b) OR (NOT c AND d,硬件描述语言VHDL概述- 二,当然也有例外,在所有逻辑运算符中,NOT的优先级最高,如果一个逻辑表达式中只有“AND”,”OR”, “XOR”运算符,那么改变运算顺序将不会导致逻辑的改变。此时,括号是可以省略的。例如: a=b AND c AND d AND e; a=b OR

40、c OR d OR e; a=b XOR c XOR d XOR e; a=(b NAND c) NAND d) NAND e; (必须要括号) a=(b AND c) OR (a AND e); (必须要括号,硬件描述语言VHDL概述- 二,2.算术运算符,在VHDL中共有10种算术运算符,它们分别为: +加; - 减;*乘;/除;MOD求模; REM取余;+正(一元运算);- 负(一元运算); *指数;ABS取绝对值,加、减、乘、除运算符可用于整数、浮点数和物理类型。 指数运算的左边可以是整数或浮点数,但右边必须为整数,只有在左边为浮点数时,其右边才可以为负数。 取绝对值运算可以用于任何数

41、值类型。 求模和取余运算只能用于整数类型。 一元运算的操作数可以为任何数值类型(整数、浮点数和物理类型,硬件描述语言VHDL概述- 二,移位运算和循环移位运算的定义如下,移位运算符和循环移位运算符为二元运算符,只能定义在一维数组上,其左运算数(左元)的元素类型必须为位型(Bit)或布尔型(Boolean),而右运算数(右元)必须为整数类型。若右运算数为0,则无任何动作。如“ S RRL 0”将不发生任何动作;若右运算数为负数,则移位次数为该数的绝对值,如“S SRL 6”与“S SRL 6”等价,硬件描述语言VHDL概述- 二,3.关系运算符,在VHDL中共有6种算术运算符,它们分别为: =

42、等于;/= 不等于; 大于;= 大于等于,其中等号“=”和不等号“/=”可以适合所有类型的数据。 其它关系运算符则可使用于整数、浮点数、位(STD_LOGIC)等枚举类型和位矢量(STD_LOGIC_VECTOR)等数组类型。 注意:在利用关系运算符对数据类型进行比较时,比较过程是从最左边的位开始,自左至右按位进行比较。在位长不同的情况下,只能按自左至右的比较结果作为关系运算的结果。例,SIGNAL a:STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL b:STD_LOGIC_VECTOR (2 DOWNTO 0); ab) THEN,比较的结果是b大于a,显然这样的

43、比较结果是不符合实际情况的,为注释符,硬件描述语言VHDL概述- 二,4.合并运算符,合并运算符“ b:=3.0; c:=d+e,硬件描述语言VHDL概述- 三,2.信号代入,格式为: 目的信号量=表达式; 将右边表达式值经一定时间间隔(最小为)之后赋给左边的目的信号量。 例: a=b; 该语句表示将信号量b的当前值赋予目的信号量a. 注意:代入语句的符号“=”,和关系运算的小于等于符“=”非常相似,要正确判别不同的操作关系,应根据上下文的含义和说明。 另外,代入符号两边信号量的类型和位长度应该是一致的,硬件描述语言VHDL概述- 三,3.2 IF语句,IF语句是根据所指定的条件来确定执行哪些

44、语句的,其书写格式可以分为3种类型,1. IF语句的门闩控制 格式为: IF 条件 THEN 顺序语句; END IF; 当程序执行到该IF语句时,要判断IF语句所指定的条件是否成立。如果条件成立,则执行顺序语句;否则程序跳过顺序语句,而直接执行IF语句的后继语句。 这里的条件起到门闩的控制作用,硬件描述语言VHDL概述- 三,例,该IF语句所描述的是一个门闩电路。A是门闩控制信号量;b是输入信号量;c是输出信号量。 当门闩控制信号量a为1时,输入信号量b的任何值的变化都将被赋予输出信号量c。当a不等于1时,c=b语句不被执行,c将维持原始值,而不管信号量b的值发生什么变化,IF (a=1)

45、THEN c=b; END IF,硬件描述语言VHDL概述- 三,这种描述经逻辑综合,实际上可以生成D触发器。例,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL ENTITY dff IS PORT (clk,d:IN STD_LOGIC; q:OUT STD_LOGIC); END dff; ARCHITECTURE rtl OF dff IS BEGIN PROCESS (clk) BEGIN IF (clkEVENT AND clk=1) THEN q=d; END IF; END PROCESS; END rtl,此例中IF语句的条件是时钟信号clk

46、发生变化,且时钟信号clk=1。只是在这个时候,q端输出复现d端输入的信号值。 当该条件不满足时,q端维持原来的输出值,硬件描述语言VHDL概述- 三,格式为: IF 条件 THEN 顺序语句1; ELSE 顺序语句2; END IF; 当程序执行到该IF语句时,要判断IF语句所指定的条件是否成立。如果条件成立,则执行THEN与ELSE之间所界定的顺序语句;否则执行ELSE与END IF之间所界定的顺序语句。即用条件来选择两条不同的执行路径,2. IF语句的二选择控制,硬件描述语言VHDL概述- 三,这种描述的典型逻辑电路实例是二选一电路,ARCHITECTURE rtl OF mux2 IS

47、 BEGIN PROCESS (a,b,sel) BEGIN IF (sel=1) THEN c=a; ELSE c=b; END IF; END PROCESS; END rtl,硬件描述语言VHDL概述- 三,IF语句的多选择控制又称IF语句的嵌套。 格式为: IF 条件 THEN 顺序语句1; ELSIF 条件 THEN 顺序语句2; ELSIF 条件 THEN 顺序语句n-1; ELSE 顺序语句n; END IF,3. IF语句的多选择控制,在这种多选择控制的IF语句中,设置了多个条件,当满足所设置的多个条件之一时,就执行该条件后跟的顺序语句。如果所有设置的条件都不满足,则执行ELS

48、E与END IF之间所界定的顺序语句,硬件描述语言VHDL概述- 三,这种描述的典型逻辑电路实例是多选一电路,ARCHITECTURE rtl OF mux4 IS BEGIN PROCESS (a,b,c,d,sel) BEGIN IF (sel=“00”) THEN y=a; ELSIF (sel=“01”) THEN y=b; ELSIF (sel=“10”) THEN y=c; ELSE y=d; END IF; END PROCESS; END rtl,硬件描述语言VHDL概述- 三,3.3 CASE语句,CASE语句用来描述总线或编码、译码的行为,从许多不同语句的序列中选择其中之一

49、执行。虽然IF语句也有类似的功能,但是CASE语句的可读性比IF语句要强得多,程序的阅读者很容易找出条件式和动作的对应关系,CASE 表达式 IS WHEN 条件表达式=顺序语句; END CASE,格式为,硬件描述语言VHDL概述- 三,WHEN 值=顺序语句; WHEN 值|值|值=顺序语句; WHEN 值 TO 值=顺序语句; WHEN OTHERS=顺序语句,CASE语句中的条件表达式可以有4种不同的表示形式,当CASE和IS之间的表达式的取值满足指定的条件表达式的值时,程序将执行后跟的,由符号=所指的顺序语句。 条件表达式的值可以是一个值;或者是多个值的“或”关系;或者是一个取值范围

50、;或者表示其它所有的缺省值。例,CASE num IS WHEN 1 TO 6=num:=num+1; WHEN 0|10 =num:=0; WHEN OTHERS=num:=num+2; END CASE,此语句表示当num值为16时,执行num:=num+1,此语句表示当num值为0或10时,执行num:=0,此语句表示当num值除上述二条语句的条件值外(即,除16、0和10外)时,执行num:=num+2,硬件描述语言VHDL概述- 三,例,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL ENTITY mux4 IS PORT (a,b,i0,i1,i

51、2,i3:IN STD_LOGIC; q:OUT STD_LOGIC); END mux4; ARCHITECTURE mux4_behave OF mux4 IS SIGNAL sel:INTEGER RANGE 0 TO 3; BEGIN B:PROCESS (a,b,i0,i1,i2,i3l) BEGIN sel=0; IF (a=1) THEN sel=sel+1; END IF; IF (b=1) THEN sel=sel+2; END IF; - 接右边,接左边 CASE sel IS WHEN 0=qqqq=i3; END CASE; END PROCESS; END mux4_

52、behave,此例说明,选择器的行为描述不仅可以用IF语句,而且可以用CASE语句。但是它们两者还是有区别的。首先在IF语句中,先处理最起始的条件;如果不满足,再处理下一个条件。而在CASE语句中,没有值的顺序号,所有值是并行处理的。因此,在WHEN项中已用过的值,如果在后面WHEN项中再次使用,那在语法上是错误的。也就是说,值不能重复使用。另外。应该将表达式的所有取值都一一列举出来,如果不列举出表达式的所有值,在语法上也是错误的,硬件描述语言VHDL概述- 三,例,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL ENTITY decode_3to8 IS

53、PORT (a,b,c,G1,G2A,G2B:IN STD_LOGIC; y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); END decode_3to8; ARCHITECTURE rtl OF decode_3to8 IS SIGNAL indata:STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN indatayyyy=“11110111”; - 接下页,硬件描述语言VHDL概述- 三,接上页 WHEN “100”=yyyyy=“XXXXXXXX”; END CASE; ELSE y=“11111111”; END IF; END PROCES

54、S; END rtl,原因是:本例中,indata是矢量型数据,除了取值为“0”和“1”之外,还有可能取值为“X”,”Z”和“U”。尽管这些取值在逻辑电路综合时没有用,但是,在CASE中必须把所有可能取的值都要描述出来,故在本例中应加一项WHEN OTHERS项,使得它包含了y输出的所有缺省值,前面8条WHEN语句已罗列了indata的从“000”“111”的8种状态,为什么还要加这一条语句,这条WHEN语句也可改成: WHEN “UZX”|”ZXU”|”UUU” =y=“XXXXXXXX,硬件描述语言VHDL概述- 三,3.4 LOOP语句,LOOP与其它高级语言中的循环语句一样,使程序能进

55、行有规则的循环,循环的次数受迭代算法控制。在VHDL语言中常用来描述位片逻辑及迭代电路的行为。 LOOP语句的书写格式一般有两种,标号:FOR 循环变量 IN 离散范围 LOOP 顺序语句; END LOOP 标号,格式为,1. FOR循环变量,LOOP语句中的循环变量的值在每次循环中都将发生变化,而IN后跟的离散范围则表示循环变量在循环过程中依次取值的范围,硬件描述语言VHDL概述- 三,例:8位的奇偶校验电路的描述实例,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL ENTITY parity_check IS PORT (a:IN STD_LOGIC_

56、VECTOR (7 DOWNTO 0); y:OUT STD_LOGIC); END parity_check; ARCHITECTURE rtl OF parity_check IS BEGIN PROCESS (a) VARIABLE tmp: STD_LOGIC; BEGIN tmp:=0; FOR i IN 0 TO 7 LOOP tmp:=tmp XOR a(i); END LOOP; y=tmp; END PROCESS; END rtl,tmp是变量,它只能在进程内部说明,因为它是一个局部量,FOR-LOOP语句中的i无论在信号说明和变量说明中都未涉及,它是一个循环变量。它是一个

57、整数变量。信号和变量都不能代入到此循环变量中,tmp是变量,如果该变量要从进程内部输出就必须将它代入信号量,信号量是全局的,可以将值带出进程。此句语句就是把tmp的值通过y带出进程,硬件描述语言VHDL概述- 三,标号:WHILE 条件 LOOP 顺序语句; END LOOP 标号,格式为,2. WHILE条件,在该语句中,如果条件为“真”,则进行循环;如果条件为“假”,则结束循环。例,i:=1; sum:=0; sbcd:WHILE (i10) LOOP; sum:=i+sum; i:=i+1; END LOOP sbcd,注意:此种LOOP语句有一种变种格式: 标号:LOOP 顺序语句;

58、END LOOP 标号; 即为无条件循环,硬件描述语言VHDL概述- 三,3.5 NEXT语句,在LOOP语句中NEXT语句用来跳出本次循环,NEXT 标号 WHEN 条件,格式为,NEXT语句执行时将停止本次迭代,而转入下一次新的迭代。NEXT后跟的“标号”表明下一次迭代的起始位置,而“WHEN条件”则表明NEXT语句执行的条件。如果NEXT语句后面既无“标号”也无“WHEN条件”说明,那么只要执行到该语句就立即无条件地跳出本次循环,从LOOP语句的起始位置进入下一次循环,即进行下一次迭代,硬件描述语言VHDL概述- 三,例,PROCESS (a,b) COMSTANT max_limit:

59、 INTEGER:=255; BEGIN FOR i IN 0 TO max_limit LOOP IF (done(i)=TRUE) THEN NEXT; ELSE done(i):=TRUE; END IF; q(i)=a(i) AND b(i); END LOOP; END PROCESS,定义max_limit是常数,且为整形,初值为255,当done(i)为TRUE,结束本次循环,即不再执行q(i)=a(i) AND b(i);语句,而回到FOR语句,而开始下一次循环,此例的功能是,判别每一个done(i),若done(i)状态不为TRUE,则把done(i)状态改成TRUE,且使a

60、(i) SIGNAL a_less_then_b:BOOLEAN; a_less_then_b=FALSE; FOR i IN 0 TO 1 LOOP IF (a(i)=1 AND b(i)=0) THEN a_less_then_b=FALSE; NEXT; ELSIF (a(i)=0 AND b(i)=1) THEN a_less_then_b=FALSE; NEXT; ELSE NULL; END IF; END LOOP,NULL为空语句,定义a_less_then_b为布尔量,硬件描述语言VHDL概述- 三,3.7 WAIT语句,进程在仿真运行中总是处于下述两种状态之一:执行或挂起。

61、进程状态的变化受等待语句的控制,当进程执行到等待语句时,就将被挂起,并设置好再次执行的条件。 WAIT语句可以设置4种不同的条件:无限等待、时间到、条件满足以及敏感信号量变化。这几类条件可以混用,格式为,该语句表明,它等待信号量a或b发生变化。a或者b中只要有一个信号量发生变化,进程将结束挂起状态,而继续执行WAIT ON语句的后继语句。WAIT ON可以再次启动进程的执行,其条件是指定的信号量必须有一个新的变化。类似进程指定的敏感信号量有新的变换立即启动进程,1. WAIT ON,WAIT ON 信号,信号,硬件描述语言VHDL概述- 三,例,PROCESS(a,b) BEGIN y=a A

62、ND b; END PROCESS,PROCESS BEGIN y=a AND b; WAIT ON a,b; END PROCESS,上例左右所示的两个进程的描述是等价的,只是WAIT ON和PROCESS中所使用的敏感信号量的书写方法有区别。 在使用WAIT ON语句的进程中,敏感信号量应写在进程中的WAIT ON语句的后面。 而在不使用WAIT ON语句的进程中,敏感信号量只应在进程开头的PROCESS后跟的括号中说明,PROCESS(a,b) BEGIN y=a AND b; WAIT ON a,b; END PROCESS,注意:如果PROCESS语句已有敏感信号量说明,那么在进程中

63、再不能使用WAIT ON语句。右例的描述是错误的,错误语句,硬件描述语言VHDL概述- 三,格式为,WAIT UNTIL语句后面跟的是布尔表达式,当进程执行到该语句时将被挂起,直到表达式返回一个“真”值,进程才被再次启动。 该语句在表达式中建立一个隐式的敏感信号量表,当表中的任何一个信号量发生变化时,就立即对表达式进行一次评估。如果评估结果使表达式返回一个“真”值,则进程脱离等待状态,继续执行下一个语句。例如,2. WAIT UNTIL,WAIT UNTIL 表达式,WAIT UNTIL (x*10100,当信号量x的值大于等于10时,进程执行到该语句将被挂起;当x的值小于10时进程再次被启动

64、,继续执行WAIT语句的后继语句,硬件描述语言VHDL概述- 三,格式为,WAIT FOR语句后面跟的是时间表达式,当进程执行到该语句时将被挂起,直到指定的等待时间到时,进程再开始执行WAIT FOR语句的后继语句。例如,3. WAIT FOR,WAIT FOR 时间表达式,WAIT FOR 20 ns; WAIT FOR (a*(b+c,在上例的第一个语句中,时间表达式是一个常数值20ns,当进程执行到该语句时将等待20ns。一旦20ns时间到,进程将执行WAIT FOR语句的后继语句。 在上例的第二个语句中,FOR后面是一个时间表达式,a*(b+c)是时间量。WAIT FOR语句在等待过程

65、中,要对表达式进行一次计算,计算结果返回的值就作为该语句的等待值,硬件描述语言VHDL概述- 三,在前面叙述的3个WAIT语句中,等待条件都是单一的,要么是信号量,要么是布尔量,要么是时间量。实际上WAIT语句还可以同时使用多个等待条件。例如,4. 多条件WAIT语句,WAIT ON nmi,interrupt UNTIL (nmi=TRUE) OR (interrupt=TRUE) FOR 5 s,上述语句等待的是3个条件: 第一,信号量nmi和interrupt任何一个有一次新的变化。 第二,信号量nmi和interrupt任何一个取值“为真”。 第三,该语句已等待5 s。 只要上述3个条

66、件中一个或多个条件满足,进程将再次启动,继续执行WAIT语句的后继语句,硬件描述语言VHDL概述- 四,四、 并行语句,由于硬件描述语言所描述的实际系统,其许多操作是并发的,所以在对系统进行仿真时,这些系统中的元件在定义的仿真时刻应该是并发工作的。并行语句就是用来表示这种并发行为的。 并行语句的书写次序并不代表其执行的顺序。某一时刻只有被激活的语句才会被执行,硬件描述语言VHDL概述- 四,例,ENTITY rs_ff IS PORT(r,s: IN Bit; q,nq: BUFFER Bit); END rs_ff; ARCHITECTURE funct_rsff OF rs_ff IS BEGIN q=s NAND nq; nq=r AND q; END funct_rsff,上例结构体中的两条赋值语句是并行语句。设仿真时r、s起始值均为1,q的初始状态为1(则nq就为0)。若某时刻r由1变为0,则nq赋值语句被激活(执行),经过时间后nq由0变为1。此时因nq变化才使q赋值语句被激活(执行),再经过延迟后q由1变为0,S,R,Q,Q,基本RS触发器,硬件描述语言VHDL概述- 四

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论