2016-11-08 20 views
-1

Verilogで入力値を使用する際に問題が発生しました。 私が書く:Verilogの "always" definitonでの入力値の使い方

module reg_vector (INPUT, ICLK, IENBL, NR, OUT); 
parameter k = 6; 
parameter n = 3; 
input [(8*k)-1:0] INPUT; 
input ICLK; 
input IENBL; 
input [n-1:0] NR; 

reg [n-1:0] temp; 
output reg [7:0] OUT; 

[email protected] (temp, posedge ICLK) 
begin 
    if (IENBL) 
     begin 
      OUT = INPUT[temp*8 : temp*8+8]; 
     end 
end 

endmodule 

しかしエラーました:

Error (10734): Verilog HDL error at reg_vector.v(25): temp is not a constant

私はそれを修正する必要がありますどのように? ありがとう)

+0

あなたは 'temp'を宣言しますが、これに値を割り当てることはありません。また、 'posedge ICLK'で'常に 'senitivityリストに入れたいとは思わない – toolic

答えて

0

INPUT[temp*8 : temp*8+8]:の範囲構文では両側が定数である必要があるため、機能しません。
+:の配列スライスを使用することです。INPUT[temp*8 +: 8] +:の左側に変数があり、開始インデックスを表します。右辺は幅であり、定数でなければなりません。より多くの+:についてIndexing vectors and arrays with +:

その他の問題を参照してください。

  1. は、感度リストからtempを削除します。何か
  2. OUTに割り当てる
  3. tempニーズは非ブロック(<=)を割り当てる必要があり、それは順序論理であるので、(=)ブロックしていません。

always @(posedge ICLK) // no temp in sensitivity list 
begin 
    if (IENBL) 
    begin 
    OUT <= INPUT[temp*8 +: 8]; // non-blocking and +: 
    end 
end 
0

ベクトルが常に1バイト幅であっても、ツールはそれを可変サイズとして認識し、それを処理する方法を知らない。

それを行うための別の方法は、によってシフトの下8ビットがかかります。これは、OUTとして動作するはずシフト演算子に

OUT = INPUT >> (temp*8); 

を使用することです(あなたはまた、ベクターの選択におけるインデックスtemp*8temp*8+8を反転しました) のINPUT

+0

さて、エラーはなくなりましたが、シフト演算子が解であるかどうかはわかりません。 入力脚を出力に接続する必要があり、NR入力に依存します。 OUT = IN [7:0] OUT = IN [15:8]もしNR = 1ならば、OUT = IN [7:0] はNR = –

関連する問題