EDA笔记(4)--语言要素

目录

VHDL文字规则

一.数字型文字

二.字符串型文字

三.标识符

四.下标名及下标段名

一.常量

二.变量

三.信号

数据类型

1.VHDL数据类型特点

1.布尔(BOOLEAN)数据类型

2.位(BIT)数据类型

3.位矢量(BIT_VECTOR)数据类型

4.字符(CHARACTER)数据类型

5.整数(INTEGER)数据类型

6.自然数(NATURAL)和正整数(POSITIVE)数据类型

7.实数(REAL)数据类型

8.字符串(STRING)数据类型

9.时间(TIME)数据类型

10.错误等级(SEVERITY_LEVEL)

三、IEEE预定义标准逻辑位与矢量

1.标准逻辑位(STD_L0GIC)数据类型

2.标准逻辑矢量(STD_LOGIC_VECTOR)数据类型

四、其他预定义标准数据类型

(1)无符号数据类型(UNSIGNED TYPE)

(2)有符号数据类型(SIGNED TYPE)

一、用户自定义数据类型方式

1.TYPE语句用法

2.SUBTYPE语句用法

二、各种自定义数据类型

1.枚举类型

2.数组类型

3.记录类型

三.数据类型转换

1.数据类型转换的作用

2.数据类型转换的方式

四.运算操作符及操作数

一.操作符及对应的操作数

VHDL操作符列表

VHDL操作符优先级

二.各种操作符的使用说明

三.重载操作符


VHDL文字规则

一.数字型文字

例如:16#E#E1 ( 14*16=224 )       16#F.01#E+2  ( [15*16^0+0*16^-1+1*16^-2]*16^2=3841 )

二.字符串型文字

三.标识符

1.标识符用来定义常数、变量、信号、端口、子程序或参数的名字。
2.VHDL的基本标识符就是以英文字母开头,不连续使用下划线“_”,不以下划线“_”结尾的,由26个大小写英文字母、数字0~9以及下划线“_”组成的字符串。
3.标识符中的英语字母不分大小写。VHDL的保留字不能用于作为标识符使用。

四.下标名及下标段名

1.作用:下标名用于指示数组型变量或信号的某一元素,而下标段名则用于指示数组型变量或信号的某一段元素

2.语句格式:

3.实例:下标名及下标段名使用示例

signal A,B,C: bit_vector(0 to 7);
signal M: integer range 0 to 3;
signal Y,Z:bit;
Y<=A(M);    --M是不可计算型下标表示
Z<=B(3);    --3是可计算型下标表示
C (0 to 3)<=A (4 to 7);    --以段的方式进行赋值
C (4 to 7)<=A (0 to 3);    --以段的方式进行赋值


一.常量


1.常量(CONSTANT)的定义和设置主要是为了使设计实体中的常数更容易阅读和修改。
例如,将位矢的宽度定义为一个常量,只要修改这个常量就能很容易地改变宽度,从而改变硬件结构。
2.常量的定义形式如下:
CONSTANT 常量名:数据类型:=表达式;
例如:
CONSTANT FBUS : BIT_VECTOR(5 DOWNTO 0):=“010111”(常量名为FBUS,数据类型是位矢量,常量值是"010111")

二.变量


1.变量(VARIABLE)是一个局部量,只能在进程和子程序中使用。
变量不能将信息带出对它作出定义的当前设计单元。
变量的赋值是一种理想化的数据传输,是立即发生,不存在任何延时的行为。
变量常用在实现某种算法的赋值语句中。
2.定义变量的语法格式:
VARIABLE 变量名:数据类型:=初始值;
例如:
VARIABLE B,C: INTEGER:=2;--定义B和C为整型变量,初始值为2
变量赋值语句的语法格式:
目标变量名:=表达式;


三.信号


1.信号(SIGNAL)是描述硬件系统的基本数据对象,它类似于连接线。
信号可以作为设计实体中并行语句模块间的信息交流通道。
2.信号的定义格式:
SIGNAL 信号名:数据类型:=初始值;
例如:
SIGNAL S1:STD_LOGIC:=0;--定义了一个标准位的单值信号S1,初始值为低电平
SIGNAL S4:STD_LOGIC_VECTOR(15 DOWNTO 0);   --定义了一个标准位矢的位矢量(数组、总线)信号,共有16个信号元素
信号的赋值语句表达式:
目标信号名〈=表达式;

数据类型

1.VHDL数据类型特点

VHDL是一种强类型语言,要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,并且只有数据类型相同的量才能互相传递和作用。

1.布尔(BOOLEAN)数据类型


TYPE BOOLEAN IS(FALSE,TRUE);
布尔数据类型实际上是一个二值枚举型数据类型,它的取值有FALSE和TRUE两种。综合器将用一个二进制位表示BOOLEAN型变量或信号。
例如,当A大于B时,在IF语句中的关系运算表达式(A>B)的结果是布尔量TRUE,反之为FALSE。综合器将其变为1或0信号值,对应于硬件系统中的一根线。


2.位(BIT)数据类型


位数据类型也属于枚举型,取值只能是1或0。
位数据类型的数据对象,如变量、信号等,可以参与逻辑运算,运算结果仍是位的数据类型。
VHDL综合器用一个二进制位表示BIT。在程序包STANDARD中定义的源代码是:
TYPE BIT IS(‘0’,‘1’);


3.位矢量(BIT_VECTOR)数据类型


位矢量只是基于BIT数据类型的数组,在程序包STANDARD中定义的源代码是:
TYPE BIT_VETOR IS ARRAY(NATURAL RANGE<>)OF BIT;
使用位矢量必须注明位宽,即数组中的元素个数和排序。
例如:
SIGNAL A : BIT_VECTOR(7 DOWNTO 0);--表示信号A被定义为一个具有8位位宽的矢量,它的最左位是A(7),最右位是A(0)。


4.字符(CHARACTER)数据类型


字符类型通常用单引号引起来,如’A’。
字符类型区分大小写,如‘B’不同于‘b’。


5.整数(INTEGER)数据类型


在VHDL中,整数的取值范围:
-2 147 483 647 ~ +2 147 483 647 即可用32位有符号的二进制数表示。
在实际应用中,VHDL仿真器通常将INTEGER类型作为有符号数处理,而VHDL综合器则将INTEGER作为无符号数处理。


6.自然数(NATURAL)和正整数(POSITIVE)数据类型


自然数是整数的一个子类型,是非负的整数,即零和正整数;
正整数也是整数的一个子类型,它包括整数中非零和非负的数值。


7.实数(REAL)数据类型


VHDL的实数类型类似于数学上的实数,或称浮点数。
实数的取值范围:
-1.0E38 ~ +1.0E38
通常情况下,实数类型仅能在VHDL仿真器中使用,VHDL综合器不支持实数,因为实数类型的实现相当复杂,目前在电路规模上难以承受。


8.字符串(STRING)数据类型


字符串数据类型是字符数据类型的一个非约束型数组,或称为字符串数组。字符串必须用双引号标明。
例如:
VARIABLE STRING_VAR : STRING(1 TO 7);

STRING_VAR : “A B C D”;


9.时间(TIME)数据类型


VHDL中惟一的预定义物理类型是时间。
完整的时间类型包括整数和物理量单位两部分,整数和单位之间至少留一个空格。
例如:
55 ms,20 ns


10.错误等级(SEVERITY_LEVEL)


在VHDL仿真器中,错误等级用来指示设计系统的工作状态。
共有四种可能的状态值:
NOTE(注意)、WARNING(警告)、ERROR(出错)、FAILURE(失败)。
在仿真过程中,可输出这四种值来提示被仿真系统当前的工作情况。
其定义如下:
TYPE SEVERITY_LEVEL IS(NOTE,WARNING,ERROR,FAILURE);

三、IEEE预定义标准逻辑位与矢量


在IEEE库的程序包STD_LOGIC_1164中,定义了两个非常重要的数据类型,即标准逻辑位STD_L0GIC和标准逻辑矢量STD_L0GIC_VECTOR。


1.标准逻辑位(STD_L0GIC)数据类型


(1)数据类型STD_L0GIC的定义:
TYPE STD_LOGIC IS(‘U’,‘X’,‘0’,‘1’,‘Z’,‘W’,‘L’,‘H’,’-’ );
(未初始化的,强未知,强0,强1,高阻态,弱未知,弱0,弱1,忽略他);
(2)在程序中使用此数据类型前,需加入下面的语句:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

(3)注意事项:
由于标准逻辑位数据类型的多值性,在编程时应当特别注意。因为在条件语句中,如果未考虑到STD_LOGIC的所有可能的取值情况,综合器可能会插入不希望的锁存器。
就综合而言,STD_LOGIC型数据能够在数字器件中实现的只有其中的四种值,即“-”、“0”、“1”和“Z”。

2.标准逻辑矢量(STD_LOGIC_VECTOR)数据类型


STD_LOGIC_VECTOR数据类型的数据对象赋值的原则是:
同位宽、同数据类型的矢量间才能进行赋值。


四、其他预定义标准数据类型


1.VHDL综合工具配带的扩展程序包中,定义了一些有用的类型。如Synopsys公司在IEEE库中加入的程序包STD_L0GIC_ARITH中定义了如下的数据类型:无符号型(UNSIGNED)、有符号型(SIGNED)和小整型(SMALL_lNT)。

2.在使用之前,请注意必须加入下面的语句:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_ARITH.ALL;

UNSIGNED类型和SIGNED类型是用来设计可综合的数学运算程序重要类型。
UNSIGNED 用于 无符号数的运算
SIGNED 用于 有符号数的运算


(1)无符号数据类型(UNSIGNED TYPE)


UNSIGNED数据类型代表一个无符号的数值,在综合器中,这个数值被解释为一个二进制数,这个二进制数的最左位是其最高位。
示例如下:
VARIABLE VAR:UNSIGNED(0 TO 10);--变量VAR有11位数值,最高位是VAR(0),而非VAR(10);
SIGNAL SIG:UNSIGNED(5 DOWNTO 0);--信号SIG有6位数值,最高位是SlG(5)


(2)有符号数据类型(SIGNED TYPE)


SIGNED数据类型表示一个有符号的数值,综合器将其解释为补码,此数的最高位是符号位。
例如:
SIGNED(“0101”)代表+5,5;SIGNED(“1011”)代表-5。


一、用户自定义数据类型方式


用户自定义数据类型是用 类型定义语句TYPE子类型定义语句SUBTYPE 实现的。


1.TYPE语句用法


2.SUBTYPE语句用法


子类型SUBTYPE只是由TYPE所定义的原数据类型的一个子集,它满足原数据类型的所有约束条件。
利用子类型定义数据对象,除了使程序提高可读性和易处理外,还有利于提高综合的优化效率。
子类型SUBTYPE的语句格式如下:
SUBTYPE 子类型名 IS 基本数据 RANGE 约束范围;
例如:
(标准程序包中已定义过得数据类型)
SUBTYPE DIGITS INTEGER RANGE 0 TO 9;
(把INTEGER约束到
只含有10个值得数据类型)


二、各种自定义数据类型


VHDL自定义数据类型有多种,如枚举类型、整数类型、数组类型、记录类型、时间类型、实数类型等。


1.枚举类型


(1)VHDL中的枚举数据类型是用文字符号来表示一组实际的二进制数的类型。
其目的是为了更便于阅读和编译。
(2)枚举数据类型定义示例
TYPE M_STATE IS(STATE1,STATE2,STATE3,STATE4,STATE5);
SIGNAL CURRENT_STATE,NEXT_STATE : M_STATE;

(3)在综合过程中,枚举类型文字元素的编码通常是自动的,编码顺序是默认的,一般将第一个枚举量编码为0,以后依次加1。
一般而言,编码方法因综合器不同而不同。为了某些特殊的需要,编码顺序也可以人为设置。


2.数组类型


(1)数组类型是将一组具有相同数据类型的元素集合在一起,作为一个数据对象来处理的数据类型。
数组可以是一维数组或多维数组。VHDL仿真器支持多维数组,但VHDL综合器只支持一维数组
(2)VHDL允许定义两种不同类型的数组,即限定性数组和非限定性数组
它们的区别是:
限定性数组下标的取值范围在数组定义时就被确定了,而非限定性数组下标的取值范围需留待随后根据具体数据对象再确定。
(3)限定性数组定义语句格式:
(即指数组各元素的数据类型)
TYPE 数组名 IS ARRAY(数组范围)0F 数据类型
(明确指出数组元素的定义数量和排序方式,
以整数来表示其数组的下标)

(4)非限制性数组的定义语句格式:
(下标范围待定符号,用到该数组类型时,再
填入具体的数值范围)

TYPE 数组名 IS ARRAY(数组下标名 RANGE< >)0F 数据类型;
(以整数类型设定的一个数组下标名称)

比如:
TYPE BIT_VECTOR IS ARRAY(NATURAL RANE< >)OF BIT;
VARABLE VA : BIT_VECTOR(1 TO 6);–将数组取值范围定在1~6

 

3.记录类型

1.由已定义的、数据类型不同的对象元素构成的数组称为记录类型的对象。

2.定义记录类型的语句格式:

三.数据类型转换

1.数据类型转换的作用


由于VHDL是一种强类型语言,要求各种数据类型相同的参量,才能相互作用和传递。
因此对于数据类型不同的参量需要进行相互作用和传递时,首先必须进行数据类型的转换。

2.数据类型转换的方式

(1)类型转换函数方式
类型转换函数方式,就是通过定义一个数据类型转换函数,将属于某种数据类型的数据对象转换成属于另一种数据类型的数据对象。
(2)直接类型转换方式
直接类型转换方式,就是将一个需要转换数据类型的表达式,通过指定一种特定的数据类型的方式,即数据类型标识符(表达式),将表达式的值转换成指定的数据类型。

(3)应用举例

四.运算操作符及操作数

一.操作符及对应的操作数

VHDL操作符列表

VHDL操作符优先级

二.各种操作符的使用说明

1.严格遵循基本操作符间操作数是同数据类型的规则严格遵循操作数的数据类型必须与操作符所要求的数据类型完全一致的规则
2.注意操作符之间的优先级别。当一个表达式中有两个以上的运算符时,可使用括号将这些运算分组。

三.重载操作符

为了方便各种不同数据类型间的运算,VHDL允许用户对原有的基本操作符重新定义,赋予新的含义和功能,从而建立一种新的操作符,这就是重载操作符,定义这种操作符的函数称为重载函数。
Synopsys的程序包STD_LOGIC_ARITHSTD_LOGIC_UNSIGNEDSTD_LOGIC_SIGNED中已经为许多类型的运算重载了算术运算符和关系运算符,因此只要引用这些程序包SIGNEND、UNSIGEND、STD_LOGIC和INTEGER之间即可混合运算INTEGER、STD_LOGIC和STD_LOGIC_VECTOR之间也可以混合运算。

发布了11 篇原创文章 · 获赞 41 · 访问量 9795

猜你喜欢

转载自blog.csdn.net/weixin_43788952/article/details/105568006