"Serialisieren" VHDL-Rekord
Angenommen ich habe die folgende definition basiert auf Konstanten, die angeben, Vektor Länge des Datensatzes Mitglieder:
type point_t is record
x: std_logic_vector(X_WIDTH-1 downto 0);
y: std_logic_vector(Y_WIDTH-1 downto 0);
end record;
Ich würde gerne konvertieren diese Art von Aufzeichnungen in std_logic_vector
s, um in, sagen wir, ein FIFO. Momentan benutze ich den folgenden code:
PROCEDURE encodepoint(signal pnt: in point_t;
signal d: out std_logic_vector(POINT_ENC_WIDTH-1 downto 0)) is
variable top: integer := 0;
begin
top := X_WIDTH-1;
d(top downto 0) <= pnt.x;
top := top + Y_WIDTH;
d(top downto top-X_WIDTH+1) <= sl.y;
d(d'left downto top+1) <= (others => '0');
end;
Dieser code ist suboptimal in vielerlei Hinsicht. Zum Beispiel verlangt von mir immer richtig eingestellt POINT_ENC_WIDTH auf einen Wert, der groß genug ist, um zu ermöglichen d
zu halten die ganze serialisierten Datensatz. Es stützt sich auf die Programmierer zu tun, sehr mechanische Arbeit. Zum Beispiel für jedes Mitglied der Datensatz, sagen x
, X_WIDTH
erscheint zweimal in den code, einmal in direktem Zusammenhang mit x
und einmal in Verbindung mit dem nächsten Mitglied y
. Dies schnell langweilig. Wenn ich die definition ändern des Datensatzes durch das hinzufügen zusätzlicher Felder, ich habe zu aktualisieren, sowohl die Serialisierung und die (sehr ähnliche) Deserialisieren von code, und ich kann nur vergessen diese. Wenn ich die Felder entfernen, zumindest der compiler meckert.
So das führt mich zu meiner Frage: gibt es eine einfache, automatisierte oder zumindest quasi-automatisierten Weg, um zu konvertieren VHDL-records in std_logic_vector
s ohne Rückgriff auf manuell geschrieben serialisieren/Deserialisieren von code? Es ist nicht wichtig für mich zu wissen, die spezifische Codierung, wie ich bin über die Datensätze intern und die endgültige Ausgabe-format ist spezifiziert und implementiert werden manuell.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht einfach dies schreiben:
Entnommen Diskussion hier
Einem vernünftigen Weg, dies zu tun, mit großen Datensätzen zu definieren, die Bereiche vor der Zeit, wie diese:
Dann die Funktionen für die Konvertierung wie folgt Aussehen:
Ich in der Regel zu definieren, die conversion-Funktionen in einem Paket zusammen mit dem Datensatz.
In deinem Fall, so etwas wie:
HINWEIS:
Je nachdem, was Sie versuchen zu tun, möchten Sie vielleicht verwenden Sie vordefinierte Größen auf der einen Seite oder der anderen, und Konvertierungsfunktionen, um pad/Clips zu den natürlichen Längen (dh: vielleicht passen die X-und Y-Werte in 16-oder 32-bit-Werte). Das unsigned-Typ und die resize-Funktion funktioniert gut für diese:
Obwohl es derzeit keine offizielle automatisierte Möglichkeit der Umwandlung von Datensätzen auf Vektoren (und Umgekehrt), ist es eine sehr häufige Anforderung. Sie haben 2 Optionen:
Langwierigen und sich wiederholenden Aufgaben, die Sie motivieren, um ein Skript zu schreiben um code zu generieren, sind ein Indiz für einen Mangel in der Sprache selbst. Sie können dies ändern, indem Sie einen aktive Rolle in der IEEE-working-group und Einfluss die nächste version des VHDL-standard.
Vorbereitet habe ich ein Skript generiert automatisch den
VHDL
- Paket für Konvertierungen zwischen den benutzerdefinierten Datensatz-Typ und den std_logic_vector
geben.Den Quellen dieses Skript veröffentlicht
PUBLIC DOMAIN
imalt.sources
Gruppe.Sie können sehen, http://groups.google.com/group/alt.sources/browse_frm/thread/53ea61208013e9d1 oder suchen Thema "Skript zum generieren
VHDL
- Paket für die Konvertierung zwischen den record-Typ undstd_logic_vector
"Wenn Sie wollen, packen Sie das Archiv aus dem Google-Archiv, denken Sie daran, wählen Sie "
show original
" - option. Ansonsten ist die indendation derPython
Quelle beschädigt wird.Habe ich, die anderen versuchen, bei record-Serialisierung. Ich glaube, meine Methode ist ein wenig mehr robust. Sie müssen noch zu erstellen-Funktion für jeden Datensatz-Typ, aber Sie brauchen nicht zu erwähnen, Bereiche.
Können sagen, Sie brauchen, um zu serialisieren type_a mit meinem Paket:
Definieren die beiden Funktionen so:
Und dann kannst du es im code wie folgt:
Ich habe meine code und ein Beispiel von komplexer Typen (geschachtelte Datensätze etc.) finden Sie unter: https://github.com/gitmodimo/vhdl-serialize