1

メインコンポーネントにプロセスaがあり、他のサブコンポーネント(メインコンポーネントに実装されている)にプロセスbがあります。プロセスaとbはどちらも、感度リストにクロックのみが含まれています。readyと呼ばれる制御可能な信号を処理します。1つのプロセスbが機能する場合、0のプロセスbは何もしません。問題はプロセスaにあり、プロセスがイネーブル信号の値を0に変更すると、変更するために次のクロックサイクルにかかる必要があるため、プロセスbは終了し、余分なクロックサイクルを実行します。

a:process(clk)
begin
if(rising_edge(clk)) then
if(output/=old_output) then
        enable<='0';
end if;
end if;
end process;

b:process(clk)
begin
if(rising_edge(clk)) then
if(enable='1') then
        --do anything
end if;
end if;
end process;
4

1 に答える 1

2

その理由は、値がクロックの正確なrising_edgeでラッチ/サンプリングされるためです。その時点で、「enable」はまだ1に等しいです。そのシミュレーションデルタでは、enabledは値ゼロを取得しますが、最初のデルタの後まで使用できません。

これは、enableがoneになると(クロックの立ち上がりエッジでも生成される場合)、クロックが立ち上がりたときにプロセスが値を正確にラッチし、シミュレーターでは、enableがクロック期間全体にわたって高く見える場合にも当てはまります。 「-何でもする」は起こりませんが。

これは、プログラミング言語ではなく、実際の電気回路と考えることができます。「output/= old_output」の評価には時間がかかり、設計者は次のクロックの立ち上がりエッジの前にそれを実行する必要があることを考慮してください。

これがお役に立てば幸いですが、これが言語の仕組みです。有効化の設定とリセットの両方があれば、より良い答えを与えることができます。

于 2013-03-25T06:43:32.750 に答える