FPGA基础 -- Verilog 结构建模
Verilog 的结构建模(Structural Modeling),以适用于初学者打基础、高阶用户实现模块化设计、以及用于大规模设计的系统集成。
一、Verilog 三种建模风格概述
在 Verilog 中,描述硬件系统主要有三种建模方式:
建模方式 | 描述层次 | 特点 |
---|---|---|
行为建模(Behavioral) | 算法层或行为层 | 使用 always , if , case 等结构建模逻辑功能 |
数据流建模(Dataflow) | 数据流层 | 使用连续赋值 assign 语句来描述电路的逻辑关系 |
结构建模(Structural) | 结构层 | 使用模块例化(module instantiation)来组装整个系统结构 |
➡️ 结构建模最接近实际硬件连接方式,适合做系统集成、层次化设计。
二、结构建模的核心思想
🔧 核心概念:模块例化与信号连接
结构建模就是像搭积木一样地“连接模块”,通过顶层模块将各个功能模块组合成一个系统。
比如我们有两个模块:
module and_gate (input a, b, output y);assign y = a & b;
endmodule
我们可以在顶层结构中例化它:
module top_module;wire x, y, z;and_gate u1 (.a(x), .b(y), .y(z)); // 结构建模实例endmodule
三、结构建模完整实例讲解
1️⃣ 设计目标
设计一个 1 位半加器(half-adder),它由两个基本门电路(异或门 XOR 与 与门 AND)构成:
输入 A | 输入 B | 和 Sum | 进位 Carry |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
2️⃣ 基本模块实现
XOR 门模块:
module xor_gate (input a,input b,output y
);assign y = a ^ b;
endmodule
AND 门模块:
module and_gate (input a,input b,output y
);assign y = a & b;
endmodule
3️⃣ 结构化地组合半加器
module half_adder (input a,input b,output sum,output carry
);wire xor_out, and_out;xor_gate u1 (.a(a),.b(b),.y(xor_out));and_gate u2 (.a(a),.b(b),.y(and_out));assign sum = xor_out;assign carry = and_out;
endmodule
📌说明:
u1
、u2
是实例化名;xor_gate
和and_gate
是我们提前写好的模块;assign
是顶层连接语句;
四、结构建模的进阶技巧
✅ 命名规范与层次设计
结构建模适合使用模块分层设计(Hierarchical Design):
module ALU; // 高层
module adder; // 中层
module full_adder; // 底层
✅ 支持参数化模块(parameter
)
结构建模配合参数化可以复用模块:
module mux #(parameter WIDTH = 8) (input [WIDTH-1:0] a, b,input sel,output [WIDTH-1:0] y
);assign y = sel ? b : a;
endmodule
✅ 多实例管理(结构化复用)
mux #(8) u1 (.a(a1), .b(b1), .sel(s1), .y(y1));
mux #(8) u2 (.a(a2), .b(b2), .sel(s2), .y(y2));
五、结构建模适用场景
场景 | 是否推荐结构建模 | 原因 |
---|---|---|
简单逻辑(如小FSM) | ❌ | 不如行为建模直观 |
多模块协同(如图像流水线) | ✅✅✅ | 可视化连接、清晰层次结构 |
软核 SoC 搭建(如 CPU + RAM + IO) | ✅✅✅ | 每个 IP 模块用结构方式集成 |
Verilog Testbench 验证 | ✅ | DUT 模块通常通过结构建模方式加载 |
六、小结
结构建模是:
- 通过模块例化 + 信号连接来描述硬件系统;
- 适合模块层次清晰、功能组合明确的工程;
- 是实现大规模可复用 FPGA 系统的主流方法。