if-Abfrage innerhalb eines generate-Blocks, was ist falsch?

Gast #2035800
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!!
1
  rts : for m in 0 to SPI_NUMBER-1 generate
2
    rts_master_ar_s(m) <= RTS_MASTER_AR(m);
3

4
    if state = CONVERT and spi_byte_cnt /= 0 then
5
      SS_MASTER_AR(m) <= ss_trans_ar_s(m);
6
    else
7
      SS_MASTER_AR(m) <= ss_master_ar_s(m)(2) & convst_s & ss_master_ar_s(m)(0);
8
      --SS_MASTER_AR(1) <= ss_master_ar_s(1)(2) & convst_s & ss_master_ar_s(1)(0);
9
    end if;
10
  end generate;

Und die Fehlermeldungen:
1
# Error: COMP96_0329: interface.vhd : (144, 3): Generate statement must have a label.
2
# Error: COMP96_0019: interface.vhd : (144, 44): Keyword 'generate' expected.
3
# Error: COMP96_0019: interface.vhd : (146, 3): Keyword 'end' expected.
4
# Error: COMP96_0015: interface.vhd : (149, 7): ';' expected.
5
# Error: COMP96_0016: interface.vhd : (149, 9): Design unit declaration expected.
Gast
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.
Gast
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
Gast
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.htm#pgfId-1007414

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

Active-HDL sagt aber:
1
# 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.
Moderator (Firma: Titel) Persönliche Seite
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...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.