我已经实例化了4个模块。调用的第三个模块没有输入,if块输入变为零,但是当模块单独执行而没有从该主模块调用时,它运行正常。任何人都可以告诉我为什么它没有得到输入?
请通过第三个模块
module one(u,v,p,x,x2,rx,clk,rem);
input [15:0]u,v,p;
input clk;
output wire [15:0]rx,rem;
output wire [31:0]x,x2;
rcalci inst(.p(p),.clk1(clk),.r(rx));
vedic_16x16 inst2(.a(u),.b(rx),.c(x));
division1 inst3(.n(x),.d(p),.clk2(clk),.r(rem));
vedic_16x16 inst4(.a(v),.b(rx),.c(x2));
endmodule
module division1(n,d,clk2,r);
input [31:0]n;
input [15:0]d;
output [15:0]r;
reg [15:0]r,q;
reg [15:0]n1,n2;
input clk2;
integer i=0;
reg [1:0]flag;
initial
flag=0;
always @(posedge clk2)
begin
if(flag==0)
begin
n1[15:0]=n[31:16];
n2[15:0]=n[15:0];
flag=1;
end
if(flag==1)
begin
r=n2[15:0];
if(i<16)
begin
n1[15:0]={n1[14:0],n2[15]};
n2=n2<<1;
if(n1>=d)
begin
n1=n1-d;
n2[0]=1;
//q=n2;
end
end
i=i+1;
if(i>=16)
flag=2;
end
end
endmodule
答案 0 :(得分:0)
division1
输入n
仅在第一个时钟上采样,一旦完成一个除法,则不执行其他操作。此输入源自rx
,它似乎由同一时钟更新。 n
在division1
采样时,flag
极不可能具有预期值。
我不知道您的代码的意图。一种选择是将i
设置为0而不是2并重置<=
,以便再次进行除法。另一种选择是在后一个时钟边缘开始除法。我猜你想要第一个选择。
此外,应为顺序逻辑分配非阻塞分配(=
)而不阻塞(@FirstTable
)。