std_logic_vector länge abhängig von mehreren Generics

OP #5978565
Hallo zusammen,

ich möchte gerne ein Signal definieren, dessen Länge von mehreren 
Generics abhängt. Genaugenommen soll es so lang werden, wie das Maximum 
der Generics. Habt ihr eine Idee, wie ich das direkt implementieren 
kann?
Da ein Code mehr aussagt als tausend Worte, kommt hier ein Beispiel:
1
entity testEntity is
2
  generic(
3
    gValue1_len : integer := 3;
4
    gValue2_len : integer := 7;
5
    gValue3_len : integer := 7;
6
    gValue4_len : integer := 5;
7
  );
8
  port(
9
    Value1 : in std_logic_vector(gValue1_len - 1 downto 0);
10
    Value2 : in std_logic_vector(gValue2_len - 1 downto 0);
11
    Value3 : in std_logic_vector(gValue3_len - 1 downto 0);
12
    Value4 : in std_logic_vector(gValue4_len - 1 downto 0)
13
  );
14
end entity testEntity;
15

16
architecture RTL of testEntity is
17
signal processingValue : std_logic_vector(Maximum(gValue1_len, gValue2_len, gValue3_len, gValue4_len) - 1 downto 0);
18
begin
19
[...]
20
end architecture RTL;

In diesem Fall soll die Länge von processingValue also 7 sein. Habt Ihr 
eine Idee, wie sich das realisieren lässt? Aktuell fällt mir nur der Weg 
über ein zusätzliches Generic gProcessing_len ein, aber das misfällt 
mir, da ich quasi redundante Informationen in meinen Generics habe.
Ich freue mich auf Eure Rückmeldungen.

Vielen Dank
 fpga-ing
#5978605
Einfach folgende Funktionen definieren:
1
function max(len1, len2: integer) return integer is
2
begin
3
    if (len2 > len1) then
4
        return len2;
5
    end if;
6
    
7
    return len1;
8
end function max;
9

10
function Maximum(len1, len2, len3, len4: integer) return integer is
11
begin
12
    return max(max(max(len1, len2), len3), len4);
13
end function Maximum

(ungetestet, einfach nur runtergeschrieben)
Gast #5978951
Markus F. schrieb:
> die Funktionen minimum() und maximum() sind bereits definiert - muss man
> nicht mehr selber machen, nur noch aufrufen.

Entscheidend ist hier wohl, das zunächst in einem ersten Schritt zu tun 
und danach (mit einem "natural"?) als Parameter für den logic_vector an 
die Synthese zu übergeben, statt den Konstrukt in die Definition zu 
schreiben.
OP #5979107
Hallo,

vielen Dank für eure Antworten. Mir war nicht bewusst, dass ich bei der 
Signal Definition bereits Funktionen verwenden kann.
VHDL 2008 kommt im aktuellen Projekt nicht in Frage, aber dennoch gut zu 
wissen, dass ich mir die separate Funktion zukünftig sparen kann.

Die Länge habe ich nun auch auf natural geändert.

Schön, dass Ihr so schnell helfen konntet!
Gast #5988521
Du kannst in synthesefähigem Code sogar noch weitergehen.

Wenn etwas auf Basis mehrerer Generics deklariert/generiert wird kommt 
es oft vor, dass nicht alle Kombinationen gültig/supported sind.

Wie teilt man das dem Benutzer mit?
1. Dokumentation
2. VHDL assert

Auch der Synthesizer behandelt asserts und kann so bei einer illegalen 
Kombination mit Fehler abbrechen (Sinnvollerweise gleich mit nützlicher 
Fehlermeldung).

Wenn aus mehreren Generics Werte ausgerechnet werden, wie z. B. in 
deinem Fall, kann es auch sinnvoll sein, diesen berechneten Wert per 
VHDL report ins Synthesizer Log File auszugeben.
#5988906
Bonzo schrieb:
> Entscheidend ist hier wohl, das zunächst in einem ersten Schritt zu tun
> und danach (mit einem "natural"?) als Parameter für den logic_vector an
> die Synthese zu übergeben, statt den Konstrukt in die Definition zu
> schreiben.

Den Satz habe ich jetzt mindestens fünf Mal gelesen, aber (leider) immer 
noch nicht verstanden???

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.