#119. 模块例化
模块例化
题目描述
通过前面一系列的练习,用户应当已经熟悉单个模块电路的设计了。对于功能上更复杂的电路模块,一般都是由若干子模块以及附加的功能电路构成的。
在模块实例化过程中,被例化模块的端口信号是最重要的,用户甚至可以不知道模块的内部结构。上图展示了一个非常简单的包含有子模块电路的电路结构,在此电路中,创建模块mod_a的一个实例化,并将该实例化模块的三个端口(in1
,in2
,out
)与顶层电路的三个端口(a
,b
,out
)直接连接,其中mod_a
模块的代码如下:
module mod_a ( input in1, input in2, output out );
// Module body
assign out = in1 & in2; //这只是一个简单的示例
endmodule
模块实例化一般有两种语法格式,分别称为基于端口名称的实例化和基于端口位置的实例化。
基于位置的实例化和C语言中的函数调用类似(只是语法上类似,实际上该例化会产生实际的硬件电路),以上述mod_a
模块的实例化为例,可以在上层模块中使用以下语句:
module top(input wa,input wb,output wc);
mod_a inst_name1(wa,wb,wc);
endmodule
其中inst_name1是mod_a模块的实例化名称,可以由用户自定义,通过这种例化方式,便实现了端口对应:wa↔in1
, wb↔in2
, wc↔out
。
基于端口名称的实例化如下所示
module top(input wa,input wb,output wc);
mod_a inst_name2(
.out (wc),
.in1 (wa),
.in2 (wb));
endmodule
本教程推荐用户使用基于端口名称的例化方式,因为这种方式编写的代码可读性更强。
试创建一verilog电路,并按照上图中所示实例化mod_a
模块(建议使用基于端口名称的方式实例化)。
Hint:
- 推荐使用基于端口名称的实例化方式
- 模块调用就像是一个树形的层次结构,不允许循环调用,如a调用b,b又调用a,也不允许模块调用自身,即模块c中又实例化模块c。
- 不允许在进程块(如always、initial等)或赋值语句(如assign语句)内进行模块实例化
- 模块的实例化名称可以自定义,如在同一模块中要对一个模块多次实例化,需要有不同的实例化名称。
输入格式
一位线网型变量a、b
输出格式
一位线网型变量out
示例代码
module top(
input a,
input b,
output out
);
// 请用户在下方编辑代码
//用户编辑到此为止
endmodule
module mod_a (
input in1,
input in2,
output out
);
assign out = in1 & in2;
endmodule