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


von noips (Gast)


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!!
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.

von noips (Gast)


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.

von D. I. (Gast)


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

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


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...

von noips (Gast)


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.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.

von Klaus F. (kfalser)


Lesenswert?

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

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


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...

von noips (Gast)


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!!!

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.