Forum: FPGA, VHDL & Co. negation in der port map


von guest (Gast)


Lesenswert?

Hi,

ich erhalte beim kompilieren folgende Fehlermeldung die sich auf eine 
Negation (CI in der Instanz AND1) in einer port map bezieht:

"Actual (prefix expression) for formal "input1" is not a globally static 
expression."

Kann mal kurz einer erklären wo genau das Problem liegt?
1
component GATES_AND
2
    generic(HL : time;
3
            LH : time);
4
    port(INPUT1 : in  std_logic;
5
         INPUT2 : in  std_logic;
6
         OUTPUT : out std_logic);
7
end component;
8
9
for all : GATES_AND use entity ORDNER.AND2 (BEHAVIORAL)
10
    generic map(1 ps, 1 ps)
11
    port map(INPUT1, INPUT2, OUTPUT);
12
13
AND1 : GATES_AND generic map(1 ps, 1 ps)         
14
                 port map (not CI, B, AND_TMP1);

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


Lesenswert?

> Kann mal kurz einer erklären wo genau das Problem liegt?
Das sagt die Meldung. Such mal hier im Forum nach dem Begriff "globally 
static" und "locally static"...

Der Workaround: nimm ein Signal und weise dem den invertierten Wert zu, 
und übergib dann dieses Signal in der Portliste.

von guest (Gast)


Lesenswert?

Hi,

Die negation der Signale vor der Zuweisung in der Port Map hatte ich 
bereits verwendet, wollte es nur gerne kompakter haben, daher die Frage 
nach der Interpretation der Fehlermeldung.

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


Lesenswert?

> daher die Frage nach der Interpretation der Fehlermeldung.
Dort ist es ein wenig ausführlicher erklärt:
http://www.vhdl.org/comp.lang.vhdl/FAQ1.html#static

> wollte es nur gerne kompakter haben,
VHDL ist eine geschwätzige Sprache.

von SuperWilly (Gast)


Lesenswert?

Das sollte gehen:
1
port map ("not" (CI), B, AND_TMP1);

Gruß,
SuperWilly

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


Lesenswert?

> Das sollte gehen:...
Mit welcher Toolchain?
Was ist der Hintergrund?
Warum sind solche Syntaxverknotungen nötig?

von guest (Gast)


Lesenswert?

Danke soweit,

> Dort ist es ein wenig ausführlicher erklärt:
>http://www.vhdl.org/comp.lang.vhdl/FAQ1.html#static

Dort wurden globally und locally static expressions eigentlich gut 
erklärt, jedoch begreif ich nicht wirklich warum die Auswertung von "not 
CI" in der Port Map nicht als globally static gesehen wird.
Laut Definition:
"globally static expression: An expression that can be evaluated as soon 
as the design hierarchy in which it appears is elaborated."

Letztendlich kann die evaluation des Ausdrucks "not CI" doch 
durchgeführt werden wenn das gesamte Desing in dem sich CI befindet vom 
Compiler bearbeitet wurde.

>Das sollte gehen:
>port map ("not" (CI), B, AND_TMP1);

Das geht in der Tat, jedoch wüsste ich auch gerne was der Grund für 
dieses Konstrukt ist bzw. warum es funktioniert.
Eine Lösung hatte ich allerdings bereits, sprich Signale in der 
architecture angelegt und vor Nutzung in der Port Map negiert.

von SuperWilly (Gast)


Lesenswert?

Konvertierungen in "Port Maps" sind erlaubt, müssen jedoch als 
Funktionsaufrufe implementiert sein.
Laut dem IEEE-VHDL-LRM müssen diese Konvertierungsfunktionen "globally 
static" sein, folgende Eigenschaften müssen vorhanden sein:

"A function call whose function name denotes a pure function and whose 
actual parameters are each globally static expressions"

Gruß,
SuperWilly

von Duke Scarring (Gast)


Lesenswert?

SuperWilly schrieb:
> Konvertierungen in "Port Maps" sind erlaubt, müssen jedoch als
> Funktionsaufrufe implementiert sein

Sowas wird leider von den Tools auch unterschiedlich betrachtet :-/
1
module_inst: modul
2
  port map(
3
    clk                => clk,
4
    reset              => reset,
5
    data_in            => std_logic_vector(data), -- geht in XST + Modelsim
6
    unsigned(data_out) => result                  -- geht nur in Modelsim
7
  );

Duke

von SuperWilly (Gast)


Lesenswert?

Dass Hersteller sich nicht an das IEEE-VHDL-LRM halten, ist ja nichts 
Neues ;O)

Gruß,
SuperWilly

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.