mikrocontroller.net

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


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hagen Re (hagen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du schreibst eine normale Funktion mit Eingabe Parametern und einem 
Resulat.

Gruß Hagen

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Berater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht es nicht mit einem Package

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Mark (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 
;-)

Autor: Mark (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, ne Zeile hatte noch gefehlt im File

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ... wenn ich Dir damit geholfen habe, einen Kasten Bier rüberschieben

Macht man das mit Cut & Paste ?

Autor: Matthias (Gast)
Datum:

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

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.