Konstante aus einem generischen Array bilden

OP #1196669
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
Gast #1196712
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
OP #1196964
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
OP #1197292
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.
Gast #1198223
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
OP #1198259
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

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