2017-10-14 1 views
2

次の回路VHDLコードでSとRが両方とも '0'のときにSR-Latchが発振することがわかりました。ここVHDLでのシンプルなSRラッチシミュレーションが発振しない

はSRLATCH

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity SRLATCH_VHDL is 
port(
     S : in STD_LOGIC; 
     R : in STD_LOGIC; 
     Q : inout STD_LOGIC; 
     NOTQ: inout STD_LOGIC); 
end SRLATCH_VHDL; 

architecture Behavioral of SRLATCH_VHDL is 
begin 

process(S,R,Q,NOTQ) 
    begin 
     Q <= R NOR NOTQ; 
     NOTQ<= S NOR Q; 
end process; 

end Behavioral; 

のVHDLで、以下は、テストベンチのコードでプロセスであり、そのシミュレーションが

-- Stimulus process 
    stim_proc: process 
    begin   
    S <= '1'; R <= '0'; WAIT FOR 100NS; 
    S <= '0'; R <= '0'; WAIT FOR 100NS; 
    S <= '0'; R <= '1'; WAIT FOR 100NS; 
    S <= '0'; R <= '0'; WAIT FOR 100NS; 
    S <= '1'; R <= '1'; WAIT FOR 500NS; 
    end process; 

を生じ、完全に私はシミュレーションが反映されていない理由を任意のアイデアを持っていません。 ..

Xilinx Simul of SR LATCH

(クリックで拡大)
+0

振動を実証する[最小、完全であり、検証可能な例](https://stackoverflow.com/help/mcve)も提供していません。治療法は、遅延をアンバランスにすることで、1つが勝つようにすることです。コンセンサスの言葉を提供するのと同じです。クロックド・フリップフロップでは、マスタ・スレーブ・フリップフロップを使用するための刺激と同様に、セットアップ・アンド・ホールド時間が発生します。我々は、デジタルデザインの喪失した技術とゼロゲート遅延による抽象化に取り組んでいます。 – user1155120

+0

QとNOTQの割り当てに均一な遅延を追加する場合、1ns後に 'Q <= R NOR NOTQ;同じオク​​ターブサイクル(介在するWAITなし)でSとRの両方で '0'から '1'への遷移を提供し、[発振](https:// i .stack.imgur.com/d23rt.png "srlatch_vhdl_with_delay.png")、デルタサイクルを表示したりデルタサイクルの最大数を超えたりする可能性のある波形表示を必要としません。 – user1155120

答えて

1

誰かが間違った知識を教えています!

SRおよびRS基本フリップフロップ(ラッチとも呼ばれます)は発振しません。 S = R = 1(禁止)の問題は、S = R = 1を離れると状態を知ることができないため、S = R = 0(save)に同時に行くことができないためです。 S = R = 1からS = R = 0からS = 1; R = 0(設定)またはS = 0; R = 1(リセット)に移行します。これによりまたはリセットのいずれかの状態になり、状態に到着する前に、が保存されます。

VHDLは離散時間でシミュレートし、実行ごとに同じシミュレーション結果を再現していることに注意してください。シミュレーション実行ごとに異なる信号遅延を引き起こす物理的効果を(簡単に)シミュレートすることはできません。

Btw。あなたVHDLの説明も間違っています。 QおよびNOTQは、inoutではなく、outのモードです。 VHDL-2008をサポートする適切なシミュレータ(アウトポートのリードバックを可能にする)または中間信号を使用してください。

+0

THANX A LOT :)私は、S = R = 1の後、S = R = 0の状態が振動することを意味しました!私はこの問題を解決しました。あなたが私に答えたように、ちょうどisim事について。 isimでは '0'とほとんど同じですので、反復制限 '10000'というisimエラーがあります!私は行動の定義を遅らせて解決しました:)もう一度ありがとうございます:) –

+0

OPはあなたに '<= '0'をグラフト化するよう指示しています。 r≦ '0'である。 100ns待つ; 's <= '1'に続く既存のstim_procの終わりまで。 r≦ '1'である。 500ns待つ;デルタサイクル振動を引き起こす - 'シミュレーションはストップデルタによって停止した。 OPの質問は、[Minimal、Complete and Verifiable example](https://stackoverflow.com/help/mcve)を提供していない問題を示すものではなく、逸話的に関連する問題に答えることもできません。 – user1155120

+0

QとNOTQに対する割り当てが同じで、振動を示す波形を得ることができます。 SとRが両方とも '1'である場合、遅延のアンバランスと片側の勝ち。コンセンサスの言葉 - Google *ハザードロジック*または*アールラッチ*(振動防止のためのコンセンサス用語付きのDラッチ、IBMのEarle)を使用する簡単な方法があります。 SとRが両方とも '1'から両方の '0'に同時に移行することを本質的に禁じるものは何もありません。物理的な実装では、まれに終了する可能性がありますが、通常はセットアップまたはホールドタイムの​​違反を表します。ルーティングは、遅延の不均衡を招く傾向があります。 – user1155120

2

あなたのインストラクターは正解です。この回路は、SとRの両方が同じ時間にリリースされた場合に発振します。あなたの問題は、あなたのTBはこれをやっていないということですが、これはありません:これは、ための素晴らしい方法ではありません

enter image description here

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity TOP is 
end entity TOP; 

architecture A of TOP is 
    signal S,R,Q,NOTQ: std_logic; 

    component SRLATCH_VHDL is 
    port(
     S : in std_logic; 
     R : in std_logic; 
     Q : inout std_logic; 
     NOTQ : inout std_logic); 
    end component SRLATCH_VHDL; 

begin 
    U1 : SRLATCH_VHDL port map(S, R, Q, NOTQ); 

    process is 
    begin 
    S <= '1'; 
    R <= '1'; 
    wait for 10 ns; 
    S <= '0'; 
    R <= '0'; 
    wait; 
    end process; 
end architecture A; 

これは無限デルタ遅延振動を生成します回路の物理的性質を効果的に簡素化し、VHDLスケジューラを使用して問題があることを示すため(デルタ遅延を使用して)非同期動作を示します。これを行うより良い方法は、信号遅延を追加することによって実際の回路の振る舞いをモデル化することです(これは、タイミングシミュレーションのバックアノテート時にツールが行っていることとまったく同じです)。信号の割り当てをafterでルックアップし、転送と慣性の遅延の違いを調べます。回路図を描くと、SRが解放され、2番目の制御信号が変化する前に回路の周りの信号伝播が完了しない「小さな」時間ウィンドウで問題が発生することがわかります。この時間枠の中にSRを変更するテストベンチを書く必要があります。

設計したほとんどすべてが、SR回路とまったく同じ方法で非同期になります。我々は、入力信号が同時に変化しないことを保証することによってのみ、回路を「同期」させる。タイミングツールの仕事は、実際には「同じもの」が実際に何を意味するのかを教えてくれることです。レポートやデータシートの値を設定や保留にすると、数値は単に「同じではない」という数値バージョンになります。

関連する問題