あなたの宣言はconv_int
で無効です。最初は、conv_int
がまだ定義されていないため、右側のサブタイプの指示にconv_int
を使用することはできません。他の信号(またはオブジェクト)を使用することができます。 Distance
、これは以前に宣言されています。そして、あなたはto
またはdownto
とstd_logic_vector
の長さだけでなく、例えばで範囲を指定する必要があります:
signal conv_int : std_logic_vector(to_unsigned(timeIn, Distance'length)-1);
しかし、今の範囲は推敲中に制約されていないので、このは、どちらかを動作しませんtimeIn
理由定数ではありません。つまり、コンパイル時に配列タイプstd_logic_vector
の範囲を指定する必要があります。
それはあなたが後でDistance
にconv_int
を割り当てるためDistance
用としてconv_int
のための同じ範囲を持つためにここに意味をなさないと思います。この宣言は有効です:
signal conv_int : std_logic_vector(Distance'range);
この変更を加えると、コードが分析され、複雑になります(コンパイル/合成)。整数式timeIn*340/2
がconv_int'length
にバイナリ表現を切り捨てながらunsigned
に変換し、その後、実行時に/シミュレーション時に評価されます。次のように今、この行で「バイナリ」変換
conv_int <= std_logic_vector(to_unsigned((timeIn*340/2), conv_int'length));
にあなたの整数で動作します最後にこれをstd_logic_vector
に変換します。 timeIn
の値がfloor(2 ** 16/170)= 101より大きい場合、切り捨ては予期せぬDistance
になることに注意してください。
コードをさらに向上させることができます:あなたは非標準のシノプシスパッケージstd_logic_unsigned
を避ける必要があります
。標準IEEEパッケージnumeric_std
のみを使用してください。
処理は、同時実行文として書かれた1ライナーconv_int <= ...
に相当します。バリアントはtimeIn
が変更されたとき(および起動後に1回)に実行されるためです。
conv_int
が出力Distance
にのみ割り当てられている場合は、中間信号は必要ありません。
timeIn
が2 ** 31/170より小さい限り、340/2の乗算は170の乗算と等価になります。これは、切り詰めに関する上記の要件のために当てはまります。このように、あなたのアーキテクチャはに減少させることができる
:今
architecture behav of DistanceCal is
begin
Distance <= std_logic_vector(to_unsigned(timeIn*170, Distance'length));
end behav;
、私はすでにそれを変換することができます。ご清聴ありがとうございました。 –