Hallo alle,
ich stehe vor folgendem Hindernis:
Parameter für verschiedene, schon instanziierte, Module auf einem FPGA
(Cyclone IV) sollen über eine serieller Schnittstelle (UART) mittels
Matlab in den Speicher des Entwicklerboards (Terasic DE2-115) geladen
werden.
So soll gewährelistet werden, dass die Modulparameter nach erfolgreicher
Synthese während des Bertriebes verändert werden können. Zm Beispiel die
Koeffizienten eines FIR-Filters oder der Adressberreich des internen
SRAM-Speichers (20 Bit). Im Falle der Speicheradressierung wären somit
ceil(20/3) = 3 8-Bit-Vektoren nötig die auf dem FPGA zusammengesetzt
werden um den vollen Adressbereich ausreizen zu können.
Nun habe ich im ersten Schritt versucht eine FSM zu generieren, welche
die ankommenden Daten (Bei UART üblicherweise 8 Bit Pakete) eigenständig
auf die Ausgangsgröße anpasst. Das erste Bild "Module_merge_data" stellt
dieses Modul mit Ein- und Ausgangssinalen dar. Hierbei sind die
Vektorlängen der Ein- und Ausgangssignale der Daten (N und M) generische
Parameter, die biem instanziieren des Moduls festgelegt werden.
Das Zustandsdiagramm zur FSM ist in Bild "FSM_merge_data" dargestellt.
Hier ist zu erkennen, dass im Zustand "start" ein Vergleich der Ein- und
Ausgangsvektoren stattfindet. Anschließend werden basierend auf diesem
Ergebnis der Eingangsvektor beschnitten oder so oft eingelesen bis der
Ausgangsvektor vollständig ist, Bild "scheme_merge_data" verdeutlichet
diesen Vorgang. Dabei wird mit jedem neu anliegendem Datenvektor am
Eingang ein Signal "tick" gesendet, um die FSM auszuführen.
Dass funktioniert auch alles tadelos, nur bekomme ich Probleme bei der
Synthese, wenn ich mich auf nur eine Ausgangsgröße beschränke, in meinem
Fall auf "data_out".
Für den Fall M > N nimmt das Ausgangssignal data_out die größe M an,
womit data_in im Zustand "shorter then input" (M < N) nicht zugewiesen
werden kann. Die Vektorlängen stimmen für diesen Fall nämlich nicht mehr
miteinander überein, was auch Sinn ergibt. Ich bin also gezwungen den
Ausgang data_out in data_out_short und data_out_long zu unterteilen.
Ansonsten bleibt Synthesefähigkeit dieser FSM aus.
Nun meine Frage:
Ist es möglich, sich dennoch auf einen Ausgang festzulegen?
Um ein klassisches Schiftregister handelt es sich ja hier nicht mehr.
Eher wird durch den Indexberreich des ausgangsvektors geschifted.
besten Gruß! =)
Nun, mal unabhängig von FSM und so, Du willst als Daten ins FPGA laden?
Nachträglich? Dann mach das wie es Andere auch gemacht haben bei
diversen Bausteinen die man kaufen kann mit z. B. SPI Schnittchenstelle.
Da gibt es intern Register und die kann man beschreiben. Du definierst
Dir also intern Register, wie lang und wie viele bleibt Dir überlassen
und dann eben Befehle wie diese beschrieben werden. Über UART könnte man
das so machen, dass eine FSM z. B. immer 9 Bytes erwartet. Das erste
Byte ist die Adresse des zu schreibenden Registers und die weiteren
Bytes die zu schreibenden Daten.
Stephan K. schrieb:> Dass funktioniert auch alles tadelos, nur bekomme ich Probleme bei der> Synthese, wenn ich mich auf nur eine Ausgangsgröße beschränke, in meinem> Fall auf "data_out". [..]
vielleicht hilft es, wenn du deinen Code mal hier mit zeigst. Am Ende
kann man das sicher auch elegant schreiben. Manchmal ist eine andere
Architektur wesentlich simpler.
Wenn da ein Prozessor mit im System ist, würde ich diesem das
Uart-Daten-Geschubse übernehmen lassen.
Gustl B. schrieb:> Über UART könnte man> das so machen, dass eine FSM z. B. immer 9 Bytes erwartet.
Ist definitiv kein blöder Ansatz, jedoch nicht mehr dynamisch. Werde ich
evtl. aber noch drauf zurück kommen.
Klakx schrieb:> vielleicht hilft es, wenn du deinen Code mal hier mit zeigst.
Man kann ja nur dazu lernen. :)
Gut denn, anbei der "Code".
Zeile 103 des Moduls (merge_data.vhd) macht bei der Synthese
Schwierigkeiten.
verständlich, da bei dem angesprochenen Fall (data_out > data_in) der
Vektor data_out größer ist als der von data_in. Für das Beispiel data_in
8 Bit, data_out 20 Bit erscheint folgende Fehlermeldung in Quartus.
Error (10504): VHDL error at merge_data.vhd(103): slice that is assigned
to target slice has 8 elements, but must have same number of elements as
target slice (20)
Wüsste aber auch mommentan nicht wie ich dies besser lösen könnte.
Besten Gruß und einen guten Start in den Tag!
Wenn ich mir das Ganze so anschaue, dann soll da irgendwas völlig
Simples unglaublich generisch und universell beschrieben werden. Oder
übersehe ich was?
Stephan K. schrieb:> Um ein klassisches Schiftregister handelt es sich ja hier nicht mehr.
Sicher nicht.
Wenn es tatsächlich dynamisch gemacht werden sollte, dann ist es ein
Multiplexer. Und wenn es statisch ist (so wie es aussieht ist es das),
dann ist es einfach nur eine fixe Verdrahtung auf ein paar Register...
Lothar M. schrieb:> Wenn ich mir das Ganze so anschaue, dann soll da irgendwas völlig> Simples unglaublich generisch und universell beschrieben werden.
Ja, genau so hatte ich es mir vorgestellt, weil ich öfter darauf
zugreifen müsste.
z.B. das auslesen der einzelnen Speicherregister (20 bit).
Vermutlich doch eher ein unüblicher Weg, wenn ich mir die Antworten so
ansehe. Also ein Klassischer Fall von overengineeríng.
Ich lege diese Erkenntnis dann mal in meinen Erfahrungsschatz. :D
Danke dennoch an alle für die Mühen. :)
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