[VHDL] Aufruf einer Prozedur mit konstanten Signalen

Gast #2768847
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?
Gast #2768877
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?
Gast #2769041
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?
Gast #2769045
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.
Moderator (Firma: Titel) Persönliche Seite #2769071
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;
Gast #2769152
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?
Moderator (Firma: Titel) Persönliche Seite #2769153
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;
#2769172
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.
#2769177
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.
Gast #2769679
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren