FPGA学习-Verilog例化说明

FPGA学习-Verilog例化说明Verilog 例化说明 1 什么是模块例化 为什么要例化 模块例化可以理解成模块调用 对于一个 FPGA 工程 通常是由一个顶层模块与多个功能子模块组成 为了实现顶层模块与子模块的连接 需要进行模块间的例化 或说是调用

欢迎大家来到IT世界,在知识的湖畔探索吧!

Verilog例化说明

1.什么是模块例化?为什么要例化?

模块例化可以理解成模块调用。对于一个FPGA工程,通常是由一个顶层模块与多个功能子模块组成,为了实现顶层模块与子模块的连接,需要进行模块间的例化(或说是调用)。在一个FPGA项目工程中,其输入、输出端口命名通常在设计前期就已确定下来,但会存在一些中间变量,一个工程可能会让不同的工程师在不同的时间段内共同完成,不同的人对于这些变量的命名会有所不同,故例化很有必要。

2.实例说明例化方法

实例:静态数码管显示
根据功能将 FPGA 顶层例化了以下两个功能子模块:计时模(time_count)和数码管静态显示模块(seg_led_static),如下图所示:

FPGA学习-Verilog例化说明


1.计时模块(仅显示端口及参数)

module time_count( input clk , // 时钟信号 input rst_n , // 复位信号 output reg flag // 一个时钟周期的脉冲信号 ); //parameter define parameter MAX_NUM = 25000_000; // 计数器最大计数值 ......(省略功能代码) endmodule 

欢迎大家来到IT世界,在知识的湖畔探索吧!

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 2.数码管静态显示模块(仅显示端口及参数)

    欢迎大家来到IT世界,在知识的湖畔探索吧!module seg_led_static ( input clk , // 时钟信号 input rst_n , // 复位信号(低有效) input add_flag, // 数码管变化的通知信号 output reg [5:0] sel , // 数码管位选 output reg [7:0] seg_led // 数码管段选 ); ......(省略功能代码) endmodule 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 3.顶层模块(着重看下面“例化计时模块”、“例化数码管静态显示模块”)

    module seg_led_static_top ( input sys_clk , // 系统时钟 input sys_rst_n, // 系统复位信号(低有效) output [5:0] sel , // 数码管位选 output [7:0] seg_led // 数码管段选 ); //parameter define parameter TIME_SHOW = 25'd25000_000; // 数码管变化的时间间隔0.5s //wire define wire add_flag; // 数码管变化的通知信号 //例化计时模块 time_count #( //参数例化使用’#‘ .MAX_NUM (TIME_SHOW) ) u_time_count( .clk (sys_clk ), .rst_n (sys_rst_n), .flag (add_flag ) ); //例化数码管静态显示模块 seg_led_static u_seg_led_static ( .clk (sys_clk ), .rst_n (sys_rst_n), .add_flag (add_flag ), .sel (sel ), .seg_led (seg_led ) ); endmodule 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 上面给出了顶层模块的完整代码,子模块只有模块的端口和参数定义的代码。这是因为顶层模块对子模块做例化时,只需要知道子模块的端口信号名,而不用关心子模块内部具体是如何实现的。

    如果子模块内部使用parameter 定义了一些参数,Verilog 也支持对参数的例化(也叫参数的传递),即顶层模块可以通过例化参数来修改子模块内定义的参数。

    下图为模块例化。

    FPGA学习-Verilog例化说明


    上图右侧是例化的数码管静态显示模块,子模块名是指被例化模块的模块名,而例化模块名相当于标识,当例化多个相同模块时,可以通过例化名来识别哪一个例化,我们一般命名为“u_”+“子模块名”。信号列表中“.”之后的信号是数码管静态显示模块定义的端口信号,括号内的信号则是顶层模块声明的信号,这样就将顶层模块的信号与子模块的信号一一对应起来,同时需要注意信号的位宽要保持一致。

    接下来再来介绍一下参数的例化,参数的例化是在模块例化的基础上,增加了对参数的信号定义。

    下图为参数例化:

    FPGA学习-Verilog例化说明

    在对参数进行例化时,在模块名的后面加上“#”,表示后面跟着的是参数列表。计时模块定义的MAX_NUM 和顶层模块的 TIME_SHOW 都是等于25000_000,当在顶层模块定义 TIME_SHOW=12500_000时,那么子模块的 MAX_NUM 的值实际上是也等于 12500_000。当然即使子模块包含参数,在做模块的例化时也可以不添加对参数的例化,这样的话,子模块的参数值等于该模块内部实际定义的值。

    值得一提的是,Verilog 语法中的localparam 代表的意思同样是参数定义,用法和 parameter 基本一致,区别在于 parameter 定义的参数可以做例化,而 localparam 定义的参数是指本地参数,上层模块不可以对localparam 定义的参数做例化。

    免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/93839.html

    (0)
    上一篇 2024年 12月 2日 下午7:45
    下一篇 2024年 12月 2日 下午8:15

    相关推荐

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注

    联系我们YX

    mu99908888

    在线咨询: 微信交谈

    邮件:itzsgw@126.com

    工作时间:时刻准备着!

    关注微信