在模块和实例引用时,可以通过参数传递改变在被引用模块或实例中已经定义的参数。
module exam_prj #(parameter WIDTH=8)//此处的参数WIDTH表示只在端口设置时使用
//端口内的参数只能在这使用
(
input [WIDTH-1:0] dataa,//[WIDTH-1:0]
input [WIDTH-1:0] datab,
output reg [WIDTH:0] result
);
parameter Conuter = 4'd111;//用于代码部分的参数
第一个WIDTH表示只在端口设置时使用,后面的Conuter是对于模块内部的使用。
module adder_16(sum,a,b);
parameter time_delay=5,time_count=10;
......
endmodule
adder_16 #(4,8) AD1(sum1,a1,b1); //传入参数之后time_delay=4,time_count=8
可以在后面调用模块时重新定义参数的大小
例如:
module buzzer#(parameter CLK_PRE = 50_000_000 , TIME_300MS = 20_000_000)(
input clk,
input rst_n,
output reg beep
);
//模块调用的格式
buzzer#(.CLK_FRE(5000),.TIME_300MS(1500)) u_buzzer(
.clk (tb_clk ) ,
.rst_n (tb_rst_n ) ,
.beep (tb_beep )
);
module counter#(parameter TIME_1S = 50_000_000)( //计时模块 时分秒
input clk ,
input rst_n ,
output [16:0] dout //输出时分秒
);
module seg_driver#(parameter TIME_20US = 1000)(
input clk ,
input rst_n ,
input [16:0] din , //计时间导入进来的值
output reg [7:0] dig , // 段选
output reg [5:0] sel //片选
);
//TOP模块
module CLOCK#(parameter TIME_1S = 50_000_000,TIME_20US = 1000)(
input clk ,
input rst_n ,
output [5:0] sel ,
output [7:0] dig
);
counter#(.TIME_1S(TIME_1S)) u_counter( //引用模块
.clk (clk ) ,
.rst_n (rst_n ) ,
.dout (dout )
);
seg_driver#(.TIME_20US(TIME_20US)) u_seg_driver( //引用模块
.clk (clk ) ,
.rst_n (rst_n ) ,
.din (dout ) ,
.dig (dig ) ,
.sel (sel )
);