Forum: FPGA, VHDL & Co. Parallelen Datenstrom mit VHDL in FIFO speichern


von Simson36 (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem. Ich habe 8 Vektoren (je 128 Bit Busbreite) 
die mit jedem Takt neue Daten liefern. Es werden insgesamt 128 neue 
Daten generiert. Diese möchte ich in ein FIFO mit 8 Bit Datenbus 
speichern, um diese anschließend seriell auszulesen.

Mein Problem dabei ist, dass mir nicht einfällt, wie ich die Daten der 
einzelnen Vektoren auf 8 Bit wandeln kann.

Dachte ich mache das mit einem Multiplexer, das wird aber wohl etwas 
viel Quelltext und es muss eine intelligientere Version geben.

Meine andere Idee ist es einen Zähler zu nehmen und diesen bis 128 
Zählen zu lassen. Mit Hilfe einer "intelligenten" Datenübergabe können 
die Daten anschließend in "Echtzeit" in den FIFO geladen werden.

Das mit dem Zähler ist nicht das Problem, aber wie bekomme ich die 
Datenübergabe hin?

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


Lesenswert?

Erst mal eine Rückfrage:
Simson36 schrieb:
> Ich habe 8 Vektoren (je 128 Bit Busbreite) die mit jedem Takt neue Daten
> liefern.
Je Takt also 1KBit (8*128)?
> Es werden insgesamt 128 neue Daten generiert.
Insgesamt also 128KBit (128*1KBit)?

Welches FPGA?
Wieviel (Block-)RAM?

von Simson36 (Gast)


Lesenswert?

Lothar Miller schrieb:
> Insgesamt also 128KBit (128*1KBit)?

Ja, genau.

Lothar Miller schrieb:
> Welches FPGA?
> Wieviel (Block-)RAM?

FPGA: Altera Cyclone III
M9K Blocks 8192 × 1  (ich hoffe das meinstest du)

von Uli (Gast)


Lesenswert?

Du kannst doch einen ungleich breiten FiFo nehmen und wortweise 
beschreiben, dann geschieht die Wandlung von allein,

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


Lesenswert?

Uli schrieb:
> Du kannst doch einen ungleich breiten FiFo nehmen und wortweise
> beschreiben, dann geschieht die Wandlung von allein,
Das wäre auch meine Wahl, wenn genug RAM-Blöcke vorhanden sind...

@ Simson36 (Gast)
Sieh mal nach, wie du die RAM-Blöcke als Dual-Ported-RAM mit 
unterschiedlichen Wortbreiten betreiben kannst. Und überleg dann, wie 
dir das helfen könnte.

von Simson36 (Gast)


Lesenswert?

Lothar Miller schrieb:
> Sieh mal nach, wie du die RAM-Blöcke als Dual-Ported-RAM mit
> unterschiedlichen Wortbreiten betreiben kannst. Und überleg dann, wie
> dir das helfen könnte.

Da habe ich mir auch schon Gedanken drüber gemacht, das funktioniert 
aber nicht, da die maximale Breite des Busses beim Einlesen auf 288 
begrenzt ist. Ich will das System etwas dynamisch haben und eventuell um 
Vektoren erweitern. Dies würde mir dabei nicht viel helfen.

Ich werde wohl definitiv die Daten vorher wandeln müssen.

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


Lesenswert?

Simson36 schrieb:
> Da habe ich mir auch schon Gedanken drüber gemacht, das funktioniert
> aber nicht, da die maximale Breite des Busses beim Einlesen auf 288
> begrenzt ist.
Welches Busses?
Eines einzelnen RAM-Blocks?
Wie wäre es mit parallelschalten?

von Simson36 (Gast)


Lesenswert?

Lothar Miller schrieb:
> Welches Busses?

Des Eingangs- sowie Ausgangsbusses des einzelnen RAMs

Lothar Miller schrieb:
> Eines einzelnen RAM-Blocks?

Ja

Lothar Miller schrieb:
> Wie wäre es mit parallelschalten?

Das ist zunächst auch eine gute Idee, aber ich will die jeweils ersten 
Daten der einzelnen Busse als erstes über SPI übertragen, danach die 
zweiten usw. . Das Problem, dass ich habe liegt nicht in der Ansteuerung 
oder Speicherung in ein RAM, sondern in der Wandlung der Busse.

von Florian P. (db1pf)


Lesenswert?

Simson36 schrieb:
> Das ist zunächst auch eine gute Idee, aber ich will die jeweils ersten
> Daten der einzelnen Busse als erstes über SPI übertragen, danach die
> zweiten usw. . Das Problem, dass ich habe liegt nicht in der Ansteuerung
> oder Speicherung in ein RAM, sondern in der Wandlung der Busse.

Das Auslesen der FIFOs in der richtigen Reihenfolge sollte eigentlich 
kein Problem sein, auch wenn du mehrere Speicher parallel schaltest: Du 
weißt ja, im welchem Speicher welches Byte steht.
z.B. bei einem 304 Bit Vector, aufgeteilt auf zwei RAM-Blöcke (288 u. 16 
Bit). Ausgelesen werden dann 36 Byte vom ersten Block, dann 2 Byte vom 
zweiten Block, wieder 36 Byte vom ersten, usw. Die Sequenz kannst du dir 
mit einer einfachen Statemachine oder einem Zähler realisieren.

Ich würde das Laden des kompletten Vektors dem zerstückeln des Vektors 
vorziehen. Denn im ersten Fall musst du dich um die Takte keine Sorge 
machen. Die Alternative ist, dass du einen zweiten Takt erzeugst, der 
(im obrigen Beispiel) dem 38 fachen des Bustaktes entspricht. In jedem 
dieser Taktzyklen nimmst du ein Byte vom Eingangsvektor uns schreibst es 
in das FIFO. Das Problem dabei ist aber die synchronisation der beiden 
Takte. Du musst besonders auf die Setup- und Holdzeiten achten!

Grüße,
Florian

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.