在HDL的建模中,主要有结构化描述方式、数据流描述方式和行为描述方式,下面分别举例说明三者之间的区别
结构化描述方式
结构化的建模方式就是通过对电路结构的描述来建模,即通过对器件的调用( HDL概念称为例化),并使用线网来连接各器件的描述方式。
模块例化语句例化的格式为:
<设计模块名> <例化电路名> < 端口列表>;
// 名关联法
xxxx u_xxxx
(
.a (a1),
.b (b1),
.c (c1),
.d (d1)
);
其中设计模块名是用户设计的电路模块名,例化电路名是用户为了系统设计定义的标书费(为可选项),相当于电路板上为插入设计元件的插座;端口列表用于描述模块元件上引脚与插座的对应关系。端口列表的描述方法有两种:
1. 位置关联法(.设计模块端口名, .设计模块端口名,…… .设计模块端口名) 但是顺序要对应。
2.名称关联法 (.设计模块端口名(插座引脚名), .设计模块端口名(插座引脚名), ….)
顺序可以不对应,上例使用的就是名称关联法(推荐使用)。
数据流描述方式
数据流的建模方式就是通过对数据流在设计中的具体行为的描述的来建模。最基本的机制就是用连续赋值语句。在连续赋值语句中,某个值被赋给某个线网变量(信号),语法如
下:
assign #time net_name = expression;
如:
assign #2 a = b;
在数据流描述方式中,还必须借助于HDL提供的一些运算符,如按位逻辑运算符:逻辑与(&),逻辑或(|)等。
module FA_flow
(
input a,
input b,
input cin,
output so,
output count
);
wire s1,t1,t2,t3;
assign s1 = a ^ b;
assign so = s1 ^ cin;
assign t3 = a & b;
assign t1 = a & cin;
assign t2 = b & cin ;
endmodule
注意在各assign 语句之间,是并行执行的,即各语句的执行与语句之间的顺序无关。如上,当A有个变化时, S1、 T3、 T1 将同时变化, S1的变化又会造成Sum的变化。
行为描述方式
行为方式的建模是指采用对信号行为级的描述(不是结构级的描述)的方法来建模。在表示方面,类似数据流的建模方式,但一般是把用initial 块语句或always 块语句描述的归为行为建模方式。行为建模方式通常需要借助一些行为级的运算符如加法运算符( +),减法运算符(-)等。
module FA_behav2
(
input a,
input b,
input cin,
output reg so,
output reg count
);
always@ ( * ) begin
{count , so} = a + b + cin ;
end
endmodule