Forum: FPGA, VHDL & Co. Frage zu Generate


von Dietrich (Gast)


Lesenswert?

Hallo,

wer kann mir sagen, was an diesem Konstrukt falsch ist:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity xyz
5
end xyz;
6
7
architecture beh of xyz is
8
signal ls_ack, ls_sig : std_logic;
9
constant cGenerate : std_logic := '0';
10
begin
11
12
g_GenTest: if cGenerate='0' generate
13
begin
14
p_Test: process(ls_sig)
15
begin
16
  ls_ack <= ls_sig;
17
end process p_Test;
18
19
20
else generate   --** error: near "else" expecting END
21
22
p_Test: process(ls_sig)
23
begin
24
  ls_ack <= not ls_sig;
25
end process p_Test;
26
27
end generate g_GenTest;
28
29
end beh;

Danke für Eure hilfe.

Dietrich

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


Lesenswert?

Falsch ist:
> g_GenTest: if cGenerate='0' generate
Ein if gibt es nur innerhalb eines Prozesses ;-)

Du kannst z.B. nicht einfach process drumrumschreiben, weil es 
innerhalb eines Prozesses auch keinen zweiten Prozess gibt :-/

Du willst offenbar abhängig von einem Generate-Schalter mal den einen 
oder den anderen Prozess synthetisieren?

BTW:
Du wirst z.B. auch Probleme haben, wenn deine Prozesse (p_Test) gleich 
heißen. Machs einfach so, dass die gar keinen Namen haben.

von Roger S. (edge)


Lesenswert?

if ... generate gibts natuerlich, aber kein else generate.

Mach halt zwei if ... generate Bloecke.
Beim zweiten:
1
g_GenTest2: : if cGenerate /= '0' generate

Uebersichtlicher wirds so
1
p_Test: process(ls_sig)
2
begin
3
  if cGenerate='0' then
4
    ls_ack <= ls_sig;
5
  else
6
    ls_ack <= not ls_sig;
7
  end if;
8
end process p_Test;

da cGenerate konstant ist, wird das Ergebnis der Synthese dasselbe sein.

Cheers, Roger

von Dietrich (Gast)


Lesenswert?

Hi Roger,

die Verwendung von zwei separaten Generate-Anweisungen ist natürlich
möglich.

Das Problem bei der Verwendung von else-generate besteht wohl darin, 
dass man dem else Zweig kein eigenes Generate-Label bzw. Namen geben 
kann. Ähnliches Problem wahrscheinlich bei elsif-generate Anweisungen.
Interessanterweise sind diese if-elsif-else-generate Anweisungen in 
Ashenden's "A designer's guide to VHDL, 3rd edition" aufgeführt. 
Wahrscheinlich werden sie noch nicht unterstützt, vielleicht mit VHDL 
2008 ...

Dietrich

von Dietrich (Gast)


Lesenswert?

@ Lothar
>Ein if gibt es nur innerhalb eines Prozesses ;-)

Das stimmt so natürlich nicht, da es bedingte Generate-Anweisungen gibt.

Dietrich

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


Lesenswert?

Dietrich wrote:
> @ Lothar
> Das stimmt so natürlich nicht, da es bedingte Generate-Anweisungen gibt.
Ja, ich hatte da wohl eine Leseschwäche  :-o

von Micha Frank (Gast)


Lesenswert?

Dietrich hat recht. In Peter J. Ashendens Designers Guide sthet auf S 
459, dass VHDL-87, -93 und 2002 keine elsif oder else generate 
unterstützen.
Da meines Wissens nach kein Synthesetool VHDL 2008 unterstützt, bleibt 
wohl nur die Alternative wie sie Roger vorgeschlagen hat.

Micha

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.