明德扬点拨FPGA高手进阶 第五章 verilog快速掌握 5.5 模块例化.pdf
文本预览下载声明
5.5 模块例化
5.5.1 例化的概念
在做模块划分时,通常会出现这种情形:某个大的模块中包含了一个或多个功能
子模块。verilog 是通过模块调用或称为模块实例化的方式来实现这些子模块与高层模
块的连接的。
完成一个模块的设计,该模块就可以被其他代码通过例化的方式使用。例如,假
设我们完成一个 USB 模块的设计,该模块实现了 USB 接口功能,并定义好了输入和输
出接口。
如果其他代码需要使用到 USB 接口的功能,例如模块 1 ,它需要用到两个USB 接
口,则可以对USB 模块例化两份,从而模块 1 就包含了两个 USB 接口。
同样的道理,模块 1 也可以被其他代码例化。假设顶模块包括了模块 1 的功能和
其他模块通过,则可以通过例化模块 1 ,从而使用该模块。
通过例化,就可以通过一个个简单的小模块,搭建起复杂、功能强大的系统。
注意,例化时,电路上是有真正的电路对应的。例化多少份,就有多少个对应的
电路。例如上图中,对 USB 模块例化了两份,那么就表示有两套 USB 硬件电路。
5.5.2 例化方法
一个模块的设计文件,外界可以看到的是其模块名和输入输出接口。如下图所
示。模块名为 uart ,其输入输出接口分别有clk ,rst_n ,vld_n 等信号。
其他模块例化该模块时,只按需要按如下方式例化即可。
1 是指被例化模块的模块名,uart 就是被例化的模块名;
2 是例化名,相当于标识。例如当例化多个相同模块时,可以通过例化名来识别哪
一个例化。
3.是被调用模块的输入输出接口。注意例化时,前面有“.”号。
4.括号内本模块的信号名称。如上图中,将本模块的 clk_100m 信号连接到被例化
模块的 clk 接口;将本模块信号bt_data_out_vld 连接到被例化模块的 vld_in 接口等。
5.5.3 参数传递
在例化模块时,可以不修改被例化模块代码,就可以改变被例化模块内部的参数。
而且例化之间不受影响。
例如假充 uart 模块内部定义了一个参数:
parameter DATA_W=8 ;
在例化时,按以下写法,就将 DATA_W 变成 16。其中“#”表示要传递参数,
“DATA_W”就是 uart 模块内部的 DATA_W 参数,其值为 8。“(16)”表示将 uart 里
DATA_W 值改为 16。
同样支持多个参数的修改,例如改为 uart #(.DATA_W(16),.DATA_LEN(8))。
注意,这里所说的传递,只是本例化模块起作用。即 u_uart 这个例化模块的
DATA_W 才变成 16。下图中,u_uart_0 里的 DATA_W 仍然为 8 ,而u_uart_1 里的
DATA_W 为 16。
5.5.4 例化举例
练习:将下面模块用 verilog 描述出来,其中 mul_module 是 5.4.3 设计的模块。
首先为该模块起一个名称,如 mul_2port ,该模块一共有clk ,rst_n ,sel_a ,
sel_b ,din_a ,din_b ,din_c ,din_d ,result_a 和 result_b 信号。因此模块名和端口列
表可以写成:
接下来是端口声明,指出端口方向和位宽。由图中可知 clk ,rst_n ,sel_a 和 sel_b
是输入信号并且是 1 位位宽;din_a 是输入信号并且是 3 位位宽;din_b 是输入信号并
且是 2 位位宽;din_c 和 din_d 是输入信号并且是 4 位位宽;result_a 是输出信号并且
是 7 位位宽;result_b 是输出信号并且是 6 位位宽。因此端口声明可写成:
接下来是描述出图中的电路,可以将电路划分成以下几部分,并且将未命名的信
号命名(result_a_tmp ,result_b_tmp ,sel_dout 和 sel )。
第 1 部分是 7 位的 D 触发器,时钟为 clk ,复位为rst_n ,输入是result_a_tmp ,
输出为 result_a。因此该电路代码为:
第 2 部分是 6 位的 D 触发器,时钟为 clk ,复位为rst_n ,输入是result_b_tmp ,
输出为 result_b。因此该电路代码为:
第 3 部分是例化 mul_module ,该例化名为mul_4_3。需要注意,由于输入位宽改
变,例化时就要传递合适的参
显示全部