FPGA基础 -- 什么是 Verilog 的模块(`module`)

发布于:2025-06-13 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、什么是 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) begin
    if (rst)
        q <= 1'b0;
    else
        q <= d;
end

endmodule

说明:

  • always 块建模时序逻辑(posedge clk)
  • qreg 类型 → 可以在过程块中赋值

✅ 示例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、驱动器、监控器、断言等

六、模块设计建议(工程实战)

  1. 模块只做一件事,职责清晰(单一职责)
  2. 端口宽度参数化,提升模块复用性
  3. 避免组合逻辑中使用 reg,使代码可综合
  4. 子模块之间通过明确的端口接口通信,避免全局变量
  5. 所有时序逻辑使用同步时钟边沿描述,避免异步时序错误
  6. 注意“组合逻辑漏赋值”问题,需使用 defaultcase default

七、小结

模块元素 描述
module 定义逻辑功能的实体单元
input/output 声明端口
assign 组合逻辑建模
always 时序或行为逻辑建模
parameter 提高模块通用性
实例化 将子模块嵌套到顶层或中间模块中

网站公告

今日签到

点亮在社区的每一天
去签到