Statisches Signal in Package

Gast #2732616
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ß
#2732649
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.
Gast #2732666
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.
Gast #2732732
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

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