前言
常编写Verilog代码的就会知道,我们对于某一功能的描述,可以通过门电路来描述,也可以直接描述其功能等,这就牵扯到HDL的描述方式,本文节选自《FPGA之道》,一起看下HDL语言的三种描述方式。
三种描述方式
当我们使用HDL代码在描述硬件功能的时候,主要有三种基本描述方式,即结构化描述方式、数据流描述方式以及行为级描述方式。在平时的编程中,可以根据实际情况以及自己的喜好选择其中的一种或几种混合在一起进行自己的HDL代码编写。下面对这三种描述方式分别进行介绍。
结构化描述方式
结构化描述方式是最原始的描述方式,是抽象级别最低的描述方式,但同时也是最接近于实际的硬件结构的描述方式。因为采用结构化的描述方式来编写HDL代码,其思路就跟在面包板上搭建数字电路是一样一样的,唯一的不同点就是我们是通过HDL的形式来描述数字电路都需要哪些“元器件”以及它们之间的连接关系是怎么样的罢了。所以,随着FPGA芯片的集成度越来越高,项目的复杂性越来越大,要想纯粹使用这种描述方法完成FPGA设计,已经不是人类所能做得到的。因此,目前来说,我们一般不采用结构化的描述方式来直接描述电路的逻辑功能,取而代之的是接下来将要介绍的数据流描述方式和行为级描述方式。原因有二:首先,使用结构化的方式不易描述功能稍微复杂的电路,因为我们的大脑除了要抽象出电路的逻辑功能关系,还要抽象出具体的实现形式,这就好比人家都用C语言编代码,而你却还在用汇编一样;其次,不同FPGA厂商提供的软件集成开发环境中的原语名称是不同的,因此使用结构化描述方式编写的代码是非常不通用的。
不过,结构化描述方式有它独有的优势,这也使得我们在平时的HDL代码编写中几乎无法离开它。这是因为层次化的模块划分是FPGA设计思想的主流,尤其对于复杂一些的设计这种思想甚至是必须的,那么,父模块调用子模块的过程只能通过结构化的描述方式来实现。当然,必须要用到结构化描述方式的地方也不仅仅局限于此,例如IP核的调用等等也需要用到。
通过上面对结构化描述方式的介绍,我想大家应该能判断出具有什么样特征的HDL代码叫做结构化描述了吧?没错,那就是实例化语句。只要HDL代码中有实例化语句出现,那么它就采用了结构化的描述方式,如果一个模块中除了实例化语句外不再有其他功能语句,那么它就是一个纯结构化的HDL代码,一般来说,较高层级的父模块都应该采用这种纯粹的结构化描述方式。
下面通过一个例题来具体的看一下什么叫结构化的描述方式。如果我们要描述的是这样一个功能:这是一个四输入、一输出的逻辑,输入信号分别为1bit的a、b、c、d,输出为1bit的o,当且仅当a和b不相等且c和d不相等时,o为逻辑1,否则o为逻辑0。如果要用结构化的描述方式编写HDL代码的话,必须先要抽象出数字电路结构来才行。针对本例,抽象出的数字电路结构图如下(答案不唯一):
可以看出,为了实现题目要求的功能,我们使用了两个异或门和一个与门,假设我们使用的是Xilinx公司的ISE集成开发环境,由于ISE原语库中的两输入异或门和与门的名称分别为XOR2和AND2,因此最后的结构化描述代码如下:
-- VHDL example
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
library UNISIM;
use UNISIM.VComponents.all;
entity Example is
port (
a, b, c, d : in std_logic;
o : out std_logic
);
end Example;
architecture Behavioral of Example is
-