图 2 R-S 触发器的 VHDL 实体描述和符号
实体语句用关键词 ENTITY 开头,实体名 rsff 是描述的符号名,在结束实体语句的 END rsff之间,实体语句可以用关键词 BEGIN 把实体语句分成两部分:即 BEGIN 之前是实体说明,BEGIN之后是实体语句。
在 ENTITY 语句的实体说明部分,常用 PORT 付语描述实体对外界连接的端口(数目、方向和数据类型)。实体 rsff 有 4 个端口,Set/Reset 是输入 IN 模式,Q/QB 是输出BUFFER(缓冲)模式,都为 BIT 类型。实体说明中还可说明数据类型、子程序和常量等数据信息,实体语句常用于描述设计经常用到的判断和检查信息。
实体描述的格式如下:
ENTITY 实体名 IS [GENERIC(参数表);] [PORT(端口表);] [BEGIN 实体语句部分;] END [ENTITY] [实体名];
其中,GENERIC 是用于说明设计实体和其外部环境
通信的对象,规定端口的大小、实体中子元件的数目、实体的延时特性等。只能用整数类型表示,如整型、时间型等,其他类型的数据不能逻辑综合。格式如下:
GENERIC ([CONSTANT]属性名称:[IN]子类型标识[:=静态表达式],……);
PORT 关键字用于定义模块的端口,它的格式如下:
PORT( [SIGNAL] 端口名称:[方向]类型标识[BUS] [:=静态表达式], [SIGNAL] 端口名称:[方向] 类型标识[BUS] [:=静态表达式], … [SIGNAL] 端口名称:[方向] 类型标识[BUS] [:=静态表达式]);
• SIGNAL:SIGNAL 是关键字,但是由于 PORT 之后必须是信号类,所以一般可以将 SIGNAL关键字省略。
• 端口名称:是该端口的标识,通常由英文字母和数字组成,但是必须是英文字母打头。
• 方向:定义了端口是输入还是输出,如 IN、OUT。表明端口方向的关键字如表1所示。
• 类型标识:说明流过该端口的数据类型,常用的数据类型有 BIT(位)、BIT_VECTOR(位向量)、BOOLEAN(布尔型)和 INTEGER(整数型)4 种。
• BUS 关键字:在该端口和多个输出端相连的情况下使用。
表 1 端口方向关键字说明表
2.2 结构体的描述方法
结构体描述实体的行为功能,一个实体可以有多个结构体。结构体是一个基本设计单元,它具体地指明了所设计模块的行为、元件及内部的连接关系,也就是说它定义了设计单元具体的功能。结构体对其基本设计单元的输入/输出关系可以用 3 种方式进行描述,即行为描述(基本设计单元的数学模型描述)、寄存器传输描述(数据流描述)和结构描述(逻辑元件连接描述)。
不同的描述方式只体现在描述语句上,而结构体的结构是完全一样的。由于结构体是对实体功能的具体描述,因此它一定要跟在实体的后面。通常,先编译实体之后才能对结构体进行编译。如果实体需要重新编译,那么相应结构体也应重新进行编译。
结构体的格式如下:
ARCHITECTURE 结构体名 OF 实体名 IS [定义语句] BEGIN [并行处理语句] END 结构体名;
定义语句用于对结构体内部所使用的信号、常数、数据类型和函数等进行定义。信号定义和端口说明的语句一样,应有信号名和数据类型的说明,但因它是内部连接用的信号,故没有也不需有方向的说明。并行处理语句具体地描述了结构体的行为及其连接关系,它们都是可以并行执行的。
以上面介绍的 R-S 触发器为例。假设已经有一个实现了与非功能的模块 nand2,用它实现R-S 触发器的原理图如图 3 所示。
图 3 R-S 触发器的实现原理图对应以上原理图的结构体描述如下:library IEEE;use IEEE.std_logic_1164.all;
ENTITY rsff isPORT ( set, reset: in bit; q, qb: buffer );END ENTITY;
ARCHITECTURE arch_rsff OF rsff IS COMPONENT nand2 PORT ( a, b : IN BIT; c: OUT BIT); END COMPONENT; BEGIN U1: nand2 PORT MAP (set, qb, q); U2: nand2 PORT MAP (reset, q, qb);END arch_rsff;
上面的代码中,以关键字 ARCHITECTURE 作为结构体的开头,结构体名为 arch_rsff,表示描述 rsff 实体的结构体 arch_rsff。ARCHITECTURE 和 BEGIN 之间是结构体说明区, BEGIN和 END 之间是结构体语句区。结构体说明区描述组件(COMPONENT)和局部信号,结构体语句中用的具体元件(上例是 nand2)均应在结构体说明中说明接口,以便将描述的信息通知给编辑器。
如果设计者希望将模块分为若干个相对比较独立的子模块进行描述,可以将一个结构体用几个子结构来构成。VHDL 结构体描述常常用到 3 种语句结构:PROCESS 语句结构、BLOCK 语句结构和子程序结构。
1).PROCESS 语句结构
进程语句是一种并发处理语句,在一个结构体中多个 PROCESS 语句可以同时并行运行(相当于多个 CPU 同时运作)。PROCESS 语句是 VHDL 语言中描述硬件系统并发行为的最基本语句。
PROCESS 语句归纳起来有如下几个特点:
• 它可以与其他进程并发运行,并可存取结构体或实体号中所定义的信号;• 进程结构中的所有语句都是按顺序执行的;
• 为启动进程,在进行结构中必须包含一个显式的敏感信号量表或包含一个 WAIT 语句;
• 进程之间的通信是通过信号量传递来实现的。
PROCESS 语句的格式如下:
[进程名]:PROCESS(信号 1,信号 2,…)BEGIN…END PROCESS;
一般情况下进程名可以被省略。进程申明关键字 PROCESS 后面括号内的信号是此进程的敏感信号,这些信号的变化会激活过程的执行。例如下面的代码就表示过程 main_proc 在信号clk 和 reset 变化时执行:
library IEEE;use IEEE.std_logic_1164.all;
ENTITY counter is PORT ( clk, reset: in bit; c: out bit );END ENTITY;
ARCHITECTURE arch of counter isBEGIN main_proc: PROCESS(clk, reset) BEGIN if (reset = '1') then … end if; END PROCESS;END
在进程中也可以定义一些变量,这些变量是局部量,只能在进程内部使用,它们的赋值是立即生效的。局部变量定义的格式如下:
VARIABLE 变量名:数据类型 [约束条件] [:=表达式];