VHDL语言诞生于1982年,1987年被美国国防部和IEEE确定为标准的硬件描述语言。自从IEEE发布了VHDL的第一个标准版本IEEE 1076-1987后,各大EDA公司都先后推出了自己支援 VHDL 的 EDA 工具。VHDL 在电子设计行业得到了广泛的认同。此后IEEE又先后发布了IEEE 1076-1993和IEEE 1076-2000版本。[1]
自IEEE-1076(简称87版)之后,各EDA公司相继推出自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,简称93版。VHDL和Verilog作为IEEE的工业标准硬件描述语言,得到众多EDA公司支持,在电子工程领域,已成为事实上的通用硬件描述语言。
VHDL语言是一种用于电路设计的高级语言。它在80年代的后期出现。最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言 。
VHDL翻译成中文就是超高速集成电路硬件描述语言,主要是应用在数字电路的设计中。它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。当然在一些实力较为雄厚的单位,它也被用来设计ASIC。
VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。[2]
VHDL 语言能够成为标准化的硬件描述语言并获得广泛应用,它自身必然具有很多其他硬件描述语言所不具备的优点。归纳起来,VHDL 语言主要具有以下优点:
(1) 功能强大,设计方式多样
VHDL 语言具有强大的语言结构,只需采用简单明确的VHDL语言程序就可以描述十分复杂的硬件电路。同时,它还具有多层次的电路设计描述功能。此外,VHDL 语言能够同时支持同步电路、异步电路和随机电路的设计实现,这是其他硬件描述语言所不能比拟的。VHDL 语言设计方法灵活多样,既支持自顶向下的设计方式,也支持自底向上的设计方法; 既支持模块化设计方法,也支持层次化设计方法。
(2)具有强大的硬件描述能力
VHDL 语言具有多层次的电路设计描述功能,既可描述系统级电路,也可以描述门级电路;描述方式既可以采用行为描述、寄存器传输描述或者结构描述,也可以采用三者的混合描述方式。同时,VHDL 语言也支持惯性延迟和传输延迟,这样可以准确地建立硬件电路的模型。VHDL 语言的强大描述能力还体现在它具有丰富的数据类型。VHDL 语言既支持标准定义的数据类型,也支持用户定义的数据类型,这样便会给硬件描述带来较大的自由度。
(3) 具有很强的移植能力
VHDL 语言很强的移植能力主要体现在: 对于同一个硬件电路的 VHDL 语言描述,它可以从一个模拟器移植到另一个模拟器上、从一个综合器移植到另一个综合器上或者从一个工作平台移植到另一个工作平台上去执行。
(4) 设计描述与器件无关
采用 VHDL 语言描述硬件电路时,设计人员并不需要首先考虑选择进行设计的器件。这样做的好处是可以使设计人员集中精力进行电路设计的优化,而不需要考虑其他的问题。当硬件电路的设计描述完成以后,VHDL 语言允许采用多种不同的器件结构来实现。
(5) 程序易于共享和复用
VHDL 语言采用基于库 ( library) 的设计方法。在设计过程中,设计人员可以建立各种可再次利用的模块,一个大规模的硬件电路的设计不可能从门级电路开始一步步地进行设计,而是一些模块的累加。这些模块可以预先设计或者使用以前设计中的存档模块,将这些模块存放在库中,就可以在以后的设计中进行复用。
由于 VHDL 语言是一种描述、模拟、综合、优化和布线的标准硬件描述语言,因此它可以使设计成果在设计人员之间方便地进行交流和共享,从而减小硬件电路设计的工作量,缩短开发周期。
(1)与其他的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。
(2)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。
(3)VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。符合市场需求的大规模系统高效,高速的完成必须有多人甚至多个开发组共同并行工作才能实现。
(4)对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表。
(5)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。
一个VHDL程序由5个部分组成,包括实体(ENTITY)、结构体(architecture)、配置(coxnfiguration)、包(package)和库(library)。实体和结构体两大部分组成程序设计的最基本单元。图2.2表示的是一个VHDL程序的基本组成。配置是用来从库中选择所需要的单元来组成该系统设计的不同规格的不同版本,VHDL和Verilog HDL已成为IEEE的标准语言,使用IEEE提供的版本。包是存放每个设计模块都能共享的设计类型、常数和子程序的集合体。库是用来存放已编译的实体、结构体、包和配置。在设计中可以使用ASIC芯片制造商提供的库,也可以使用由用户生成的IP库。
--- VHDL Example
library ieee;
use ieee.std_logic_1164.all; --库声明
entity TONE is
port(A,B:in std_logic; --实体定义
C:out std_logic);
end TONE;
architecture EX of TONE is --结构体定义
begin
C<=A OR B;
end EX;
VHDL不区分大小写
VHDL语言应用实例指导
VHDL中的标识符可以是常数、变量、信号、端口、子程序或参数的名字。使用标识符要遵守如下法则:
·标识符由字母(A…Z;a…z)、数字和下划线字符组成。
·任何标识符必须以英文字母开头。
·末字符不能为下划线。
·不允许出现两个连续下划线。
·标识符中不区分大小写字母。
·VHDL定义的保留子或称关键字,不能用作标识符。
·VHDL中的注释由两个连续的短线(--)开始,直到行尾。
以下是非法标识符:
-Decoder —起始不能为非英文字母
3DOP —起始不能为数字
Large#number —“#”不能成为标识符的构成符号
Data__bus —不能有双下划线
Copper_ —最后字符不能为下划线
On —关键字不能用作标识符。
注:在AHDL语言中标识符要区分大小写,但在VHDL语言中不区分大小写。所以写程序时,一定要养成良好的书写习惯,应用关键字时用大写,自己定义的标识符用小写。
标识符表示的几种数据对象的详细说明如下:
1) 常数(Constant )
常数是一个固定的值,主要是为了使设计实体中的常数更容易阅读和修改。常数一被赋值就不能在改变。一般格式:
CONSTANT 常数名:数据类型:=表达式;
例:CONSTANT Vcc: REAL: =5.0;
—设计实体的电源电压指定
常数所赋得值应与定义的数据类型一致。
常量的使用范围取决于它被定义的位置。程序包中定义的常量具有最大的全局化特性,可以用在调用此程序包的所有设计实体中;设计实体中某一结构体中定义的常量只能用于此结构体;结构体中某一单元定义的常量,如一个进程中,这个常量只能用在这一进程中。
2) 变量(Variable)
变量是一个局部变量,它只能在进程语句、函数语句和进程语句结构中使用。用作局部数据存储。在仿真过程中。它不像信号那样,到了规定的仿真时间才进行赋值,变量的赋值是立即生效的。变量常用在实现某种算法的赋值语句中。
一般格式:
VARIABLE 变量名 数据类型 约束条件:=表达式;
例:VARIABLE x,y:INTEGER; —定义x,y为整数变量
VARIABLE count: INTEGER RANGE0 TO255:=10; —定义计数变量范围
变量的适用范围仅限于定义了变量的进程或子程序中。若将变量用于进程之外,必须该值赋给一个相同的类型的信号,即进程之间传递数据靠的信号。
变量赋值语句的语法格式如下:
目标变量:=表达式;
变量赋值符号是“:=”。赋值语句右方的表达式必须是一个与目标变量有相同数据类型的数值。变量不能用于硬件连线和存储元件。
3) 信号(Signal)
信号是描述硬件系统的基本数据对象,它类似于连接线,它除了没有数据流动方向说明以外,其它性质与实体的端口(Port)概念一致。变量的值可以传递给信号,而信号的值不能传递给变量。信号通常在构造体、包集合和实体中说明。信号说明格式为:
SIGNAL 信号名: 数据类型;
信号初始值的设置不是必需的,而且初始值仅在VHDL的行为仿真中有效。
1. 变量
变量只能在进程、函数和过程中使用,一旦赋值立即生效。
例:VARIABLE x, y: INTEGER;
VARIABLE count: INTEGER RANGE 0 TO 255:=10;
2. 信号
信号除了没有方向的概念以外几乎和端口概念一致。
例:SIGNAL sys_clk: BIT:=’0’;
SIGNAL ground: BIT:=’0’
在程序中,信号值输入信号时采用代入符”<=”,而不是赋值符“:=”,同时信号可以附加延时。
信号传送语句:
s1<=s2 AFTER 10ns
信号是一个全局量,可以用来进行进程之间的通信
3. 信号与变量的区别:
信号赋值可以有延迟时间,变量赋值无时间延迟;
信号除当前值外还有许多相关值,如历史信息等,变量只有当前值;
进程对信号敏感,对变量不敏感;
信号可以是多个进程的全局信号,但变量只在定义它之后的顺序域可见;
信号可以看作硬件的一根连线,但变量无此对应关系。
例:ENTITY reg1 IS
PORT ( d : in BIT;
clk : in BIT;
q : out BIT);
END reg1;
ARCHITECTURE reg1 OF reg1 IS
SIGNAL a, b : BIT;
BEGIN
PROCESS (clk)
BEGIN
IF clk='1' AND clk’event THEN
a <= d;
b <= a;
q <= b;
END IF;
END PROCESS;
END reg1;
ENTITY reg1 IS
PORT ( d : in BIT;
clk : in BIT;
q : out BIT);
END reg1;
ARCHITECTURE reg1 OF reg1 IS
BEGIN
PROCESS (clk)
VARIABLE a, b : BIT;
BEGIN
IF clk='1' AND clk’event THEN
a := d;
b := a;
q <= b;
END IF;
END PROCESS;
END reg1;[3]