基本设计单元
Library (库)
库主要存放已经编译过的实体、结构体、程序包和配置;
Package(程序包)
程序包主要用来存放各个设计都能共享的数据类型、子程序说明、属性说明、元件说明等部分。
Entity(实体)
Architecture(结构体)
Configuration(配置)
结构 库
库是专门用于存放预先编译好的程序包的地方,对应一个文件目录,程序包的文件就放在此目录中,其功能相当于共享资源的仓库,所有已完成的设计资源只有存入某个“库”内才可以被其他实体共享。库的说明总是放在设计单元的最前面,表示该库资源对以下的设计单元开放。
IEEE库:是VHDL设计中最常用的资源库,包含IEEE标准的STD_LOGIC_1164、NUMERIC_BIT、NUMERIC_STD以及其他一些支持工业标准的程序包。其中最重要和最常用的是STD_LOGIC_1164程序包,大部分程序都是以此程序包中设定的标准为设计基础。
STD库:是VHDL的标准库,VHDL在编译过程中会自动调用这个库,所以使用时不需要用语句另外说明。
WORK库:是用户在进行VHDL设计时的现行工作库,用户的设计成果将自动保存在这个库中,是用户自己的仓库,同STD库一样,使用该库不需要任何说明。
程序包
程序包是用VHDL语言编写的一段程序,可以供其他设计单元调用和共享,相当于公用的“工具箱”,各种数据类型、子程序等一旦放入了程序包,就成为共享的“工具”,类似于C语言的头文件,使用它可以减少代码的输入量,使程序结构清晰。在一个设计中,实体部分所定义的数据类型、常量和子程序可以在相应的结构体中使用,但在一个实体的声明部分和结构体部分中定义的数据类型、常量及子程序却不能被其他设计单元使用。因此,程序包的作用是可以使一组数据类型、常量和子程序能够被多个设计单元使用。 程序包分为包头和包体两部分。包头(也称程序包说明)是对包中使用的数据类型、元件、函数和子程序进行定义,其形式与实体定义类似。包体规定了程序包的实际功能,存放函数和过程的程序体,而且还允许建立内部的子程序、内部变量和数据类型。包头、包体均以关键字PACKAGE开头。
1 2 3 4 5 6 7 8 9 PACKAGE 程序包名 IS [包头说明语句] END 程序包名;PACKAGE BODY 程序包名 IS [包体说明语句] END 程序包名;
调用方式:
实体
实现设计单元的端口说明。
1 2 3 4 ENTITY 实体名 IS PORT (); GENERIC (); END 实体名;
类属
端口 1 2 PORT (端口信号名:端口模式 数据类型; 端口信号名:端口模式 数据类型);
端口模式
IN 输入
OUT 输出
INOUT 双向
BUFFER 从实体输出
结构体
结构体的任务是:定义结构体中的各项内部使用元素,如数据类型(TYPE),常数(CONSTAND),信号(SIGNAL),元件(COMPONENT),过程(POCEDURE),变量(VARIABLE)和进程(PROCESS)等。通过VHDL语句描述实体所要求的具体行为和逻辑功能。描述各元件之间的连接。
1 2 3 4 5 ARCHITECTURE 结构体名 OF 实体名 IS 定义语句法; BEGIN 功能描述语句法; END 结构体名称;
配置
为实体指定所要配置的结构体
1 2 3 4 CONFIGURATION 配置名 OF 实体名 IS FOR 被选结构体名 END FOR ; END 配置名;
基本语法 标识符规则
应以英文字母开头
允许包含图形符号如回车符,换行符,空格符
不能使用VHDL中的关键字
标识符的下标加括号表示
VHDL的数据对象分为:常量,变量和信号
数据对象 信号
为全局变量,在程序包说明、实体说明、结构体描述中使用,用于声明内部信号,而非外部信号(外部信号为IN、OUT、INOUT、BUFFER),其在元件之间起互联作用,可以赋值给外部信号。
1 2 3 4 5 SIGNAL 信号名:数据类型[:=初始值];目标信号名 <= 表达式
常在结构体中用赋值语句完成对信号赋初值的任务,因为综合器往往忽略信号声名时所赋的值。
变量
只在给定的进程中用于声明局部值或用于子程序中,变量的赋值符号为“:=”,和信号不同,信号是实际的,是内部的一个存储元件(SIGNAL)或者是外部输入(IN、OUT、INOUT、BUFFER),而变量是虚的,仅是为了书写方便而引入的一个名称,常用在实现某种算法的赋值语句当中。
1 2 VARIABLE 变量名:数据类型[:=初始值]
常量
在结构体描述、程序包说明、实体说明、过程说明、函数调用说明和进程说明中使用,在设计中描述某一规定类型的特定值不变,如利用它可设计不同模值的计数器,模值存于一常量中,对不同的设计,改变模值仅需改变此常量即可,就如上一章所说的参数化元件。
1 2 CONSTANT 常数名:数据类型:=表达式;
信号与变量的区别:若在一个进程中为一个信号多次赋值,则最后一次生效;变量赋值实时生效。
数据类型
VHDL是一种强类型语言,对于每一个常数、变量、信号、函数及设定的各种参量的数据类型(DATA TYPES)都有严格要求,相同数据类型的变量才能互相传递和作用,标准定义的数据类型都在VHDL标准程序表STD中定义,实际使用中,不需要用USE语句以显式调用。
类型
范围和说明
INTEGER
-2147483547~2147483546
REAL
-1.0E38~ 1.0E38
BIT
取值为0或1
BIT_VECTOR
用双引号括起来的一组位数据,如“10011”,通常用来表示数据总线
BOOLEAN
TRUE / FALSE
CHARACTER
ASCII码支持的128个字符,使用单引号包裹
STRING
“like this”
STD_LOGIC
枚举数据类型
STD_LOGIC_VECTOR
用双引号括起来的一组STD_LOGIC数据,如“101011”,通常用来表示数据总线
枚举数据类型:
值
说明
‘U’
初始值
‘X’
不定
‘0’
0
‘1’
1
‘Z’
高阻
‘W’
弱信号不定
‘L’
弱信号0
‘H’
弱信号1
‘-‘
不可能情况
运算符 逻辑运算符
操作符
说明
and
与
or
或
nand
与非
nor
或非
xor
异或
xnor
同或
not
逻辑非
算数运算符
操作符
说明
+
加
-
减
*
乘
/
除
**
乘方
mod
求模
rem
求余
abs
绝对值
关系运算符
操作符
说明
=
等于
/=
不等于
<
小于
<=
小于等于
>
大于
>=
大于等于
连接运算符 &,将多个对象或矢量连接成维数更大的矢量
顺序语句 赋值语句
WAIT语句
WAIT语句属于敏感信号激励信号,一个进程语句含有敏感信号时,进程中不能出现WAIT等待语句;当进程语句不含有敏感信号时,进程语句必须含有其他形态的敏感信号激励。
1 2 3 4 5 6 WAIT WAIT ON (敏感信号1 ,敏感信号2 ,敏感信号N) WAIT UNTIL 布尔表达式 WAIT FOR 时间表达式 WAIT UNTIL 布尔表达式 ON (敏感信号1 ,敏感信号2 ,敏感信号N) FOR 时间表达式
IF语句 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 IF 条件表达式 THEN 顺序语句; END IF ; IF 条件表达式 THEN 顺序语句; ELSE 顺序语句; END IF ;IF 条件表达式 THEN 顺序语句; ELSIF 条件表达式 THEN 顺序语句; …… ELSE 顺序语句; END IF ;
CASE语句 1 2 3 4 5 6 CASE 条件表达式 IS WHEN 条件取值 => 顺序处理语句; WHEN 值1 |值2 |值3 => 顺序处理语句; WHEN 起始值 TO 结束值 => 顺序处理语句; WHEN OTHERS => 顺序处理语句; END CASE ;
LOOP循环语句 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [标号:]LOOP 顺序语句; END LOOP [标号];[标号:] FOR 循环变量 IN 循环次数范围 LOOP 顺序语句; END LOOP [标号] ;[标号:] WHILE 条件表达式 LOOP 顺序语句; END LOOP [标号];
NEXT语句
EXIT语句
函数 1 2 3 4 5 6 7 8 FUNCTION <函数名>(参数表) RETURN <数据类型> IS BEGIN 顺序语句; RETURN [返回变量名]; END <函数名>;函数名(实际参数表);
过程 1 2 3 4 5 6 7 PROCEDURE <过程名>(参数表) IS BEGIN 顺序语句; END <过程名>;过程名(实际参数表);
并行语句
当满足条件时,多个语句同时被执行,与书写顺序无关。
BLOCK语句 1 2 3 4 5 [块标号:]BLOCK [(布尔表达式)] [块说明语句;] BEGIN 并行语句; END BLOCK [块标号];
进程语句 1 2 3 4 5 [进程名:] PROCESS (敏感信号表) [说明语句;] BEGIN 顺序语句; END PROCESS [进程名];
并行信号赋值语句 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 目标信号<=表达式; 目标信号 <= 表达式1 when 赋值条件1 else 表达式2 when 赋值条件1 else …… 表达式n; with 选择表达式 select 目标信号 <= 表达式1 when 选择值1 , 表达式2 when 选择值2 , …… 表达式n when 选择值n;
并行过程调用语句
并行过程调用语句与顺序过程调用语句形式基本相同,只是出现的位置不同。
元件例化语句 1 2 3 4 COMPONENT 元件名 [GENERIC <参数说明>;] PORT <端口说明>; END COMPONENT ;