私はソフトウェアエンジニア(JAVA/C++)で電気工学者ではないので、VHDLが完全に混乱していると想像することができます。シンセサイザーは舞台裏でやろうとしています。そして、それは私が非常に単純なアーキテクチャであると信じるものを合成することができないと私に伝えています。 (実際には、それは私が、私はいくつかの基本的な概念を誤解し、複数の場所で建築ミスを繰り返してい疑われているいくつかのエンティティのためにそれをやっている。)これは合成できないのはなぜですか?
は、なぜこれが... (ERROR合成しない - (controller.vhdを63):。それは はNOT(クロックエッジ)の条件で、その値を保持していないので、文は が完了VHDL-1242を合成可能なされていない:エラーコード2)
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY controller IS
PORT (
ack: out STD_LOGIC := '0';
data_request: in STD_LOGIC
);
END controller;
ARCHITECTURE logic OF controller IS
BEGIN
PROCESS (data_request)
BEGIN
if (rising_edge(data_request)) then
-- other logic will be added here
ack <= '1';
elsif (falling_edge(data_request)) then
-- other logic will be added here too
ack<='0';
end if;
END PROCESS;
END logic;
を(はい、私は完全に承知していますプロセスの「論理」は ack < = data_requestに置き換えることができますが、私のVHDLソースは実際にはtよりはるかに複雑です彼の しかし、私はエラーをスローする最も単純なサブセットにそれを蒸留しました。プロセスを別の構造体/同時実行文に置き換えることはお勧めしません)。
基本的に、data_request行がハイに遷移すると、ack出力はハイになります。立ち下がりエッジでは、ドライブをローに変更する必要があります。 (そして、それぞれの場合でも、他のものも同様に変更したいので、同時のステートメントの代わりにプロセスが必要です。要求が完了したことをトップレベルのエンティティに通知するために変更してください)
"価値を保持していない"とは何ですか?それが "NOT(クロックエッジ)"と書かれているとき、それは何の「時計」ですか?
これを修正する方法(構造を変更することなく)と、シンセサイザに何を求めているのか、シンセサイザが目的を達成できない理由についての説明が大好きです。
私はいくつかの理由を理解しているかもしれません。私は、感性プロセスにおける "X <= Y"割り当てのX出力は、感度イベントに時計として接続されたフリップフロップ私はフリップフロップがサポートしていない2つの異なるクロックソースでフリップフロップを駆動しようとしています。これは正しいです?どのようにして2つの異なるイベントに応じて2つの異なる方法で出力を変更するのですか? – user3059763
あなたの合成ツールは、IEEE Std 1076.6-2004(抜粋)から派生した受け入れ可能なフォームを示す順次ロジックのHDLガイドラインを持っています。ここでの問題は、デュアルデータレートクロックとしてdata_requestの両端を使用しようとすることです.DDRはサポートされていれば、iOセルでのみ使用でき、特殊な呼び出しが必要です(2つのフリップフロップを使用します)。一般に、1プロセス当たり1つのクロックエッジのみがサポートされる。ハードウェア記述言語を考える。 – user1155120