基本设计单元

  1. Library (库)

    • 库主要存放已经编译过的实体、结构体、程序包和配置;
  2. Package(程序包)

    • 程序包主要用来存放各个设计都能共享的数据类型、子程序说明、属性说明、元件说明等部分。
  3. Entity(实体)
    • 用来说明模型的外部特征
  4. Architecture(结构体)
    • 来定义模型的功能
  5. Configuration(配置)
    • 将实体和它的结构体联系起来

结构

库是专门用于存放预先编译好的程序包的地方,对应一个文件目录,程序包的文件就放在此目录中,其功能相当于共享资源的仓库,所有已完成的设计资源只有存入某个“库”内才可以被其他实体共享。库的说明总是放在设计单元的最前面,表示该库资源对以下的设计单元开放。

1
LIBRARY 库名 ;
  • 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
USE 库名.程序包名.ALL;

实体

实现设计单元的端口说明。

1
2
3
4
ENTITY 实体名 IS
PORT(); --端口
GENERIC(); --类属表
END 实体名;

类属

1
2
--格式
GENERIC(常数名:数据类型:设定值);

端口

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 绝对值

关系运算符

操作符 说明
= 等于
/= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于

连接运算符

&,将多个对象或矢量连接成维数更大的矢量

顺序语句

赋值语句

1
2
3
4
5
--变量赋值
变量名:=表达式;

--信号赋值
信号名<=表达式;

WAIT语句

WAIT语句属于敏感信号激励信号,一个进程语句含有敏感信号时,进程中不能出现WAIT等待语句;当进程语句不含有敏感信号时,进程语句必须含有其他形态的敏感信号激励。

1
2
3
4
5
6
WAIT --无限等待;
WAIT ON (敏感信号1,敏感信号2,敏感信号N) --敏感信号变化,表中的信号产生变化时才往下运行;
WAIT UNTIL 布尔表达式 --为TRUE时,进程启动,为FARLSE是等待
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
-- 方式1
IF 条件表达式 THEN
顺序语句;
END IF;

-- 方式2
IF 条件表达式 THEN
顺序语句;
ELSE
顺序语句;
END IF;

-- 方式3
IF 条件表达式 THEN
顺序语句;
ELSIF条件表达式 THEN
顺序语句;
……
ELSE
顺序语句;
END IF;

CASE语句

1
2
3
4
5
6
CASE 条件表达式 IS
WHEN 条件取值 => 顺序处理语句;
WHEN1|值2|值3 => 顺序处理语句;
WHEN 起始值 TO 结束值 => 顺序处理语句;
WHEN OTHERS => 顺序处理语句;
END CASE;

LOOP循环语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- LOOP模式
[标号:]LOOP
顺序语句; -- 需要引入退出语句
END LOOP [标号];

-- FOR模式
[标号:] FOR 循环变量 IN 循环次数范围 LOOP
顺序语句;
END LOOP [标号] ;

-- WHILE模式
[标号:] WHILE 条件表达式 LOOP
顺序语句;
END LOOP [标号];

NEXT语句

1
NEXT [WHEN 条件];	-- 满足条件时终止

EXIT语句

1
EXIT [标号][WHEN 条件];	-- 满足条件时退出循环

函数

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;