结构体(Architecture) 声明区(Declarations) 信号声明;声明用于该结构体的类型,常数,元件,子程序。 并发语句 信号赋值(Signal Assignments) 计算结果,并赋值给信号 过程调用(Procedure Calls) 调用一个预先定义好的一个算法。 元件例化 (Component Instantiations) 调用另一个实体所描述的电路。即元件调用
结构体的一般格式如下:
过程(Processes) 定义一个新算法实现电路功能。在过程中赋值顺序语句。语句按放置的顺序执行。 architectureof
--声明结构体所用的内部信号及数据类型
--如果使用元件例化,则在此声明所用的元件 begin --以下开始结构体,用于描述设计的功能 --concurrent signal assignments并行语句信号赋值 --processes 进程(顺序语句描述设计) --component instantiations 元件例化 end;
如上述四位计数器的结构体(Architecture)如下:
--这是一个模为16,同步计数,异步清零、进位输入/输出的计数器的结构体:
125 — —
ARCHITECTURE behave OF cntm16 IS BEGIN
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;
结构体(Architecture)描述的是实体中的具体逻辑,采用一些语句来描述设计的具体行为。因为语句中涉及到运算符,数据对象等,因此后面将分别说明。
★ 一个完整的、能够被综合实现的VHDL设计必须有一个实体和对应的结构体。一个实体和其对应结构体可构成一个完整的VHDL设计。一个实体可对应一个结构体或多个结构体。
4.1.4 程序包(Package)与USE语句
在VHDL语言中,数据类型、常量与子程序可以在实体说明部分和结构体部分加以说明;而且实体说明部分所定义的类型,常量及子程序在相应的结构体中是可见的(可以被使用)。但是,在一个实体的说明部分与结构体部分中定义的数据类型,常量及子程序对于其它实体的说明部分与结构体部分是不可见的。程序包就是为了使一组类型说明,常量说明和子程序说明对多个设计实体都成为可见的而提供的一种结构。
程序包定义了一组数据类型说明、常量说明、元件说明和子程序说明。以供其他多个设计实体引用。它如同C语言中的*.H文件,定义了一些类型说明, 函数一样。
程序包分包头和包体两部分。包头以保留字PACKAGE开头,包体则以PACKAGE BODY识别。
下面是一个程序包的例子:
--包头说明
PACKAGE Logic IS
TYPE Three_level_logic IS (‘0’,’L’,’Z’);
126 — —
CONSTANT Unknown_Value :Three_level_logic := ‘0’;
FUNCTION Invert ( input : Three_level_logic) RETURN Three_level_logic);
END Logic;
--包体说明
PACKAGE BODY Logic IS --如下是函数Invert的子程序体:
FUNCTION Invert ( input : Three_level_logic) RETURN Three_level_logic); BEGIN
CASE input IS
WHEN ‘0’=>RETURN ‘1’; WHEN ‘1’=>RETURN ‘0’; WHEN ‘Z’=>RETURN ‘Z’; END CASE; END invert; END Logic;
一个程序包所定义的项对另一个单元并不是自动可见的,如果在某个VHDL单元之前加上USE语句,则可以使得程序包说明中的定义项在该单元中可见。
--假定上述程序包Logic的说明部分已经存在 --下面的USE语句使得Three-level-logic 和 Invert; --对实体说明成为可见
USE Logic. Three_level_logic.Logic; USE Logic. Three_level_logic. Invert;
--或USE Logic.all。保留字all代表程序包中所有的都可见。即表示使用 --库/程序包中的所有定义
ENTITY Inverter IS
PORT (x; IN Three_level_logic; y: OUT Three_level_logic); END Inverter;
--结构体部分继承了实体说明部分的可见性, --所以不必再使用USE语句
ARCHITECTURE Three_level_logic OF Inverter IS BEGIN PROCESS
BEGIN
Y<=Invert (x) ;--一个函数调用
127 — —
WAIT ON x; END PROCESS;
END Inverter_body;
程序包的另一个例子可参考“上机练习”部分,它包含了两个元件的说明。
4.1.5 库(Library)
库是专门存放预先编译好的程序包(package)的地方,这样它们就可以在其它设计中被调用。它实际上对应一个目录,预编译程序包的文件就放在此目录中。用户自建的库即为设计文件所在的目录,库名与目录名的对应关系可在编译软件中指定。 例如在上述计数器设计中开始部分有:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee. std_logic_unsigned.ALL;
ieee是ieee标准库的标志名,下面两个USE语句使得以下设计可使用程序包
std_logic_1164、std_logic_unsigned中预定义的内容。
以下是IEEE两个标准库”std”与”ieee”中所包含的程序包的简单解释。
库 名 std ieee ieee ieee ieee ieee
在MAX+PLUSII软件系统中,在ALTERA库中提供如下两个程序包:
程序包名 standard std_logic_1164 numeric_std std_logic_arith std_logic_signed std_logic_unsigned 包中预定义内容 VHDL类型,如bit, bit_vector 定义std_logic, srd_logic_vector等 定义了一组基于 std_logic_1164中定义的类型的算术运算符,如“+”,“-”,SHL,SHR等。 定义有符号与无符号类型,及基于这些类型上的算术运算。 定义了基于std_logic与std_logic_vector类型上的有符号的算术运算。 定义了基于std_logic与std_logic_vector类型上的无符号的算术运算。 · maxplus2 定义了74系列各模块 · megacore 定义了如FFT、8255、8251、图象格式转换函数等大块。
128 — —
4.1.6 VHDL运算符
VHDL为构造计算数值的表达式提供了许多预定义算符。预定义算符可分为四种类型:算术运算符,关系运算符,逻辑运算符与连接运算符。分别叙述如下:
·算术运算符(Arithmetic operators) + 加 - 减 * 乘 / 除 ** 乘方 mod 求模 rem 求余 abs 求绝对值
·关系运算符 = 等于 /= 不等于 < 小于 <= 小于或等于 > 大于 >= 大于或等于
注:其中‘<=’操作符也用于表示信号的赋值操作
·逻辑运算符与连接运算符 and 逻辑与 or 逻辑或 nand 与非 nor 或非 xor 异或 xnor 同或 not 逻辑非
·连接运算符 & 连接,将两个对象或矢量连接成维数更大的矢量
129 — —