www.mikrocontroller.net

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


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ope (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ope (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Martin (Gast)
Datum:

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

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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')"?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ope (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Xenu: yep, hast Recht; immer diese Ausnahmen ;-) ich bezog wait nur auf
zeitl. Dinge.
 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.