1

私の質問は、次のコードに関するものです。

library ieee;
use ieee.std_logic_1164.all;

entity exam is port (
    I,CLK,RESET : in std_logic;
    Q : out std_logic
);
end entity;

architecture exam_arc of exam is
    signal temp_sig : std_logic;
begin
    process (CLK,RESET)
    begin
        if RESET = '1' then
            temp_sig <='0';
        elsif CLK'event and CLK='1' then
            temp_sig <= I;
        end if;
        Q <= temp_sig;
    end process;
end exam_arc;

このコードは、クロックの立ち上がりエッジで動作する D フリップフロップをシミュレートしているように見えますが、この質問に対する回答 [この質問は試験から取得されました] は、この D フリップフロップがクロックの立ち下がりエッジで動作すると主張しています。

この VHDL コードがシミュレートするフリップフロップの種類は?

4

5 に答える 5

5

ひっかけ問題です。プロセスはクロックの立ち上がりエッジと立ち下がりエッジの両方でウェイクアップし、中間信号 temp_sig が立ち上がりエッジに割り当てられていることに注意してください。

それをシグナル割り当て (延期された割り当て) のセマンティクスと合わせて、何が得られるかを確認してください。

ジムが提案するように、シミュレーションによるクロスチェック...

于 2013-07-15T22:36:17.560 に答える
2

Q への割り当てを、同じセンシティビティ リストを持つ独自のプロセス ステートメントに分割します。プロセス数は異なりますが、シミュレーション モデルの動作は同じです。

DUT:
    process (CLK,RESET)
    begin
        if RESET = '1' then
            temp_sig <='0';
        elsif CLK'event and CLK ='1' then
            temp_sig <= I;
        end if;
--        Q <= temp_sig;
    end process;

QDEVICE:
    process (CLK, RESET)
    begin
        Q <= temp_sig;
    end process;

temp_sig を割り当てるエッジ センシティブ ストレージ デバイスは、CLK にセンシティブで、RESET (ハイ) によって非同期にリセットされるポジティブ エッジ クロック フリップフロップであることは明らかです。

QDEVICE プロセスは合成ターゲット コンストラクトですか? これは、temp_sig フリップフロップへのフォロワ ラッチとして動作しますが、イネーブルの極性に関する指示はありません。IEEE Std 1076.6-2004 IEEE Standard for VHDL Register Transfer Level (RTL) Synthesis, 6.2.1.1 Level-sensitive storage from process with sensitive list を参照してください。

次のすべてが適用される場合、レベル センシティブ ストレージ エレメントは信号 (または変数) に対してモデル化されます。

c) シグナル (または変数) への (割り当てステートメントによる) 明示的な割り当てを実行しないプロセスの実行があります。

(レベルによる) 資格がなければ、ルール c は満たされません。さらに、元のプロセスでは、動作がIEEE Std 1076.6-2004 6.2クロックエッジ仕様のいずれにもマッピングされていないと述べていますが、いずれにも中間信号の使用は含まれていません。

ブライアンの言うとおり、ひっかけ問題です。遅延を提供するフォロワーの何か他のものを備えたフリップフロップ。また、CLK または RESET のイベントが発生するまでの q のシミュレーションでの「U」の値が表示されます。

ここに画像の説明を入力

于 2013-07-16T05:02:35.860 に答える
2

自分で合成するしかない。

ほぼ同じffv3 http://www.cs.uregina.ca/Links/class-info/301/register/lecture.htmlも参照してください。

更新
欠落しているフォーマットに誤解されていました。実際、別の回答がすでに示しているように、実際には立ち下がりエッジでトグルしています。

すべての割り当ては順番に行われますが、信号の割り当てはプロセスの最後に行われるためtemp_signal、クロック サイクルの半分前 (次の立ち下がりエッジ) であり、最近割り当てられた値は含まれていません。

http://www.gmvhdl.com/process.htm
シグナル割り当てはプロセスでどのように機能しますか?

于 2013-07-15T16:41:35.780 に答える
0

シミュレートしたことはありますか?Q はいつ、なぜ変更されますか? 信号はいつ更新されますか? 立ち上がりエッジの間、Q は I の値を取得しますか? 必ずシミュレートしてください。

于 2013-07-15T16:42:23.100 に答える
0

次のコード行を見てみましょう。

    elsif CLK'event and CLK='1' then

CLK はタイミング信号 (別名クロック) です。

CLK' イベントは、CLK の値が変化したときにトリガーされます。CLK='1' は、クロックがハイに等しいことを意味します。

したがって、クロックが変更され、現在高い状態にある場合は、この ELSIF ステートメント内のコードを実行します。

ビット変数には 2 つの状態しかないことがわかっているため、CLK が変化し、ハイ状態に変化した場合、元々はロー状態でした。これは、クロックがローからハイになるときにのみコードが実行されることを意味します。

高から低のトリガーで実行する場合は、ステートメントを次のように変更します。

    elsif CLK'event and CLK='0' then
于 2015-11-14T00:26:06.837 に答える