verilog模块调用语句问题

module sine_reader(step_size,clk,generate_next,reset,sample_out,new_sample_ready);
input clk;
input generate_next;
input reset;
input [19:0] step_size;

output [15:0] sample_out;
output new_sample_ready;

wire [21:0] raw_addr;
wire [21:0] sum1;
wire [15:0] raw_data;
wire [15:0] sample;
wire [9:0] rom_addr;
//定义传输线sum1
assign sum1={2'b00+step_size}+raw_addr;
//调用DFF
D_FFRE #(22)dffre22(.d(sum1),.clk(clk),.r(reset),.en(generate_next),.q(raw_addr));
//定义rom_addr的值 地址处理
assignrom_addr=raw_addr[20]?((raw_addr[20:10]==1024)?1023:(~raw_addr[19:10]+1)):raw_addr[19:10];
//调用sine_rom函数
sine_romrom_inst(.clk(clk),.dout(raw_data),.addr(rom_addr));
//定义sample的值 数据处理
assignsample=raw_addr[21]?(~raw_data[15:0]+1):raw_data[15:0];
//调用DFFRE
D_FFRE #(22)dffre21(.d(sample),.clk(clk),.en(generate_next),.q(sample_out));
//调用DFF
D_FF #(1)dff(.d(generate_next),.clk(clk),.q(new_sample_ready));

endmodule

这边调用函数中#(XX)是什么意思?求解!
DFFRE的代码
module D_FFRE
(
d,
en,
r,
clk,
q
);
parameter WIDTH = 1;
input en;
input r;
input clk;
input [WIDTH-1:0] d;
output [WIDTH-1:0] q;
reg [WIDTH-1:0] q;
always @ (posedge clk)
if ( r )
q <= {WIDTH{1'b0}};
else if (en)
q <= d;
else q <= q;
endmodule

给实例化的模块里面的参数重新赋值,相当于defparam追问

有点不太明白哎 能再详细点吗 给哪些参数重新赋值?

追答

算问到点子上了,这种写法的问题就在于可读性差,必须看你的D_FFRE模块里面的定义。
D_FFRE #(22)dffre21(.d(sample),.clk(clk),.en(generate_next),.q(sample_out));

可读性好的写法应该是
D_FFRE dffre21(.d(sample),.clk(clk),.en(generate_next),.q(sample_out));
defparam dffre21.参数名 = 22;

追问

能给个Q吗 详细问你下~ 另外DFFRE的代码已经上传 帮忙看下吧
我查了下资料大概理解成 DFFRE模块中有parameter WIDTH = 1; 这个#(22)是把模块内部的这个常量改变成22是吧?

另外dffre21 这个21是什么意思的?

追答

楼下其实说的比较清楚了,你的理解也是对的。这里参数含义是位宽,默认是1,实例化的时候改成22。至于21是因为前面已经有一个实例叫22了,如果是我的话这两个实例会分别命名为dffre_sample22和dffre_addr22。

温馨提示:内容为网友见解,仅供参考
无其他回答

请各位高手指点迷津!!小弟初学Verilog,想学一学模块调用,自编了一段小...
1、进程里面不能调用模块,只能调用函数或者任务,然而在clk模块里含有always等,所以也无法写成任务或者函数;2、在try这个模块里,q如果定义成reg型的,就不能用作例化模块的信号(clk CK2(.clk_in(clk_in),.q(q)); ),因为主模块的接口信号必须是wire型的,但如果改成wire型的话非阻塞赋值语句...

verilog中,在module里想调用别的module时出现问题说Array x0 Needs a...
你可能的原因是你的输出设置的是reg型,你调用的时候就会报错,其实可以这样说,你的top层是一个接口层,top里面的模块与顶层相连只能是wire型,也就是定义与top相连接的走线,还可能的原因是你的模块和你在这里声明的调用语句发生冲突,你的模块和你在这里申明的引脚数目不符合或者其他,可以把你的err...

verilog中,对一个模块的多次调用,比如前一个调用还没有结束的情况下,就...
Verilog中的模块都是电路,只能称之为例化,不能称之为调用。 如果你需要重复例化多个同样的模块,可以使用generate for语句:generate genvar i;for (i=0;i<N;i=i+1)begin : inst_gen ...end endgenerate

verilog中在同一模块中调用其他多个模块,模块是顺序执行的吗
模块在语言形式上是以关键词module开始,以关键词endmodule结束的一段程序。在做模块划分时,通常会出现这种情形:某个大的模块中包含了一个或多个功能子模块。verilog是通过模块调用或称为模块实例化的方式来实现这些子模块与高层模块的连接的。按照每个模块并行工作的思路来调整设计。这给软件开发人员入门...

Verilog 一个模块调用另一个模块的参数,用哪个命令?
引用模块时,可以运用参数编写的模块的灵活引用。但是不能互相调用参数 module Decode(A,F);parameter Width=1,Polarity=1;……endmodule 引用时:module Top;wire [3:0] A4;wire [4:0] A5;wire [15:0] F16;wire [31:0] F32;Decode u_D1(A4,F16); \/\/u_D1使用默认参数,Widt...

verilog 中顶层文件引用其他模块出现错误,怎么修改?
可以将reg [7:0] hou_n,min_n,sec_n,hou_a,min_a;中的sec_n改为wire[7:0]sec_n,其他变量也可能会出现这个问题,我没有细看,但是粗看一下有很多问题。这里给你指出一个,在count_60模块你应该是想定义60的计数器,但是其中8‘h59应该是表示16进制的59,换算成十进制的值应该是89,...

看一下verilog中 模块实例化问题
这个例化调用放在always语句块的外面!不能这样直接调用的!你要有电路的思想,一个例化调用就相当于一个电路,你用if语句,有时候要综合出这个电路有时候又不要综合出这个电路了,这个不是让人家软件为难吗!你要这样,综合出来时必须的,至于用不用,要看你有没有信号给它,它的输出有没有引回来!

verilog HDL中能否调用子程序
首先明确一个问题,verilog是硬件语言,不存在程序这样说法,程序是软件的叫法,这里交代吗。至于调用的问题,是绝对没问题的,一个顶层模块可以包含任意个底层模块这是没问题的,只需要一个例化语句。如果还有什么问题可以继续追问

verilog for循环中模块实例化的问题
你把一个模块同名的例化10遍,不出错才怪 如果你真的是要例化十遍,用generate语句

Verilog程序中如何调用子模块?
verilog在调用模块的时候(也称模块实例化),信号端口可以通过位置或名称关联,其形式如下面的例子:\\x0d\\x0a\\x0d\\x0amodule and (C,A,B);\\x0d\\x0ainput A,B;\\x0d\\x0aoutput C;\\x0d\\x0a... \\x0d\\x0aendmodule\\x0d\\x0a\\x0d\\x0aand A1 (T3, A1, B 1); \/\/...

相似回答