mikrocontroller.net

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


Autor: Björn (Gast)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

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

Autor: Björn (Gast)
Datum:

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

Autor: G.. (Gast)
Datum:

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

Autor: Björn (Gast)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

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

Autor: die ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal abgesehen von den oben besprochenen Sachen. Ich zähle drei "if"'s, 
aber nur ein "end if".
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;
  end if;
end if;

Autor: die Sonne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreit das nicht nach case?

Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem ist gelöst. DANKE

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.