VHDL语言作为IC设计或FPGA设计的硬件描述语言,在书写的时候按照一定的格式组织的。本节内容从整体介绍VHDL的文件的组织结构和书写格式,做到对VHDL语言描述电路有一个整体印象。VHDL的设计文件中的各部分的详细内容将会在后续章节中逐步展开介绍。
1. VHDL语言设计文件的整体架构
VHDL语言的设计文件(设计文件是指可综合成电路的文件)主要有如下几个部分组成:
- 注释及文件头描述,
- 库文件的声明(library …),
- 库文件的引用(use …),
- 实体(entity)的声明,
- 参数(generic),
- 输入、输出端口描述(in, out,inout declaration),
- 构造体(architecture),
- 元件的声明(component declaration),
- 信号声明 (signal declaration),
- 赋值与运算 (assignment and calculation),
- 进程(process),
- 过程(procedure)。
按照上面的组织结构举一个简单的例子:
例1: 利用VHDL语言设计 一个“与”逻辑电路
---------------------------------------------------------------------------------- header description
-- Company:
-- Engineer: tim
--
-- Create Date: 2022/05/21 00:09:20
-- Design Name:
-- Module Name: top_logic - Behavioral
-- Project Name:
-- Target Devices:
-- Tool Versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------header description
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx leaf cells in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity top_logic is
generic(
AND_OR: integer:=0
);
Port ( a : in STD_LOGIC;
b : in STD_LOGIC;
c : out STD_LOGIC
);
end top_logic;
architecture Behavioral of top_logic is
--signal declare area
--component declare area
begin
-- logic assignment area
c<=a and b; --concurrent assignment 并发赋值
-- process area
-- ...
end Behavioral;
2. 按照VHDL 文件组织方式分析
以例1为例,对VHDL文件组织结构进行分析,
(1)VHDL文件以 .VHD 为扩展名存储。存储的文件名一般与实体名一致,如本文件的文件名为 top_logic.VHD。
(2)文件的开始一般以注释语句作为文件头部分,文件头部分一般由于说明设计文件版权,版本,公司名称,工程师,设计时间等内容。如:
———————————————————————————-
— Company:
— Engineer: tim
—
— Create Date: 2022/05/21 00:09:20
— Design Name:
— Module Name: top_logic – Behavioral
— Project Name:
— Target Devices:
— Tool Versions:
— Description:
—
— Dependencies:
—
— Revision:
— Revision 0.01 – File Created
— Additional Comments:
—
———————————————————————————-
(3)正文部分
- 声明(引用)将使用的库,如:
library IEEE;
声明(或引用)本设计使用 IEEE的库文件,IEEE库是IEEE为VHDL提供的标准库,其中STD_LOGIC_1164库中定义了std_logic ,std_logic_vector等逻辑及矢量类型以及该数据类型的操作函数,因此如果设计中要用到std_logic ,std_logic_vector等类型应声明 IEEE库。这样就指明了将要使用库的位置。
VHDL库的声明格式:以关键字library 后跟库的名称即可,以分号’;”结束。如:library IEEE;
注:VHDL语言以分号”;”结束一行的语句。
- 打开(使用)将使用库中的内容,如:
use IEEE.STD_LOGIC_1164.ALL;
利用关键字use使用库中的内容。从上面的语句可以看出在IEEE库中包含的库文件有许多,这里只使用STD_LOGIC_1164,并且由ALL标识使用STD_LOGIC_1164中的所有内容。可见在打开库文件时,库里的内容是可选的。选项内容以”.”隔离。使用了use语句后相当于将库文件的内容复制到文件的该位置。若 还有其它的库文件使用,继续打开并使用即可,如:
use IEEE.NUMERIC_STD.ALL;
library UNISIM;
use UNISIM.VComponents.all;
在VHDL语言中,库的引用和打开库的内容部分是可选的,如果不使用任何库的内容,该部分可以不存在,如本来中如果只想实现2进制的与运算,可以不适用std_logic数据类型,而采用bit类型,此时可以不使用任何库,也可以完成相同的功能,程序修改如下:
有关库文件的详细内容,将在VHDL库文件一章中详细讲解。
- 实体声明
实体是设计文件的入口,实体由两个主要部分组成:1)由关键字generic引导的参数部分声明,2)由port引导的输入、输出端口描述。如:
entity top_logic is
generic(
AND_OR: integer:=0
);
Port ( a : in STD_LOGIC;
b : in STD_LOGIC;
c : out STD_LOGIC
);
end top_logic;
实体由关键字entity 引导,entity后跟实体名(如 top_logic),并由关键字is指示后面将是实体的具体内容。最后由end 实体名结束。
-
- 参数部分
参数部分,也有部分作者翻译成泛型。该部分主要提供预编译的机制,使设计的实体部分及其行为可配置,参数部分是可选的,如果不需要使用参数,这部分内容可以不存在。如本例中的参数并没有使用,程序可以修改成成如下的代码,并不会影响程序的功能。
entity top_logic is
Port (
a : in bit;
b : in bit;
c : out bit
);
end top_logic;
由于bit类型是VHDL所支持的基本内置类型,因此使用bit类型并不需要其他库和库文件的支持。关于该部分的内容的使用机制将在后续章节中详细讲解。
-
- 端口部分,端口部分是必不可少的。该部分内容主要描述芯片的输入、输出,是整个设计的入口。如本例中声明的a,b为输入(in),c为输出(out), 它们的数据类型为bit或std_logic。
- 构造体(architecture)
构造体是IC设计的行为描述部分。实体部分描述的输入、输出端口之间的逻辑或时序关系将会构造体部分得到描述。构造体的格式如下:
architecture Behavioral of top_logic is --signal declaretion --component declaretion begin c<=a and b; end Behavioral;
由关键字architecture 引导,后跟构造体的名称,并指出该构造体是归属于哪个实体的。在VHDL的架构中一个实体可以有多个构造体,这部分内容将在VHDL配置部分内容介绍。如:Behavioral of top_logic is。
构造体又分为两个部分,分别是元件声明部分和逻辑或行为描述部分,如图1所示。

图1 构造体的组成
-
- 元件或信号声明部分在构造体声明语句和begin之间,由于声明构造体内将使用的信号,或声明将要使用的库元件。在begin之后就是具体的逻辑行为描述部分。如 c<=a and b; 描述了端口c和端口a,b之间的”与”逻辑关系。
- end后面跟构造体名结束构造的描述,主要最后的分号不能省略。
3. VHDL 与 Verilog设计文件对比
VHDL 与 Verilog设计文件对比见表1,
| Verilog | VHDL | |
| 注释 | // 或 /* …*/ | — |
| 库 | 没有具体指定,可以用include实现类似的作用 | Library …
Use … …. |
| 设计入口 | module name_of_module | Entity name_of_entity is
|
| #(
参数部分(可选) );
|
Generic (
参数部分(可选) );
|
|
| (
端口描述 );
|
(
端口描述 );
|
|
| End nameof_entity;
|
||
| 参数部分 | #(
parameter WIDTH=32, ….
parameter DEPTH=1024
);
|
Generic (
WIDTH: integer:=32 ; …. DEPTH : integer:=1024
); |
| 端口部分 |
没有关键字引导,用括号”(…)”标注该部分内容。
|
用port关键字引导
|
| (
input a, // use “,” input b, output c
)
|
port ( a : in bit;
b : in bit; c : out bit );
|
|
| 输入: input
输出:output 双向:inout
|
输入:in
输出:out 双向:inout 缓冲: buffer |
|
| 构造体 | 端口描述部分之后,就是变量声明区和逻辑行为描述区。 | 由architecture引导构造体:如
architecture Behavioral of top_logic is |
| 变量声明区:wire,reg, function,task等
|
变量声明区:signal, component, package, function等
|
|
| 行为描述区:
连续赋值语句; always 过程 …
|
行为描述区:
并发赋值语句; Process 过程 …
|
|
| endmodule | End name-of-architecture ;
|
|
| 标识符、关键字大小写 | 区分大小写:如 Begin与begin表示不同的含义,begin是关键字,而Begin不是关键字 |
不区分大小写:如
Port与port的含义相同 |