www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Fehler im VHDL-Code (Anfängerfrage)


Autor: Stefan K. (stefan82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuche mich gerade in VHDL einzuarbeiten.
Habe dafür zunächst einmal das Tutorial von ISE 10.1 durch gearbeitet 
und Versuche nun mich mit ISE und ein Paar Simulationen erst mal so mit 
den Grundprinzipien vertraut zu machen.

Aktuelles Problem liegt darin, das mir der Compiler die Syntax im 
folgenden Code mit einem "parse error, unexpected IF" als Falsch 
ankreidet.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity DFF is  

port (
      CLK : in STD_LOGIC;
      D : in  STD_LOGIC;
      RST : in  STD_LOGIC;
      Q : out  STD_LOGIC
     );

end DFF;

architecture Behavioral of dff is

begin 
 process (CLK)               
  if RST='1'then    -- !!Hier wird der Fehler gemeldet
    Q <='0';
   else if RISING_EDGE(CLK) THEN
     Q <= D;
   end if;
  end if;
 end process;

end Behavioral;


Leider finde ich keine Begrüdung warum die if-Abfrage so nicht möglich 
sein soll. Wäre nett mir da jemand einen Hinweis geben könnte.

Gruß,

Stefan

P.S.: Hoffe mal ich hab bei meiner Suche im Forum nichts übersehen.

Autor: Nephilim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das problem lieht ein klein wenig tiefer.

das "ELSE IF" muss "ELSEIF" heissen.

Autor: Stefan K. (stefan82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Nephilim!

sry...

aber "elseif" meckert mir ISE als "undefined symbol" an.
ISE fragt nach ob es evtl. als "elsif" gemeint ist. Diese Schreibweise 
wird zwar im Gegensatz zu "elseif" als vhdl Syntax erkannt behebt aber 
leider den Fehler des unexpected if nicht.

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du elsif benutzt, muss natuerlich auch noch eines der "end if;" 
weg.
Und das "begin" vom process fehlt auch noch.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> process (CLK)
Und schon wieder einer  ;-)
Seisitivity-List ist unvollständig. Da gehört RST auch mit rein.

> ELSEIF
ELSIF

EDIT:
Edit --> Language Templates... -->
VHDL --> Synthesis Constructs --> Processes
findest du Vorlagen, die funktionieren.

Autor: Stefan K. (stefan82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das eine
 end if; 
 hab ich nun auch raus genommen, bringt aber leider ebenso keine 
Abhilfe. Stellt es ein Problem dar, das der Prozess mit dieser 
If-Anweisung quasi abhängig von RST wird?

Hab grade folgendes probiert:
architecture Behavioral of dff is

begin 
 process (CLK,RST)               
  if RST='1'then    -- !!Hier wird der Fehler gemeldet
    Q <='0';
   else if RISING_EDGE(CLK) THEN
     Q <= D;
   end if;
  end if;
 end process;

end Behavioral;

bringt aber auch keine Änderung.

In einem Tutorial hab ich folgendes gefunden:
process (clk;rst; ...;) 

Aber dabei meckert er mir die Semikola in der Liste an. Daher hab ich 
sie durch Kommata ersetzt.

Autor: Stefan K. (stefan82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Und schon wieder einer  ;-)
> Seisitivity-List ist unvollständig. Da gehört RST auch mit rein.

Dann müßte ich also auch D mit einbringen, oder?

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ich oben schrieb:
>>Und das "begin" vom process fehlt auch noch.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Dann müßte ich also auch D mit einbringen, oder?
Nein, D wird nur abgefragt, wenn sich CLK ändert,
und dann wird der Prozess eh' schon wegen der Änderung von CLK 
durchgerechnet.
 process (CLK,RST)   BEGIN  ---<<<<<<<<< beginnen wir den Prozess mal
  if RST='1'then    -- !!Hier wird der Fehler gemeldet
    Q <='0';
  elsif RISING_EDGE(CLK) THEN  ---<<< ELSIF nicht ELSEIF oder ELSE IF
     Q <= D;
--  end if;  -----<<<< zuviel! schöner einrücken, dann sieht man das  :-/
  end if;            
 end process;

Autor: Stefan K. (stefan82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE für die schnelle Hilfe!
 ...
Der Fehler lag im fehlenden "begin", was ich im Eiffer des Gefechts bei 
Jans Post überlesen habe.
Den Rest werd ich dann auch noch mal durchprobieren und mich mit den 
Templates beschäftigen.

DANKE & Gruß

Stefan

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller wrote:
> --  end if;  -----<<<< zuviel! schöner einrücken, dann sieht man das
>   end if;
Nicht unbedingt zu viel, aber die Codierung ist eher ungewöhnlich, denn 
es fehlte wirklich nur das begin und die unvollständige 
Senitivity-Liste. Denn:
process (CLK,RST)
begin
   if RST='1'then
      Q <='0';
   else if rising_edge(CLK) then -- hier stehen zwei Statements: "else"
                                 -- und "if .. then"
         Q <= D;
      end if;
   end if;            
end process;
Gleichbedeutend mit folgendem Code, nur besser lesbar:
process (CLK,RST)
begin
   if RST='1'then
      Q <='0';
   else
      if rising_edge(CLK) then
         Q <= D;
      end if;
   end if;            
end process;
Synthetisiert habe ich so was allerdings noch nicht!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> aber die Codierung ist eher ungewöhnlich,...
Richtig, jetzt sehe ich das auch.

> Synthetisiert habe ich so was allerdings noch nicht!
Habe es mal schnell ausprobiert: geht problemlos.
Trotzdem ab damit in die Kuriositätensammlung ;-)

Autor: ajax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum braucht man eigentlich das Schlüselwort "process"? Kann es sein, 
es bei allen Strukturen, die ein Speicherelement ( D-FF ) benötigen 
verwendet werden muss?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Schlüselwort "process"?
braucht man für sequentielle Beschreibungen. Innerhalb eines Prozesses 
gibt es andfere Beschreibungsmöglichkeiten als ausserhalb (concurrent).
Ein if und ein case gibt es nur in einem Prozess.

Autor: Stefan K. (stefan82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin zusammen!

>> Synthetisiert habe ich so was allerdings noch nicht!
> Habe es mal schnell ausprobiert: geht problemlos.
> Trotzdem ab damit in die Kuriositätensammlung ;-)

Ist ja auch nur ein Programmierbeispiel aus einem Howto gewesen, mit dem 
ich versucht hab die Quelltext-Struktur und dieses ISE Dingen ein wenig 
besser kennenzulernen :) ...

Größere Sachen kommen dann später... dann pack ich vllt. noch ein ANd 
dazu ;-) ...

Thx and cu

Stefan

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls ichs überlesen hab:

"else if" oder "elsif"



VG,
/th.

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.