www.mikrocontroller.net

Forum: FPGA, VHDL & Co. if-Abfrage innerhalb eines generate-Blocks, was ist falsch?


Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

mit dem unten gezeigten Code versuche ich folgendes zu erreichen: 
SS_MASTER_AR ist ein Array von Ausgängen eines Moduls. Wieviele Ausgänge 
es werden sollen, wird durch SPI_NUMBER bestimmt. Was für Signale auf 
diese Ausgänge geschaltet werden, soll davon abhängen in welchem Zustand 
die im Code vorhandene FSM gerade ist. Active-HDL will den Code aber 
nicht kompilieren. Fehlermeldungen folgen unten. Könnte jemand bitte 
einen Blick drüber werfen? Was mache ich da falsch?

Danke für die Hilfe im Voraus!!
  rts : for m in 0 to SPI_NUMBER-1 generate
    rts_master_ar_s(m) <= RTS_MASTER_AR(m);

    if state = CONVERT and spi_byte_cnt /= 0 then
      SS_MASTER_AR(m) <= ss_trans_ar_s(m);
    else
      SS_MASTER_AR(m) <= ss_master_ar_s(m)(2) & convst_s & ss_master_ar_s(m)(0);
      --SS_MASTER_AR(1) <= ss_master_ar_s(1)(2) & convst_s & ss_master_ar_s(1)(0);
    end if;
  end generate;


Und die Fehlermeldungen:
# Error: COMP96_0329: interface.vhd : (144, 3): Generate statement must have a label.
# Error: COMP96_0019: interface.vhd : (144, 44): Keyword 'generate' expected.
# Error: COMP96_0019: interface.vhd : (146, 3): Keyword 'end' expected.
# Error: COMP96_0015: interface.vhd : (149, 7): ';' expected.
# Error: COMP96_0016: interface.vhd : (149, 9): Design unit declaration expected.

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und noch eine Ergänzung:

Zeile 144, die beim 1. Error angegeben ist, ist die Zeile wo
if state = CONVERT and spi_byte_cnt /= 0 then steht, also die 3. Zele im 
gezeigten Code.

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if ist eine sequential anweisung in einer for-generate kann aber nur 
concurrent zeug stehen.

Entweder du schreibst das if in ein concurrent statement um oder du 
schreibst nen process innerhalb des for-generate

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

Bewertung
0 lesenswert
nicht lesenswert
Darf man evtl. kein if im Zusammenhang mit der generate Anweisung 
verwenden?
Oder andersrum: wo kann ein if in VHDL verwendet werden?
Du solltest dein VHDL Buch daraufhin nochmal untersuchen...

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
D. I. schrieb:
> if ist eine sequential anweisung in einer for-generate kann aber nur
> concurrent zeug stehen.

Lothar Miller schrieb:
> Darf man evtl. kein if im Zusammenhang mit der generate Anweisung
> verwenden?

Es gibt Conditional GENERATE Statement 
http://www.vhdl-online.de/tutorial/deutsch/t_246.h...

Ich habe es so versucht:
  rts : for m in 0 to SPI_NUMBER-1 generate
    rts_master_ar_s(m) <= RTS_MASTER_AR(m);
    cond1 : if state = CONVERT and spi_byte_cnt /= 0 generate
      SS_MASTER_AR(m) <= ss_trans_ar_s(m);
    end generate;
    
    cond2 : if not (state = CONVERT and spi_byte_cnt /= 0) generate
      SS_MASTER_AR(m) <= ss_master_ar_s(m)(2) & convst_s & ss_master_ar_s(m)(0);
      --SS_MASTER_AR(1) <= ss_master_ar_s(1)(2) & convst_s & ss_master_ar_s(1)(0);
    end generate;
  end generate;

Active-HDL sagt aber:
# Error: COMP96_0529: interface.vhd : (154, 14): Condition in a generation scheme must be a static expression.
Scheinbar geht es nicht, wenn die Bedingungen variable Signale 
enthalten. Obwohl ich denke, das müsste doch machbar sein. Von den 
Signalen state und spi_byte_cnt hängt hier ja nicht die Anzahl der zu 
generierenden Signale sondern nur ihr Verhalten.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst einen Multiplexer! (und vielleicht ein VHDL Buch :-) )
SS_MASTER_AR(m) <= ss_trans_ar_s(m) when state = CONVERT and spi_byte_cnt /= 0 else
      ss_master_ar_s(m)(2) & convst_s & ss_master_ar_s(m)(0);

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

Bewertung
0 lesenswert
nicht lesenswert
noips schrieb:
> Obwohl ich denke, das müsste doch machbar sein.
Es ist aber von VHDL nicht vorgesehen.
Und darüber hinaus kommt noch dazu, dass etliche Dinge in VHDL sehr 
einfach zu beschreiben sind, aber vom Synthesizer nicht umsetzbar sind 
(oder schlicht ignoriert werden)...

In dem von dir verlinkten Beispiel ist die Condition zur 
Übersetzungszeit statisch.

noips schrieb:
> Ich habe es so versucht:
Mach das doch einfach in einem Prozess mit einer for-Schleife...

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Falser schrieb:
> SS_MASTER_AR(m) <= ss_trans_ar_s(m) when state = CONVERT and spi_byte_cnt  /= 0
> else   ss_master_ar_s(m)(2) & convst_s & ss_master_ar_s(m)(0);

So hat es funktioniert, vielen Dank!

@ alle

Danke für alle Beiträge!!!

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.