mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Fpga I. (fpga-ing)
Datum:

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

entity testEntity is
  generic(
    gValue1_len : integer := 3;
    gValue2_len : integer := 7;
    gValue3_len : integer := 7;
    gValue4_len : integer := 5;
  );
  port(
    Value1 : in std_logic_vector(gValue1_len - 1 downto 0);
    Value2 : in std_logic_vector(gValue2_len - 1 downto 0);
    Value3 : in std_logic_vector(gValue3_len - 1 downto 0);
    Value4 : in std_logic_vector(gValue4_len - 1 downto 0)
  );
end entity testEntity;

architecture RTL of testEntity is
signal processingValue : std_logic_vector(Maximum(gValue1_len, gValue2_len, gValue3_len, gValue4_len) - 1 downto 0);
begin
[...]
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

Autor: Pat A. (patamat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfach folgende Funktionen definieren:
function max(len1, len2: integer) return integer is
begin
    if (len2 > len1) then
        return len2;
    end if;
    
    return len1;
end function max;

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

(ungetestet, einfach nur runtergeschrieben)

: Bearbeitet durch User
Autor: Markus F. (mfro)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Für die VHDL 2008-Benutzer:

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

Autor: Bonzo (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: Fpga I. (fpga-ing)
Datum:

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

Autor: Christophz (Gast)
Datum:

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

Autor: Markus F. (mfro)
Datum:

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

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.

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