Forum: FPGA, VHDL & Co. Statisches Signal in Package


von Kugelfutter (Gast)


Lesenswert?

Guten Tag zusammen.

Ich möchte einen Procedure, die einen Endlichen Automaten realisiert, in 
einem Package erstauen. Den Zustand dieses Automaten muss nur die 
Procedure kennen, also wollte ich das Signal mit ins Package klatschen:
1
package mypackage is
2
  type mytype is (START, ZustandA, ...);
3
  signal A : mytype := START;
4
  procedure myEA(
5
    variable inValue : in integer range 0 to 10;
6
    variable outValue : out integer range 0 to 10;
7
  );
8
end mypackage
9
10
package body mypackage is
11
  procedure myEA(
12
    variable inValue : in integer range 0 to 10;
13
    variable outValue : out integer range 0 to 10;
14
  ) is
15
  begin
16
    if A = START then
17
      -- verarbeite nach Zustand Start
18
      A <= ZustandA;
19
    elseif A = ZustandA then
20
      -- verarbeite nach Zustand A
21
      A <= ...
22
    elseif ...
23
      -- verarbeite nach anderen Zuständen
24
    ...
25
    endif;
26
  end myEA;
27
end mypackage;
Hier bekomme ich den Fehler, dass ich signal A nicht aus der Procedure 
myEA beschreiben darf. Ist das ganze überhaupt erlaubt in VHDL, wenn ja, 
was mache ich falsch?

Gruß

von P. K. (pek)


Lesenswert?

Prozeduren sind meines Wissens eine Art "ausgelagertes" Stück der 
Beschreibung (die Du nicht 100x schreiben willst). Es generiert aber 
nicht jeder "Aufruf" einen Satz Signale, und schon gar nicht werden sie 
bis zum nächsten "Aufruf" gemerkt.

Prozeduren sind etwas, dass zu sehr die SW-Denkweise fördert. Ich 
persönlich verwende sie ausschliesslich in Testbenches (um wie gesagt 
nicht 100x dasselbe Verhaltensmuster schreiben zu müssen).

Vermutlich solltest Du Deine FSM in eine Entity/Architecure kapseln, die 
Du dann instantieren kannst.

von Kugelfutter (Gast)


Lesenswert?

Ich war auch immer davon ausgegenen, dass Proceduren den Makros in C/C++ 
sehr ähnlich sind. Ich würd das ganze auch liebend gerne in eine Entität 
schieben, leider habe ich von meinem Professor eine entsprechende 
Vorgabe.

Die einzige Lösung, die ich bisher sehe, ist das Signal nicht statisch 
zu generieren, sondern als Parameter der Procedure zu übergeben. Dann 
muss ich aber, falls ich mehrere solche Proceduren schachteln möchte, 
auf der obersten Schicht für jede mögliche Unter-Procedure solch ein 
Signal erstellen und durch die anderen Proceduren "schleifen". Das macht 
das ganze enorm unübersichtlich.

von SuperWilly (Gast)


Lesenswert?

>Die einzige Lösung, die ich bisher sehe, ist das Signal nicht statisch
>zu generieren, sondern als Parameter der Procedure zu übergeben.

Oder man schreibt die Prozedur in den Deklarationsteil eines Prozesses. 
Dann hast du Zugriff auf Signale, ohne diese übergeben zu müssen.



Beispiel:
1
signal clk : std_logic;
2
3
process
4
   procedure wait (i : in natural) is
5
   begin
6
       for k in 1 to i loop
7
           wait until (clk = '1');
8
       end loop;
9
   end wait;
10
begin
11
    wait(100);
12
    ...
13
wait;
14
end process;


VG, SuperWilly

von SuperWilly (Gast)


Lesenswert?

Sorry, "wait" ist natürlich reserviert!

von SuperWilly (Gast)


Lesenswert?

Diese Herangehensweise hat die Einschränkung, dass man die Prozedur 
nicht in ein Package packen kann.


VG, SuperWilly

von user (Gast)


Lesenswert?

du kannst ja alle signale in einen record packen und dann der procedure 
übergeben, als in bzw out

von Kugelfutter (Gast)


Lesenswert?

user schrieb:
> du kannst ja alle signale in einen record packen und dann der procedure
> übergeben, als in bzw out

Ich denke das ist die einfachste Lösung. Danke an alle für die Hilfe!

von Stachele (Gast)


Lesenswert?

Auflösen musst du das Record trotzdem irgendwo ...

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.