当前位置: 首页 > article >正文

Verilog语法之模块与端口

摘要:本文主要介绍了Verilog中如何设计模块与定义端口,以及如何实例化模块并调用模块,通过端口将不同的模块连接起来,构成自己的设计。

1.模块modeule

        模块module是Verilog基本的较高层级的描述单位,其后的内容用来描述某个设计的功能或结构及其与其他某块通信的外部端口。module后接用户自定义的模块名,模块名后接括号,括号中是端口列表,模块以module开始,以endmodule结束。一个工程中通常包含多个设计模块,模块之间通过“例化”实现接口的数据交互。多个模块是的设计具备一定的层级结构,处于最上层的模块称为“顶层模块”,顶层模块引出的端口将会连接到FPGA器件的物理引脚上,即连接到FPGA外部的芯片;其他的模块将会直接或简介地与顶层模块实现连接,实现数据交互。下层魔窟哎通常称之为其上层模块的子模块。

语法结构如下:

2.端口port

        端口port用于设计魔窟哎对外的接口信号的描述,不同模块之间通过port的连接实现数据交互。整个设计工程的顶层魔窟哎通过port定义FPGA器件与外部芯片的接口信号。FPGA设计中的每个魔窟哎通常必须有port定义,只有对设计进行仿真验证的测试脚本的顶层模块可以无须port定义。

        port主要有输入端口input、输出端口output和输入输出双向端口inout三种类型。通常在一个module开始时就对port进行申明,port申明时可以同时指定数据类型,如wire或reg类型。input和inout端口不能定义数据类型为reg。具体的代码示例如下:

// 模块名称为logic_and
// 模块定义在模块名称后的()内
module logic_and(i_clk, i_d1, i_d2, o_d);
    // 端口类型申明
    input i_clk;
    input i_d1, i_d2;
    output reg o_d;
    
    always @(posedge i_clk) begin
        o_d <= i_d1 & i_d2;
    end
endmodule

// 模块名称为vlg_design
// 端口以及端口类型同时定义在模块名称后的()内
module vlg_design(
    input i_clk,
    input [3:0] i_d,
    output [1:0] o_d);
    
    // 以下两次例化同一个子模块uut_logic_and_2,但是名称定义必须不同
    // 这种方式可以实现模块的复用
    // 例化子模块logic_and,名称为uut_logic_and-1
    // 端口中按顺序定义和子模块连接的信号
    logic_and uut_logic_and_1(i_clk, i_d[0], i_d[1], o_d[0]);
    
    // 例化子模块logic_and,名称为uut_logic_and_2
    // 端口中按照一一映射的方式连接子模块中的信号
    // .后的信号名与子模块中的信号一致,()内的信号名与本模块的信号名一致
    logic_and uut_logic_and_2(
        .i_clk(i_clk),
        .i_d1(i_d[2]),
        .i_d2(i_d[3]),
        .o_d(o_d[1])
    );
endmodule

         测试脚本中的端口定义,通常将被例化模块的input或inout端口申明为reg类型,将output端口申明为wire数据类型。具体的代码示例如下:

module vlg_testbench();
    reg clk;
    reg [3:0] i_d;
    wire [1:0] o_d;

    initial begin
        clk = 0;
        i_d = 4'd0;
    end

    always #10 clk = !clk;

    always @(posedge clk) begin
        i_d <= i_d + 1;
    end

    vlg_design uut_vlg_design(
        .i_clk(clk),
        .i_d(i_d),
        .o_d(o_d)
    );
endmodule

End!


http://www.kler.cn/a/468667.html

相关文章:

  • 基于transformer的目标检测:DETR
  • (六)优化 ChatGPT 交互:任务式 Prompt 的力量
  • Docker:安装 XXL-JOB 分布式调度任务的技术指南
  • 66.基于SpringBoot + Vue实现的前后端分离-律师事务所案件管理系统(项目 + 论文)
  • 3.final关键字
  • 封装/前线修饰符/Idea项目结构/package/impore
  • 基于LightGBM的集成学习算法
  • sniff2sipp: 把 pcap 处理成 sipp.xml
  • 深入探讨服务器虚拟化:架构、技术与应用
  • 在 macOS 中,设置自动将文件夹排在最前
  • 小程序组件 —— 28 组件案例 - 推荐商品区域 - 实现结构样式
  • React 如何进行路由变化监听
  • qt-C++笔记之动画框架(Qt Animation Framework)入门
  • 【Unity报错】error Cs0103: The name ‘keyCode‘ does not exist in the current context
  • 《机器学习》——决策树
  • 【Leetcode 每日一题】2241. 设计一个 ATM 机器
  • 12.3【hardware][day3]
  • springboot优先级和ThreadLocal
  • Docker, Moby, Containers
  • Tailwind CSS 实战:深色模式设计与实现
  • Coroutine 基础八 —— Flow 操作符(二)
  • CPT203 Software Engineering 软件工程 Pt.3 系统建模(中英双语)
  • 五月天TV 1.1.0 | 频道丰富的娱乐向电视直播应用
  • 使用大语言模型的生物嵌入,后续应该会有很多类似文章出来!
  • VSCode 在Windows下开发时使用Cmake Tools时输出Log乱码以及CPP文件乱码的终极解决方案
  • 信息系统管理师试题-人力资源