Forum: FPGA, VHDL & Co. VHDL Frage (Suche so etwas wie ein Makro)


von Matthias (Gast)


Lesenswert?

Hallo!

Ich habe ein Problem, das (hoffentlich) einfach zu lösen ist, aber ich 
habe keine Ahnung, wonach ich suchen soll.

Ich habe eine Reihe von Ausgabepins und verschiedene "Kommandos", die 
ich dort ausgeben möchte, abhängig vom Zustand meiner State Machine. Ich 
will das in einer Art Makro oder Unterprogramm haben und dann in meiner 
State Machine einfach schreiben können:

-----
...
when state1 =>
   OutputCommand(command);
...
-----

Irgendwo definiere ich ein Makro oder eine Procedure oder Fkt. oder wie 
auch immer, die mit einer Case-Abfrage alle Command-Typen durchgeht und 
das dann ausgibt. Der Vorteil wäre natürlich, dass der Source kürzer 
wird und (ganz wichtig) ich falls nötig nur an einer Stelle Änderungen 
durchführen müsste.

Am besten wäre wohl eine Art Präprozessor, der mir den Aufruf dann durch 
den entsprechenden Code ersetzt (wie ein C Makro eben).

Wie mache ich das in VHDL? Ich hab nicht mal eine Ahnung wonach ich 
suchen soll, ich habs mit einer Procedure versucht, aber die darf auf 
die Signale derselben Architecture anscheinend nicht zugreifen.

von Hagen R. (hagen)


Lesenswert?

du schreibst eine normale Funktion mit Eingabe Parametern und einem 
Resulat.

Gruß Hagen

von Klaus F. (kfalser)


Lesenswert?

Ich würde die Ausgangssignale zu einem Vector zusammenfassen und für die 
zugewiesenen Werte Konstanten definieren.

z.B.

    subtype  Command_type is std_logic_vector(4 downto 0);
    -- cmd_type(4) .. CS#
    -- cmd_type(3) .. RAS#
    -- cmd_type(2) .. CAS#
    -- cmd_type(1) .. WE#
    -- cmd_type(0) .. DQM
    constant CMD_NOP         : Command_type := "0111-";  -- No operation
    constant CMD_ACTIVE      : Command_type := "0011-";
    constant CMD_PRECHARGE   : Command_type := "0010-";
    constant CMD_READ        : Command_type := "01010";  -- read 
operation
    ....


In der FSM
..
    when state1 =>
         sdram_cmd <= CMD_NOP;
....

In der Architecture :

    Sdram_CS_N  <= sdram_cmd(4);
    Sdram_Ras_N <= sdram_cmd(3);
    Sdram_Cas_N <= sdram_cmd(2);
    Sdram_WE_N  <= sdram_cmd(1);
    Sdram_Dqm   <= sdram_cmd(0);


Grüße
Klaus

von Berater (Gast)


Lesenswert?

Geht es nicht mit einem Package

von Matthias (Gast)


Lesenswert?

@Klaus Falser:

Sind da übersinnliche Fähigkeiten im Spiel oder war aus meinem Beitrag 
so klar erkennbar, dass es sich um einen SDRAM handelt? Die Lösung ist 
sehr elegant aber ich habe in der derzeitigen Form auch Zuweisungen auf 
die Adressen, Bänke usw, die müsste ich extra zuweisen oder einen sehr 
langen Vector machen. Eine LÖsung mit Procedure oder Makro kommt mir 
leichter wartbar vor.

von Klaus F. (kfalser)


Lesenswert?

Macros gibt es nicht und eine Prozedur erzeugt Dir möglicherweise 
überflüssigen Code.
Mit einer Prozedur geht es schon, aber erstens mußt alle Signale in die 
Parameterliste der Prozedur aufnehmen und zweitens wird der 
Procedure-Aufruf damit nicht kurz und kompakt.
Eine Prozedur in VHDL kann nämlich keine Seiteneffekte habe, Du mußt die 
Signale die Du schreiben willst in der Paramterliste übergeben 
(direction inout).

Klaus

von Matthias (Gast)


Lesenswert?

Ich hab jetzt gefunden, dass das mit der Prozedur wie von mir gewünscht 
geht, wenn diese im Process (und nicht, wie ich es zuerst gemacht habe, 
in der Architecture) deklariert wird.

Der andere Ansatz ist mir deswegen nicht ganz geheuer, weil ich dann bei 
den Änderungen immer aufpassen muss, dass ich die Adressen und Bänke und 
diversen internen Signale, die ich zb für Bank Interleaving brauche, 
nicht vergesse.

Ich lass es mir noch ein wenig durch den Kopf gehen, ob ich das so 
mache, danke für die Hilfe!

von Mark (Gast)


Angehängte Dateien:

Lesenswert?

Beispiel aus meinem DDR-SDRAM-Controller:

- im package einen record für die Signale generieren
- eine Konstante anlegen, die Deine Kommandos enthält

- im Hauptprogramm ein entspr. Signal anlegen
- an der richtigen Stelle dem Signal die Konstante zuweisen

... s. Beispielfile


... wenn ich Dir damit geholfen habe, einen Kasten Bier rüberschieben 
;-)

von Mark (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, ne Zeile hatte noch gefehlt im File

von Klaus F. (kfalser)


Lesenswert?

> ... wenn ich Dir damit geholfen habe, einen Kasten Bier rüberschieben

Macht man das mit Cut & Paste ?

von Matthias (Gast)


Lesenswert?

Naja, ASCII-Bier kann ich bieten. Prost und danke für die Hilfe!

             
   | |       | |
   | |       | |
   | |       | |
  /   \     /   \
 |  B  |   |  B  |
 |  I  |   |  I  |
 |  E  |   |  E  |
 |  R  |   |  R  |
 |     |   |     |
 -------   -------

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.