Forum: FPGA, VHDL & Co. rst auf '1' setzen ?


von rub (Gast)


Angehängte Dateien:

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

von Bitflüsterer (Gast)


Lesenswert?

Sei bitte so gut und poste Deinen Code (ggf. als Anhang). Unsere 
Glaskugeln sind alle beim polieren.

von rub (Gast)


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;

von Helfer (Gast)


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

von eingast (Gast)


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.

von Klaus F. (kfalser)


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'.

von Bitflüsterer (Gast)


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.

von rub (Gast)


Lesenswert?

Wenn ich das rst von Beginn auf '1' setze, was ich auch immer mache, 
gibt es keine Probleme. Die Frage ist eher was ist der Sinn eines 
asynchronen reset signals im Allgemeinen?

von Matthias (Gast)


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.

von rub (Gast)


Lesenswert?

Dank dir!! Auf so ne Antwort habe ich gewartet

von Fpgakuechle K. (Gast)


Lesenswert?

rub schrieb:
> Dank dir!! Auf so ne Antwort habe ich gewartet

Man wartet nicht auf Antworten - man sucht sie.

SCNR,

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.