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


von Stefan K. (stefan82)


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.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
---- Uncomment the following library declaration if instantiating
7
---- any Xilinx primitives in this code.
8
--library UNISIM;
9
--use UNISIM.VComponents.all;
10
11
entity DFF is  
12
13
port (
14
      CLK : in STD_LOGIC;
15
      D : in  STD_LOGIC;
16
      RST : in  STD_LOGIC;
17
      Q : out  STD_LOGIC
18
     );
19
20
end DFF;
21
22
architecture Behavioral of dff is
23
24
begin 
25
 process (CLK)               
26
  if RST='1'then    -- !!Hier wird der Fehler gemeldet
27
    Q <='0';
28
   else if RISING_EDGE(CLK) THEN
29
     Q <= D;
30
   end if;
31
  end if;
32
 end process;
33
34
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.

von Nephilim (Gast)


Lesenswert?

das problem lieht ein klein wenig tiefer.

das "ELSE IF" muss "ELSEIF" heissen.

von Stefan K. (stefan82)


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.

von Jan M. (mueschel)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Stefan K. (stefan82)


Lesenswert?

das eine
1
 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:
1
architecture Behavioral of dff is
2
3
begin 
4
 process (CLK,RST)               
5
  if RST='1'then    -- !!Hier wird der Fehler gemeldet
6
    Q <='0';
7
   else if RISING_EDGE(CLK) THEN
8
     Q <= D;
9
   end if;
10
  end if;
11
 end process;
12
13
end Behavioral;

bringt aber auch keine Änderung.

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

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

von Stefan K. (stefan82)


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?

von Jan M. (mueschel)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.
1
 process (CLK,RST)   BEGIN  ---<<<<<<<<< beginnen wir den Prozess mal
2
  if RST='1'then    -- !!Hier wird der Fehler gemeldet
3
    Q <='0';
4
  elsif RISING_EDGE(CLK) THEN  ---<<< ELSIF nicht ELSEIF oder ELSE IF
5
     Q <= D;
6
--  end if;  -----<<<< zuviel! schöner einrücken, dann sieht man das  :-/
7
  end if;            
8
 end process;

von Stefan K. (stefan82)


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

von Matthias G. (mgottke)


Lesenswert?

Lothar Miller wrote:
1
> --  end if;  -----<<<< zuviel! schöner einrücken, dann sieht man das
2
>   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:
1
process (CLK,RST)
2
begin
3
   if RST='1'then
4
      Q <='0';
5
   else if rising_edge(CLK) then -- hier stehen zwei Statements: "else"
6
                                 -- und "if .. then"
7
         Q <= D;
8
      end if;
9
   end if;            
10
end process;
Gleichbedeutend mit folgendem Code, nur besser lesbar:
1
process (CLK,RST)
2
begin
3
   if RST='1'then
4
      Q <='0';
5
   else
6
      if rising_edge(CLK) then
7
         Q <= D;
8
      end if;
9
   end if;            
10
end process;
Synthetisiert habe ich so was allerdings noch nicht!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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 ;-)

von ajax (Gast)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Stefan K. (stefan82)


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

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Falls ichs überlesen hab:

"else if" oder "elsif"



VG,
/th.

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.