2017-10-14 639 views
2

我已經瞭解到,當S和R在它們在下面的電路VHDL代碼中僅爲'1'時均爲'0'時,SR鎖存器會發生振盪。VHDL中的簡單SR鎖存器仿真(帶Xilinx)不會振盪

這裏是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),您提供的刺激也不會這樣做。治癒的辦法是平衡延誤,以贏得勝利。這相當於提供了共識。在鍾控觸發器中,這是設置和保持時間的源泉,也是使用主從觸發器的動力。我們正在處理丟失的數字設計藝術以及零門延遲的抽象。 – user1155120

+0

如果您要爲Q和NOTQ的賦值添加統一的延遲:1ns後的Q <= R NOR NOTQ;在1 ns後NOTQ <= S NOR Q;'並且在同一個增量週期內(不插入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(保存)。您將轉換爲S = R = 1S = R = 0S = 1; R = 0(設置)或S = 0; R = 1(重置)。這將觸發一個集合重置操作在您到達狀態之前保存

請注意,VHDL以離散時間模擬並在每次運行中重現相同的模擬結果。您無法(輕鬆)模擬每次模擬運行會導致不同信號延遲的物理效應。

Btw。你的VHDL描述也是錯誤的。 QNOTQ的模式是out,而不是inout。使用支持VHDL-2008的正確模擬器(允許讀出端口)或使用中間信號。

+0

THANX A LOT :)我只是說在S = R = 1之後,S = R = 0狀態會發生振盪!我解決了這個問題。當你回答我的時候,它只是一件事情。時間尺度與isim中的'0'幾乎相同,所以迭代限制'10000'時存在isim錯誤!我通過拖延行爲的定義來解決它:)再次感謝你:) –

+0

OP是告訴你嫁接's ='0'; r <='0';等待100 ns;'在's ='1'之後現有的stim_proc的末尾; r <='1';等待500納秒;'會導致增量循環振盪 - 模擬停止 - 停止增量。 OP的問題沒有證明問題沒有提供[最小化,完整和可驗證的示例](https://stackoverflow.com/help/mcve),也沒有回答解決他有關的問題。 – user1155120

+0

對於Q和NOTQ具有相同的分配延遲,您可以獲得顯示振盪的波形。當S和R都爲'1'時,不平衡延遲,一方獲勝。有一個使用共識術語的簡單方法 - 谷歌*危險邏輯*或*厄爾鎖存*(D鎖存器,用於防止振盪的共識術語,IBM的J. G. Earle)。從本質上來說,禁止S和R同時從'1'和'0'同時出現。在物理實現中,它可以退出很少,但確實發生,通常表示設置或保持時間違反。路由會導致延遲不平衡。 – user1155120

2

不錯的問題,你的導師是正確的 - 如果S和R都在「相同」時間釋放,這個電路將振盪。你的問題是您的結核病不這樣做,但是這一個作用:

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; 

這將產生無窮的增量延遲振盪:

enter image description here

這不是一個偉大的方式來演示了異步行爲,因爲您正在有效地簡化電路的物理特性,並使用VHDL調度程序來顯示出現問題(使用「delta延遲」)。更好的方法是通過添加信號延遲來建模實際電路行爲(這正是您的工具在爲時序仿真返回註釋時所做的)。用after查找信號分配,以及傳輸和慣性延遲之間的差異。如果您繪製電路圖,您會發現如果SR都在「小」時間窗內釋放,則不會在第二個控制信號更改之前讓電路周圍的信號傳播完成。您現在需要編寫一個在此時間窗口內更改SR的測試臺。

幾乎所有你設計的東西都是異步的,就像你的SR電路一樣。只有確保輸入信號不會同時發生變化,我們才能使電路「同步」。計時工具的作用是告訴我們「相同」實際上意味着什麼:當你得到一份報告或數據表值給你一個設置或一個保持時間時,那麼這個數字就是'不一樣'的數字版本。