第二章 VHDL 语言元素
Click here to load reader
description
Transcript of 第二章 VHDL 语言元素
YANGTZE NORMAL UNIVERSITY
第二章 VHDL语言元素
2.1 VHDL语言的客体
2.2 VHDL语言的数据类型
2.3 VHDL数据类型转换
2.4 VHDL词法规则与标识符
YANGTZE NORMAL UNIVERSITY2.1 VHDL语言的客体
VHDL语言中,可以赋予一个质的对象就称为客体。客体主要包括以下三种:变量( VARIABLE)、常量( CONSTANT)、信号( SIGNAL)。
2.1.1 常量( CONSTANT) (常数 )
定义一个常数主要是为了使设计实体中的某些量易于阅读和修改。常数说明就是对某一常数名赋予一个固定的值。通常在程序开始前进行赋值,该值的数据类型在说明语句中说明。
常数说明语句格式为:
CONSTANT 常数名:数据类型 := 表达式;
YANGTZE NORMAL UNIVERSITY
例如:
CONSTANT Vcc : REAL := 5.0;
CONSTANT Fbus : BIT_VECTOR := “1011”;
CONSTANT Delay : TIME := 10ns;
注 :常量是一个恒定不变的值,一旦做了数据类型和赋值定义,它在程序中就不能再改变。
YANGTZE NORMAL UNIVERSITY
2.1.2 变量( VARIABLE)
变量只能在进程和子程序中用,是一个局部量,不能将信息带出对它做出定义的当前设计单元。与信号不同,变量的赋值是理想化数据传输,其赋值是立即生效的,不存在任何的延时行为。
变量定义语句的格式为:
VARIABLE 变量名 : 数据类型 : 约束条件 := 初始值;
例如:
VARIABLE n: INTEGER RANGE 0 TO 15 := 2;
VARIABLE a: INTEGER;
YANGTZE NORMAL UNIVERSITY
变量赋值语句的格式为:
目标变量名 := 表达式;
赋值语句 “ :=” 右边的表达式必须与目标变量具有相同的数据类型,这个表达式可以是一个运算表达式也可以是一个数值。变量赋值语句左边的目标变量可以是单值变量,也可以是变量的集合。
例如定义变量:
VARIABLE a, b := REAL;
VARIABLE x, y := BIT_VECTOR( 0 TO 7);
YANGTZE NORMAL UNIVERSITY
2.1.3 信号( SIGNAL)
信号是电子电路内部硬件连接的抽象。它可以作为设计实体中的并行语句模块间交流信息的通道。信号及其相关的延时语句明显地体现了硬件系统的特征。
信号定义语句的格式为:
SIGNAL 信号名:数据类型:约束条件 := 表达式;
例如:
SIGNAL gnd : BIT := ‘0’;
SIGNAL data : STD_LOGIC_VECTOR (7 DOWNTO 0);
YANGTZE NORMAL UNIVERSITY信号赋值语句表达式为:
目标信号名 <= 表达式;
符号 “ <=” 表示赋值操作,即将数据信息传入。数据信息传入时可以设置延时过程,这与器件的实际传播延时十分接近。
“因此信号值的代入采用 <=”代入符,而不是像变量赋值时那“样用 :=”。但信号定义时初始赋值符号“ :=”,即仿真的
时间坐标是从赋初始值开始的。
信号赋值语句举例:
x <= y;
a <= ‘1’;
s1 <= s2 AFTER 10 ns;
注意 :变量和信号都必须先定义 ,后赋值。注意赋值符“ <=”和 “ :=”的差别。
YANGTZE NORMAL UNIVERSITY信号与变量的区别:
信号和变量是 VHDL中重要的客体,他们之间的主要区别有:
·信号赋值至少要有 δ延时;而变量赋值没有。
· 信号除当前值外有许多相关的信息,如历史信息和投影波形;而变量只有当前值。
·进程对信号敏感而不对变量敏感。
·信号可以是多个进程的全局信号;而变量只在定义他们的顺序域可见(共享变量除外)。
·信号是硬件中连线的抽象描述,他们的功能是保存变化的数据值和连接子元件,信号在元件的端口连接元件。变量在硬件中没有类似的对应关系,他们用于硬件特性的高层次建模所需要的计算中。
YANGTZE NORMAL UNIVERSITY
2.2 VHDL 语言的数据类型
在对 VHDL的客体进行定义时,都要指定其数据类型。 VHDL有多种标准的数据类型,并且允许用户自定义数据类型。在 VHDL语言语义约束中,对类型的要求反映在赋值语句的目标与源的一致,表达式中操作的一致,子类型中约束与类型的一致等许多方面。
2.2.1 VHDL中预定义的数据类型(编程者可直接使用)
预定义类型在 VHDL标准程序包 STANDARD中定义,在应用中自动包含进 VHDL的源文件,不需要 USE语句显示调用。数据类型说明如下。
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
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);
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’)。
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。
在系统仿真时,时间数据特别有用,用它可以表示信号延时,从而使模型系统能更逼近实际系统的运行环境。
YANGTZE NORMAL UNIVERSITY9.错误等级( SEVERITY LEVEL)
错误等级类型数据用来表征系统的状态,共有 4 种:note ( 注 意 ) , warning ( 警 告 ) , error ( 出错), failure(失败)。在系统仿真过程中可以用这 4种状态来提示系统当前的工作情况,从而使设计人员随时了解当前系统工作的情况,并根据系统的不同状态采取相应的对策。
10.大于等于零的整数(自然数)( NATURAL),正整数( POSITIVE)
这两种数据是整数的子类, NATURAL类数据为取 0和 0以上的正整数;而 POSITIVE 则只能为正整数。
YANGTZE NORMAL UNIVERSITY
上述 10种数据类型是 VHDL语言中标准的数据类
型,在编程时可以直接引用。如果用户需使用这
10种以外的数据类型,则必须进行自定义。但大
多数的 CAD厂商已在包集合中对标准数据类型进
行了扩展。例如,数组型数据等,请同学们注意。
YANGTZE NORMAL UNIVERSITY 2.2.2 用户自定义的数据类型
可以由用户定义的数据类型有:
·枚举( ENUMERATED)类型;
·整数( INTEGER)类型;
·实数( REAL)、浮点数( FLOATING)类型;
·数组( ARRAY)类型;
·存取( ACCESS)类型;
·文件( FILE)类型;
·记录( RECORDE)类型;
·时间( TIME)类型(物理类型)。
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
‘—’ - - 不可能情况
);
YANGTZE NORMAL UNIVERSITY 2.3 VHDL数据类型转换
在 VHDL程序设计中不同的数据类型的对象之间不能代入和运算。实现他们之间数据类型的转换有 3种方法:
·类型标记法;
·函数转换法;
·常数转换法。
2.3.1 用函数进行类型转换
VHDL语言中,程序包中提供了变换函数,这些程序包有 3 种,每个程序包中的变换函数不一样。现列表如下。
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
YANGTZE NORMAL UNIVERSITY
2.3.2 类型标记法实现类型转换
类型标记就是类型的名称。类型标记法适合那些关系密切的标量类型之间的类型转换,即整数和实数的类型转换。
例如:
VARIABLE I: INTEGER;
VARIABLE R: REAL;
I := INTEGER( R);
R := REAL( I);
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);
YANGTZE NORMAL UNIVERSITY
2.4 VHDL操作符
与其他程序设计语言相似, VHDL中的表达式也是由运算符将基本元素连接起来形成。这里的基本元素包括对象名、文字、函数调用及用括号括起来的表达式。
在 VHDL语言中共有 4类操作符,可以分别进行逻辑运算( LOGICAL)、关系运算( RELATIONAL)、算术运算( ARITHMETIC)和并置运算( CONCATENATION)。需要指出的是操作符操作的对象是操作数,且操作数的类型应该和操作符所要求的类型相一致。另外,运算操作符是有优先级的,例如,逻辑运算符 not,在所有操作符中优先级最高。
YANGTZE NORMAL UNIVERSITY1.逻辑运算符
在 VHDL语言中,共有 6种逻辑运算符,他们分别是:
NOT 取反;
AND 与;
OR 或;
NAND 与非;
NOR 或非;
XOR 异或。
这 6 “种逻辑运算符可以对 STD_LOGIC ” “和 BIT”等逻“辑型数据、 STD_LOGIC _VECTOR”逻辑型数组及布
尔数据进行逻辑运算。必须注意,运算符的左边和右边,以及代入的信号的数据类型必须是相同的。
YANGTZE NORMAL UNIVERSITY
2.算术运算符
VHDL语言中有 5类算术运算符,他们分别是:
·求和操作符: +(加)、-(减)
· 求 积 操 作 符 :* ( 乘 ) 、 / ( 除 ) 、 MOD ( 求模)、 REM(取余)
·符号操作符: +(正)、-(负)
·混合操作符: **(指数)、 ABS(取绝对值)
·移位操作符: SLL(逻辑左移)、 SRL(逻辑右移)、 SLA(算术左移)、 SRA(算术右移)、 ROL(逻辑循环左移)、 ROR逻辑循环右移)
YANGTZE NORMAL UNIVERSITY
3.关系运算符
VHDL语言中有 6种关系运算符,他们分别是:
= 等于;
/= 不等于;
< 小于;
<= 小于等于;
> 大于;
>= 大于等于;
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的数组
YANGTZE NORMAL UNIVERSITY5.VHDL操作符的优先顺序
运算符 优先级
NOT, ABS, ** 最高优先级
*, /,MOD, REM
+(正号),-(负号)
+,-,&
SLL, SLA, SRL, SRA, ROL, ROR
=, /=, <, >, <=, >=
AND, OR, NAND, NOR, XOR, XNOR 最低优先级
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写入控制状态机时序电路进程
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的字母,大小写字母意义无区别。
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”
YANGTZE NORMAL UNIVERSITY位矢量字符串是被双引号引起来的扩展的数字序列,数字序列前冠以基数说明符。基数符有“ B” “、 O” “、 X”,他们的含义如下。
B:二进制基数符号,表示二进制位 0或 1,在字符串中每一个位表示一个 BIT。
O:八进制基数符号,在字符串中每一个数代表一个八进制数,即代表一个 3位( BIT)的二进制数。
X:十六进制基数符号,代表一个十六进制数,即代表一个 4位二进制数。
例如:
B“1011_1111”, O“152”, X“F821”
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,可以进行综合。
YANGTZE NORMAL UNIVERSITY 2.4.2 标识符
标识符是最常用的操作符,可以是常数、变量、信号、端口、子程序或参数的名字。标识符规则是 VHDL语言中符号书写 的 一 般 规 则 , 为 EDA 工 具 提 供 了 标 准 的 书 写 规范。 VHDL’93 对 VHDL’87 版本的标识符语法规则进行了扩展,通常称 VHDL’87版本标识符为短标识符, VHDL’93版标识符为扩展标识符。
1.短标识符VHDL短标识符需遵守以下规则:
( 1)必须以英文字母开头;
( 2)英文字母、数字( 0~ 9)和下划线都是有效的字符;
( 3)短标识符不区分大小写;
( 4)下划线( _)的前后都必须有英文字母或数字。
YANGTZE NORMAL UNIVERSITY
一般的,在书写程序时,应将 VHDL的保留字大写或黑体,设计者自己定义的字符小写,以使得程序便于阅读和检查。尽管 VHDL仿真综合时不区分大小写,但一个优秀的硬件程序设计师应该养成良好的习惯。
例:
一些合法的标识符:
S_MACHINE, present_state, sig3
不合法的标识符:
present-state, 3states, cons_,_now
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个字符);