HDL的三种描述方式
结构化描述
结构化描述方式是最原始的描述方式,是抽象级别最低的描述方式,但同时也是最接近于实际的硬件结构的描述方式。结构化的描述方式,思路就像在面包板上搭建数字电路一样,唯一的不同点就是我们通过HDL的形式来描述数字电路都需要哪些元器件以及它们之间的连接关系是怎么样的罢了。所以,随机FPGA芯片的集成度越来越高,项目的复杂性越来越大,要想纯粹使用这种描述方式完成FPGA设计,已经不是人类所能做到的。
因此,我们一般不采用结构化的描述方式直接描述电路的逻辑功能,原因有二:首先,使用结构化的描述方式不易描述功能稍微复杂的电路;其次,不同FPGA厂商提供的软件集成开发环境中的原语名称是不同的,因此,使用结构化描述方式编写的代码是非常不通用的。
不过结构化描述方式也有它的优势,这也使得我们平时的HDL代码编写中几乎无法离开它。这是因为层次化的模块划分是FPGA设计思想的主流,尤其对于复杂一些的设计,这种思想甚至是必须的,那么,父模块调用子模块的过程只能通过结构化的描述方式来实现。当然,必须用到结构化描述方式的地方不仅局限于此,IP核的调用等等也需要用到。
通过上面结构,我们应该知道什么样的HDL代码叫做结构化描述方式了吧?没错,那就是实例化语句。只要HDL代码中有实例化语句出现,那么它就采用了结构化的描述方式,如果一个模块中除了实例化语句外不再有其他功能语句,那么它就是一个纯结构化的HDL代码,一般来说,较高层次的父模块都采用这些纯粹的结构化描述方式。
给出一个小例子,我们会分别使用三种不同的方式来描述这个电路:我们要描述的是这样一个功能——这是一个四输入、一输出的逻辑,输入信号分别为1bit的 a 、b、 c、 d,输出为1bit的 o,当且仅当 a、b 不相等且 c、d不相等时,o 为逻辑1,否则 o 为逻辑0。
如果要用结构化的描述方式编写HDL代码,必须先要抽象出数字电路结构才行。
module test( input a,b,c,d; output o; ); wire temp0,temp1; XOR (temp0, a, b); XOR (temp1, c, d); AND2 (out, temp0, temp1);
endmodule
数据流描述
数据流描述方式要比结构化描述方式抽象级别要高一些,因为它不在需要清晰地刻画出具体的数字电路架构,而是可以比较直观地表达底层的逻辑行为。
数据流描述方式又可称为RTL级描述方式,即寄存器传输级描述,因为它主要从数据的变换和传送的角度来描述设计模块,并且使用的语句多为和硬件行为一致的并行语句,因此它的抽象级别远没有后面要介绍的行为级描述方式高,所以纯数据流的描述方式也只适用于小规模的电路设计。
不过也正因为数据流描述方式这种折中的抽象级别,使得它既显式地表达了模块的行为,又隐式地刻画了模块的电路结构。因此对于功能较为简单的模块,我们可以轻松地使用数据流描述方式来实现,这样对设计者和编译器都方便;而对于复杂的模块,一般都是行为级描述为主,数据流描述方式为辅;更一般的,我们可能会在同一个模块中同时使用这三种描述方式,来实现数字电路更灵活地描述。
module test( input a,b,c,d; output out; ); wire temp0, temp1;
assign temp0 = a^b; assign temp1 = c^d; assign out = temp0 & temp1; endmodule
行为级描述
和前面两种方式比起来,行为级描述方式的抽象级别更高,概括力更强,因此规模稍微大些的设计,往往都以行为级描述方式为主。
注意,虽然FPGA的设计思路都是并行的,但是HDL中还是支持大量的串行语句元素。由此可见,行为级描述方式的主要载体就是串行语句,同时辅以并行语句用于描述各个算法之间的连接关系。
module test( input a,b,c,d; output out; ); always@(a,b,c,d) begin if(a != b && c != d) out = 1'b1; else out = 1'b0; end endmodule