Verilog结构建模中端口的由浅入深培训讲解,适合从初学者到工程实践者逐步理解使用 Verilog 的结构化设计思想中的“端口声明与连接”。
Verilog 的三种建模方式包括:
其中:
✅结构建模:更接近电路原理图的写法,将电路划分为多个子模块,通过 端口连接与模块例化,搭建起层级化的设计体系,广泛用于 模块复用与系统集成。
类型 | 说明 |
---|---|
input |
输入端口,接收来自外部的信号 |
output |
输出端口,将信号送出模块外部 |
inout |
双向端口,一般用于总线或三态信号 |
注意:在结构建模中,端口声明的方向和位宽都必须准确匹配。
module my_module (
input wire clk,
input wire rst,
input wire [7:0] a,
output wire [7:0] y
);
module my_module (clk, rst, a, y);
input wire clk;
input wire rst;
input [7:0] a;
output [7:0] y;
结构建模通过模块调用(例化)将多个子模块连接起来:
sub_module u1 (a, b, y); // 按顺序:input a, input b, output y
sub_module u1 (
.a(a_sig),
.b(b_sig),
.y(y_sig)
);
命名连接更清晰,减少端口错接风险,尤其在端口数量多时优势明显。
module adder (
input [3:0] a,
input [3:0] b,
output [4:0] sum
);
assign sum = a + b;
endmodule
module top (
input [3:0] in1,
input [3:0] in2,
input [3:0] in3,
output [4:0] sum1,
output [4:0] sum2
);
// 调用第一个加法器
adder u_adder1 (
.a(in1),
.b(in2),
.sum(sum1)
);
// 调用第二个加法器
adder u_adder2 (
.a(in2),
.b(in3),
.sum(sum2)
);
endmodule
项目 | 建议 / 注意 |
---|---|
命名 | 使用统一前缀,如 u_xxx 表示模块例化 |
端口连接 | 推荐 命名连接方式,提高可读性 |
多级结构 | 支持嵌套结构建模,推荐 自顶向下建模 |
多位端口 | 输入输出端口支持 [N:0] 位宽 |
双向端口 inout |
实际应用需配合三态缓冲器(如IO PAD) |
端口默认值 | 不允许声明中赋初值,必须在 assign 或 always 中赋值 |
多驱动信号 | 注意输出口不能被多个模块驱动(防止冲突) |
在大型 FPGA 工程中,结构建模用于以下场景:
场景 | 说明 |
---|---|
IP复用 | 将 IP 核包装为模块,统一调用 |
AXI 总线系统构建 | AXI Master/Slave 用结构建模集成 |
图像流水线设计 | 结构建模逐层连接 Gamma、滤波、裁剪模块等 |
SoC 系统设计 | 结构建模将软核CPU、外设、DMA 统一整合 |
结构建模的核心是 模块化、可重用、可维护。掌握端口的使用方法,不仅是初学 Verilog 的基础,更是构建层级复杂 SoC 和图像系统的必备能力。