35

Click here to load reader

第二章 VHDL 语言元素

  • Upload
    jared

  • View
    143

  • Download
    3

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY

第二章 VHDL语言元素

2.1 VHDL语言的客体

2.2 VHDL语言的数据类型

2.3 VHDL数据类型转换

2.4 VHDL词法规则与标识符

Page 2: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY2.1 VHDL语言的客体

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

2.1.1 常量( CONSTANT) (常数 )

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

常数说明语句格式为:

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

Page 3: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY

例如:

CONSTANT Vcc : REAL := 5.0;

CONSTANT Fbus : BIT_VECTOR := “1011”;

CONSTANT Delay : TIME := 10ns;

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

Page 4: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY

2.1.2 变量( VARIABLE)

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

变量定义语句的格式为:

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

例如:

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

VARIABLE a: INTEGER;

Page 5: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY

变量赋值语句的格式为:

目标变量名 := 表达式;

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

例如定义变量:

VARIABLE a, b := REAL;

VARIABLE x, y := BIT_VECTOR( 0 TO 7);

Page 6: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY

2.1.3 信号( SIGNAL)

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

信号定义语句的格式为:

SIGNAL 信号名:数据类型:约束条件 := 表达式;

例如:

SIGNAL gnd : BIT := ‘0’;

SIGNAL data : STD_LOGIC_VECTOR (7 DOWNTO 0);

Page 7: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY信号赋值语句表达式为:

目标信号名 <= 表达式;

符号 “ <=” 表示赋值操作,即将数据信息传入。数据信息传入时可以设置延时过程,这与器件的实际传播延时十分接近。

“因此信号值的代入采用 <=”代入符,而不是像变量赋值时那“样用 :=”。但信号定义时初始赋值符号“ :=”,即仿真的

时间坐标是从赋初始值开始的。

信号赋值语句举例:

x <= y;

a <= ‘1’;

s1 <= s2 AFTER 10 ns;

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

Page 8: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY信号与变量的区别:

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

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

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

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

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

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

Page 9: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY

2.2 VHDL 语言的数据类型

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

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

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

Page 10: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY

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 11: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY3.位( BIT)

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

‘同, 1’ ‘和 0’仅仅表示一个位的两种取值。

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

4.位矢量( BIT_VECTOR)

位 矢 量 是 用 双 引 号 括 起 来 的 一 组 数 据 。 例“如: 001100”, X“00bb”。在这里位矢量前面的 X表示是

十六进制。用位矢量数据表示总线状态最形象也最方便,在VHDL程序中将会经常遇到。使用位矢量时必须注明位宽,即数组中元素个数和排列,例如:

SIGNAL s1: BIT_VECTOR( 15 DOWNTO 0);

Page 12: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY5.布尔量( 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 13: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY7.字符串( 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 14: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY9.错误等级( SEVERITY LEVEL)

错误等级类型数据用来表征系统的状态,共有 4 种:note ( 注 意 ) , warning ( 警 告 ) , error ( 出错), failure(失败)。在系统仿真过程中可以用这 4种状态来提示系统当前的工作情况,从而使设计人员随时了解当前系统工作的情况,并根据系统的不同状态采取相应的对策。

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

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

Page 15: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY

上述 10种数据类型是 VHDL语言中标准的数据类

型,在编程时可以直接引用。如果用户需使用这

10种以外的数据类型,则必须进行自定义。但大

多数的 CAD厂商已在包集合中对标准数据类型进

行了扩展。例如,数组型数据等,请同学们注意。

Page 16: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY 2.2.2 用户自定义的数据类型

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

·枚举( ENUMERATED)类型;

·整数( INTEGER)类型;

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

·数组( ARRAY)类型;

·存取( ACCESS)类型;

·文件( FILE)类型;

·记录( RECORDE)类型;

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

Page 17: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY

2.2.3 IEEE预定义标准

1.标准化数据类型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 18: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY 2.3 VHDL数据类型转换

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

·类型标记法;

·函数转换法;

·常数转换法。

2.3.1 用函数进行类型转换

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

Page 19: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY·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 20: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY

2.3.2 类型标记法实现类型转换

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

例如:

VARIABLE I: INTEGER;

VARIABLE R: REAL;

I := INTEGER( R);

R := REAL( I);

Page 21: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY2.3.3 常数实现类型转换就模拟效率而言,利用常数实现类型转换比利用类型转换函数的效率更高。

下面的例子使用常数把类型为 STD_LOGIC的值转换为 BIT型的值。

例 :

LIBRARY IEEE;

USE IEEE. STD_LOGIC_1164.ALL;

ENTITY typeconv IS

END;

ARCHITECTURE arch OF typeconv IS

TYPE typeconv_type IS ARRAY( STD_ULOGIC) OF BIT;

CONSTANT typecon_con : typeconv_type : = ‘( 0’/‘L’=>‘0’ ‘, 1’/‘H’ =>1’, OTHERS=>‘0’);

SIGNAL b: BIT;

SIGNAL b: BIT; SIGNAL s: STD_ULOGIC;

BEGIN

b<= typecon_con (s);

Page 22: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY

2.4 VHDL操作符

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

在 VHDL语言中共有 4类操作符,可以分别进行逻辑运算( LOGICAL)、关系运算( RELATIONAL)、算术运算( ARITHMETIC)和并置运算( CONCATENATION)。需要指出的是操作符操作的对象是操作数,且操作数的类型应该和操作符所要求的类型相一致。另外,运算操作符是有优先级的,例如,逻辑运算符 not,在所有操作符中优先级最高。

Page 23: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY1.逻辑运算符

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

NOT 取反;

AND 与;

OR 或;

NAND 与非;

NOR 或非;

XOR 异或。

这 6 “种逻辑运算符可以对 STD_LOGIC ” “和 BIT”等逻“辑型数据、 STD_LOGIC _VECTOR”逻辑型数组及布

尔数据进行逻辑运算。必须注意,运算符的左边和右边,以及代入的信号的数据类型必须是相同的。

Page 24: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY

2.算术运算符

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

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

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

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

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

·移位操作符: SLL(逻辑左移)、 SRL(逻辑右移)、 SLA(算术左移)、 SRA(算术右移)、 ROL(逻辑循环左移)、 ROR逻辑循环右移)

Page 25: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY

3.关系运算符

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

= 等于;

/= 不等于;

< 小于;

<= 小于等于;

> 大于;

>= 大于等于;

Page 26: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY

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 27: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY5.VHDL操作符的优先顺序

运算符 优先级

NOT, ABS, ** 最高优先级

*, /,MOD, REM

+(正号),-(负号)

+,-,&

SLL, SLA, SRL, SRA, ROL, ROR

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

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

Page 28: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY2.4 VHDL词法规则与标识符 2.4.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 29: 第二章   VHDL 语言元素

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

·十进制整数表示法:如

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 30: 第二章   VHDL 语言元素

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

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 31: 第二章   VHDL 语言元素

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

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

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

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

例如:

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

Page 32: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY4. 下标名

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

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 33: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY 2.4.2 标识符

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

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

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

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

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

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

Page 34: 第二章   VHDL 语言元素

YANGTZE NORMAL UNIVERSITY

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

例:

一些合法的标识符:

S_MACHINE, present_state, sig3

不合法的标识符:

present-state, 3states, cons_,_now

Page 35: 第二章   VHDL 语言元素

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

( 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个字符);