加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

VHDL语言元素

(2012-03-12 09:18:14)
标签:

杂谈

http://blog.csdn.net/skyyunmi/archive/2007/04/20/1572343.aspx

VHDL语言元素
2.1    VHDL
语言的客体
2.2    VHDL
语言的数据类型
2.3    VHDL
数据类型转换
2.4    VHDL
词法规则与标识符
2.1   VHDL
语言的客体
VHDL
语言中,可以赋予一个质的对象就称为客体。客体主要包括以下三种:变量(VARIABLE)、常量(CONSTANT)、信号(SIGNAL)。
2.1.1
常量(CONSTANT(常数)
定义一个常数主要是为了使设计实体中的某些量易于阅读和修改。常数说明就是对某一常数名赋予一个固定的值。通常在程序开始前进行赋值,该值的数据类型在说明语句中说明。
常数说明语句格式为:
CONSTANT
常数名:数据类型 := 表达式;
例如:
CONSTANT Vcc : REAL := 5.0;
CONSTANT Fbus : BIT_VECTOR := “1011”

CONSTANT Delay : TIME := 10ns

:常量是一个恒定不变的值,一旦做了数据类型和赋值定义,它在程序中就不能再改变。
2.1.2
变量(VARIABLE
变量只能在进程和子程序中用,是一个局部量,不能将信息带出对它做出定义的当前设计单元。与信号不同,变量的赋值是理想化数据传输,其赋值是立即生效的,不存在任何的延时行为。变量定义语句的格式为:
VARIABLE
变量名 : 数据类型 : 约束条件 := 初始值;
例如:
VARIABLE n: INTEGER RANGE0 TO 15 := 2;
VARIABLE a: INTEGER;
变量赋值语句的格式为:
目标变量名 := 表达式;
赋值语句 “:=” 右边的表达式必须与目标变量具有相同的数据类型,这个表达式可以是一个运算表达式也可以是一个数值。变量赋值语句左边的目标变量可以是单值变量,也可以是变量的集合。
例如定义变量:
VARIABLE a
b := REALVARIABLE xy := BIT_VECTOR0 TO 7);
2.1.3
信号(SIGNAL
信号是电子电路内部硬件连接的抽象。它可以作为设计实体中的并行语句模块间交流信息的通道。信号及其相关的延时语句明显地体现了硬件系统的特征。
信号定义语句的格式为:
SIGNAL
信号名:数据类型:约束条件 := 表达式;--定义时候使用
例如:SIGNAL gnd BIT := ‘0’
SIGNAL data
STD_LOGIC_VECTOR (7 DOWNTO 0); 
信号赋值语句表达式为:
目标信号名 <= 表达式;                --赋值时候使用
符号 “<=” 表示赋值操作,即将数据信息传入。数据信息传入时可以设置延时过程,这与器件的实际传播延时十分接近。因此信号值的代入采用“<=”代入符,而不是像变量赋值时那样用“:。但信号定义时初始赋值符号“:,即仿真的时间坐标是从赋初始值开始的。
信号赋值语句举例:X<= y;
a <= ‘1’

s1 <= s2 AFTER 10 ns

--
注意:变量和信号都必须先定义,后赋值。注意赋值符“<=” “:的差别。
信号与变量的区别:
信号和变量是VHDL中重要的客体,他们之间的主要区别有:
·
信号赋值至少要有δ延时;而变量赋值没有。
·
信号除当前值外有许多相关的信息,如历史信息和投影波形;而变量只有当前值。
·
进程对信号敏感而不对变量敏感。
·
信号可以是多个进程的全局信号;而变量只在定义他们的顺序域可见(共享变量除外)。
·
信号是硬件中连线的抽象描述,他们的功能是保存变化的数据值和连接子元件,信号在元件的端口连接元件。变量在硬件中没有类似的对应关系,他们用于硬件特性的高层次建模所需要的计算中。
2.2 VHDL
语言的数据类型
     
在对VHDL的客体进行定义时,都要指定其数据类型。VHDL有多种标准的数据类型,并且允许用户自定义数据类型。在VHDL语言语义约束中,对类型的要求反映在赋值语句的目标与源的一致,表达式中操作的一致,子类型中约束与类型的一致等许多方面。
2.2.1 VHDL
中预定义的数据类型(编程者可直接使用)
       
预定义类型在VHDL标准程序包STANDARD中定义,在应用中自动包含进VHDL的源文件,不需要USE语句显示调用。数据类型说明如下。
1.
整数(INTEGER
       
整数与数学中整数的定义相似,可以使用预定义运算操作符,如加、减、乘“×”、除“÷”进行算术运算。在VHDL语言中,整数的表示范围为-21474836472147483647,即从-(2311)(2311)2.实数(REAL
在进行算法研究或实验时,作为对硬件方案的抽象手段,常常采用实数四则运算。实数的定义值范围为-1.0E+38+1.0E+38。实数有正负数,书写时一定要有小数点。例如:-1.0+2.5,-1.0E+38

3.
位(BIT
用来表示数字系统中的信号值。位值用字符‘0’或者‘1’(将值放在引号中)表示。与整数中的10不同,‘1’‘0’仅仅表示一个位的两种取值。
位数据可以用来描述数字系统中总线的值。位数据不同于布尔数据,可以用转换函数进行转换。
4.
位矢量(BIT_VECTOR
位矢量是用双引号括起来的一组数据。例如:“001100”X“00bb”。在这里位矢量前面的X表示是十六进制。用位矢量数据表示总线状态最形象也最方便,在VHDL程序中将会经常遇到。使用位矢量时必须注明位宽,即数组中元素个数和排列,例如:
SIGNAL s1
BIT_VECTOR15 DOWNTO 0);
5.
布尔量(BOOLEAN
一个布尔量具有两种状态,或者。虽然布尔量也是二值枚举量,但它和位不同没有数值的含义,也不能进行算术运算。它能进行关系运算。例如,它可以在if语句中被测试,测试结果产生一个布尔量TRUE或者FALSE6.字符(CHARACTER
   
字符也是一种数据类型,所定义的字符量通常用单引号括起来,如‘a’。一般情况下VHDL对大小写不敏感,但对字符量中的大小写则认为是不一样的。例如,‘B’不同于‘b’。字符量中的字符可以是从az中的任一个字母,从09中的任一个数以及空格或者特殊字符,如$@%等等。包集合standard中给出了预定义的128ASCⅡ码字符,不能打印的用标识符给出。字符‘1’与整数1和实数1.0都是不相同的,当要明确指出1的字符数据时,则可写为:CHARACTER ‘ 1’)。
7.
字符串(STRING
字符串是由双引号括起来的一个字符序列,也称字符矢量或字符串组。字符串常用于程序的提示和说明。字符串举例如下:
VATIABLE string_1 : STRING (0TO 3);

string_1:= “a b c d”;
8.
时间(TIME
时间是一个物理量数据。完整的时间量数据应包含整数和单位两部分,而且整数和单位之间至少应留一个空格的位置。例如55 sec2 min等。在包集合STANDARD中给出了时间的预定义,其单位为fspsnsμsmssecminhr。例如:20 μs100 ns3 sec
在系统仿真时,时间数据特别有用,用它可以表示信号延时,从而使模型系统能更逼近实际系统的运行环境。9.错误等级(SEVERITY LEVEL
错误等级类型数据用来表征系统的状态,共有4种:note(注意),warning(警告),error(出错),failure(失败)。在系统仿真过程中可以用这4种状态来提示系统当前的工作情况,从而使设计人员随时了解当前系统工作的情况,并根据系统的不同状态采取相应的对策。
10.
大于等于零的整数(自然数)(NATURAL),正整数(POSITIVE
这两种数据是整数的子类,NATURAL类数据为取00以上的正整数;而POSITIVE 则只能为正整数。
上述10种数据类型是VHDL语言中标准的数据类型,在编程时可以直接引用。如果用户需使用这10种以外的数据类型,则必须进行自定义。但大多数的CAD厂商已在包集合中对标准数据类型进行了扩展。例如,数组型数据等,请同学们注意。
2.2.2
用户自定义的数据类型
可以由用户定义的数据类型有:
·
枚举(ENUMERATED)类型;
·
整数(INTEGER)类型;
·
实数(REAL)、浮点数(FLOATING)类型;
·
数组(ARRAY)类型;
·
存取(ACCESS)类型;
·
文件(FILE)类型; ·记录(RECORDE)类型;
·
时间(TIME)类型(物理类型)。
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
     ‘—’                   - -
不可能情况
          
);                  --9种不同的值2.3 VHDL数据类型转换
VHDL程序设计中不同的数据类型的对象之间不能代入和运算。实现他们之间数据类型的转换有3种方法:
·
类型标记法;
·
函数转换法;
·
常数转换法。
2.3.1
用函数进行类型转换
VHDL
语言中,程序包中提供了变换函数,这些程序包有3种,每个程序包中的变换函数不一样。现列表如下。
·STD_LOGIC_1164
包集合函数
函数 TO_ STDLOGICVECTORA
BIT_VECTOR转换为STD_LOGIC_VECTOR
函数 TO_ BITVECTORA              
STD_LOGIC_VECTOR转换为BIT_VECTOR
函数 TO_ STDLOGICA                 BIT转换为STD_LOGIC
函数 TO_ BITA                        STD_LOGIC转换为BIT
.STD_LOGIC_ARITH
包集合函数
函数:CONV_STD_LOGIC_VECTOR (A,位长)UNSINGEDSINGED转换为INTEGER 
STD_LOGIC_ UNSINGED
包集合
函数:CONV_INTEGER (A)       STD_LOGIC_VECTOR转换为INTEGER
·STD_LOGIC_ UNSINGED
包集合
函数:CONV_INTEGER (A) 
    
INTEGERUNSINGEDSINGED转换为 STD_LOGIC_VECTOR
2.3.2
类型标记法实现类型转换
类型标记就是类型的名称。类型标记法适合那些关系密切的标量类型之间的类型转换,即整数和实数的类型转换。例如:
VARIABLE I
INTEGER
VARIABLE R
REAL
I := INTEGER
R);
R := REAL
I);
2.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_ULOGICOF BIT--定义一个类型CONSTANT typecon_contypeconv_type=‘0’/‘L’=>‘0’‘1’/‘H’ =>1’OTHERS=>‘0’);
SIGNAL b
BIT
SIGNAL b
BIT                     SIGNAL sSTD_ULOGIC 
BEGIN
b<= typecon_con (s)
--常数实现类型转换
2.4 VHDL
操作符
与其他程序设计语言相似,VHDL中的表达式也是由运算符将基本元素连接起来形成。这里的基本元素包括对象名、文字、函数调用及用括号括起来的表达式。
VHDL语言中共有4类操作符,可以分别进行逻辑运算(LOGICAL)、关系运算(RELATIONAL)、算术运算(ARITHMETIC)和并置运算(CONCATENATION)。需要指出的是操作符操作的对象是操作数,且操作数的类型应该和操作符所要求的类型相一致。另外,运算操作符是有优先级的,例如,逻辑运算符not,在所有操作符中优先级最高。
1.
逻辑运算符
VHDL语言中,共有6种逻辑运算符,他们分别是:
NOT        
取反;
AND        
与;
OR           
或;
   NAND    
与非;
   NOR       
或非;
   XOR       
异或。
6种逻辑运算符可以对“STD_LOGIC ”“BIT”等逻辑型数据、“STD_LOGIC _VECTOR”逻辑型数组及布尔数据进行逻辑运算。必须注意,运算符的左边和右边,以及代入的信号的数据类型必须是相同的。
2.
算术运算符
VHDL
语言中有5类算术运算符,他们分别是:
·
求和操作符:+(加)、-(减)
·
求积操作符:*(乘)、/(除)、MOD(求模)、REM(取余)
·
符号操作符:+(正)、-(负)
·
混合操作符:**(指数)、ABS(取绝对值)·移位操作符:SLL(逻辑左移)、SRL(逻辑右移)、SLA(算术左移)、SRA(算术右移)、ROL(逻辑循环左移)、ROR逻辑循环右移)
3.
关系运算符
VHDL
语言中有6种关系运算符,他们分别是:
      
等于;
/=      
不等于;
      
小于;
<=    
小于等于;
      
大于;
>=     
大于等于;
4.
并置运算符
  
连接
SIGNAL g
hiSTD_LOGIC
SIGNAL c
deSTD_LOGIC _VECTOR1 TO 0);
               
 
d <= i & NOT h
            - -元素与元素并置,形成长度为2的数组
a <= c & d
         - -数组与数组并置,形成长度为4的数组
5.VHDL
操作符的优先顺序
运算符                                                                   优先级
NOT
ABS**                                                         最高优先级
*
/MODREM 
+
(正号),-(负号)
+
,-,
SLL
SLASRLSRAROLROR 
=
/=<><=>= 
AND
ORNANDNORXORXNOR                                最低优先级
2.4 VHDL
词法规则与标识符
2.4.1
词法规则
1.
注释
    
为了提高VHDL源程序的可读性,在VHDL中可以写入注释。注释以- -开头直到本行末尾的一段文字。在MUX+PLUSⅡ中可以看见,敲入- -之后,后面字体的颜色就发生改变。注释不是VHDL设计描述的一部分,编译后存入数据库中的信息不包含注释。
注释举例:
Q
OUT STD_LOGIC _VECTOR11 DOWNTO 0);--A/D转换数据输出显示(行注释)
--SRAM
数据写入控制状态机(段注释)
WRIT_STATE
PROCESSclkrst--SRAM写入控制状态机时序电路进程
2.
数字数字型文字可以有多种表达方式:可以是十进制数,也可以表示为二进制、八进制或十六进制等为基的数,可以是整数,也可以是含有小数点的浮点数。现举例如下。
·
十进制整数表示法:如
012         78_456 (=78456)      2E6
在相邻数字之间插入下划线,对十进制数值不产生影响,仅仅是为了提高文字的可读性。允许在数字之前冠以若干个0,但不允许在数字之间存在空格。
·
以基表示的数:用这种方式表示的数由五个部分组成。第一部分,用十进制数标明数值进位的基数;第二部分,数值隔离符号“#”;第三部分,表达的文字;第四部分,指数隔离符号“#”;第五部分,用十进制表示的指数部分,这一部分的数如果为0可以省去不写。如
2#111_1011#     8#1473#    16#A8#E1     016#F.01#E+4
对以基表示的数而言,相邻数字间插入下划线不影响数值。基的最小数为2,最大数为16,以基表示的数中允许出现AF的字母,大小写字母意义无区别。
·
实数:实数必须带有小数点。如
      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” 
位矢量字符串是被双引号引起来的扩展的数字序列,数字序列前冠以基数说明符。基数符有“B”“O”“X”,他们的含义如下。
B
:二进制基数符号,表示二进制位01,在字符串中每一个位表示一个BIT
O
:八进制基数符号,在字符串中每一个数代表一个八进制数,即代表一个3位(BIT)的二进制数。
X
:十六进制基数符号,代表一个十六进制数,即代表一个4位二进制数。
例如:
    B“1011_1111”
   O“152”    X“F821” 4.下标名
下标名用于指示数组型变量或信号的某一元素。
SIGNAL a
bBIT _VECTOR0 TO 3);
SIGNAL s
INTEGER RANGE 0 TO 2
SIGNAL x
yBIT;
x <= a (s);
y <= b (3);
上例中,a (s)为一下标语句,s是不可计算的下标名,只能在特定情况下进行综合;b (3)的下标为3,可以进行综合。
2.4.2
标识符
     
标识符是最常用的操作符,可以是常数、变量、信号、端口、子程序或参数的名字。标识符规则是VHDL语言中符号书写的一般规则,为EDA工具提供了标准的书写规范。VHDL’93VHDL’87版本的标识符语法规则进行了扩展,通常称VHDL’87版本标识符为短标识符,VHDL’93版标识符为扩展标识符。
1.
短标识符
VHDL
短标识符需遵守以下规则:
1)必须以英文字母开头;(2)英文字母、数字(09)和下划线都是有效的字符;
3)短标识符不区分大小写;
4)下划线(_)的前后都必须有英文字母或数字。一般的,在书写程序时,应将VHDL的保留字大写或黑体,设计者自己定义的字符小写,以使得程序便于阅读和检查。尽管VHDL仿真综合时不区分大小写,但一个优秀的硬件程序设计师应该养成良好的习惯。
例:
一些合法的标识符:
S_MACHINE
present_statesig3
不合法的标识符:
present-state
3statescons_,_now 

2.扩展标识符
扩展标识符的识别和书写有下面的规则:
1)用反斜杠来界定扩展标识符,如 \control_machine\\s_block\ 等都是合法的扩展标识符;
2)扩展标识符允许包含图形符号和空格,如 \s&33\\legal$state\ 是合法的扩展标识符;
3)两个反斜杠之间的字可以和保留字相同,如 \SIGNAL\\ENTITY\ 是合法的标识符,与SIGNALENTITY是不同的;
4)两个反斜杠之间的标识符可以用数字开头,如 \15BIT\\5ns\是合法的;
5)扩展标识符是区分大小写的,如 \a\ \ A\ 是不同的标识符;
6)扩展标识符允许多个下划线相邻,如 \our_ _entity\ 是合法的扩展标识符(不推荐这种方式);
7)扩展标识符的名字中如果含有一个反斜杠,则用相邻的两个反斜杠来代表它,如 \te\\xe\ 表示该扩展标识符的名字为 te\xe (共5个字符);

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有