Forum: FPGA, VHDL & Co. Messbox mit externem RAM und internen FIFOs - beste Konzept


von Torsten2000 (Gast)


Lesenswert?

Hallo,

ich habe leider noch nicht viel Erfahrung was FPGA anbelangt. Leider bin 
ich hier in der 3 Mann Firma der einzige der sich mit VHDL ansatzweise 
auskennt, so dass ich niemanden fragen kann. Deswegen hoffe ich auf eure 
Hilfe...

Ich habe eine Box vorgesetzt bekommen, die Daten getriggert misst 
(analog & digital) und auch analoge & digitale Daten getriggert ausgibt. 
Es ist ein DDR2 Ram angeschlossen und die ganze Box wird über USB2 (FX2) 
an den PC angeschlossen.

In meinen (noch unerfahrenen) Augen, ist der Ansatz von meine Vorgänger 
nicht gut, so dass ich mir Gedanken mache dies alles komplett zu 
ersetzten (wenn ich dafür Zeit bekomme). Sein Quellcode ist mit wenig 
wiederverwendbaren Modulen. Er hat viel mit Copy & Paste gearbeitet, so 
dass Änderungen an vielen Stellen geändert werden müssen. Herzstück ist 
ein Wishbone-bus, den er nicht wirklich verwendet(nur USB<-> RAM), 
sondern alles klassisch? parallel.

Dreh und Angelpunkt sind eigentlich die internen FIFOs.

Ausgänge: Über USB werden daten in ein RAM-FIFO geschrieben. Diese 
werden in ein BRAM-FIFO geschrieben um sofortigen zugriff zu erhalten.

Eingägne: Eingänge kommen in ein BRAM-FIFO die in das RAM-FIFO 
geschriben werden.

RAM-FIFO weil viel Platz.
BRAM-FIFO weil schnell.

Wie ist jetzt der beste Ansatz/das beste Konzept um möglicht hohen 
Durchsazt zu bekommen?

Problem: das Memmory-Interface hat nicht genügent Ports um jedem FIFO 
ein Port zuweisen zu können.

Wahrscheinlich sollten die Daten möglichst im Burst-Modus übertragen 
werden, damit nicht unnötig Takte vergeudet werden.

Ich hatte mir überlegt ein FIFO-Baustein zu programmieren, dass den 
RAM-FIFO und den BRAM-FIFO vereint. Den könnte man dann immer wieder 
verwenden und Sie würden die Vorteile von beiden vereinen. Im Augenblick 
ist das alles einzeln und sehr verstrickt, was einige Problem mit sich 
bringt.

Sollten Wishbone-RAM-FIFO-Slaves/Masters programmiert werden die auf ein 
Wishbone-RAM-SLAVE zugreifen? Aber die würden sich dann gegenseitig 
blockieren beim Shared-Bus.
Hätte aber den Vorteil, dass eine einfache Wiederverwendbarkeit 
gewährleistet wäre und x-beliebig viele slaves/master auf den RAM 
zugreigen könnten.

Oder sollten alle RAM-Ports parallel verwendet werden. Aber es gibt 
nicht genügend Ports...

Ich bin mal gespannt auf eure Anregungen.

Vielen Dank schon mal im Voraus.

Grüße
Torsten

von Kest (Gast)


Lesenswert?

Ich möchte Dir nicht zu nahe tretten, aber das ist typisch Anfänger ;-): 
gleich Sachen ändern, obwohl man davon keine Ahnung hat... Ernsthaft, 
aus Post geht nicht hervor, wieso Du überhaupt daran was ändern sollst, 
funktioniert es denn nicht?
Wenn alles läuft, dann ist gut. Im bestehenden Code "rumzupfuschen" ist 
sehr selten eine gute Idee. Überlege es Dir genau, was und weshalb Du 
ändern möchtest. Und vergiss auch nicht die betriebswirtschaftliche 
Seite des Projekts.

Ansonsten habe ich nicht wirklich verstanden, worum es geht, sorry ;-)

Grüße,
Kest

von Torsten M. (torsten2000)


Lesenswert?

Hallo Kest
Ja es läuft schon. Ich soll nur Änderungen/Erweiterungen einpflegen. Da 
aber mein Vorgänger viel mit Copy & Paste gearbeitet hat, ist es extrem 
aufwendig und fehlerträchtig es an x stellen anzupassen...

Sei ruhig ehrlich. Ich zähle mich zu den Anfängern und kann nur 
lernen...

Eine Frage ist:

"klassische VHDL-Programmierung" ein Memorykontroller mit vielen Ports, 
die aber nicht ausreichen also auch nochmal ihrgendwie aufgesplittet 
werden müssen

oder

ein Memorykontroller über Wishbone.

Was ist sinnvoller hinsichtlich Wartung - Erweiterung und 
Geschwindigkeit?


Torsten

von Alex W. (a20q90)


Lesenswert?

Kannst Du mal von dem Ding einen Schaltplan posten und den Source? Ich 
kann mir jetzt Dein Problem so garnicht vorstellen!

von franke (Gast)


Lesenswert?

DDR2 immer kaufen! um himmelswillen nicht selber bauen.
Und damit bist du schon auf den Core der Herstellers gebunden.

Du brauchst ausreichend große Entkoppel-FIFOs um die Clock-Domains zu 
trennen, bzw um Refreshs des DDR2 abzufangen.

Aber wie gesagt, erstmal schaun welchen IP, und dann weiterlaufen.

PS .. Deine Formulieren "Copy und Paste" hört sich doch sehr abwerten 
an... unterschätz das mal nicht, einen DDR2 zum laufen zu bringen ist 
nicht banal und den USB2 zu füttern auch nicht, das war garantier kein 
"Copy & Paste", höchsten Reuse von IP Blöcken... was wirklich nicht das 
gleiche ist...

von Kest (Gast)


Lesenswert?

Als erstes würde ich Übersicht verschaffen -- RTL Plan erstellen und da 
sieht man, was da alles passiert. Danach würde ich die "Copy & Paste" 
Sachen einfach in Module packen -- aber um Gottes Willen nichts 
ändern/optimieren! Wenn das dann läuft, würde ich den Flaschenhals 
suchen (FIFO Größe/Anzahl und so weiter).
Wenn Du erstmal damit durch bist, dann wirst Du gute Vorstellung haben, 
wieso Dein Vorgänger genau so und nicht anders gemacht hat.

Und nun zur Frage mit Wartung/Erweiterung/Sicherheit:
Ich weiß nicht, in welcher Position Du bist. Deshalb sagte ich ja auch 
-- denk' auch wirtschaftlich! Ich habe so oft erlebt, dass neue Studis, 
die gerade anfagen zwar die genialsten Ideen haben und alles ändern 
wollen, doch die Zeit/Kosten aus dem Blickfeld verlieren. Jeder 
Arbeitstag zählt. Und wenn man gegenrechnet, dann wird einem auch klar, 
ob es sich lohnt da was zu machen oder nicht.
Oft erlebte ich auch solche Ansagen wie:"hier ist der code -- optimiere 
den mal" Damit kann ich überhaupt nichts anfangen... soll ich jetzt eine 
Woche lang optimieren? Bezüglich was optimieren? Dass der Source Code 
schön aussieht? Weniger Zeilen im Code? Baustein? Taktrate?

Ich sage nur, man bewegt sich bald in eine Sackgasse, wenn man keine 
klare Ziele hat.
Wishbone oder nicht -- am Ende ist alles Latte, wenn es funktioniert und 
Du einen Plan ist, was da abläuft. Und wenn es nicht funktioniert, dann 
sollte man auch eine ungefähre Ahnung haben, woran das liegt.

So, das war mein Senf dazu :-) Ich wünsche Dir viel Erfolg bei der 
Bewältigung der Aufgabe! Hier findest Du immer Hilfe. Versuch die Fragen 
klarer und kürzer zu formulieren, dann bekommst Du auch mehr Resonanz 
;-)

Grüße,
Kest

von Christian R. (supachris)


Lesenswert?

Sowas kenn ich. Sachen neu in ein Design eines anderen bauen ist nicht 
ganz leicht. Ich hatte das auch zu tun, erschwerend kam hinzu, dass das 
Ursprungsdesign in Schematic gemacht und so gut wie überhaupt nicht 
dokumentiert war. Ich hab dann die Funktion Modul für Modul analysiert 
und in VHDL neu geschrieben, dabei die ganzen Anfängerfehler wie 
asynchrone Resets usw. rausgemacht. Aber du solltest dir erst mal 
ansehen, wie die Kiste funktioniert, alles durch simulieren und dann 
schauen, was du verwenden kannst. Copy-Paste ist nicht immer zu 
verteufeln, gerade wie schon gesagt wurde bei der DDR2 Ansteuerung, und 
dann noch als FIFO.
Da der FX2 eh nur max. 40MB/s kann, sollte eigentlich genügend Zeit 
sein, die Daten blockweise aus dem DDR2 RAM in den Ausgabe-FIFO vor dem 
USB zu kopieren. Und alleine mit dem FX2 wirst du als Anfänger schon 
jede Menge Spaß haben. Ich hab da auch eine Weile gekämpft, das Timing 
ist einfach gruselig.

von G. M. (Gast)


Lesenswert?

Christian R. schrieb:
> und so gut wie überhaupt nicht
> dokumentiert war.
Die Standardsituation in deutschen Entwicklungsabteilungen.

von Torsten M. (torsten2000)


Lesenswert?

Hallo danke für eure Rückmeldung.

der DDR2 Kontroller ist mittels Core-Generator  von Xilinx erstellt. Der 
wird nicht angefasst, wenn nicht umbedingt nötig. Die FX2-Wishbone 
Schnittstelle wird auch nicht angefasst. Das zu übernehmen ist ja völlig 
in Ordnung.
Was ich mit Copy & Paste meine ist, wenn man in eine Entity alle Fifos 
mit
Copy & Paste einfügt, die aber die gleichen Funktionalitäten haben.

So hatte ich zum Beispiel das Problem, dass ich die FIFOs zurücksetzen 
musste. Da ich jeweils den RAM-FIFO und den BRAM-FIFO zurücksetzen muss, 
damit beide leer sind und dass an x stellen einpflegen muss, weil der 
Code mit Copy&Paste immer wieder verwendet wurde, dann finde ich das 
nicht optimal... (Die RAM-Fifos sind auch keine richtigen FIFOs, wie man 
sie sich vorstellt, sondern RAM mit Pointern und man muss die Pointer 
manuell anpassen. Lesepointer: FPGA / Schreibpointer: Host-Rechner bzw. 
andersrum)
Wenn ich jetzt ein neues Modul hinzufügen möchte, muss ich auch wieder 
Copy&Paste machen anstatt eine neue Instanz anzulegen...

Außerdem sollen die FIFOS auch zu Ringbuffern (mit/ohne 
auto-repeat)umwandelbar sein.

Das muss ich für jedes Modul einzeln anpassen.

Ich stell mir da eher ein Modul vor, was BRAM-FIFOs & RAM-FIFOs enthält 
und einstellbar ist. Diese Modul kann ich dann immer wieder verwenden 
und muss es nur einmal anpassen, wenn es Änderungen gibt... und die 
Änderung ist in allen Instanzen dann drin...

Ich hoffe ich konnte mich verständlich machen, was ich mit Copy&Paste 
meine... und ich hoffe ihr stimmt mir da auch zu... :-)

Frage ist jetzt nur wie binde ich x Module am besten am RAM an? Es gibt 
ja nicht genügend Ports...

von Torsten M. (torsten2000)


Lesenswert?

Bei mir war leider auch so gut wie nix dokumentiert...
:-)

von franke (Gast)


Lesenswert?

achso...


real programmers don't comment code...
it was hard to write, it should be hard to read

von Christian R. (supachris)


Lesenswert?

G. M. schrieb:
> Christian R. schrieb:
>> und so gut wie überhaupt nicht
>> dokumentiert war.
> Die Standardsituation in deutschen Entwicklungsabteilungen.

Kommt drauf an, welche Strategie man verfolgt. Solange der Code lesbar 
und sinnvoll gegliedert ist, braucht man nur für die Schnittstellen nach 
außen Doku. Wir halten das bei uns so, dass es klar definierte 
Schnittstellen gibt, und im Code keine Kommentare, sondern alle 
Variablennamen usw. so eindeutig, dass man weiß, was da passiert. 
Außerdem möglichst kleine Module, um die Sache übersichtlich zu halten. 
Dann braucht man keine großartige Doku.

von Ralf (Gast)


Lesenswert?

Was haelt dich denn ab so ein BRAM-FIFO & RAM-FIFO zu schreiben
und in dein geaendertes Design einzubauen. Da du den ganzen
Quellcode hast kannst du ja immer wieder auf den jetzigen
Stand zurueck.
Ich wuerde, wenn ueberhaupt, so ein Modul schreiben und einmal
an einer Stelle einbauen. Danach simulieren und testen, ob
noch alles funktioniert und dann an weiteren Stellen einbauen.
Das ist alles sehr langwierig und ich wuerde immer nur kleine
Aenderungen machen. Aber wie Kest schon geschrieben hat.
Man darf nie die wirtschaftliche Seite aus den Augen verlieren.

Gruss

Ralf

von Torsten M. (torsten2000)


Lesenswert?

Das ist wohl das beste, wenn ich das einfach mal ausprobiere...

Ich denke auf dauer wird es schon wirtschaftlicher, da das VHDL-Design 
wesentlich einfacher zu warten und einfacher zu erweitern ist. Außerdem 
müüste der Host nicht mehr die FIFO-POINTER anpassen. Der 
Host-Programmierer meinte auch, dass viel wegfallen würde und es viel 
einfacher werden würde...

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.