Forum: FPGA, VHDL & Co. std_logic_vector länge abhängig von mehreren Generics


von Fpga I. (fpga-ing)


Lesenswert?

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

von Pat A. (patamat)


Lesenswert?

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)

: Bearbeitet durch User
von Markus F. (mfro)


Lesenswert?

Für die VHDL 2008-Benutzer:

die Funktionen minimum() und maximum() sind bereits definiert - muss man 
nicht mehr selber machen, nur noch aufrufen.

von Bonzo (Gast)


Lesenswert?

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.

von Fpga I. (fpga-ing)


Lesenswert?

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!

von Christophz (Gast)


Lesenswert?

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.

von Markus F. (mfro)


Lesenswert?

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???

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.