Forum: FPGA, VHDL & Co. Konstante aus einem generischen Array bilden


von Matthias G. (mgottke)


Lesenswert?

In einer Bibliothek habe ich folgendes Typ deklariert:
1
   type integer_array is array ( natural range <>) of integer;
In einem zugehörigen Modul sollen hierüber eine unterschiedliche Anzahl 
an Parametern übergeben werden. Innerhalb des Moduls benötige ich aber 
z.B. als Konstante die Summe aus den Parametern. Also Konstante = Summe 
aus 1 bis n von den Einzelparametern.
1
entity testdesign is
2
generic
3
(
4
   array_lenght   : positive
5
);
6
port
7
(
8
   integer_list   : in integer_array(1 to array_lenght);
9
   ...
10
);
11
end testdesign ;
12
architecture behavior of testdesign is
13
   constant sum_of_integer_list : integer := ? -- Hier soll folgende Summe hin:
14
                                               -- Summe(i = 1 to array_lenght) aus integer_list(i)
15
   ...
16
   begin
17
   ...
18
end behavior;
Wir kann ich das lösen?

Gruß Matthias

von Ottmar (Gast)


Lesenswert?

Mit Konstanten geht das nicht. Diese müssen zur compile-zeit statisch 
sein. Ports sind per definition nicht statisch.

Lösungsansatz:
Anstatt einer Konstante ein Signal verwenden und die Werte aus der 
integer_list in einer for schleife aufaddieren.

Gruß,
Ottmar

von Matthias G. (mgottke)


Lesenswert?

> Lösungsansatz:
> Anstatt einer Konstante ein Signal verwenden und die Werte aus der
> integer_list in einer for schleife aufaddieren.

Geht leider nicht, da ich aus der Zahl ein weiteres array bauen muss, 
das in seiner Größe von der Zahl abhängt. In dem übergeordneten Modul 
sind alle Werte an dem Eingang konstant.

> Mit Konstanten geht das nicht. Diese müssen zur compile-zeit statisch
> sein. Ports sind per definition nicht statisch.

Ja stimmt, habe ich übersehen. Geht das eigentlich, dass ich die Zeile 
in die generics mit legen, so dass ein Generic vom andern abhängig ist? 
Und wenn ja, gibt es dann dafür eine Lösung? Also etwa so:
1
entity testdesign is
2
generic
3
(
4
   array_lenght   : positive;
5
   integer_list   : in integer_array(1 to array_lenght)
6
);
7
port (   ...  );
8
end testdesign ;
9
architecture behavior of testdesign is
10
   constant sum_of_integer_list : integer := ? -- Hier soll folgende Summe hin:
11
                                               -- Summe(i = 1 to array_lenght) aus integer_list(i)
12
   ...
13
   begin
14
   ...
15
end behavior;

Gruß Matthias

von Matthias G. (mgottke)


Lesenswert?

Das im vorigen Beitrag geht nicht, da generics nicht in der selben Liste 
genutzt werden können.
So nun bin ich aber ein bisschen weiter gekommen. So sieht es jetzt aus:
1
entity testdesign is
2
generic
3
(
4
   integer_list : in integer_array
5
);
6
port (   ...  );
7
end testdesign ;
8
architecture behavior of testdesign is
9
   constant array_lenght        : positive := integer_array'high;
10
   constant sum_of_integer_list : integer  := ? -- Hier soll folgende Summe hin:
11
                                                -- Summe(i = 1 to array_lenght) aus integer_list(i)
12
   type sl_array is array (0 to (sum_of_integer_list - 1)) of std_logic;
13
   ...
14
   begin
15
   ...
16
end behavior;
Allerdings fehlt mir immer noch eine Lösung um die Summe heraus zu 
bekommen.
Jetzt wir auch deutlich, warum ich die Summe als Konstante brauche.

von Ottmar (Gast)


Lesenswert?

Muss denn die integer_list wirklich eine variable länge haben oder 
könnte man sie nicht auch auf die größte länge festlegen und unbenutzte 
listenelemente mit 0 belegen? Dadurch wäre die konstantenberechnung ein 
fester ausdruck. Mehr "programmiersprache" ist im deklarationsteil einer 
architecture nicht möglich.

Gruß,
Ottmar

von Matthias G. (mgottke)


Lesenswert?

> Muss denn die integer_list wirklich eine variable länge haben ...

Ja, muss es. Derzeit behelfe ich mir dadurch, dass ich die Summe als 
zweiten generic habe und dafür parallel zur Integerliste manuell die 
Konstanten der Liste auserhalb des Moduls durchführe.
Das ist etwas unschön, zumal man die Konstanten an zwei Stellen pflegen 
muss.

In wirklichkeit ist das ganze noch ein bisschen komplizierter. Das 
Beispiel ist lediglich eine vereinfachte Darstellung meines 
tatsächlichen Moduls.

Danke für die Antwort, Gruß Matthias

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.