41
第第第 VHDL 第第第第 4.1 VHDL 第第第第4.2 VHDL 第第第第第第第 4.3 VHDL 第第第第第第 4.4 VHDL 第第第第第第第第

第四章 VHDL 语言元素

Embed Size (px)

DESCRIPTION

第四章 VHDL 语言元素. 4.1 VHDL 语言的客体 4.2 VHDL 语言的数据类型 4.3 VHDL 数据类型转换 4.4 VHDL 词法规则与标识符. 4.1 VHDL 语言的客体. VHDL 语言中,可以赋予一个质的对象就称为客体。客体主要包括以下三种:变量( VARIABLE )、常量( CONSTANT )、信号( SIGNAL )。. 4.1.1 常量( CONSTANT ) ( 常数 ). - PowerPoint PPT Presentation

Citation preview

Page 1: 第四章   VHDL 语言元素

第四章 VHDL 语言元素 4.1 VHDL 语言的客体

4.2 VHDL 语言的数据类型 4.3 VHDL 数据类型转换

4.4 VHDL 词法规则与标识符

Page 2: 第四章   VHDL 语言元素

4.1 VHDL 语言的客体 VHDL 语言中,可以赋予一个质的对象就称为客体。客体主要包括以下三种:变量( VARIABLE )、常量( CO

NSTANT )、信号( SIGNAL )。 4.1.1 常量( CONSTANT ) ( 常数 )

定义一个常数主要是为了使设计实体中的某些量易于阅读和修改。常数说明就是对某一常数名赋予一个固定的值。通常在程序开始前进行赋值,该值的数据类型在说明语句中说明。

常数说明语句格式为:

CONSTANT 常数名:数据类型 := 表达式;

Page 3: 第四章   VHDL 语言元素

例如:

CONSTANT Vcc : REAL := 5.0;

CONSTANT Fbus : BIT_VECTOR := “1011” ;

CONSTANT Delay : TIME := 10ns ;

注 : 常量是一个恒定不变的值,一旦做了数据类型和赋值定义,它在程序中就不能再改变。

Page 4: 第四章   VHDL 语言元素

4.1.2 变量( VARIABLE )变量只能在进程和子程序中用,是一个局部量,不能将信息带出对它做出定义的当前设计单元。与信号不同,变量的赋值是理想化数据传输,其赋值是立即生效的,不存在任何的延时行为。

变量定义语句的格式为:

VARIABLE 变量名 : 数据类型 : 约束条件 := 初始值;

例如:

VARIABLE n: INTEGER RANGE 0 TO 15 := 2;

VARIABLE a: INTEGER;

Page 5: 第四章   VHDL 语言元素

变量赋值语句的格式为:

目标变量名 := 表达式;

赋值语句 “ :=” 右边的表达式必须与目标变量具有相同的数据类型,这个表达式可以是一个运算表达式也可以是一个数值。变量赋值语句左边的目标变量可以是单值变量,也可以是变量的集合。

Page 6: 第四章   VHDL 语言元素

例如定义变量:VARIABLE x , y : REAL ;VARIABLE a , b : BIT_VECTOR ( 0 TO 7 );x:=100.0y:=1.5+xa:=b;a:=“1010101”;a(3 to 6):=(‘1’,’1’,’0’,’1’);a(0 to 5):=b(2 to 7);a(7):=‘0’;

Page 7: 第四章   VHDL 语言元素

4.1.3 信号( SIGNAL )

信号是电子电路内部硬件连接的抽象。它可以作为设计实体中的并行语句模块间交流信息的通道。信号及其相关的延时语句明显地体现了硬件系统的特征。

信号定义语句的格式为:

SIGNAL 信号名:数据类型:约束条件 := 初始值;

例如:

SIGNAL gnd : BIT := ‘0’ ;

SIGNAL data : STD_LOGIC_VECTOR (7 DOWNTO 0);

Page 8: 第四章   VHDL 语言元素

信号赋值语句表达式为:

目标信号名 <=  表达式;

符号 “ <=” 表示赋值操作,即将数据信息传入。数据信息传入时可以设置延时过程,这与器件的实际传播延时十分接近。因此信号值的代入采用“ <=” 代入符,而不是像变量赋值时那样用“ : =”。但信号定义时初始赋值符号“ : =”,即仿真的时间坐标是从赋初始值开始的。

信号赋值语句举例:

x <= y;

a <= ‘1’ ;

s1 <= s2 AFTER 10 ns ;

注意 : 变量和信号都必须先定义 , 后赋值。注意赋值符“ <=” 和 “ : =”的差别。

Page 9: 第四章   VHDL 语言元素

信号与变量的区别:

信号和变量是 VHDL 中重要的客体,他们之间的主要区别有:

· 信号赋值至少要有 δ 延时;而变量赋值没有。

· 信号除当前值外有许多相关的信息,如历史信息和投影波形;而变量只有当前值。

· 进程对信号敏感而不对变量敏感。

· 信号可以是多个进程的全局信号;而变量只在定义他们的顺序域可见(共享变量除外)。

· 信号是硬件中连线的抽象描述,他们的功能是保存变化的数据值和连接子元件,信号在元件的端口连接元件。变量在硬件中没有类似的对应关系,他们用于硬件特性的高层次建模所需要的计算中。

Page 10: 第四章   VHDL 语言元素

4.2 VHDL语言的数据类型 在对 VHDL 的客体进行定义时,都要指定其数据类型。VHDL 有多种标准的数据类型,并且允许用户自定义数据类型。在 VHDL 语言语义约束中,对类型的要求反映在赋值语句的目标与源的一致,表达式中操作的一致,子类型中约束与类型的一致等许多方面。

4.2.1 VHDL 中预定义的数据类型(编程者可直接使用)

预定义类型在 VHDL 标准程序包 STANDARD 中定义,在应用中自动包含进 VHDL 的源文件,不需要 USE 语句显示调用。数据类型说明如下。

Page 11: 第四章   VHDL 语言元素

1.整数( INTEGER )

整数与数学中整数的定义相似,可以使用预定义运算操作符,如加“+”、减“-”、乘“ ×” 、除“ ÷” 进行算术运算。在 VHDL 语言中,整数的表示范围为- 2147483647~ 2147483647 ,即从- (231- 1)到 (231- 1) 。

2. 实数( REAL )

在进行算法研究或实验时,作为对硬件方案的抽象手段,常常采用实数四则运算。实数的定义值范围为- 1.0E+38~ +1.0E+38 。实数有正负数,书写时一定要有小数点。例如:- 1.0 , +2.5 ,- 1.0E+38

Page 12: 第四章   VHDL 语言元素

3.位( BIT )

用来表示数字系统中的信号值。位值用字符‘ 0’或者‘ 1’(将值放在引号中)表示。与整数中的 1 和 0 不同,‘ 1’和‘ 0’仅仅表示一个位的两种取值。

位数据可以用来描述数字系统中总线的值。位数据不同于布尔数据,可以用转换函数进行转换。

4.位矢量( BIT_VECTOR )

位矢量是用双引号括起来的一组数据。例如:“ 001100” ,X“00bb” 。在这里位矢量前面的 X 表示是十六进制。用位矢量数据表示总线状态最形象也最方便,在 VHDL 程序中将会经常遇到。使用位矢量时必须注明位宽,即数组中元素个数和排列,例如:

SIGNAL s1 : BIT_VECTOR ( 15 DOWNTO 0 );

Page 13: 第四章   VHDL 语言元素

5.布尔量( BOOLEAN )

一个布尔量具有两种状态,“真”或者“假”。虽然布尔量也是二值枚举量,但它和位不同没有数值的含义,也不能进行算术运算。它能进行关系运算。例如,它可以在 if 语句中被测试,测试结果产生一个布尔量 TRUE或者 FALSE 。

6.字符( CHARACTER )

字符也是一种数据类型,所定义的字符量通常用单引号括起来,如‘ a’ 。一般情况下 VHDL 对大小写不敏感,但对字符量中的大小写则认为是不一样的。例如,‘ B’ 不同于‘ b’ 。字符量中的字符可以是从 a到 z 中的任一个字母,从 0到 9 中的任一个数以及空格或者特殊字符,如 $ , @ , %等等。包集合 standard 中给出了预定义的 128 个 ASCⅡ码字符,不能打印的用标识符给出。字符‘ 1’ 与整数 1 和实数 1.0 都是不相同的,当要明确指出 1 的字符数据 时,则可写为: CHARACTER ( ‘ 1’ )。

Page 14: 第四章   VHDL 语言元素

7.字符串( STRING )

字符串是由双引号括起来的一个字符序列,也称字符矢量或字符串组。字符串常用于程序的提示和说明。字符串举例如下:

VATIABLE string_1 : STRING (0TO 3);

string_1:= “a b c d”;

8. 时间( TIME )

时间是一个物理量数据。完整的时间量数据应包含整数和单位两部分,而且整数和单位之间至少应留一个空格的位置。例如 55 sec , 2 min等。在包集合 STANDARD 中给出了时间的预定义,其单位为 fs , ps , ns , μs , ms , sec , min 和 hr 。例如: 20 μs , 100 ns , 3 sec 。

在系统仿真时,时间数据特别有用,用它可以表示信号延时,从而使模型系统能更逼近实际系统的运行环境。

Page 15: 第四章   VHDL 语言元素

9.错误等级( SEVERITY LEVEL )

错误等级类型数据用来表征系统的状态,共有 4 种: note

(注意), warning (警告), error (出错), failure

(失败)。在系统仿真过程中可以用这 4 种状态来提示系统当前的工作情况,从而使设计人员随时了解当前系统工作的情况,并根据系统的不同状态采取相应的对策。

10.大于等于零的整数(自然数)( NATURAL ),正整数( POSITIVE )

这两种数据是整数的子类, NATURAL 类数据为取 0 和 0 以上的正整数;而 POSITIVE 则只能为正整数。

Page 16: 第四章   VHDL 语言元素

上述 10 种数据类型是 VHDL 语言中标准的数据类型,在编程时可以直接引用。如果用户需使用这 1

0 种以外的数据类型,则必须进行自定义。但大多数的 CAD厂商已在包集合中对标准数据类型进行了扩展。例如,数组型数据等,请同学们注意。

Page 17: 第四章   VHDL 语言元素

4.2.2 用户自定义的数据类型

可以由用户定义的数据类型有:

·枚举( ENUMERATED )类型;

·整数( INTEGER )类型;

· 实数( REAL )、浮点数( FLOATING )类型;

· 数组( ARRAY )类型;

· 存取( ACCESS )类型;

·文件( FILE )类型;

·记录( RECORDE )类型;

· 时间( TIME )类型(物理类型)。

Page 18: 第四章   VHDL 语言元素

4.2.3 IEEE预定义标准 1. 标准逻辑位 STD_LOGIC 数据类型IEEE‘93增加了多值逻辑包 STD_LOGIC_1164 ,使得“ STD_LOGIC”数据具有 9 种不同的值。其定义如下所示:

TYPE STD_LOGIC IS (

‘U’ , - - 初始值

‘X’ , - - 不定

‘0’ , - - 0

‘1’ , - - 1

‘Z’ , - - 高阻

‘W’ , - - 弱信号不定

‘L’ , - - 弱信号 0

‘H’ , - - 弱信号 1

‘—’ - - 不可能情况

);

Page 19: 第四章   VHDL 语言元素

2. 标准逻辑矢量 STD_LOGIC_VECTOR 数据类型在使用中 , 标准逻辑矢量数据类型的数据对象赋值时 , 必须考虑位矢的宽度 . 同位宽、同数据类型的矢量才能进行赋值。

例:… .

TYPE t_date IS ARRAY(7 DOWNTO 0)OF STD_LOGIC;

SIGNAL databus,memory:t_date;

VARIABLE rega:t_date;

…..

datebus<=rega;

….

datebus<=memory;….

Page 20: 第四章   VHDL 语言元素

4.2.4 枚举类型

枚举类型用特殊的字符来表示一组实际的二进制数 .

例如 :TYPE m_state IS( state1, state1 , state1 , state1)

SIGNAL present_state,next_state:m_state;

默认 state1 为’ 00’ state2 为’ 01’;…

Page 21: 第四章   VHDL 语言元素

4.2.5 数组类型数组可以是一维 , 也可以是多维 . 但是 VHDL 只支持一维数组 .

数组的元素可以是任意数据类型 .

TYPE 数组名 IS ARRY ( 数组范围 ) OF 数据类型

例 1: TYPE data_bus1 IS (7 DOWNTO 0) OF REAL;

TYPE data_bus2 IS (7 DOWNTO 0) OF STD_LOGIC;

TYPE data_bus3 IS (7 DOWNTO 0,X) OF STD_LOGIC;TYPE 数组名 IS ARRY(NATURAL RANGE<>)OF 数据类型 ;

例 2:TYPE date IS ARRY(NATURAL RANGE<>))OF BIT;

VARIABLE va:date(1 TO 6);

Page 22: 第四章   VHDL 语言元素

4.3 VHDL 数据类型转换

在 VHDL 程序设计中不同的数据类型的对象之间不能代入和运算。实现他们之间数据类型的转换有 3 种方法:

· 类型标记法;

·函数转换法;

· 常数转换法。

4.3.1 用函数进行类型转换

VHDL 语言中,程序包中提供了变换函数,这些程序包有 3 种,每个程序包中的变换函数不一样。现列表如下。

Page 23: 第四章   VHDL 语言元素

·STD_LOGIC_1164 包集合函数

函数 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

.STD_LOGIC_ARITH 包集合函数

函数: CONV_STD_LOGIC_VECTOR (A,位长 )

由 UNSINGED , SINGED 转换为 INTEGER STD_LOGIC_ UNSINGED 包集合

函数: CONV_INTEGER (A)

由 STD_LOGIC_VECTOR 转换为 INTEGER

·STD_LOGIC_ UNSINGED 包集合

函数: CONV_INTEGER (A)

由 INTEGER , UNSINGED , SINGED 转换为 STD_LOGIC_VECTOR

Page 24: 第四章   VHDL 语言元素

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY qijian ISPORT(input:IN STD_LOGIC_VECTOR(2 DOWNTO 0); output:out STD_LOGIC_VECTOR(7 DOWNTO 0));END qijian;ARCHITECTURE a OF qijian ISBEGINPROCESS(input)BEGINOutput<=(others=>’0’);Output (CONV_INTEGER(input))<=‘1’;END PROCESS;END a;

Page 25: 第四章   VHDL 语言元素

4.3.2 类型标记法实现类型转换类型标记就是类型的名称。类型标记法适合那些关系密切的标量类型之间的类型转换,即整数和实数的类型转换。

例如:

VARIABLE I : INTEGER ;

VARIABLE R : REAL ;

I := INTEGER ( R );

R := REAL ( I );

Page 26: 第四章   VHDL 语言元素

4.4 VHDL 操作符

与其他程序设计语言相似, VHDL 中的表达式也是由运算符将基本元素连接起来形成。这里的基本元素包括对象名、文字、函数调用及用括号括起来的表达式。

在 VHDL 语言中共有 4 类操作符,可以分别进行逻辑运算( L

OGICAL )、关系运算( RELATIONAL )、算术运算( ARI

THMETIC )和并置运算( CONCATENATION )。需要指出的是操作符操作的对象是操作数,且操作数的类型应该和操作符所要求的类型相一致。另外,运算操作符是有优先级的,例如,逻辑运算符 not ,在所有操作符中优先级最高。

Page 27: 第四章   VHDL 语言元素

1.逻辑运算符在 VHDL 语言中,共有 6 种逻辑运算符,他们分别是:

NOT 取反;

AND 与;

OR 或;

NAND 与非;

NOR 或非;

XOR 异或。 这 6 种逻辑运算符可以对“ STD_LOGIC ” 和“ BIT”等逻辑型数据、“ STD_LOGIC _VECTOR”逻辑型数组及布尔数据进行逻辑运算。必须注意,运算符的左边和右边,以及代入的信号的数据类型必须是相同的。

Page 28: 第四章   VHDL 语言元素

例 :LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY yu ISPORT(a,b:IN STD_LOGIC_VECTOR(0 TO 3); output:out STD_LOGIC_VECTOR(0 TO 3));END yu;ARCHITECTURE a OF yu ISbeginOUTPUT<=a and b;end a;

Page 29: 第四章   VHDL 语言元素

2. 算术运算符VHDL 语言中有 5 类算术运算符,他们分别是:

·求和操作符: +(加)、-(减)

· 求积操作符 :* (乘)、 / (除)、 MOD (求模)、 REM(取余)

· 符号操作符: +(正)、-(负)

·混合操作符: ** (指数)、 ABS (取绝对值)

·移位操作符: SLL (逻辑左移)、 SRL (逻辑右移)、 SLA

(算术左移)、 SRA (算术右移)、 ROL (逻辑循环左移)、ROR逻辑循环右移)

Page 30: 第四章   VHDL 语言元素

例 : 利用移位操作符设计译码器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY yimaqi ISPORT(input:IN STD_LOGIC_VECTOR(2 DOWNTO 0); output:out bit_VECTOR(7 DOWNTO 0));END yimaqi;ARCHITECTURE a OF yimaqi ISbeginOUTPUT<="00000001" SLL CONV_INTEGER(INPUT)end a;

Page 31: 第四章   VHDL 语言元素

3. 关系运算符VHDL 语言中有 6 种关系运算符,他们分别是:

= 等于;

/= 不等于;

< 小于;

<= 小于等于;

> 大于;

>= 大于等于;

Page 32: 第四章   VHDL 语言元素

4. 并置运算符& 连接

SIGNAL g , h , i : STD_LOGIC ;

SIGNAL c , d , e : STD_LOGIC _VECTOR ( 1 TO 0 );

d <= i & NOT h ; - - 元素与元素并置,形成长度为 2 的数组

a <= c & d ; - - 数组与数组并置,形成长度为 4 的数组

Page 33: 第四章   VHDL 语言元素

5.VHDL 操作符的优先顺序

运算符 优先级

NOT , ABS , ** 最高优先级

* , / , MOD , REM

+ (正号),-(负号)

+ ,-, &

SLL , SLA , SRL , SRA , ROL , ROR

= , /= , < , > , <= , >=

AND , OR , NAND , NOR , XOR , XNOR 最低优先级

Page 34: 第四章   VHDL 语言元素

4.5 VHDL 词法规则与标识符 4.5.1 词法规则

1.注释

为了提高 VHDL源程序的可读性,在 VHDL 中可以写入注释。注释以 - - 开头直到本行末尾的一段文字。在 MUX+PLUS

Ⅱ中可以看见,敲入 - - 之后,后面字体的颜色就发生改变。注释不是 VHDL 设计描述的一部分,编译后存入数据库中的信息不包含注释。

注释举例:

Q : OUT STD_LOGIC _VECTOR ( 11 DOWNTO 0 ); --A/D 转换数据输出显示(行注释)

--SRAM 数据写入控制状态机(段注释)

WRIT_STATE : PROCESS ( clk , rst ) --SRAM写入控制状态机时序电路进程

Page 35: 第四章   VHDL 语言元素

2.数字数字型文字可以有多种表达方式:可以是十进制数,也可以表示为二进制、八进制或十六进制等为基的数,可以是整数,也可以是含有小数点的浮点数。现举例如下。

· 十进制整数表示法:如

012 5 78_456 (=78456) 2E6

在相邻数字之间插入下划线,对十进制数值不产生影响,仅仅是为了提高文字的可读性。允许在数字之前冠以若干个 0 ,但不允许在数字之间存在空格。

· 以基表示的数:用这种方式表示的数由五个部分组成。第一部分,用十进制数标明数值进位的基数;第二部分,数值隔离符号“ #” ;第三部分,表达的文字;第四部分,指数隔离符号“ #” ;第五部分,用十进制表示的指数部分,这一部分的数如果为 0 可以省去不写。如

2#111_1011# 8#1473# 16#A8#E1 016#F.01#E+4

对以基表示的数而言,相邻数字间插入下划线不影响数值。基的最小数为 2 ,最大数为 16 ,以基表示的数中允许出现 A 至 F 的字母,大小写字母意义无区别。

Page 36: 第四章   VHDL 语言元素

· 实数:实数必须带有小数点。如

12.0 0.0 3.14 6_741_113.666 52.6 E- 2

·物理量文字:综合器不支持物理量文字的综合。如

60 s (秒) 100 m (米) 177 A (安培)

3.字符和字符串

字符是用单引号引起来的 ASCⅡ字符,可以是数值,也可以是符号或字母,如

‘E’ , ‘ e’ , ‘ $’ , ‘ 23’ , ‘ A’…

字符串是一维的字符数组,需放在双引号中。有两种类型的字符串:文字字符串和位矢量字符串。

文字字符串是用双引号引起来的一串文字。如

“FALSE” , “ X” , “ THIS IS END”

Page 37: 第四章   VHDL 语言元素

位矢量字符串是被双引号引起来的扩展的数字序列,数字序列前冠以基数说明符。基数符有“ B” 、“ O” 、“ X” ,他们的含义如下。

B :二进制基数符号,表示二进制位 0或 1 ,在字符串中每一个位表示一个 BIT 。

O :八进制基数符号,在字符串中每一个数代表一个八进制数,即代表一个 3位( BIT )的二进制数。

X :十六进制基数符号,代表一个十六进制数,即代表一个 4位二进制数。

例如:

B“1011_1111” , O“152” , X“F821”

Page 38: 第四章   VHDL 语言元素

4.下标名

下标名用于指示数组型变量或信号的某一元素。

SIGNAL a , b : BIT _VECTOR ( 0 TO 3 );

SIGNAL s : INTEGER RANGE 0 TO 2 ;

SIGNAL x , y : BIT;

x <= a (s);

y <= b (3);

上例中, a (s) 为一下标语句, s 是不可计算的下标名,只能在特定情况下进行综合; b (3) 的下标为 3 ,可以进行综合。

Page 39: 第四章   VHDL 语言元素

4.5.2 标识符

标识符是最常用的操作符,可以是常数、变量、信号、端口、子程序或参数的名字。标识符规则是 VHDL 语言中符号书写的一般规则,为 EDA工具提供了标准的书写规范。 VHDL’93 对VHDL’87版本的标识符语法规则进行了扩展,通常称 VHDL’

87版本标识符为短标识符, VHDL’93版标识符为扩展标识符。

1.短标识符VHDL短标识符需遵守以下规则:

( 1 )必须以英文字母开头;

( 2 )英文字母、数字( 0~ 9 )和下划线都是有效的字符;

( 3 )短标识符不区分大小写;

( 4 )下划线( _ )的前后都必须有英文字母或数字。

Page 40: 第四章   VHDL 语言元素

一般的,在书写程序时,应将 VHDL 的保留字大写或黑体,设计者自己定义的字符小写,以使得程序便于阅读和检查。尽管 VHDL 仿真综合时不区分大小写,但一个优秀的硬件程序设计师应该养成良好的习惯。

例:

一些合法的标识符:

S_MACHINE , present_state , sig3

不合法的标识符:

present-state , 3states , cons_,_now

Page 41: 第四章   VHDL 语言元素

2.扩展标识符扩展标识符的识别和书写有下面的规则:

( 1 )用反斜杠来界定扩展标识符,如 \control_machine\ , \s_block\ 等都是合法的扩展标识符;

( 2 )扩展标识符允许包含图形符号和空格,如 \s&33\ , \legal$state\ 是合法的扩展标识符;

( 3 )两个反斜杠之间的字可以和保留字相同,如 \SIGNAL\ , \ENTITY\ 是合法的标识符,与 SIGNAL 、 ENTITY 是不同的;

( 4 )两个反斜杠之间的标识符可以用数字开头,如 \15BIT\ , \5ns\ 是合法的;

( 5 )扩展标识符是区分大小写的,如 \a\ 与 \ A\ 是不同的标识符;

( 6 )扩展标识符允许多个下划线相邻,如 \our_ _entity\ 是合法的扩展标识符(不推荐这种方式);

( 7 )扩展标识符的名字中如果含有一个反斜杠,则用相邻的两个反斜杠来代表它,如 \te\\xe\ 表示该扩展标识符的名字为 te\xe (共 5 个字符);