Wait wird nicht unterstützt

Gast #297655
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
Gast #297656
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
Gast #297658
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
Gast #297661
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')"?
Gast #297662
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
Gast #297663
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

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