2016-03-19 5 views
-3
-- 

library IEEE; 

use IEEE.STD_LOGIC_1164.ALL; 


entity D_flip_flop is 

port ( 

     D : in STD_LOGIC; 
     Q : inout STD_LOGIC; 
     Q_tonos : out STD_LOGIC; 
     CLK : in STD_LOGIC; 
     RST : in STD_LOGIC 
     ); 

end D_flip_flop; 

architecture Behavioral of D_flip_flop is 

begin 

process_flip_flip: process 

begin 

wait until CLK'EVENT AND CLK = '1'; 

if(RST='1') then 

    Q <= '0'; 
    else 
    Q <= D; 
    end if; 
    Q_tonos <= not Q; 

end process process_flip_flip; 
end Behavioral; 

------------------------- 

--testbench 

LIBRARY ieee; 

USE ieee.std_logic_1164.ALL; 



ENTITY test_flip_flop IS 

END test_flip_flop; 

ARCHITECTURE tb OF test_flip_flop IS 



    COMPONENT D_flip_flop 
    PORT(

     D : IN std_logic; 
     Q : INout std_logic; 
     Q_tonos : OUT std_logic; 
     CLK : IN std_logic; 
     RST : IN std_logic 
     ); 
    END COMPONENT; 



    signal D : std_logic ; 

    signal CLK : std_logic ; 

    signal RST : std_logic ; 



    signal Q : std_logic; 



    signal Q_tonos : std_logic; 


    constant CLK_period : time := 10 ns; 
    signal stopClk : boolean; 

BEGIN 

    -- Instantiate the Unit Under Test (UUT) 
    dut: D_flip_flop PORT MAP (

      D => D, 
      Q => Q, 
      Q_tonos => Q_tonos, 
      CLK => CLK, 
      RST => RST 
     ); 

    CLK_process :process 

    begin 

     while not stopClk loop 

     CLK <= '0'; 
     wait for CLK_period/2; 
     CLK <= '1'; 
     wait for CLK_period/2; 
     end loop; 
     wait; 
    end process CLK_process; 


    -- Stimulus process 

    stim_proc: process 
    begin   


     -- insert stimulus here 
     D <= '0'; 
     RST <= '1'; 
     wait for 100 ns; 

     D <= '0'; 
     RST <= '0'; 
     wait for 100 ns; 

     D <= '1'; 
     RST <= '0'; 
     wait for 100 ns; 

     D <= '1'; 
     RST <= '0'; 
     wait for 100 ns; 

     wait; 
    end process; 

END; 
+4

Sie haben Ihr Problem nicht wirklich beschrieben. Was willst du * diesen Code tun und was tut er stattdessen? –

+0

es soll ein d-flipflop in vhdl sein, aber wenn ich simuliere, um die Diagramme zu sehen gibt mir nichts und ich weiß nicht, was falsch ist .. die Uhr funktioniert auch nicht und ich weiß nicht, was ist falsch mit dem Code .. –

+1

Wenn die Uhr funktioniert nicht, dann reduziere bitte deinen Code, so dass nur noch der Uhrprozess und die erforderlichen Signaldeklarationen übrig sind. Dann wird der Fehler deutlicher. –

Antwort

1

Sie eine Zeile in der Testbench fehlen, denke ich:

D <= '1'; 
    RST <= '0'; 
    wait for 100 ns; 

    stopClk <= TRUE; -- add this line 

    wait; 
    end process; 

END; 

http://www.edaplayground.com/x/56Mm

auf diese Weise, wenn der Test ist beendet, schaltet die Uhr stopClk Signal den Taktgenerator aus und die Simulation wird beendet. Es endet, weil es einen Zustand Ereignisverknappung erreicht. Jedes Mal, wenn eine Codezeile ausgeführt wird, die eine Signalzuweisung enthält, wird den Simulatoren Ereigniswarteschlange (ihre "Aufgabenliste") ein Ereignis hinzugefügt. Wenn Sie eine Situation erstellen, in der solche Zeilen nicht weiter ausgeführt werden, wird die Ereigniswarteschlange leer. Das ist Ereignismangel. Der Simulator erkennt dies und die Simulation stoppt. (Wenn Sie darüber nachdenken, was könnte es noch tun?)

Ohne diese zusätzliche Zeile läuft die Simulation für immer, da der Taktgenerierungsprozess Signalzuweisungen für immer ausführt, so dass die Ereigniswarteschlange nie leer ist.

0

nicht wirklich eine Antwort, aber: mit wenn rising_edge (CLK) oder vielleicht wenn CLK = '1' und CLK'event statt warten, bis betrachten. Nicht alle synthesis Werkzeuge unterstützen diese Art von Code und es ist selten, es in der professionellen Welt zu sehen;)

p.s. stopClk Signal ist nicht (oder war es?) Ihre TB-Uhr ist möglich, aber ich denke, es bleibt 'u' für die gesamte Simulation. Wenn in der Simulation nicht erzwungen.

Verwandte Themen