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


von blitzgeist (Gast)


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

von T.M. (Gast)


Lesenswert?

Du kannst den Generic in der Portdeklaration verwenden. Also so:
1
generic (
2
  temp : natural := 17
3
  );
4
port (
5
  a: in std_logic_vector(temp-1 downto 0)
6
  ...
7
  );
Oder was hast du vor?


T.M.

von blitzgeist (Gast)


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.

von T.M. (Gast)


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?

von blitzgeist (Gast)


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

von T.M. (Gast)


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.

von blitzgeist (Gast)


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

von T.M. (Gast)


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.

von blitzgeist (Gast)


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?

von T.M. (Gast)


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.

von blitzgeist (Gast)


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.

von T.M. (Gast)


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.

von blitzgeist (Gast)


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?

von T.M. (Gast)


Lesenswert?

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


T.M.

von blitzgeist (Gast)


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.

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.