Suche…


Syntax

  • warten [auf SIGNAL1 [, SIGNAL2 [...]]] [bis CONDITION] [für TIMEOUT];
  • warten; - Ewiges Warten
  • warte auf s1, s2; - Warten Sie, bis sich die Signale s1 oder s2 (oder beide) ändern
  • warte bis s1 = 15; - Warten Sie, bis sich das Signal s1 ändert und der neue Wert 15 ist
  • warte bis s1 = 15 für 10 ns; - Warten Sie, bis sich das Signal s1 ändert und der neue Wert höchstens 10 ns beträgt

Ewiges Warten

Die einfachste Form der wait Anweisung ist einfach:

wait;

Wenn ein Prozess dies ausführt, wird er für immer ausgesetzt. Der Simulationsplaner wird ihn nie wieder aufnehmen. Beispiel:

signal end_of_simulation: boolean := false;
...
process
begin
  clock <= '0';
  wait for 500 ps;
  clock <= '1';
  wait for 500 ps;
  if end_of_simulation then
    wait;
  end if;
end process;

Empfindlichkeitslisten und Warteanweisungen

Ein Prozess mit einer Sensitivitätsliste kann auch keine wait-Anweisungen enthalten. Es entspricht dem gleichen Prozess, ohne Sensitivitätsliste und mit einer weiteren letzten Anweisung:

wait on <sensitivity_list>;

Beispiel:

  process(clock, reset)
  begin
    if reset = '1' then
      q <= '0';
    elsif rising_edge(clock) then
      q <= d;
    end if;
  end process;

ist äquivalent zu:

  process
  begin
    if reset = '1' then
      q <= '0';
    elsif rising_edge(clock) then
      q <= d;
    end if;
    wait on clock, reset;
  end process;

VHDL2008 führte das Schlüsselwort all in Sensitivitätslisten ein. Es entspricht allen Signalen, die irgendwo im Prozess gelesen werden . Es ist besonders praktisch, unvollständige Sensitivitätslisten zu vermeiden, wenn kombinatorische Prozesse für die Synthese entworfen werden. Beispiel für eine unvollständige Sensitivitätsliste:

  process(a, b)
  begin
    if ci = '0' then
      s  <= a xor b;
      co <= a and b;
    else
      s  <= a xnor b;
      co <= a or b;
    end if;
  end process;

Das ci Signal ist nicht Teil der Sensitivitätsliste, und dies ist sehr wahrscheinlich ein Codierungsfehler, der zu Simulationsfehlanpassungen vor und nach der Synthese führt. Der korrekte Code lautet:

  process(a, b, ci)
  begin
    if ci = '0' then
      s  <= a xor b;
      co <= a and b;
    else
      s  <= a xnor b;
      co <= a or b;
    end if;
  end process;

In VHDL2008 vereinfacht das all Schlüsselwort dies und reduziert das Risiko:

  process(all)
  begin
    if ci = '0' then
      s  <= a xor b;
      co <= a and b;
    else
      s  <= a xnor b;
      co <= a or b;
    end if;
  end process;

Warten Sie auf den Zustand

Es ist möglich, die Klauseln on <sensitivity_list> und for <timeout> wegzulassen, wie in:

    wait until CONDITION;

was äquivalent ist zu:

    wait on LIST until CONDITION;

Dabei ist LIST die Liste aller Signale , die in CONDITION . Es ist auch äquivalent zu:

    loop
      wait on LIST;
      exit when CONDITION;
    end loop;

Eine wichtige Konsequenz ist, dass wenn die CONDITION keine Signale enthält, dann:

    wait until CONDITION;

ist äquivalent zu:

    wait;

Ein klassisches Beispiel dafür ist das berühmte:

    wait until now = 1 sec;

Das tut nicht das, was man denken könnte: Da es sich now um eine Funktion und nicht um ein Signal handelt, wird die Ausführung dieser Anweisung für immer unterbrochen.

Warten Sie eine bestimmte Zeit

Wenn Sie nur die Klausel for <timeout> , ist es möglich, eine bedingungslose Wartezeit zu erhalten, die für eine bestimmte Dauer andauert. Dies ist nicht synthetisierbar (keine echte Hardware kann dieses Verhalten so einfach ausführen), wird jedoch häufig zum Planen von Ereignissen und zum Erzeugen von Uhren in einer Testbench verwendet.

In diesem Beispiel wird in der Simulationstestbank ein Takt von 100 MHz mit einem Tastverhältnis von 50% erzeugt, um das zu testende Gerät zu betreiben:

constant period : time := 10 ns;
...
process
begin
   loop
      clk <= '0';
      wait for period/2;
      clk <= '1';
      wait for period/2;
   end loop;
end process;

In diesem Beispiel wird veranschaulicht, wie eine Literaldauerwartung verwendet werden kann, um den Testbench-Stimulus- / Analyseprozess zu sequenzieren:

process
begin
   rst <= '1';
   wait for 50 ns;
   wait until rising_edge(clk); --deassert reset synchronously
   rst <= '0';
   uut_input <= test_constant;
   wait for 100 us; --allow time for the uut to process the input
   if uut_output /= expected_output_constant then
      assert false report "failed test" severity error;
   else
      assert false report "passed first stage" severity note;
      uut_process_stage_2 <= '1';
   end if;
   ...
   wait;
end process;


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow