私は最近、VHDL 合成中の意図しないラッチに関するすべての (ほとんどの) 問題の解決策は、問題のある信号をレコードに入れることであると言われました。
これは少しうますぎるように思えますが、私は VHDL の経験が豊富ではないため、考慮していないことが他にある可能性があります。
すべての信号を記録に入れる必要がありますか?
std_logic
レコードは、 toのグループ化に配列を使用するのと同様に、他のタイプをグループ化するもう 1 つの方法であるstd_logic_vector
ため、設計のラッチを回避するためにレコードをより効果的にする魔法は何もありません。
設計で意図しないラッチが発生した場合、「ラッチの問題」と思われるものは、コーディング スタイルがラッチを指定しているためであり、@zennehoy も示唆しているように、コーディング スタイルを変更する必要があります。
1 つの方法は、使用するさまざまな構造のコード テンプレートを定義し、既知の機能するテンプレートに固執することです。
非同期リセットを使用するフリップフロップ (FF) のテンプレートは、次のようになります。
process (clk_i, rst_i) is
begin
-- Clock
if rising_edge(clk_i) then
... Control structures with Qs assign by function for Ds
... Synchronous reset is just another branch
end if;
-- Reset (asynchronous) if required
if rst_i = '1' then
... Qs assign with constant reset value for so or all Qs
end if;
end process;
可能な場合は同時シグナル割り当てを使用し、より複雑な式は、次のようなプロセスの外部で関数が使用される同時関数呼び出しを使用して実行できます。
z_o <= fun(a_i, b_i);
プロセスを使用して組み合わせロジックを作成する場合、VHDL でラッチが発生する一般的な落とし穴と原因は、センシティビティ リスト内の信号を忘れることです。ただし、VHDL-2008 にはこれに対する解決策があります。(all)
機密リストとして使用できるため、プロセスで使用されるすべての信号が暗黙的に機密リストに含まれます。したがって、VHDL-2008 を使用する場合、組み合わせプロセスのテンプレートは次のようになります。
process (all) is
begin
z_o <= a_i and b_i;
end process;
これらのテンプレートは、典型的な合成可能なデザインに必要なすべてであり、デザインのラッチを解放します。