Zoeken…


Syntaxis

  • wacht [op SIGNAL1 [, SIGNAL2 [...]]] [tot CONDITION] [voor TIMEOUT];
  • wacht; - Eeuwig wachten
  • wacht op s1, s2; - Wacht tot signalen s1 of s2 (of beide) veranderen
  • wacht tot s1 = 15; - Wacht tot signaal s1 verandert en de nieuwe waarde 15 is
  • wacht tot s1 = 15 gedurende 10 ns; - Wacht tot signaal s1 verandert en de nieuwe waarde maximaal 15 ns is

Eeuwig wachten

De eenvoudigste vorm van wait is eenvoudig:

wait;

Wanneer een proces dit uitvoert, wordt het voor altijd opgeschort. De simulatieplanner zal deze nooit meer hervatten. Voorbeeld:

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;

Gevoeligheidslijsten en wachtafspraken

Een proces met een gevoeligheidslijst kan ook geen wachtinstructies bevatten. Het is gelijk aan hetzelfde proces, zonder een gevoeligheidslijst en met nog een laatste verklaring die is:

wait on <sensitivity_list>;

Voorbeeld:

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

is gelijk aan:

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

VHDL2008 introduceerde het all keyword in gevoeligheidslijsten. Het is gelijk aan alle signalen die ergens in het proces worden gelezen . Het is vooral handig om onvolledige gevoeligheidslijsten te vermijden bij het ontwerpen van combinatorische processen voor synthese. Voorbeeld van onvolledige gevoeligheidslijst:

  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;

het ci signaal maakt geen deel uit van de gevoeligheidslijst en dit is zeer waarschijnlijk een coderingsfout die zal leiden tot simulatiemismatches voor en na de synthese. De juiste code is:

  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 vereenvoudigt het all keyword dit en vermindert het risico:

  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;

Wacht tot conditie

Het is mogelijk om de clausules on <sensitivity_list> en for <timeout> , zoals in:

    wait until CONDITION;

wat overeenkomt met:

    wait on LIST until CONDITION;

waarbij LIST de lijst is van alle signalen die in CONDITION verschijnen. Het is ook gelijk aan:

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

Een belangrijk gevolg is dat als de CONDITION geen signalen bevat, dan:

    wait until CONDITION;

is gelijk aan:

    wait;

Een klassiek voorbeeld hiervan is het beroemde:

    wait until now = 1 sec;

dat doet niet wat men zou kunnen denken: zoals now een functie is, geen signaal, schorst het uitvoeren van deze verklaring het proces voor altijd.

Wacht een specifieke duur

met alleen de clausule for <timeout> is het mogelijk om een onvoorwaardelijke wachttijd te krijgen die een specifieke duur duurt. Dit is niet synthetisch (geen echte hardware kan dit gedrag zo eenvoudig uitvoeren), maar wordt vaak gebruikt voor het plannen van gebeurtenissen en het genereren van klokken binnen een testbank.

Dit voorbeeld genereert een 100 MHz, 50% duty cycle-klok in de simulatietestbank voor het besturen van de geteste eenheid:

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

Dit voorbeeld laat zien hoe men een letterlijke wachttijd zou kunnen gebruiken om het testbankstimulatie- / analyseproces te sequencen:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow