www.mikrocontroller.net

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


Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In einer Bibliothek habe ich folgendes Typ deklariert:
   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.
entity testdesign is
generic
(
   array_lenght   : positive
);
port
(
   integer_list   : in integer_array(1 to array_lenght);
   ...
);
end testdesign ;
architecture behavior of testdesign is
   constant sum_of_integer_list : integer := ? -- Hier soll folgende Summe hin:
                                               -- Summe(i = 1 to array_lenght) aus integer_list(i)
   ...
   begin
   ...
end behavior;
Wir kann ich das lösen?

Gruß Matthias

Autor: Ottmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht 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:
entity testdesign is
generic
(
   array_lenght   : positive;
   integer_list   : in integer_array(1 to array_lenght)
);
port (   ...  );
end testdesign ;
architecture behavior of testdesign is
   constant sum_of_integer_list : integer := ? -- Hier soll folgende Summe hin:
                                               -- Summe(i = 1 to array_lenght) aus integer_list(i)
   ...
   begin
   ...
end behavior;

Gruß Matthias

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht 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:
entity testdesign is
generic
(
   integer_list : in integer_array
);
port (   ...  );
end testdesign ;
architecture behavior of testdesign is
   constant array_lenght        : positive := integer_array'high;
   constant sum_of_integer_list : integer  := ? -- Hier soll folgende Summe hin:
                                                -- Summe(i = 1 to array_lenght) aus integer_list(i)
   type sl_array is array (0 to (sum_of_integer_list - 1)) of std_logic;
   ...
   begin
   ...
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.

Autor: Ottmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.