www.mikrocontroller.net

Forum: FPGA, VHDL & Co. variable portlänge berechnen lassen


Autor: blitzgeist (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich habe folgendes Problem. Ich möchte gerne eine variable Portlänge
(zB Port A in Modul a) erstellen. das Modul a wir in einem
übergeordetem Modul b instatiiert. Bei der Instatiierung habe ich ein
generic zB temp => 17. Über dieses generic soll dann im Modul a die
Portlänge des Ports a berechnet werden (zB: a: in
std_logic_vector(data_in_width-1 downto 0)). Wie ist das zu
realisieren?
Für Infos vielen Dank!
Gruß blitzgeist

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst den Generic in der Portdeklaration verwenden. Also so:
generic (
  temp : natural := 17
  );
port (
  a: in std_logic_vector(temp-1 downto 0)
  ...
  );
Oder was hast du vor?


T.M.

Autor: blitzgeist (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo T.M.,

ja so in etwa, nur dass nun der wert 17 der temp generic BERECHNET
werden soll und nicht einfach als defaultwert (hier 17) angegenben
wird.

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den gültigen Wert gibst du ja von der höher gelegenen Hierarchiebene
mit. Der Defaultwert wird nur benutzt, wenn man bei der Instanziierung
des Moduls keinen angibt. Ich verstehe nicht, was du mit berechnen
meinst?

Autor: blitzgeist (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay ich hole etwas weiter aus: mein Modul hat auch eine Registerlänge
variabel bestimmbar über ein generic. Wie kann ich nun über diese
Registerlänge(generic) meine Portlänge von dem Port betsimmen? (wenn
reg_length >= 8 dann data_length := 8
sonst data_length := reg_length ... daraus folg nun eine data_length,
diese nun meine Portlänge bestimmen soll zB a: std_logic_vector
(data_length-1 downto 0))

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast also 2 Generics:
reg_length
data_length

Dann würde ich den data_length Generic in dem Modul B, welches das
Modul A instanziiert, berechnen. In der Entity von Modul A kannst du es
auf jeden Fall nicht machen.

Autor: blitzgeist (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja genau data_length in Modul a berechnen und dann über die port map der
Instantiierung übergeben.  Hmm.. obwohl data_length mit Modul a gar
nichts zu tun hat (außer für die Instanz) muss data_length im
übergeordnetem Modul a berechnet werden? Sehr seltsam in VHDL. C code
wäre da viel einfacher, oder? Es gibt keine andere Möglichkleit
data_length in Modul b zu berechnen(wo die Berechnung meiner Meinung
nach eigendlich auch hingehören sollte)?

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst in der Architecture keinen Wert berechnen und dann diesen Wert
in der zu der Architecture gehörigen Entity verwenden. Das ergibt sich
ganz einfach daraus, dass die Architecture gewissermassen auf den Daten
der Entity fusst. Was dort nicht drinsteht, gibts auch in der
Architecture nicht. Die Entity wird deshalb immer als 1. kompiliert,
also kann man dann nichts mehr ändern drin.
Ich hoffe alle Klarheiten sind beseitigt ;-)


T.M.

Autor: blitzgeist (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... ich meine Modul b... aber um data_length in Modul b zu berechnen
brauche ich die generic reg_length aus Modul a. Wie kann ich diese
beiden Werte miteinander verrechnen?

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also mit A und B komm  ich hier total durcheinander. Nenne  wir es
einfach Toplevel und Modul.
Im Toplevel wird der Generic data_length aus reg_length berechnet und
in der Generic Map werden beide an das Modul übergeben. So meinte ich
das. Klingt ja auch logisch.


T.M.

Autor: blitzgeist (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hehe okay toplevel und modul =)... ja so bin ich gerade dabei es zu
implementieren, aber das modul soll allgeimeingehalten werden. wenn nun
aber eine berechnung für das modul nicht in diesem modul geschieht,
sondern hier im toplevel dann ist es doch nicht mehr allgemein, ich
meine die berechnung von data_length über reg_length gehört doch zum
modul oder nicht? nur reg_length soll vom toplevel an das modul gegeben
werden und data_length im modul berechnent werden. data_length soll aber
wiederum eine grenze von einem port aus dem modul sein... hmm kann es
sein dass sich hier die katze in den schwanz beist? ich weiß nicht so
recht.

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du die in der Portdeklaration benutzen willst, müssen sie zu dem
Zeitpunkt bekannt sein. Das geht nur mit den Generics die der Entity
übergeben werden.


T.M.

Autor: blitzgeist (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gut okay, dann gehts es nur so. doch nun folgendes: im toplevel werden
zwei instanzen von dem modul angelegt. mit einer function berechne ich
nun die data_length im toplevel. die funktion hat einen
übergabeparameter und zwar reg_length. reg_length ist aber ein generic.
einmal mit der länge von 5 bei instanz A vom modul und einmal mit der
länge von 24 bei instanz B vom modul. wenn ich nun reg_length (generic)
der funtion, welche daraus die data_length berechnet, übergebe, kommt
die fehlermeldung: reg_length undefiniert. wie kann ich nun ein generic
einer funktion übergeben?

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuche mal, ein Signal zu erstellen, dem du den Generic zuweist.
Dieses Signal dann der Funktion übergeben.


T.M.

Autor: blitzgeist (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Leute, moin T.M.,
ich habe es nun folgendermaßen: constante mit wert wird einer funktion
übergeben. rückgabewert dieser funktion wird einem signal zugewiesen.
wie kann ich nun dieses signal einer generic konstante zuweisen?
bekomme die fehlermeldung:

The actual value (Signal 'data_in1') associated with a generic must
be a globally static expression.

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.