【 Verilog HDL 】三种描述方式

版权声明:本博客内容来自于个人学习过程中的总结,参考了互联网以及书本、论文等上的内容,仅供学习交流使用,如有侵权,请联系我会重写!转载请注明地址! https://blog.csdn.net/Reborn_Lee/article/details/82779151

当我们使用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代码,必须先要抽象出数字电路结构才行。针对本例,抽象出的数字电路结构图如下:

采用Verilog HDL描述代码为:

module test(
input a,b,c,d;
output o;
);

wire temp0,temp1;

XOR2 m0( .O(temp0), .I0(a), .I1(b) );
XOR2 m1( .O(temp1), .I0(c), .I1(d) );


AND2 m2( .O(o), .I0(temp0), .I1(temp1) );


endmodule

 


数据流描述方式

数据流描述方式要比结构化描述方式抽象级别要高一些,因为它不在需要清晰地刻画出具体的数字电路架构,而是可以比较直观地表达底层的逻辑行为。

数据流描述方式又可称为RTL级描述方式,即寄存器传输级描述,因为它主要从数据的变换和传送的角度来描述设计模块,并且使用的语句多为和硬件行为一致的并行语句,因此它的抽象级别远没有后面要介绍的行为级描述方式高,所以纯数据流的描述方式也只适用于小规模的电路设计。

不过也正因为数据流描述方式这种折中的抽象级别,使得它既显式地表达了模块的行为,又隐式地刻画了模块的电路结构。因此对于功能较为简单的模块,我们可以轻松地使用数据流描述方式来实现,这样对设计者和编译器都方便;而对于复杂的模块,一般都是行为级描述为主,数据流描述方式为辅;更一般的,我们可能会在同一个模块中同时使用这三种描述方式,来实现数字电路更灵活地描述。

为了方便对比,我们仍使用上述那个要设计的数字逻辑,这次使用数据流描述方式来描述:

module test(
input a,b,c,d;
output o;
);

wire temp0, temp1;

assign temp0 = a^b;
assign temp1 = c^d;

assign o = temp0 & temp1;

endmodule

行为级描述方式

和前面两种方式比起来,行为级描述方式的抽象级别更高,概括力更强,因此规模稍微大些的设计,往往都以行为级描述方式为主。注意,虽然FPGA的设计思路都是并行的,但是HDL中还是支持大量的串行语句元素。由此可见,行为级描述方式的主要载体就是串行语句,同时辅以并行语句用于描述各个算法之间的连接关系。

这里我们仍沿用上述例子,使用行为级描述方式来描述这个简单的电路:

module test(
input a,b,c,d;
output o;
);

always@(a,b,c,d)
begin
    if(a != b && c != d)
        o = 1'b1;
    else
        o = 1'b0;

end

endmodule

这种代码简直就是对自然语句所描述的题目赤裸裸的HDL直译呀!这从侧面说明了使用行为级描述方式会让HDL代码的开发过程更为迅速便捷。

 


最后要说的是,结构化描述方式直接给出底层电路结构,数据流描述方式间接给出底层电路结构,而行为级描述方式几乎就不给出底层电路结构。从题目描述到FPGA实现,无论采用何种描述方式,这中间的工作量是一致的,只不过不同的描述方式分配给人脑和电脑的工作量不同而已。

 

猜你喜欢

转载自blog.csdn.net/Reborn_Lee/article/details/82779151