第三章 VHDL语言基础
本章介绍VHDL语言的基础知识,具体内容包括: 1、概述
2、VHDL程序的基本结构
库、程序包、实体说明、结构体、配置 3、VHDL的语言要素
语法规则、数据对象、数据类型、运算操作符 4、VHDL的描述语句
并行语句、顺序语句、子程序、属性语句
5、VHDL的描述方式
行为描述方式、寄存器传输级描述方式、结构描述方式
第一节 概述
HDL(Hardware Description Language):硬件描述语言,描述数字电路和系统的语言。具体来说,用于描述数字系统的结构、行为、功能和接口。
在EDA设计中,设计者利用硬件描述语言,可以描述自己的设计思想,完成设计输入的步骤。设计输入共有三种方法——原理图、文本、波形输入,其中,文本输入方式就是用硬件描述语言跟计算机交流,让计算机读懂设计者的设计。 VHDL的全称是Very-High-Speed Integrated Circuit Hardware Description Language,译作甚高速集成电路硬件描述语言,是当前广泛使用的HDL语言之一,并被IEEE和美国国防部采用为标准的HDL语言。 1、发展历程:
美国国防部1982年开发VHDL语言,在1987年被IEEE采用为标准硬件描述语言。在实际使用过程中,发现1987年版本的缺陷,并于1993年对87版进行了修订。因此,现在有两个版本的VHDL语言。 1)1987年的IEEE 1076(VHDL87) 2)1993年进行了修正(VHDL93)
VHDL语言目前已成为,开发设计可编程逻辑器件的重要工具。 2、优点:
VHDL语言能够成为标准化的硬件描述语言并获得广泛应用,它自身必然具有很多其他硬件描述语言所不具备的优点。归纳起来,VHDL 语言主要具有以下优点:
? 功能强大,设计方式多样
VHDL具有功能强大的语言结构, 可用简洁明确的代码来描述十分复杂
的硬件电路。
VHDL 语言设计方法灵活多样,既支持自顶向下的设计方式,也支持自
底向上的设计方法;既支持模块化设计方法,也支持层次化设计方法。 (自上而下:“上”指的是整个数字系统的功能和定义,“下”指的是组成系统的功能部件(子模块)。自上而下的设计,就是根据整个系统的功能,按照一定的原则把系统划分为若干个子模块,然后分别设计实现每个子模块,最后把这些子模块组装成完整的数字系统。)
? 具有强大的硬件描述能力
VHDL 语言具有多层次描述系统硬件功能的能力,既可描述系统级电路,也可以描述门级电路。
描述方式既可以采用行为描述、寄存器传输描述或者结构描述,也可以采用三者的混合描述方式。 ? VHDL 语言的强大描述能力还体现在它具有丰富的数据类型。VHDL
语言既支持标准定义的数据类型,也支持用户定义的数据类型,这样便会给硬件描述带来较大的自由度。 ? 具有很强的移植能力
因为VHDL是一个标准语言, 故VHDL的设计描述可以被不同的工具所支持, 可以从一个模拟工具移植到另一个模拟工具, 从一个综合工具移植到另一个综合工具, 从一个工作平台移植到另一个工作平台去执行。 ? 设计描述与器件无关(可以与工艺无关编程)
采用 VHDL 语言描述硬件电路时,设计人员并不需要首先考虑选择进行设计的器件。这样做的好处是可以使设计人员集中精力进行电路设计的优化,而不需要考虑其他的问题。当硬件电路的设计描述完成以后,VHDL 语言允许采用多种不同的器件结构来实现。若需对设计进行资源利用和性能方面的优化, 也并不是要求设计者非常熟悉器件的结构才行。 ? 易于共享和复用
VHDL 语言采用基于库的设计方法。在设计过程中,设计人员可以建立各种可再次利用的模块,一个大规模的硬件电路的设计不可能从门级电路开始一步步地进行设计,而是一些模块的累加。这些模块可以预先设计或者使用以前设计中的存档模块,将这些模块存放在库中,就可以在以后的设计中进行复用。也就是说,VHDL 语言可以使设计成果在设计人员之间方便地进行交流和共享,从而减小硬件电路设计的工作量,缩短开发周期。 ? 具有良好的可读性
容易被读者理解。
3、VHDL的学习:
VHDL的语言形式与一般的计算机高级语言(C语言)非常类似,可以借鉴其他语言的学习方法。但VHDL作为一种硬件描述语言,具有许多与硬件相关的特征,学习的时候一定要特别注意。 ? VHDL的可综合性问题
VHDL有两种用途:系统仿真和硬件实现。如果程序只用于仿真,那么几乎所有的语法和编程方法都可以使用。但如果程序是用于硬件实现,那么就必须保证程序“可综合”(程序的功能可以用硬件电路实现)。
不可综合的VHDL语句在软件综合时将被忽略或者报错。应当牢记一点:
“所有的VHDL描述都可以用于仿真,但不是所有的VHDL描述都能用硬件实现。”
? 充分理解HDL语句和硬件电路的关系
学好HDL的关键是充分理解HDL语句和硬件电路的关系。 编写HDL,就是在描述一个电路,设计者写完一段程序以后,应当对生成的电路有一些大体上的了解,而不能用纯软件的设计思路来编写硬件描述语言。 ? 语法掌握贵在精,不在多
30%的基本HDL语句就可以完成95%以上的电路设计,很多生僻的语句并不能被所有的综合软件所支持,在程序移植或者更换软件平台时,容易产生兼容性问题,也不利于其他人阅读和修改。建议多用心钻研常用语句,理解这些语句的硬件含义,比多掌握几个新语法要有用的多。 ? 多维并行的思路
传统的软件编程语言永远是单向和一维的。根据CPU的工作方式,以排队式指令的形式来对特定的事件和信息进行控制或接收,在CPU工作的任一时间段只能完成一种操作。
VHDL则不同,它必须适应实际电路系统的工作方式,以并行和顺序的多种语句方式来描述事件。电路系统本质上是有许多并行工作的门电路组成。VHDL正是从这种电路系统构成思想出发的。因此,设计者在学习和应用VHDL语言时,要建立起并行设计的思想。 4、VHDL与Verilog HDL
选择VHDL还是Verilog HDL?这是一个初学者最常见的问题。其实两种语言有类似的地方,掌握其中一种语言以后,可以通过短期的学习,较快的学会另一种语言。当然,如果从事集成电路设计,则必须首先掌握Verilog,因为在IC设计领域,90%以上的公司都是采用Verilog进行IC设计。对于PLD/FPGA设计者而言,两种语言可以自由选择。
? VHDL语法严格,书写规则比Verilog繁琐一些;而Verilog HDL是在C
语言的基础上发展起来的一种硬件描述语言,语法较自由,但Verilog自由的语法也容易让少数初学者出错。 ? 二者描述的层次不同。VHDL语言更适合行为级和RTL级的描述,Verilog
HDL通常只适用于RTL级和门电路级的描述。
VHDL是一种高级描述语言,适用于描述电路的行为,即描述电路的功能,然后由综合器根据功能要求来生成符合要求的电路网表;Verilog HDL是一种较低级的描述语言,适用于描述门级电路,描述风格接近与原理图,从某种意义上来说,它是原理图的高级文本表示方式。
VHDL虽然也可以直接描述门电路,但这方面能力不如Verilog HDL;反之,在高级描述方面,Verilog HDL则不如VHDL。
? 在VHDL设计中,大量的工作是由综合器完成的,设计者所做的工作相
对较少;Verilog HDL设计中,设计者的工作量通常比较大,对设计人员的硬件水平要求比较高。
? 与VHDL相比Verilog HDL的最大优点是:它是一种非常容易掌握的硬
件描述语言,只要有C语言的编程基础,通过二十学时的学习,再加上一段实际操作,一般读者可在二至三个月内掌握这种设计技术。
而掌握VHDL设计技术就比较困难。这是因为VHDL不很直观,需要有EDA编程基础,一般认为至少需要半年以上的专业培训,才能掌握VHDL的基本设计技术。但在熟悉以后,设计效率明显高于Verilog HDL。
第二节 VHDL程序的基本结构
完整的VHDL语言程序通常包含实体(ENTITY)(实体说明+结构体ARCHITECTURE)、库(LIBRARY)、程序包(PACKAGE)和配置
(CONFIGURATION):
实体——基本单元,简单的可以是一个与非门,复杂的可以是一个系统。由两部
分构成:
实体说明——用于描述所设计系统的外部接口信号、类属参数; 结构体——用于描述系统内部的结构和行为;
库 —— 存放已经编译的实体、结构体、程序包和配置;
程序包—— 存放各设计模块都能共享的数据类型、常数和子程序等;
配置 —— 为实体指定结构体(用于从库中选取所需单元来组成系统设计的不
同版本)。
VHDL程序举例:二输入与非门 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164. ALL;
ENTITY nand2_1 IS
PORT(a, b: IN STD_LOGIC; y: OUT STD_LOGIC); END nand2_1;
ARCHITECTURE behav OF nand2_1 IS BEGIN
y<=a NAND b; END behav;
一、库(LIBRARY)
用来存储预先完成的程序包、数据集合体和元件的仓库。
库的作用在于它可以使设计者共享已经编译过的成果和有用数据。 1、库的种类 ? IEEE 库
最常见的库,存放的元件、函数都是IEEE标准、或者其他一些工业标准认可的。
包含:STD_LOGIC_1164 STD_LOGIC_ARITH
STD_LOGIC_UNSIGNED
其中,STD_LOGIC_1164是最重要和最常用的程序包,大部分基于数字系统设计的程序包都以此为基础。 ? STD库
标准库,包含一些预定义的数据类型和函数 包含:STANDARD、TEXTIO程序包
标准库,使用VHDL时一定会用到,但不需要声明。 ? WORK 库
为现行作业库,存放设计者的VHDL语言程序。临时的“仓库”,用来存放用户定义的成品或半成品。 使用时也不需要声明。 ? 用户定义的库
各公司提供的一些资源库,用户自己建立的库等。? 2、库的使用 ? 一个VHDL程序需要使用库中的单元时,需要在每个实体开始时,进行声明。格式:
LIBRARY [库名]; USE [库名.包名.项目名];
需要在每个实体开始时说明引用的库,然后使用USE语句来指明要使用库中的哪一个设计单元。 例: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
STD库、WORK 库由VHDL标准规定的,对所有项目都默认可见的,使用时不需要声明。
二、程序包(PACKAGE)
在编写VHDL程序的过程中,一个设计实体中的各种定义(数据类型、函数等)只能够在本设计实体中使用,而其他设计实体来说则是不可见的。为了使已定义的这些设计单元能被更多的设计实体访问和共享,可以将它们收集在一个VHDL程序包中。
可以存储常量说明、数据类型说明、元件定义、子程序等。 1、程序包的结构:
PACKAGE 程序包名 IS [说明语句]; END程序包名;
PACKAGE BODY程序包名IS [子程序体]; END程序包名;
一个完整的程序包一般由程序包首和程序包体两个部分组成。其中,程序包首主要对数据类型、子程序、常量等进行说明;程序包体用来规定程序包的实际功能。 例:
PACKGE mathx IS
CONSTANT aq: STD_LOGIC_VECTOR(2 DOWNTO 0) := \ --定义常量 TYPE tw32 IS ARRAY(31 DOWNTO 0) OF STD_LOGIC; --定义数据类型 FUNCTION max(a, b: IN INTEGER) RETURN INTEGER; --函数说明 END mathx;
PACKAGE BODY mathx IS
FUNCTION max(a, b: IN INTEGER) RETURN INTEGER IS BEGIN
IF (a>=b) THEN RETURN a; ELSE RETURN b; END IF; END max; END mathx;