FPGA基础 -- Verilog 结构建模之端口

Verilog结构建模中端口的由浅入深培训讲解,适合从初学者到工程实践者逐步理解使用 Verilog 的结构化设计思想中的“端口声明与连接”。


一、什么是结构建模?

Verilog 的三种建模方式包括:

  1. 行为建模(Behavioral Modeling)
  2. 数据流建模(Dataflow Modeling)
  3. 结构建模(Structural Modeling)

其中:

结构建模:更接近电路原理图的写法,将电路划分为多个子模块,通过 端口连接与模块例化,搭建起层级化的设计体系,广泛用于 模块复用与系统集成


二、Verilog结构建模的端口基础

1. 端口的三种类型

类型 说明
input 输入端口,接收来自外部的信号
output 输出端口,将信号送出模块外部
inout 双向端口,一般用于总线或三态信号

注意:在结构建模中,端口声明的方向位宽都必须准确匹配。

2. 端口语法(两种风格)

✅ ANSI 风格(推荐,Verilog-2001后引入):
module my_module (
    input  wire clk,
    input  wire rst,
    input  wire [7:0] a,
    output wire [7:0] y
);
⛔ 非 ANSI 风格(老写法,不推荐):
module my_module (clk, rst, a, y);
input wire clk;
input wire rst;
input [7:0] a;
output [7:0] y;

三、结构建模中的端口连接(模块例化)

结构建模通过模块调用(例化)将多个子模块连接起来:

✅ 格式1:位置连接(positional connection)

sub_module u1 (a, b, y);  // 按顺序:input a, input b, output y

✅ 格式2:命名连接(named connection)【推荐】

sub_module u1 (
    .a(a_sig),
    .b(b_sig),
    .y(y_sig)
);

命名连接更清晰,减少端口错接风险,尤其在端口数量多时优势明显。


四、实际例子(加法器系统结构建模)

1. 子模块:加法器

module adder (
    input  [3:0] a,
    input  [3:0] b,
    output [4:0] sum
);
assign sum = a + b;
endmodule

2. 顶层模块:结构建模调用多个子模块

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 和图像系统的必备能力。

你可能感兴趣的:(FPGA基础,fpga开发)