2017-03-27 13 views
0

私は4つのモジュールをインスタンス化しました。呼び出された第3のモジュールは入力を受けず、ifブロックの入力がゼロになりますが、モジュールが別々に実行され、このメインモジュールから呼び出されていないときはうまく動作します。誰でも入力が得られない理由を教えてもらえますか?
は親切複数モジュールのインスタンス化宣言と関数のVerilog

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

division1入力nのみ最初のクロックでサンプリングされた第3のモジュールを通過すると、1つの分割後に他の操作が行われない完了する。この入力は、同じクロックによって更新されるように見えるrxから派生したものです。 division1でサンプリングされるまでにnが期待値になることはほとんどありません。

私はあなたのコードの意図を知らない。 1つの方法は、flagを2の代わりに0に戻し、iをリセットして、再び分割が行われるようにすることです。別のオプションは、後のクロックエッジで除算を開始することです。私はあなたが最初のオプションを望んでいると思っています。

また、ブロックされていない非ブロック割り当て(<=)でシーケンシャルロジックを割り当てる必要があります(=)。

+0

したがって、 "="ではなく、配分モジュールで "<="を使用する必要がありますか? –

+0

後端からどのように分割できますか? –

+0

いつ別の入力信号を使用して、いつ起動するのかを指示できます。ブロッキングとノンブロッキングの割り当てをどこで、なぜ使用するのかについて、多くのオンラインリソースが説明しています。このような論文があります:http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf – Greg