FPGA基础 -- 什么是 Verilog 的模块(`module`)
一、什么是 Verilog 的模块(module
)
模块用于定义输入、输出端口和功能逻辑,它支持层级结构,即模块可以实例化子模块。
module 模块名 (端口列表
);// 信号声明// 行为或结构描述
endmodule
二、模块的组成部分
组成部分 | 说明 |
---|---|
module | 开始模块定义 |
input/output/inout | 定义端口方向,数据类型默认为 wire |
内部信号声明 | wire , reg , integer , parameter 等 |
过程语句 | assign (组合逻辑), always , initial (时序或行为描述) |
子模块实例化 | 使用 模块名 实例名(...) 实例化子模块 |
endmodule | 结束模块定义 |
三、Verilog 模块示例
✅ 示例1:简单与门模块
module and_gate (input wire a,input wire b,output wire y
);assign y = a & b;endmodule
说明:
- 使用
assign
实现组合逻辑 - 输入输出均为
wire
类型
✅ 示例2:时序逻辑模块(D触发器)
module dff (input wire clk,input wire rst,input wire d,output reg q
);always @(posedge clk or posedge rst) beginif (rst)q <= 1'b0;elseq <= d;
endendmodule
说明:
always
块建模时序逻辑(posedge clk)q
是reg
类型 → 可以在过程块中赋值
✅ 示例3:带参数的模块
module adder #(parameter WIDTH = 8
)(input wire [WIDTH-1:0] a,input wire [WIDTH-1:0] b,output wire [WIDTH-1:0] sum
);assign sum = a + b;endmodule
说明:
parameter
允许模块泛化,支持宽度自定义- 使用
#(...)
参数化模块
✅ 示例4:模块实例化
module top;wire a, b, y;// 实例化 and_gate 模块and_gate u1 (.a(a),.b(b),.y(y));endmodule
说明:
u1
是实例名,可以实例化多个相同模块.
连接形式是命名端口连接,推荐使用
四、模块间的层级结构
Verilog 模块支持层次化设计:
top
├── uart_ctrl
│ ├── baud_rate_gen
│ └── parity_check
└── memory_ctrl└── fifo
- 每层都是一个独立的
module
- 支持模块复用(Reusable IP)
五、Verilog 中常见模块类型(工程实用)
模块类型 | 功能说明 |
---|---|
数据通路模块 | 加法器、乘法器、比较器、位移器等 |
状态机模块 | 控制逻辑,如 FSM(有限状态机) |
接口模块 | UART、SPI、I2C、AXI-Lite、FIFO 控制等 |
存储模块 | 寄存器文件、RAM/ROM、双端口存储器等 |
验证模块 | Testbench、驱动器、监控器、断言等 |
六、模块设计建议(工程实战)
- 模块只做一件事,职责清晰(单一职责)
- 端口宽度参数化,提升模块复用性
- 避免组合逻辑中使用
reg
,使代码可综合 - 子模块之间通过明确的端口接口通信,避免全局变量
- 所有时序逻辑使用同步时钟边沿描述,避免异步时序错误
- 注意“组合逻辑漏赋值”问题,需使用
default
或case default
七、小结
模块元素 | 描述 |
---|---|
module | 定义逻辑功能的实体单元 |
input/output | 声明端口 |
assign | 组合逻辑建模 |
always | 时序或行为逻辑建模 |
parameter | 提高模块通用性 |
实例化 | 将子模块嵌套到顶层或中间模块中 |