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

Gast #2035800
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.
Gast #2035831
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
Gast #2035877
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.
Moderator (Firma: Titel) Persönliche Seite #2035914
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren