第四章 VHDL简明教程
§4.1 VHDL基本结构与语法
·VHDL是VHSIC Hardware Description Language的缩写
□ VHSIC—Very High Speed Integrated Circuit(1982年)
·由美国国防部(DOD)制定,以作为各合同商之间提交复杂电路设计文档的一种标准方案 ·1987年被采纳为IEEE 1076标准 ·1993年被更新为IEEE 1164标准
HDL 的出现是为了适应电子系统设计的日益复杂性。若以计算机软件的设计与电路设计做个类比,机器码好比晶体管/MOS管;汇编语言好比网表;则HDL语言就如同高级语言,VHDL在语法和风格上类似与现代高级编程语言,如C语言。但要注意,VHDL毕竟描述的是硬件,它包含许多硬件特有的结构。 ·现在VHDL被广泛用于: 电路设计的文档记录 设计描述的逻辑综合 电路仿真
采用VHDL及自顶向下方法在大型数字系统设计中被广泛采用。在设计中你可采用较抽象的语言(行为/算法)来描述系统结构,然后细化成各模块,最后可借助编译器将VHDL描述综合为门级。
本教程仅对用于CPLD/FPGA设计描述的VHDL语言作一简单说明。其设计过程一般如下:
1. 代码编写;
2. 由综合器(如Synplify,Synopsys等)综合成门级网表; 3. 前仿真/功能仿真;
4. 布局/布线至某一类CPLD/FPGA中; 5. 后仿真/时序仿真。
4.1.1 VHDL的组成
一个VHDL设计由若干个VHDL文件构成,每个文件主要包含如下三个部分中的一个或全部:
1.程序包(Package); 2.实体(Entity);
3.结构体(Architecture).
120 — —
其各自作用如下图所示: VHDL设计 VHDL文件 程序包(Packages) 声明在设计或实体中将用到的常数,数据类型,元件及子程序等 实体(Entities) 声明到其他实体及其他设计的接口,即定义本设计的输入/出端口。 结构体(Architectures) 定义了实体的实现。即电路的具体描述
一个完整的VHDL设计必须包含一个实体和一个与之对应的结构体。一个实体可对应多个结构体,以说明采用不同方法来描述电路。
以下以具有异步清零、进位输入/输出的四位计数器为例,讲解VHDL的基本构件:以下为此计数器的VHDL代码:(黑体为关键字)
library ieee; --库,程序包调用 use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
ENTITY cntm16 IS --实体 PORT ( ci : IN std_logic; nreset : IN std_logic; clk : IN std_logic;
co : out std_logic; qcnt : buffer std_logic_vector(3 downto 0) --此处无;号 ); END cntm16;
ARCHITECTURE behave OF cntm16 IS --结构体 BEGIN
121 — —
co<='1' when (qcnt=\ and ci='1') else '0'; PROCESS (clk,nreset) --进程(敏感表) BEGIN IF(nreset='0') THEN qcnt<=\ ELSIF (clk'EVENT AND clk = '1') THEN if(ci='1') then qcnt<=qcnt+1; end if; END IF; --end if _reset END PROCESS; END behave;
*注:基本的标识符由字母、数字以及下划线组成,且具有如下特征:
第一个字符必须为字母; 最后一个字符不能是下划线; 不允许连续2个下划线。
最长32个字符,不区分大小写;不能和VHDL的保留字相同。
各完整语句均以“;”结尾,以“--” 开始的语句为注释语句,不参与编译。
下面将分别对程序包,实体,结构体做细致说明。
4.1.2 实体(Entity)
VHDL表达的所有设计均与实体有关,实体是设计中最基本的模块。设计的最顶层是顶层实体。如果设计分层次,那么在顶级实体中将包含较低级别的实体。 实体中定义了该设计所需的输入/输出信号,信号的输入/输出类型被称为端口模式,同时,实体中还定义他们的数据类型。 实体的格式如下:
entity
port
以上述的四位计数器为例,则该计数器的实体部分如下:
122 — —
ENTITY cntm16 IS
PORT ( ci nreset clk co qcnt
--实体
: IN
: IN : IN : out : buffer std_logic; std_logic; std_logic; std_logic;
std_logic_vector(3 downto 0) --此处无;号
); END cntm16; 端口模式 端口类型 信号名 由此看出,实体(ENTITY)类似于原理图中的符号(Symbol ),它并不描述模块的具体功能。 实体的通信点是端口(PORT),它与模块的输入/输出或器件的引脚相关联。 上述实体对应的原理图符号如下:
每个端口必须定义:
信号名:端口信号名在实体中必须是唯一的。信号名应是合法的标识符*。 属性:它包括
模式(MODE):决定信号的流向
类型(TYPE): 端口所采用的数据类型
端口模式(MODE)有以下几种类型: · IN 信号进入实体但并不输出; · OUT 信号离开实体但并不输入;并且不会在内部反馈使用; · INOUT 信号是双向的(既可以进入实体,也可以离开实体); · BUFFER 信号输出到实体外部,但同时也在实体内部反馈。 BUFFER(缓冲)是INOUT(双向)的子集,但不是由外部驱动
端口模式可用下图说明:(黑框代表一个设计或模块)
IN
OUT BUFFER INOUT
123 — —
端口类型(TYPE)定义端口的数据类型,包括以下几种: · integer 可用作循环的指针或常数,通常不用于I/O信号,
例如:
SIGNAL count :integer range 0 to 255 count <= count + 1 · bit 可取值‘0’或‘1’ · std_logic 工业标准的逻辑类型,取值‘0’,‘1’,‘X’,和‘Z’ --由IEEE std 1164标准定义 · std_logic_vector std_logic的组合,工业标准的逻辑类型
VHDL是与类型高度相关的语言,不允许将一种信号类型赋予另一种信号类型。在此教程中主要采用std_logic和std_logic_vector。若对不同类型的信号进行赋值需使用类型转换函数。
在VHDL中除上述常用于端口类型的数据类型外,还有其他多种数据类型用于定义内部信号,变量等:如
可枚举类型Enumeration(常用于定义状态机的状态)
存取型(Access Types),文件型(File Types)常用于建立模拟模型 物理类型(Physical Types)定义测量单位,用于模拟。 ??
其中可枚举类型Enumeration常用于定义状态机的状态,可枚举类型语法结构如下: type
signal sig_name : type_name; 例:
定义: type traffic_light_state is (red, yellow, green); 使用: signal present_state, next_state :traffic_light_state; 此外,还可定义二维数组,详见第二部分的例子。
4.1.3 结构体(Architecture)
所有能被仿真的实体都由一个结构体描述, 结构体描述实体的行为功能。即设计的功能。一个实体可以有多个结构体,一种结构体可能为行为描述,而另一种结构体可能为设计的结构描述或数据通道的描述。结构体是VHDL设计中最主要部分,它一般由一些各子部分构成,如下图所示:
124 — —