FPGA开发:模块 × 实例化

2024-09-08 02:36
文章标签 模块 开发 实例 fpga

本文主要是介绍FPGA开发:模块 × 实例化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

模块的结构

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

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

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

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模块定义
module A(input wire [31:0] int1;input wire [31:0] int2;output wire [31:0] out;
);assign out = int1 + int2;
endmodule
  • B模块定义
module B(input wire [31:0] a;input wire [31:0] b;output wire [31:0] sum;
);endmodule
  • 实例化A模块
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、位置映射

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

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


这篇关于FPGA开发:模块 × 实例化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146866

相关文章

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

Python sys模块的使用及说明

《Pythonsys模块的使用及说明》Pythonsys模块是核心工具,用于解释器交互与运行时控制,涵盖命令行参数处理、路径修改、强制退出、I/O重定向、系统信息获取等功能,适用于脚本开发与调试,需... 目录python sys 模块详解常用功能与代码示例获取命令行参数修改模块搜索路径强制退出程序标准输入

Python pickle模块的使用指南

《Pythonpickle模块的使用指南》Pythonpickle模块用于对象序列化与反序列化,支持dump/load方法及自定义类,需注意安全风险,建议在受控环境中使用,适用于模型持久化、缓存及跨... 目录python pickle 模块详解基本序列化与反序列化直接序列化为字节流自定义对象的序列化安全注

PyQt6 键盘事件处理的实现及实例代码

《PyQt6键盘事件处理的实现及实例代码》本文主要介绍了PyQt6键盘事件处理的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录一、键盘事件处理详解1、核心事件处理器2、事件对象 QKeyEvent3、修饰键处理(1)、修饰键类

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

python pymodbus模块的具体使用

《pythonpymodbus模块的具体使用》pymodbus是一个Python实现的Modbus协议库,支持TCP和RTU通信模式,支持读写线圈、离散输入、保持寄存器等数据类型,具有一定的参考价值... 目录一、详解1、 基础概念2、核心功能3、安装与设置4、使用示例5、 高级特性6、注意事项二、代码示例

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF