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 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

python urllib模块使用操作方法

《pythonurllib模块使用操作方法》Python提供了多个库用于处理URL,常用的有urllib、requests和urlparse(Python3中为urllib.parse),下面是这些... 目录URL 处理库urllib 模块requests 库urlparse 和 urljoin编码和解码

Java Stream流以及常用方法操作实例

《JavaStream流以及常用方法操作实例》Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,:本文主要介绍JavaStream流以及常用方法... 目录一、Stream流是什么?二、stream的操作2.1、stream流创建2.2、stream的使用2.

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

springboot项目中集成shiro+jwt完整实例代码

《springboot项目中集成shiro+jwt完整实例代码》本文详细介绍如何在项目中集成Shiro和JWT,实现用户登录校验、token携带及接口权限管理,涉及自定义Realm、ModularRe... 目录简介目的需要的jar集成过程1.配置shiro2.创建自定义Realm2.1 LoginReal