Forum: FPGA, VHDL & Co. if-then anweisung


von Björn (Gast)


Lesenswert?

if rising_edge (mac_clk_in) then
if start_button <= '1' then
if counter_index := '1' then
counter_index := counter_index + 1;
dat_send <= dat_send_complete(counter_index);
elsif counter_index := '2' then
counter_index := counter_index + 1;
dat_send <= dat_send_complete(counter_index);

elsif counter_index := '3' then
counter_index := counter_index + 1;
dat_send <= dat_send_complete(counter_index);

elsif counter_index := '4' then
counter_index := counter_index + 1;
dat_send <= dat_send_complete(counter_index);
end if;
-----------
ERROR:HDLParsers:164 - "D:/Programme/Xilinx92i/EIA-232/MAC.vhd" Line 30. 
parse error, unexpected AFFECT, expecting THEN
ERROR:HDLParsers:164 - "D:/Programme/Xilinx92i/EIA-232/MAC.vhd" Line 34. 
parse error, unexpected AFFECT, expecting THEN
ERROR:HDLParsers:164 - "D:/Programme/Xilinx92i/EIA-232/MAC.vhd" Line 38. 
parse error, unexpected AFFECT, expecting THEN
ERROR:HDLParsers:164 - "D:/Programme/Xilinx92i/EIA-232/MAC.vhd" Line 42. 
parse error, unexpected AFFECT, expecting THEN
ERROR:HDLParsers:164 - "D:/Programme/Xilinx92i/EIA-232/MAC.vhd" Line 47. 
parse error, unexpected IF, expecting PROCESS
-----------------------


ich bin absoulter Anfäner und kann mir die Fehler nicht erklären

von Jan M. (mueschel)


Lesenswert?

<= ist eine Zuweisung an ein Signal
:= ist eine Zuweisung an eine Variable (*)
= ist ein Vergleich


(*) als "absoulter Anfäner" solltest du erst einmal einen Bogen um 
Variablen machen - in Hardware gibt es nur Signale.

von Björn (Gast)


Lesenswert?

ERROR:HDLParsers:808 - "D:/Programme/Xilinx92i/EIA-232/MAC.vhd" Line 30. 
<= can not have such operands in this context.
ERROR:HDLParsers:164 - "D:/Programme/Xilinx92i/EIA-232/MAC.vhd" Line 34. 
parse error, unexpected AFFECT, expecting THEN
ERROR:HDLParsers:808 - "D:/Programme/Xilinx92i/EIA-232/MAC.vhd" Line 38. 
<= can not have such operands in this context.
ERROR:HDLParsers:409 - "D:/Programme/Xilinx92i/EIA-232/MAC.vhd" Line 39. 
Signal 'counter_index' counter_index is at left hand side of variable 
assignment statement.
ERROR:HDLParsers:808 - "D:/Programme/Xilinx92i/EIA-232/MAC.vhd" Line 42. 
<= can not have such operands in this context.
ERROR:HDLParsers:409 - "D:/Programme/Xilinx92i/EIA-232/MAC.vhd" Line 43. 
Signal 'counter_index' counter_index is at left hand side of variable 
assignment statement.

dann kommt das. und ursprünglich wollte ich die anweisungen so 
schreiben:
if rising_edge (clk) AND (siganlA < signalB < 10) OR (signal A /= 11)
warum geht soche zuweisungen nicht?

von G.. (Gast)


Lesenswert?

In den
1
if then elsif
 Anweisungen darfst du nicht mit ":=" abfragen, sondern nur mit "=".
Vergleiche wie siga < sigb < 10 gehen in VHDL nicht. Es ist kein C !!

von Björn (Gast)


Lesenswert?

Die erfahrung das es < nicht geht abe ich auhc gemacht. Laut meinem Buch 
geht es aber. Mit besonderem verweis das es gerade bei if anweisungen 
geht

von Jan M. (mueschel)


Lesenswert?

Vergleiche sind durchaus moeglich, je nach eingebundenen Paketen auch 
mit std_logic_vector:

   if signal <= '1' then

Auch '0' erfuellt dann natuerlich die Bedingung - hat mir schon ein paar 
Fehlersuchen eingebracht, wie schnell ist so ein < getippt...

In VHDL kann man im Gegensatz zu C aber immer nur einen Vergleich in 
einem statement schreiben. In Hardware sollte man darauf aber 
verzichten, da der Ressourcenbedarf sehr hoch ist.

von die ??? (Gast)


Lesenswert?

Mal abgesehen von den oben besprochenen Sachen. Ich zähle drei "if"'s, 
aber nur ein "end if".
1
if rising_edge(mac_clk_in) then
2
  if start_button = '1' then
3
    if counter_index = '1' then
4
      counter_index := counter_index + 1;
5
      dat_send <= dat_send_complete(counter_index);
6
    elsif counter_index = '2' then
7
      counter_index := counter_index + 1;
8
      dat_send <= dat_send_complete(counter_index);
9
    elsif counter_index = '3' then
10
      counter_index := counter_index + 1;
11
      dat_send <= dat_send_complete(counter_index);
12
    elsif counter_index = '4' then
13
      counter_index := counter_index + 1;
14
      dat_send <= dat_send_complete(counter_index);
15
    end if;
16
  end if;
17
end if;

von die Sonne (Gast)


Lesenswert?

Schreit das nicht nach case?

von Björn (Gast)


Lesenswert?

Problem ist gelöst. DANKE

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.