VHDLプロセスでaをa+1に割り当てるステートメントを作成する場合、それは良い習慣ですか?
シミュレーターは正常に動作するため、これについて混乱していますが、FPGAに実装しようとすると、合成ツールがラッチの作成について文句を言います。
これは何を意味するのでしょうか?
このようなステートメントは、クロックプロセスでのみ実行する必要があります。合成したい場合は、追加の初期化(リセット)をお勧めします。次のようになります。
process(clk, reset)
begin
if reset='1' then
a <= 0;
elsif rising_edge(clk) then
a <= a + 1;
end if;
end process;
クロックプロセスでは、これで問題ありません。他のどこでも、おそらくそうではありません。
クロックプロセスでそれを行います、それは問題ありません。これは、「の次の値は+1a
の現在の値である必要がある」という意味です。a
(プロセスの外で)継続的な割り当てとしてそれを行う場合、あなたが言っているのは、自己参照ループである「aは常にそれに割り当てられた+1を取得している」ということです!
a
有効なプロセスの感度リストに含めると、同じ効果が得られます
process (en, a)
begin
if en = '1' then
a <= a + 1;
end if;
end process;
(このフォームを使用して、透明なラッチを作成できます。
process (en, insig)
begin
if en = '1' then
a <= insig;
end if;
end process;
)。
クロックされていないプロセスでそれを行う場合、これは以下に敏感ではありませんa
:
process (en)
begin
if en = '1' then
a <= a + 1;
end if;
end process;
a
の変更間でその値を維持する必要があるため、ポジティブエッジでトリガーされるラッチを作成しますen
。事実上、en
d型フリップフロップのクロックになります。