rst auf '1' setzen ?

Gast #4083764
Lesenswert?

Hallo Leute,

Ich habe ein kleines Datenübertragungsmodel erstellt. (Sender, Empfänger 
und FIFO als Pufferspeicher). Daten werden vom Sender erzeugt dann ans 
FIFO gesendet und zwischengelagert. Der Empfänger kann dann die Daten 
auslesen.

was ich aber nicht verstehe ist, dass wenn ich den reset bei der 
Testbench nicht auf 1 setze, der Ausgang des Empfänger den wert 'U' 
zugeschrieben bekommt
wenn ich den rst direkt zu beginn auf 1 setze taucht das 'U' nicht auf. 
Habe erst vor ne woche mit VHDL begonnen, deswegen kenne ich mich noch 
nicht so gut damit aus
Angehängte Dateien:
Gast #4083806
Lesenswert?

Hier ist die Testbech, wobei sich das entscheidende im  Stimulus process 
abspielt,


ENTITY Top_tb IS
END Top_tb;

ARCHITECTURE behavior OF Top_tb IS

    -- Component Declaration for the Unit Under Test (UUT)

    COMPONENT TOP
    PORT(
         clk : IN  std_logic;
         rst : IN  std_logic;
         enable_w : IN  std_logic;
         enable_r : IN  std_logic;
         d_out : OUT  std_logic_vector(17 downto 0)
        );
    END COMPONENT;


   --Inputs
   signal clk : std_logic := '0';
   signal rst : std_logic := '0';
   signal enable_w : std_logic := '0';
   signal enable_r : std_logic := '0';

   --Outputs
   signal d_out : std_logic_vector(17 downto 0);

   -- Clock period definitions
   constant clk_period : time := 10 ns;

BEGIN

  -- Instantiate the Unit Under Test (UUT)
   uut: TOP PORT MAP (
          clk => clk,
          rst => rst,
          enable_w => enable_w,
          enable_r => enable_r,
          d_out => d_out
        );

   -- Clock process definitions
   clk_process :process
   begin
    clk <= '0';
    wait for clk_period/2;
    clk <= '1';
    wait for clk_period/2;
   end process;


   -- Stimulus process
   stim_proc: process
   begin
      -- hold reset state for 100 ns.
      wait for 10 ns;
    rst <= '1';
    wait for 100 ns;
    rst <= '0';
    wait for 50 ns;
    enable_w <= '1';
    wait for 50 ns;
    enable_r <= '1';
    wait for 50 ns;
    enable_w <= '0';
    wait for 50 ns;
    enable_r <= '0';
    wait for clk_period*10;

      -- insert stimulus here

    wait;
   end process;

END;
Gast #4083821
Lesenswert?

Hi,
in der Testbench hab ich jetzt den Fehler so auf die Schnelle nicht 
gesehen.
Aller Warscheinlichkeit nach, weil es sich ja hier auch um den Audgang 
des FIFOs handelt, wird der Fehler im DUT liegen. Kann es sein, dass du 
auf die steigende Flanke deines Resets reagierst, bzw. dass es sich um 
einen High-Active Reset handelt?

Gruß
Helfer
Gast #4083837
Lesenswert?

Ich bin mir nicht sicher was die genaue Definition von 'U' bei VHDL ist.

Aber grundsätzlich gehst du einem solchen Problem am einfachsten auf den 
Grund in dem du die Leitungen von deinem unerwünschten Zustand nach oben 
tingelst und erst mal die genaue Stelle identifizierst wo das 'U' zum 
ersten mal Auftritt. Dazu musst du halt in der Sim mehr Leitungen 
hinzufügen, als erstes mal alle statements die d_out erzeugen.

Dann kannst du das auf eine Zeile Code eingrenzen und meisstens sehr 
schnell den Fehler finden.

Was auch immer sehr hilfreich ist: alle Inputs in dein DUT in der Sim 
anzeigen, falls du Signale im TB falsch verbunden hast.
#4083952
Lesenswert?

eingast schrieb:
> Ich bin mir nicht sicher was die genaue Definition von 'U' bei VHDL ist.

Von 
https://www.cs.sfu.ca/~ggbaker/reference/std_logic/1164/std_logic.html

    'U': uninitialized. This signal hasn't been set yet.
    'X': unknown. Impossible to determine this value/result.
    '0': logic 0
    '1': logic 1
    'Z': High Impedance
    'W': Weak signal, can't tell if it should be 0 or 1.
    'L': Weak signal that should probably go to 0
    'H': Weak signal that should probably go to 1
    '-': Don't care.

Alle nicht initialisierten std_logic Signale sind am Anfang 'U'.
Gast #4084145
Lesenswert?

Also wieder mal das Übliche: Der Fragesteller weiss ganz genau wo das 
Problem liegt, kann seine Ansicht aber nicht begründen oder daraus 
eigene Schlüsse ziehen; fühlt sich aber dennoch dazu veranlasst, 
denjenigen die er um Rat fragt den Rest des Codes vorzuenthalten.

Herzlich willkommen in meinem CSS-File und ein schönes Leben noch.
Gast #4085514
Lesenswert?

Dout ist zu Beginn nicht initialisiert. Also dem Simulator unbekannt : 
'U'nknown
Beim Reset wird Dout beschrieben und hat dann einen Wert.

Sinn eines Reset ist das zurücksetzen der  Register damit sich das Gerät 
in einen definierten Zustand befindet.
In synchronen Schaltungen sollte man Resets synchron loslassen. Man kann 
aber asynchron darauf reagieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren