1、第 1 章 VHDL 语言基础1.1 概 述硬件描述语言(hardware description language,HDL)是电子系统硬件行为描述、结构描述、数据流描述的语言。目前,利用硬件描述语言可以进行数字电子系统的设计。随着研究的深入,利用硬件描述语言进行模拟电子系统设计或混合电子系统设计也正在探索中。国外硬件描述语言种类很多,有的从 Pascal 发展而来,也有一些从 C 语言发展而来。有些 HDL 成为 IEEE 标准,但大部分是企业标准。VHDL 来源于美国军方,其他的硬件描述语言则多来源于民间公司。可谓百家争鸣,百花齐放。这些不同的语言传播到国内,同样也引起了不同的影响。在我国
2、比较有影响的有两种硬件描述语言:VHDL 语言和Verilog HDL 语言。这两种语言已成为 IEEE 标准语言。电子设计自动化(electronic design automation,EDA)技术的理论基础、设计工具、设计器件应是这样的关系:设计师用硬件描述语言 HDL 描绘出硬件的结构或硬件的行为,再用设计工具将这些描述综合映射成与半导体工艺有关的硬件配置文件,半导体器件FPGA 则是这些硬件配置文件的载体。当这些 FPGA 器件加载、配置上不同的文件时,这个器件便具有了相应的功能。在这一系列的设计、综合、仿真、验证、配置的过程中,现代电子设计理论和现代电子设计方法贯穿于其中。以 HD
3、L 语言表达设计意图,以 FPGA 作为硬件实现载体,以计算机为设计开发工具,以 EDA 软件为开发环境的现代电子设计方法日趋成熟。在这里,笔者认为,要振兴我国电子产业,需要各相关专业的人士共同努力。HDL 语言的语法语义学研究与半导体工艺相关联的编译映射关系的研究,深亚微米半导体工艺与 EDA 设计工具的仿真、验证及方法的研究,这需要半导体专家和操作系统专家共同努力,以便能开发出更加先进的 EDA工具软件。软件、硬件协同开发缩短了电子设计周期,加速了电子产品更新换代的步伐。毫不夸张地说,EDA 工程是电子产业的心脏起搏器,是电子产业飞速发展的原动力。本书从应用的角度向国内广大读者介绍 VHD
4、L 编程技术,让大家掌握 HDL 编程,了解FPGA 结构,学会使用 EDA 工具,为集成电路前端设计打下基础。1.1.1 硬件描述语言的诞生VHDL 语言的英文全名是 Very High Speed Integrated Circuit Hardware Description Language,即超高速集成电路硬件描述语言。HDL 发展的技术源头是:在 HDL 形成发展之前,已有了许多程序设计语言,如汇编、C、Pascal 、Fortran、Prolog 等。这些语言运行VHDL 程序设计教程4在不同硬件平台和不同的操作环境中,它们适合于描述过程和算法,不适合作硬件描述。CAD 的出现,使
5、人们可以利用计算机进行建筑、服装等行业的辅助设计,电子辅助设计也同步发展起来。在从 CAD 工具到 EDA 工具的进化过程中,电子设计工具的人机界面能力越来越高。在利用 EDA 工具进行电子设计时,逻辑图、分立电子原件作为整个越来越复杂的电子系统的设计已不适应。任何一种 EDA 工具,都需要一种硬件描述语言来作为 EDA 工具的工作语言。这些众多的 EDA 工具软件开发者,各自推出了自己的 HDL 语言。HDL 发展的社会根源是:美国国防部电子系统项目有众多的承包公司,由于各公司技术路线不一致,许多产品不兼容,他们使用各自的设计语言,使得甲公司的设计不能被乙公司重复利用,造成了信息交换困难和维
6、护困难。美国政府为了降低开发费用,避免重复设计,国防部为他们的超高速集成电路提供了一种硬件描述语言,以期望 VHDL 功能强大、严格、可读性好。政府要求各公司的合同都用它来描述,以避免产生歧义。由政府牵头,VHDL 工作小组于 1981 年 6 月成立,提出了一个满足电子设计各种要求的能够作为工业标准的 HDL。1983 年第 3 季度,由 IBM 公司、TI 公司、Intermetrics公司签约,组成开发小组,工作任务是提出语言版本和开发软件环境。1986 年 IEEE 标准化组织开始工作,讨论 VHDL 语言标准,历时一年有余,于 1987 年 12 月通过标准审查,并宣布实施,即 IE
7、EE STD 10761987LRM87。1993 年 VHDL 重新修订,形成了新的标准,即 IEEE STD 10761993LRM93。从此以后,美国国防部实施新的技术标准,要求电子系统开发商的合同文件一律采用VHDL 文档。即第一个官方 VHDL 标准得到推广、实施和普及。1.1.2 HDL 语言的种类HDL 语言在国外有上百种。高等学校、科研单位、EDA 公司都有自己的 HDL 语言。现选择较有影响的作简要介绍。Candence 公司是一家著名的 EDA 公司,财力雄厚。该公司的 Verilog HDL 于 1983 年由 Gate Way Design Automatic 公司的
8、Phil Moorby 首创。他在 19841985 年间成功设计了 Verilog-XL 仿真器,于 1986 年提出了快速门级仿真的 XL 算法,使 Verilog HDL 语言变得更加丰富和完善,从而受到了 EDA 工具设计公司的青睐。 1989 年 Candence 公司购买了 GDA 公司,Verilog HDL 语言从此变为 Candence 公司的“私有财产” ,成为Candence 公司的 EDA 设计环境上的硬件描述语言。经过 Candence 公司的努力,Verilog HDL 于 1995 年成为 IEEE 标准,也是民间公司第一个硬件描述语言标准,即 Verilog H
9、DL 13641995。由于 Verilog HDL 语言从 C 语言发展来,所以有 C 语言基础的设计人员能够较快入门。ALTERA 公司是一家半导体器件公司,其 CPLD 器件在世界市场上占主导地位。这家公司不仅是硬件生产厂商,也是 EDA 工具开发商,它的 EDA 工具 MAX+plus II、Quartus 由于人机界面友好、易于使用、性能优良,而受到 FPGA、CPLD 器件设计人员的欢迎。运行在 MAX+plus II 环境下的 VHDL 语言具有 C 语言设计风格,好学好用,第 1 章 VHDL 语言基础 5因此被众多用户使用。HDL 语言来自不同地方,由不同语言演变而来,为了各
10、平台之间相互转换,又推出了 EDIF(Electronic Design Interchange Format) 。它不是一种语言,而是用于不同数据格式的 EDA 工具之间的交换设计数据。1.1.3 VHDL 语言上机操作条件VHDL 语言描述能力强,覆盖面广,抽象能力强,所以用 VHDL 语言作为硬件模型建模很合适。设计者的原始描述是非常简练的硬件描述,经过 EDA 工具综合处理,最终生成付诸生产的电路描述或版图参数描述的工艺文件。整个过程通过 EDA 工具自动完成,大大减轻了设计人员的工作强度,提高了设计质量,减少了出错机会。VHDL 语言可读性好。VHDL 既能被人容易读懂,又能被计算机
11、识别,作为技术人员编写的源文件,它既是计算机程序、技术文档和技术人员硬件信息交流的文件,又是签约双方的合同文件。VHDL 语言中的设计实体(design entity) 、程序包(package) 、设计库(library ) ,为设计人员重复利用他人的设计提供了技术手段。重复利用他人的 IP 模块和软核(soft core)是 VHDL 的特色,许多设计不必个个都从头再来,而是只要在更高层次上把 IP 模块利用起来,就能达到事半功倍的效果。VHDL 语言可以在多种 EDA 工具设计环境中运行。硬件平台是工作站或高档微机。高档微机的配置应该具有:高分彩显 17 英寸以上,分辨率 1024768
12、 或更高硬盘 20GB 以上内存 512MB 以上CPU Intel 兼容 CPU光驱 8 倍速以上操作系统 Windows XX开发工具 MAX+plus II 或 Quartus IICandence、Menter、ALTERA 等公司的 EDA 工具均支持 VHDL 语言环境。关于VHDL 语言的上机实验,在第 7 章中将作详细介绍。1.2 VHDL 程序的实体 VHDL 程序包含实体(entity) 、结构体(architecture) 、配置(configuration) 、包集合(package) 、库(library)5 个部分。 简单的实体是由实体和结构体两部分组成的。实体用于
13、描述设计系统的外部接口信号,结构体用于描述系统的行为、系统数据的流程或者系统组织结构形式。设计实体是 VHDL程序的基本单元,是电子系统的抽象。简单的实体可以是一个与门电路(AND Gate) ,复杂的实体可以是一个微处理器或一个数字电子系统。实体由实体说明和结构体说明两部分VHDL 程序设计教程6组成。例 1-1 是计数器程序结构模板。由这个抽象的程序可以归纳出 VHDL 程序的基本结构。【例 1-1】 计数器程序结构模板 LIBRARY IEEE;USE ieee.std_logic_1164.all;ENTITY entity_name ISPORT (SIGNAL _data_inpu
14、t_name : IN INTEGER RANGE 0 TO _count_value;SIGNAL_clk_input_name: IN STD_LOGIC;实体 SIGNAL_clm_input_name: IN STD_LOGIC;SIGNAL_ena_input_name: IN STD_LOGIC;SIGNAL_ld_input_name : IN STD_LOGIC;SIGNAL_count_output_name : OUT INTEGER RANGE 0 TO _ Count_value;)END entity_name;ARCHITECTURE counter OF _ent
15、ity_name ISSIGNAL_count_signal_name: INTEGER RANGE 0 TO _count_value;BEGINPROCESS (_clk_input_name,_clrn_input_name)-敏感变量表BEGINIF _clrn_input_name = 0 THEN_count_signal_name = 0;ELSIF (_clk_input_nameEVENT AND _clk_input_name = 1)THENIF _ld_input_name = 1 THEN结构体 _count_signal_name = _data_input_nam
16、e;进程 ELSEIF _ena_input_name = 1 THEN_count_signal_name = _count_signal_name + 1;ELSE_count_signal_name = _count_signal_name;END IF;END IF;END IF;END PROCESS;_count_output_name = _count_signal_name;END counter;端口说明第 1 章 VHDL 语言基础 7由例 1-1 可以看出,VHDL 程序由两部分组成:第 1 部分为实体说明,第 2 部分为结构体。VHDL 程序结构更抽象、更基本、更简练的
17、表示如图 1.1 所示。设计实体用关键字 ENTITY 来标识,结构体由 ARCHITECTURE 来标识。系统设计中的实体提供该设计系统的公共信息,结构体定义了各个模块内的操作特性。一个设计实体必须包含一个结构体或含有多个结构体。一个电子系统的设计模型如图 1.2 所示。VHDL 程序设计教程8VHDL程 序 结 构 实 体 描 述 结 构 体 描 述 1 行 为 描 述 法 2 数 据 流 描 述 法 3 结 构 化 描 述 法 结 构 体 间 通 信 设 计 实 体 结 构 体 1 结 构 体 n 图 1.1 VHDL 程序基础 图 1.2 VHDL 程序设计系统模型1.2.1 实体的组
18、成 实体由实体名、类型表、端口表、实体说明部分和实体语句部分组成。根据 IEEE 标准,实体组织的一般格式为:ENTITY 实体名 ISGENERIC(类型表); -可选项PORT(端口表); -必需项实体说明部分; -可选项BEGIN实体语句部分;END ENTITY 实体名;根据上述实体说明的一般书写格式,编写一个 VHDL 程序设计的实体说明,如例 1-2所示。【例 1-2】 add8 实体说明部分 LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY add8 ISPORT( b: in std_logic_vector(7 downto 0)
19、;a: in std_logic_vector(7 downto 0);Ci: in std_logic;Sum: out std_logic_vector(7 downto 0);Co: out std_logic;)END add8;由实体说明部分画出 add8 实体的外部接口图,如图 1.3 所示。实体说明以“ENTITY 实体名 IS”开始,以“END 实体名”结束。大写字母或黑体字都是 VHDL 关键字。EDA 工具对 VHDL 语言的大小写字母不加区分。实体说明主要描述一些参数的类型。参数的类型说明必须放在端口说明之前,这是第 1 章 VHDL 语言基础 9VHDL 标准所规定的。
20、 Ci A7.0 SUM7.0 ad8 B7.0 Co 图 1.3 实体 add8/8 位加法器外部接口在层次化系统设计中,实体说明是整个系统的输入/输出(I/O) 。在一个器件级的设计中,实体说明是一个芯片的输入/输出(I/O) 。实体说明在 VHDL 程序设计中描述一个元件或一个模块与设计系统的其余部分(其余元件、模块)之间的连接关系,可以看作一个电路图的符号。因为在一张电路图中,某个元件在图中与其他元件的连接关系是明显直观的,如图 1.3 所示。1.2.2 类型说明(可选)类型说明是实体说明中的可选项,放在端口说明之前,其一般书写格式为:GENERIC CONSTANT名字表:IN子类型
21、标识: 静态表达式,举例:GENERIC(m:TIME:3ns)这个参数说明是指在 VHDL 程序中,构造体内的参数 m 的值为 3ns。类型说明和端口说明是实体说明的组成部分,用于说明设计实体和外部通信的通道。利用外部通信通道,参数的类型说明为设计实体提供信息。参数的类型用来规定端口的大小、I/O 引脚的指派、实体中子元件的数目和实体的定时特性等信息。1.2.3 端口说明端口说明是对设计实体与外部接口的描述,是设计实体和外部环境动态通信的通道,其功能对应于电路图符号的一个引脚。实体说明中的每一个 I/O 信号被称为一个端口,一个端口就是一个数据对象。端口可以被赋值,也可以当作变量用在逻辑表达
22、式中。定义实体的一组端口称作端口说明(port declaration) 。端口说明的组织结构必须有一个名称、一个通信模式和一个数据类型。端口说明的一般格式为:Port(端口名,端口名: 模式 数据类型名VHDL 程序设计教程10端口名,端口名: 模式 数据类型名);1端口名端口名是赋于每个外部引脚的名称,名称的含义要明确,如 D 开头的端口名表示数据,A 开头的端口名表示地址等。端口名通常用几个英文字母或一个英文字母加数字表示。下面是合法的端口名:CLK,RESET,A0,D32模式模式用来说明数据、信号通过该端口的传输方向。端口模式有in、out、buffer、inout。(1)输入(in
23、)输入仅允许数据流入端口。输入信号的驱动源由外部向该设计实体内进行。输入模式主要用于时钟输入、控制输入(如 Load、Reset 、Enable 、 CLK)和单向的数据输入,如地址信号(address) 。不用的输入一般接地,以免浮动引入干扰噪声。(2)输出(out)输出仅允许数据流从实体内部输出。端口的驱动源是由被设计的实体内部进行的。输出模式不能用于被设计实体的内部反馈,因为输出端口在实体内不能看作可读的。输出模式常用于计数输出、单向数据输出、设计实体产生的控制其他实体的信号等。一般而言,不用的输出端口不能接地,避免造成输出高电平时烧毁被设计实体。(3)缓冲(buffer)缓冲模式的端口
24、与输出模式的端口类似,只是缓冲模式允许内部引用该端口的信号。缓冲端口既能用于输出,也能用于反馈。缓冲端口的驱动源可以是: 设计实体的内部信号源; 其他实体的缓冲端口。缓冲不允许多重驱动,不与其他实体的双向端口和输出端口相连。内部反馈的实现方法有: 建立缓冲模式端口; 建立设计实体的内部节点。缓冲模式用于在实体内部建立一个可读的输出端口,例如计数器输出,计数器的现态被用来决定计数器的次态。实体既需要输出,又需要反馈,这时设计端口模式应为缓冲 模式。(4)双向模式(inout)双向模式可以代替输入模式、输出模式和缓冲模式。在设计实体的数据流中,有些数据是双向的,数据可以流入该设计实体,也有数据从设
25、计实体流出,这时需要将端口模式设计为双向端口。双向模式的端口允许引入内部反馈,所以双向模式端口还可以作为缓冲模式用。由上述分析可见,双向端口是一个完备的端口模式。第 1 章 VHDL 语言基础 11一般而言,输入信号把端口指派成输入模式,输出信号把端口指派成输出模式,而双向数据信号,如计算机的 PCI 总线的地址/数据复用总线、 DMA 控制器数据总线,都选用端口双向模式。这一良好的设计习惯,使得从端口名称、端口模式就可一目了然地知道信号的用途、性质、来源和去向,十分方便。对一个大型设计任务,大家应协同工作,从而不至于引起歧义。3数据类型(types) 数据类型端口说明除了定义端口标识名称、端
26、口定义外,还要标明出入端口的数据类型。VHDL 语言的 IEEE 1706/93 标准规定,EDA 综合工具支持的数据类型为布尔型(boolean) 、位型(bit) 、位矢量型( bit-vector)和整数型(integer) 。由 IEEE std_logic_1164 所约定的、由 EDA 工具支持和提供的数据类型为标准逻辑(standard logic)类型。标准逻辑类型也分为布尔型、位型、位矢量型和整数型。为了使EDA 工具的仿真、综合软件能够处理这些逻辑类型,这些标准库必须在实体中声明或在USE 语句中调用。 1.2.4 实体说明部分在实体结构的一般格式中含有实体说明语句,它是每
27、一设计实体接口的共同部分。由实体说明的一般书写格式知道,含有实体说明部分的组织应放在端口说明下面,说明部分定义的项目是实体接口中的公共信息。实体说明语句是并行语句,如并行断言语句、并行过程调用语句和被动进程语句。这些语句必须是被动语句,其中不包含信号赋值。含有实体说明部分的程序如例 1-3 所示。【例 1-3】 含有实体说明部分的实体 LIBRARY ieee;USE ieee.std_logic_1164.all; USE work mypkg.all -设 my-pkg 包含 work 类型说明Entity Latch ISPort (dx IN: word -设 my-pkg 对该设计实
28、体可见端口说明部分 dy OUT: wordLoad,clk:IN bit);CONSTANT setup:time:12ns;参数类型部分 Use work.timing_pkg.all; -设 my-pkg 包括 chick timing 过程BEGIN实体语句部分 Check timing(setup,dxin,load,clk);END Latch;VHDL 程序设计教程121.3 VHDL 程序的结构体 结构体具体指明了该设计实体的行为,定义了该设计实体的功能,规定了该设计实体的数据流程,指派了实体中内部元件的连接关系。用 VHDL 语言描述结构体有 4 种方法:(1)行为描述法:采
29、用进程语句,顺序描述被称设计实体的行为。(2)数据流描述法:采用进程语句,顺序描述数据流在控制流作用下被加工、处理、存储的全过程。(3)结构描述法:采用并行处理语句描述设计实体内的结构组织和元件互连关系。(4)采用多个进程(process) 、多个模块(blocks) 、多个子程序(subprograms)的子结构方式。结构体的一般书写格式为:ARCHITECTURE 结构体名 OF 实体名 IS定义语句, 内部信号, 常数,数据类型, 函数定义BEGIN并行处理语句;进程语句;END 结构体名;一个结构体的组织结构从“ARCHITECTURE 结构体名 OF 实体名 IS”开始,到“END
30、结构体名”结束。1.3.1 结构体命名结构体名称由设计者自由命名,是结构体的惟一名称。OF 后面的实体名称表明该结构体属于哪个设计实体,有些设计实体中可能含有多个结构体。这些结构体的命名可以从不同侧面反映结构体的特色,让人一目了然。例如:ARCHITECTURE behacvioral OF mux IS 用结构体行为命名ARCHITECTURE dataflow OF mux IS 用结构体的数据流命名ARCHITECTURE structural OF mux IS 用结构体的组织结构命名ARCHITECTURE bool OF mux IS 用结构体的数学表达方式命名ARCHITECTURE latch OF mux IS 用结构体的功能来定义上述几个结构体都属于设计实体 mux,每个结构体有着不同的名称,使得阅读 VHDL程序的人能直接从结构体的描述方式了解功能,定义电路行为。因为用 VHDL 写的文档不仅是 EDA 工具编译的源程序,而且最初主要是项目开发文档,供开发商、项目承包人阅读的。这就是硬件描述语言与一般软件语言不同的地方之一。