2017-03-26 4 views
0

私はVerilogで非同期のFIFOを作成しようとしていましたが、割り当ての左側にオブジェクト "空"と "完全"の問題があります可変データ型です。左側のオブジェクトのVerilogコードのエラーに変数を割り当てる必要があります

トップモジュール:

module async_fifo (reset, wclock, rclock, datain, dataout, e, f); 
input [15:0] datain; 
output reg [15:0] dataout; 
//reg [15:0] mem1, mem2, mem3, mem4, mem5, mem6, mem7, mem8; 
reg [15:0] mem [7:0]; 
input reset, rclock, wclock; 
/*reg [0:2] wptr, rptr; 
initial wptr = 3'b000; 
initial rptr = 3'b000;*/ 
integer wflag = 0, rflag = 0; 
wire empty , full; 
input e,f; 
reg [0:2] wptr = 3'b000, rptr = 3'b000; 

counter c(wclock, rclock, empty, full); 
e = empty; 
f = full; 

[email protected](posedge wclock) 
    begin 
     if(f == 1'b0) 
     begin 
      e = 1'b0; 
      if (wptr < 3'b111) 
       begin 
        mem[wptr] = datain; 
        wptr = wptr + 3'b001; 
       end 

      else if(wptr == 3'b111 && wflag == 0) 
       wflag = 1; 

      else if (wflag == 1) 
       begin 
        wptr = 3'b000; 
        wflag = 0; 
       end 
     end 
    end 

[email protected](posedge rclock) 
    begin 
     if(e == 1'b0) 
     begin 
      f = 1'b0; 
      if (rptr < 3'b111) 
       begin 
        dataout = mem[rptr]; 
        rptr = rptr + 3'b001; 
       end 

      else if(rptr == 3'b111 && rflag == 0) 
       rflag = 1; 

      else if (rflag == 1) 
       begin 
        rptr = 3'b000; 
        rflag = 0; 
       end 
     end 
    end 
endmodule 

カウンタモジュール:

module counter(w_clock, r_clock, empty, full); 
input w_clock, r_clock; 
output reg empty = 0, full = 0; 
integer rear = 0, front = 0;  

always @ (posedge w_clock) 
    begin 
     if ((front == 1 && rear == 8) || front == rear + 1) 
      full = 1; 

     else if(rear == 8) 
      begin 
       rear = 1; 
       empty = 0; 
      end 

     else 
      begin 
       rear = rear+1; 
       empty = 0; 
      end 
    end 

    always @ (posedge r_clock) 
    begin 
     if (front == 0 && rear == 0) 
      empty = 1; 

     else if(front == 8) 
      begin 
       front = 1; 
       full = 0; 
      end 

     else 
      begin 
       front = front+1; 
       full = 0; 
      end 
    end 
endmodule 
+0

「E =空;」:このを見てみましょうaync_fifoコードでは、 "。"エラー "(10170):テキストの近くにasync_fifo.v(16)でVerilog HDL構文エラー" = ";"または "(" " – Sugandha

+0

Verilog:on代入の左側には可変データ型が必要です](http://stackoverflow.com/questions/37946414/verilog-on-left-hand-side-of-assignment-must-have-a-variable-data-タイプ) – Qiu

答えて

0

あなたが完全かつ行動ブロックの左側にある空の使用している(常に)。だから彼らはレジスターでなければならない。 しかし同時に、それらはカウンタの出力であり、ワイヤでなければなりません。 このように変数を使用することはできません。これらの変数は、瞬時に出力され、コードの他の部分の右側でのみ使用されるか、または別の部分の入力にも使用できるビヘイビアブロックの左側で使用するためのレジスタですインスタント。 コーディングスタイルを変更する方がよいでしょう。ここで

は、非同期FIFOのexamoleです:

http://www.asic-world.com/code/hdl_models/aFifo.v

そしてまた、あなたは&ノンブロッキングの割り当てと競合状態を遮断について勉強する必要があります。私は、コードを編集し、私は声明というエラーを取得しています知っている

http://ee.hawaii.edu/~sasaki/EE361/Fall01/vstyle.txt

+0

Verilogの初心者で、問題を解決するための新しいコーディングスタイルを見つけることができません。この解決策を教えてください。? – Sugandha

+0

更新された答えをご覧ください。 – Laleh

関連する問題