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.
du schreibst eine normale Funktion mit Eingabe Parametern und einem Resulat. Gruß Hagen
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
@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.
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
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!
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 ;-)
> ... wenn ich Dir damit geholfen habe, einen Kasten Bier rüberschieben
Macht man das mit Cut & Paste ?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.