FPGA开发:模块 × 实例化

模块的结构

对于C语言,其基本单元为函数。与此类似,Verilog的基本设计单元称之为"模块 "(block)。对于整个项目的设计思想就是模块套模块

一个模块由两个部分组成:一部分描述接口,一部分描述逻辑功能。

每个Verilog模块包含4个部分:端口定义、IO说明、内部信号声明、功能定义。且位于moduleendmodule之间,如下:

cpp 复制代码
module block(a,b,c);
    input a,b;        //模块的输入,不需要规定类型
    output wire c;    //模块的输出,一定要规定类型

    wire d;        //定义内部信号

    assign d=a|b;    //组合逻辑输出
    assign c=d?a:b;    //组合逻辑输出
endmodule

1、模块名及端口

模块的端口声明了模块的输入输出口,相当于C语言函数的参数和返回值。格式如下:

  • module 模块名(端口名1,端口名2,...,端口名n);

如果将模块看作一个芯片,那么模块名 就相当于芯片的名字(例如STM32F103C8T6),端口定义 就相当于确定了这个芯片有哪些端口(引脚),而下面的IO声明就相当于规定引脚是输入还是输出。


2、IO声明

模块的端口可以是输入端口输出端口双向端口

对于输入端口:

input 信号位宽-1:0 端口名1;

input 信号位宽-1:0 端口名2;

......

input 信号位宽-1:0 端口名n;

对于输出端口:

output 信号位宽-1:0 端口名1;

output 信号位宽-1:0 端口名2;

......

output 信号位宽-1:0 端口名n;

对于双向端口:

inout 信号位宽-1:0 端口名1;

inout 信号位宽-1:0 端口名2;

......

inout 信号位宽-1:0 端口名n;

**【注意】**位宽可省略不写,此时就默认其位宽为1位。

【注意】对于信号位宽,N位宽 就是指对应的端口由N根引脚组成。


3、内部信号声明

通常是声明wirereg型的变量。

reg 位宽-1:0 R变量1,...,R变量n;

wire 位宽-1:0 W变量1,...,W变量n;


模块的实例化

模块实例化是将一个模块作为组件使用在另一个模块中。这类似于在编程中在A函数里调用一个B函数。通过实例化,可以实现将复杂的设计按功能分解为更小的、可复用的一个个模块。

实例化有以下两种方法:

1、端口名重映射

假设我们有两个模块:一个是已经定义好的A模块,另一个是B模块,如下面的代码所示,B模块实例化了A模块。

  • A模块定义
cpp 复制代码
module A(
    input wire [31:0] int1;
    input wire [31:0] int2;
    output wire [31:0] out;
);
    assign out = int1 + int2;
endmodule
  • B模块定义
cpp 复制代码
module B(
    input wire [31:0] a;
    input wire [31:0] b;
    output wire [31:0] sum;
);
    
endmodule
  • 实例化A模块
cpp 复制代码
A u_A (
    .int1(a),    // 将B模块的输入 a 连接到子模块A的 int1 端口
    .int2(b),    // 将B模块的输入 b 连接到子模块A的 int2 端口
    .out(sum)   // 将子模块A的输出 out 连接到B模块的输出 sum
);

在B模块中,我们实例化了A模块,并且对这个实例取了一个名字**"u_A"**。实例化之后,通过端口映射,将B模块的端口 a、b 和 sum 分别连接到子模块B的端口 int1、int2 和 out。


2、位置映射

cpp 复制代码
module B(
    input wire [31:0] a,
    input wire [31:0] b,
    output wire [31:0] sum
);
    // 实例化 A 模块,使用位置映射
    A u_A (a, b, sum);  // 依次将 a, b 和 sum 连接到子模块A的 in1, in2 和 out
endmodule

**【注意】**使用位置映射时,要特别注意端口的顺序必须与子模块的端口定义顺序一致,否则可能会导致错误的连接。


相关推荐
坏孩子的诺亚方舟6 天前
FPGA系统架构设计实践15_高云Arora V系列时钟体系
fpga开发·系统架构
FPGA小徐7 天前
入门 CNN 结构全解析|从流程图理论到 FPGA Verilog 硬件实现(含习题带讲解)
fpga开发
FPGA小徐7 天前
FPGA 数字信号处理:并行 FIR 与串行滤波器设计原理、对比与完整 Verilog 实现
fpga开发
Saniffer_SH7 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
zlinear数据采集卡8 天前
双核架构深度解析:ARM+FPGA如何让数据采集卡实现500Ksps高性能?
arm开发·fpga开发·架构
9527华安8 天前
FPGA实现GTH Transceivers Wizard传输2路视频,基于aurora 8b10b编解码架构,提供4套工程源码和技术支持
fpga开发·gth·aurora 8b10b·transceivers
FPGA小徐9 天前
FPGA 数字信号处理(二):并行 FIR 滤波器的 Verilog 全流程设计与实现
fpga开发
国科安芯9 天前
基于AS32S601ZIT2型抗辐照MCU的商业航天卫星姿态确定与控制系统研究
单片机·嵌入式硬件·安全·fpga开发·架构·risc-v
ALINX技术博客9 天前
【黑金云课堂】FPGA技术教程FPGA基础:I2C 总线通信技术
fpga开发·i2c
Hello-FPGA9 天前
Xilinx KU040 FPGA Camera Link 图像采集
c++·fpga开发