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
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.
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.
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?
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))
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.
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)?
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.
... 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?
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.
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.
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.
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?
Versuche mal, ein Signal zu erstellen, dem du den Generic zuweist. Dieses Signal dann der Funktion übergeben. T.M.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.