Moin,
ich habe für eine Testbench eine Prozedur geschrieben, die ein
übergebenes Datenwort auf einen seriellen Datenlink schreiben soll.
1
procedurewriteData(
2
signalDataIn:instd_logic(7downto0);
3
signalClock:instd_logic;
4
signalDataOut:outstd_logic)
5
is
6
[procedurebody]
7
endprocedure;
nun lässt sich die Prozedur leider nur aufrufen, wenn man ihr als DataIn
auch ein tatsächlich existierendes Signal übergibt. Ein Aufruf wie:
1
writeData("00000000",Clock,DataLink);
wird von ModelSim mit der Fehlermeldung:
> ** Error(105): Actual (string literal) for formal "data" is not a signal.
quittiert.
Wie kann ich die Prozedur mit konstanten Werten aufrufen? Normalerweise
kann man problemlos einem Signal vom Typ std_logic_vector ein
Stringliteral wie "000" zuweisen. Warum klappt das beim Aufruf einer
Prozedur nicht?
Ok, danke schonmal :)
Damit kann man Konstanten übergeben. Das hilft mir schonmal weiter und
die Testbench lässt sich kompilieren.
Aber die hat noch Verbesserungspotential: Was ist, wenn ich beides
übergeben können will, also je nach Situation in der Testbench mal
konstante Werte und mal Signale übergeben will? Dafür 2 verschiedene
Prozeduren zu schreiben finde ich unschön, wegen doppeltem Code. Gibts
da noch nen Trick?
vh schrieb:> Kann man nicht einfach ein Dummy-Signal definieren, auf "000...0" setzen> und das dann der Prozedur übergeben?
Ja, das kann man. Warum ist VHDL nur so häßlich? Aus C++ bin ich
gewöhnt, dass man viel drauf achtet, dass der Code immer möglichst
lesbar ist und auf Anhieb klar Erkennbar, was da eigentlich gemacht
wird. Und bei VHDL? Da muss man wildeste Konstrukte verwenden, du um die
vermurkste Sprachdefinition zufrieden zu stellen...
Warum erfindet nicht endlich mal jemand eine HDL, on der einem nicht
völlig unnötigerweise Steine in den Weg gelegt werden?
Rudolph schrieb:> AFAIK braucht's kein "signal",
Für DataOut sollte es schon ein Signal sein, für Clock kann es eines
sein, und für DataIn sollte gar nichts definiert sein:
1
procedurewriteData(
2
DataIn:instd_logic_vector(7downto0);
3
Clock:instd_logic;
4
signalDataOut:outstd_logic)
5
is
6
[procedurebody]
7
endprocedure;
Oder:
1
procedurewriteData(
2
DataIn:instd_logic_vector(7downto0);
3
signalClock:instd_logic;
4
signalDataOut:outstd_logic)
5
is
6
[procedurebody]
7
endprocedure;
Und ganz konsequent wäre dann, die Vektorbreite nicht explizit
festzulegen:
Interessant! Danke!
Was für einen Typ haben dann die Objekte ohne Angabe? Wichtig wäre das
ja z. B., wenn aus der Prozedur weitere Funktionen/Prozeduren aufgerufen
werden.
Klaus schrieb:> Was für einen Typ haben dann die Objekte ohne Angabe?
Was ist für dich "der Typ"? Die Typen sind alle immer definiert
(std_logic und std_logic_vector). Allerdings ist das Verhalten evtl.
unterschiedlich (Constant, Signal, Variable) und der std_logic_vector
nicht im Bereich eingeschränkt.
Lothar Miller schrieb:> Für DataOut sollte es schon ein Signal sein, für Clock kann es eines> sein, und für DataIn sollte gar nichts definiert sein:
Was macht das denn für einen Unterschied, ob man den Parameter als
Signal angibt oder nicht?
Lothar Miller schrieb:> Was ist für dich "der Typ"? Die Typen sind alle immer definiert> (std_logic und std_logic_vector). Allerdings ist das Verhalten evtl.> unterschiedlich (Constant, Signal, Variable) und der std_logic_vector> nicht im Bereich eingeschränkt.
Ok, unklar ausgedrückt. Wie nennt man denn das, ob etwas Signal,
Variable oder sonst was ist? ;-)
Jedenfalls: Was ist DataIn dann innerhalb der Prozedur?
Die gleiche Frage kann man natürlich auch für die out Parameter stellen:
Was ist das Objekt, wenn man nichts angibt? Also wie müsste es in der
Prozedur verwendet werden?
Bronco schrieb:> Was macht das denn für einen Unterschied, ob man den Parameter als> Signal angibt oder nicht?
Es geht, oder es geht nicht.
Ein Eingangsport übernimmt wenn nichts spezifiziert wurde das Verhalten,
der Ausgangsport muss zum angeschlossenen Typ passen.
Spiel einfach mal ein wenig damit rum:
Klaus schrieb:> Und bei VHDL? Da muss man wildeste Konstrukte verwenden, du um die> vermurkste Sprachdefinition zufrieden zu stellen...>> Warum erfindet nicht endlich mal jemand eine HDL, on der einem nicht> völlig unnötigerweise Steine in den Weg gelegt werden?
Immer langsam mit den jungen Pferden!
Nur weil eine Sprache nicht auf Anhieb das macht, das eine Anfänger im
Kopf hat, heißt das noch lange nicht dass sie unklug definiert ist.
Da habe sich ein paar gescheitere Leute als wir den Kopf zerbrochen,
aber sie hatten andere Prioritäten als Du.
Soll jetzt aber kein VHDL Sprach-Krieg hier werden, aber das
VHDL-Bashing ging mir schon immer auf die Nerven....
Rudolph schrieb:> AFAIK braucht's kein "signal",> procedure writeData (> DataIn : in std_logic(7 downto 0);> Clock : in std_logic;> DataOut: out std_logic )> is> [procedure body]> end procedure;>> sollte gehen.
Sollte nicht gehen. Laut Recherche ist der default type constant, wenn
man nichts angibt.
Bronco schrieb:> Lothar Miller schrieb:>> Für DataOut sollte es schon ein Signal sein, für Clock kann es eines>> sein, und für DataIn sollte gar nichts definiert sein:>> Was macht das denn für einen Unterschied, ob man den Parameter als> Signal angibt oder nicht?
Einen großen.
Vergiss nicht, dass VHDL eine Simulationssprache ist.
Signale sind in der Implementierung komplizierte Gebilde, weil sie einen
zeitlichen Verlauf festhalten (müssen).
Für ein Signal kann man in der Prozedur dessen Attribute verwenden, z.B.
DataIn'event. Das kann man bei eine Konstante z.B. nicht.
Klaus Falser schrieb:> Sollte nicht gehen.
Geht auch nicht für einen Ausgang.
> Laut Recherche ist der default type constant, wenn man nichts angibt.
Ich vermute, dann legt es den Simulator auf die Nase, wenn veränderbare
Werte angelegt werden. Der Synthesizer kommt aber damit klar und macht
sinnvolle Harware...
Lothar Miller schrieb:> Rudolph schrieb:>> AFAIK braucht's kein "signal",> Für DataOut sollte es schon ein Signal sein, für Clock kann es eines> sein, und für DataIn sollte gar nichts definiert sein
Tja, da hatte ich tatsächlich ein Beispiel mit ausschließlich Inputs vor
Augen.
Klaus Falser schrieb:> Sollte nicht gehen. Laut Recherche ist der default type constant, wenn> man nichts angibt.
Formal mag das richtig sein. Ohne "signal" war's zumindest dem Simulator
völlig wumpe ob dort jetzt eine Konstante, ein Signal oder sonstwas
übergeben wurde...