Forum: FPGA, VHDL & Co. Wait wird nicht unterstützt


von Martin (Gast)


Lesenswert?

Hallo Leute!

Ich habe im Buch VHDL-Synthese folgendes Beispiel:
...
...
shift_full: process
begin
   for i in shw downto 1 loop
       temp(i-1)<='0';
   end loop;
   wait;
end process shift_full;
...
...

Laut Buch erzeugt dieser Prozess ein temporäres Signal TEMP,
welches nur Nullen enthält. So wie ich das verstanden habe,
sollen diesem Signal zwecks Initialisierung Nullen zugewiesen werden.
Danach soll der Prozess einfach stehenbleiben und nicht
mehr durchlaufen.

Doch das Synthesize-Werkzeug hat etwas dagegen und meldet folgendes:
Error: Bad condition in wait statement, or only one clock per process.

Warum funktioniert das nicht, so wie es im Beispiel angegeben ist
und wie kann man dies umgehen?
Ich benutze die XILINX-Umgebung 7.1i

Bitte helft mir.

Tschüss
Martin

B

von ope (Gast)


Lesenswert?

Imo ist der Auszug oben richtig, bei Erreichen des wait statements (und
Abarbeitung der Schleife) sollte er stehen bleiben. Da dort keine
Kondition steht, muss der Fehler an anderer Stelle sein. Richtige
Zeilen Nummer des Fehlers erwischt?

shw und temp sind signale, diese sind irgendwo in der architecture
bereits deklariert. D.h. von "Laut Buch erzeugt dieser Prozess ein
temporäres Signal TEMP" kann keine Rede sein. I.A. initialisert man
seine Signale it sinnvollen Werten.

Die Schleife wird in Hardware (parallel) durch das Simu/Synthese Tool
gewandelt, auch wenn Du es sequentiell schreibst. Die Processe werden
ebenfalls parallel ausgeführt, auch wenn Du sie ebenfalls seq.
schreibts - immer im Hinterkopf behalten, Du beschreibst ein "TTL
Grab" Hardware.

Kann es sein, dass Du uns nicht alles gezeigt hast?

Viele Grüße
Olaf

von ope (Gast)


Lesenswert?

oops, wer lesen kann ist klar im Vorteil.

Bei der Synthese gibt es kein wait! Nur in der Simu. Also Modelsim
anwerfen!

Viele Grüße
Olaf

von Martin (Gast)


Lesenswert?

Das lustige dabei ist, dass der Autor aber von Synthese schreibt:
Dieses interne Signal (temp) wird während der Synthese heraus
optimiert, da die Schiebeweite ein statischer Wert ist und die Anzahl
der hineinzuschiebenden Nullen somit feststeht. In diesem Sinne ist die
Empfindlichkeitsliste völlig ohne Bedeutung, sodass diese weggelassen
wurde.

Tschüss, Martin

von Xenu (Gast)


Lesenswert?

>Bei der Synthese gibt es kein wait!

Freilich gibt es das, hier z.B. ein Flip-Flop:


process
begin

  wait until rising_edge(clk);
    reg <= data_in;

end process;

von Martin (Gast)


Lesenswert?

Ich weiß, das wait until funktioniert auch, aber dieses wait am Schluss
eben nicht.

von Xenu (Gast)


Lesenswert?

>Ich weiß, das wait until funktioniert auch, aber dieses wait am
Schluss
>eben nicht.

Ich habe ja auch auf opes Beitrag geantwortet, und nicht auf Deinen.

Ich verstehe Dein Problem auch nicht ganz, was genau willst Du denn
eigentlich machen?

Wenn Du eine Signal mit lauter Nullen willst, wieso schreibst Du dann
nicht einfach "temp <= (others => '0')"?

von Martin (Gast)


Lesenswert?

Das ist eine gute Frage.
Keine Ahnung, warum das der Autor in diesem Buch so umständlich macht.
Aber danke, das ist ein guter Denkanstoß.
Zur Info stelle ich hier mal das ganze Programm rein, so wie es im Buch
steht:

-- Parametrisiertes Scheiberegister
entity param is
generic(width:natural:=4;  -- Registerbreite
shw : natural := 2); -- Schiebeweite
port(clk,load,r_l: in bit;
din : in bit_vector(width-1 downto 0);
yout:out bit_vector(width-1 downto 0));
end param;

architecture Behavioral of param is
signal yint:bit_vector(width-1 downto 0);
signal temp:bit_vector(shw-1 downto 0);
begin

shift_full: process
begin
     for i in shw downto 1 loop
       temp(i-1) <='0';
      end loop;
        wait;
end process shift_full;

syn_shift: process (clk)
begin
   if clk='1' and clk'event then
     if load='1' then yint <= din;
    elsif r_l='0' then     -- links schieben
        yint<=yint(width-1-shw downto 0) & temp;
    else  -- rechts schieben
       yint<=temp&yint(width-1 downto shw);
      end if;
    end if;
end process syn_shift;
yout<=yint;

end Behavioral;

Gruß, Martin

von ope (Gast)


Lesenswert?

@Xenu: yep, hast Recht; immer diese Ausnahmen ;-) ich bezog wait nur auf
zeitl. Dinge.
1
 wait until rising_edge(clk);
 und [vhdl] if
risinge_edge(clk) then ...[vhdl] sind gleichwertig. Wie so vieles in
VHDL gleichwertige Konstrukte hat, frei nach dem Motto: Viele Wege
führen nach Rom.

Viele Grüße
Olaf

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.