模块实例化
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 33 课,共 90 课。
模块实例化是在另一个模块中创建副本的过程。你可以通过连接较小的组件来构建更大的设计。
定义好一个模块后,你可以在另一个模块中使用它。这称为实例化。每次实例化都会创建该模块的一个独立实例。你可以把它想象成使用蓝图来制作同一组件的多个副本。
基本语法
module_name instance_name (connections);| 部分 | 含义 |
|---|---|
module_name | 要实例化的模块名称 |
instance_name | 此副本的唯一名称 |
connections | 连接到模块端口的信号 |
简单示例
步骤 1:定义一个模块
module and_gate (
input a,
input b,
output c
);
assign c = a & b;
endmodule第 2 步:在另一个模块中实例化它
module top (
input x,
input y,
output z
);
and_gate gate1 (x, y, z);
endmodule这段代码的作用如下:
and_gate:要使用的模块名称(必须在某处存在)gate1:我们为这个特定实例指定的唯一名称(x, y, z):连接到模块端口的信号(顺序与它们在模块定义中的出现顺序相同)
第一个信号 x 连接到第一个端口 a。第二个信号 y 连接到第二个端口 b。第三个信号 z 连接到第三个端口 c。
每个端口传入一个信号。Verilog 也接受较少的信号,甚至接受空括号,但每个没有信号的端口都会保持未连接状态,不会连接到设计中的任何内容。传入的信号数量多于模块的端口数量会导致错误。
多个实例
你可以创建同一个模块的多个副本:
module top;
wire out1, out2;
wire sig1, sig2, sig3, sig4;
and_gate gate1 (sig1, sig2, out1);
and_gate gate2 (sig3, sig4, out2);
endmodule每个实例都有自己的名称(gate1、gate2)和连接。它们独立工作。
实例化时会发生什么
- 会创建一份硬件副本
- 每个实例都有自己的一组信号
- 各实例并行运行(同时运行)
- 你传递的信号决定实例如何与设计的其余部分连接
实例化规则
| 规则 | 原因 |
|---|---|
| 实例名称必须唯一 | 用于区分不同副本 |
| 模块名称必须存在 | 必须在其他位置定义 |
| 每个端口传入一个信号 | 没有信号的端口会保持未连接状态,信号数量多于端口数量则会报错 |
| 连接顺序必须与端口顺序一致 | 第一个信号连接到第一个端口,以此类推 |
挑战
通过实例化 or_gate 模块来完成代码。
操作步骤:
- 使用实例名称
or1实例化or_gate - 按正确顺序传递信号:
input_a、input_b、output_y
亲手试试
module or_gate (
input in1,
input in2,
output result
);
assign result = in1 | in2;
endmodule
module top (
input input_a,
input input_b,
output output_y
);
// TODO:实例化 or_gate,命名为 or1
// 按顺序传入信号:input_a, input_b, output_y
// 不要使用 .port(signal) 语法
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器