Forum: FPGA, VHDL & Co. [VHDL] Aufruf einer Prozedur mit konstanten Signalen


von Klaus (Gast)


Lesenswert?

Moin,

ich habe für eine Testbench eine Prozedur geschrieben, die ein 
übergebenes Datenwort auf einen seriellen Datenlink schreiben soll.
1
procedure writeData (
2
    signal DataIn : in std_logic(7 downto 0);
3
    signal Clock  : in std_logic;
4
    signal DataOut: out std_logic )
5
is
6
   [procedure body]
7
end procedure;


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?

von Klaus F. (kfalser)


Lesenswert?

Anstelle von
1
signal DataIn : in std_logic(7 downto 0);
schreibst Du
1
constant DataIn : in std_logic(7 downto 0);

Damit kann man einen konstanten Wert übergeben.

von Klaus (Gast)


Lesenswert?

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?

von vh (Gast)


Lesenswert?

Kann man nicht einfach ein Dummy-Signal definieren, auf "000...0" setzen 
und das dann der Prozedur übergeben?

von Klaus (Gast)


Lesenswert?

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?

von Rudolph (Gast)


Lesenswert?

AFAIK braucht's kein "signal",
1
 procedure writeData (
2
     DataIn : in std_logic(7 downto 0);
3
     Clock  : in std_logic;
4
     DataOut: out std_logic )
5
 is
6
    [procedure body]
7
 end procedure;

sollte gehen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
procedure writeData (
2
     DataIn : in std_logic_vector(7 downto 0);
3
     Clock  : in std_logic;
4
     signal DataOut: out std_logic )
5
 is
6
    [procedure body]
7
 end procedure;

Oder:
1
procedure writeData (
2
     DataIn : in std_logic_vector(7 downto 0);
3
     signal Clock  : in std_logic;
4
     signal DataOut: out std_logic )
5
 is
6
    [procedure body]
7
 end procedure;

Und ganz konsequent wäre dann, die Vektorbreite nicht explizit 
festzulegen:
1
procedure writeData (
2
     DataIn : in std_logic_vector;
3
     Clock  : in std_logic;
4
     signal DataOut: out std_logic )
5
 is
6
    [procedure body]
7
 end procedure;

von Klaus (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von Bronco (Gast)


Lesenswert?

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?

von Klaus (Gast)


Lesenswert?

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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
entity ovlprod_top is
5
    Port ( di  : in  STD_LOGIC_VECTOR (7 downto 0);
6
           do  : out STD_LOGIC_VECTOR (7 downto 0));
7
end ovlprod_top;
8
9
architecture Behavioral of ovlprod_top is
10
11
  procedure tstovl (
12
    DataIn : in std_logic_vector(7 downto 0);
13
    signal DataOut: out std_logic_vector(7 downto 0) )
14
  is
15
  begin
16
    DataOut <= DataIn;
17
  end procedure;
18
19
signal s : std_logic_vector(7 downto 0) := "11001100";
20
signal u : unsigned(7 downto 0) := "11000011";
21
signal cs : std_logic_vector(7 downto 0) := "11001100";
22
signal cu : unsigned(7 downto 0) := "11000011";
23
24
begin
25
    tstovl("10110010",do);
26
    tstovl(std_logic_vector'("00001111"),do);
27
    tstovl(unsigned'("00001111"),do); -- geht nicht
28
    tstovl(s,do);
29
    tstovl(std_logic_vector(u),do);
30
    tstovl(u,do); -- geht nicht
31
    tstovl(cs,do);
32
    tstovl(std_logic_vector(cu),do);
33
    tstovl(cu,do); -- geht nicht
34
end Behavioral;

von Klaus F. (kfalser)


Lesenswert?

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.

von Klaus F. (kfalser)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Rudolph (Gast)


Lesenswert?

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

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.