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!
Du schreibst einfach in Kenntnis des Wortes und dessen Position der 8 innerhalb der 20 bit, diese richtig rein, also: "if upper slice" -> Zielvektor (19 downto 14) <= UART_DATA(5 downto 0); "if mid slice" -> Zielvektor (13 downto 7) <= UART_DATA(6 downto 0); "if lower slice" -> Zielvektor ( 6 downto 0) <= UART_DATA(6 downto 0); oder entsprechend.
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. :)
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.