Forum: FPGA, VHDL & Co. Serielles zusammenfassen von Bitvektoren einer UART (8 Bit -> 20 Bit ect.)


von Stephan K. (Firma: FAU Erlangen) (sofa1780)


Angehängte Dateien:

Lesenswert?

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ß! =)

von Gustl B. (-gb-)


Lesenswert?

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.

von Klakx (Gast)


Lesenswert?

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.

von Stephan K. (Firma: FAU Erlangen) (sofa1780)


Angehängte Dateien:

Lesenswert?

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!

von Ordner (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Stephan K. (Firma: FAU Erlangen) (sofa1780)


Lesenswert?

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
Noch kein Account? Hier anmelden.