Forum: FPGA, VHDL & Co. Fragen zu schnellem RAM und ADCs


von Gustl B. (-gb-)


Lesenswert?

Hallo, weil ich mich etwas weiterbilden möchte, möchte ich mal was mit 
schnellem RAM und auch schnellen ADCs anfangen.

Derzeit verwende ich das Blockram im FPGA wenn es um schnelle Dinge 
geht, aber es gibt ja auch ZBT SRAM und DDR2/3. Da ich Anfänger bin ein 
paar Fragen hierzu:

1. Kann ich ZBT SRAM wie Blockram verwenden? Oder ist das deutlich 
komplizierter?

2. Wie kompliziert ist die Verwendung von DDR2/3? Klar würde ich den MiG 
verwenden, aber ich will keinen Microblaze nutzen und den RAM also 
selbst ansprechen, muss ich da die komplette Signalform aus dem 
Datenblatt des Baustein nachbasteln für einen Schreib- und Lesezugriff 
oder brauche ich nur eine kleine FSM die den generierten 
Speichercontroller füttert?

Dann habe ich derzeit einen Flash ADC den ich mit 100MHz betreibe, der 
hat 8 Bits Auflösung und es ist eben nur einer. Jetzt gibt es da ja auch 
bezahlbare Platinen für z.B. FMC oder HSMC die 2x 500MSpS bei 12Bits 
können. Das würde mir sehr gefallen. Ich kann aber überhaupt nicht 
abschätzen wie schwer ist ist die Daten dann in das FPGA zu bekommen. 
Also muss ich den dann auch mit der Samplerate takten (was für einen 
Spartan eher schwer werden könnte) oder geschieht das anders? Hat das 
schonmal Jemand hier gemacht und kann mich beruhigen?

Der grobe Plan ist:

Signale abtasten mit z.B. 2x 500MSps und auf einem Monitor darstellen. 
Dazu etwas RAM für einige Kilo- bis Megapunkte Speicher und vor allem 
will ich dieses "Digital Phosphor" nachbauen. Das scheint mir nicht 
soooo schwer.

Ich brauche also Bildspeicher, 1024 x 512Pixel x 8Bit Farbtiefe = 
512kBytes. Das hat z.B. der Artix 7 XC7A200T schon drinnen, der hat 
sogar 1,425MBytes BRAM. Aber wenn DDR3 "einfach" ist, dann wäre das wohl 
die bessere Option.

Mir geht es hier also darum sowas abzuschätzen.
Ja ich will ein Oszi basteln mit >= 500MSpS, 2 Kanälen und gerne auch 
Logic Analyzer. Wenn Jemand schon sowas plant oder auch bauen will würde 
mich das auch sehr interessieren. Eine Platine die genau dafür 
zugeschnitten ist, also genau die passende Ausstattung besitzt wäre auch 
sehr fein.

Vielen Dank!

: Bearbeitet durch User
von Tobias L. (murxwitz)


Lesenswert?

Also DDR2/3 RAM am MIG des Spartan6 anzusteuern ist relativ einfach, im 
Datenblatt des MIG gibt es die Timingdiagramme, um das "externe" Timing 
zum DDR-Baustein kuemmert er sich dann komplett selbst, incl 
Refreshzyklen.
mann muss halt eine kleine FSM aufsetzen, um immer nach 64 Datenwoertern 
einen Schreibbefehl zu senden und die Adresse zu erhöhen.
Er arbeitet intern mit einem 64word tiefen Fifo, um den DDR-RAM im Burst 
ansprechen zu koennen und so moeglichst hohen Durchsartz zu ereichen.

Zum Takt des DAC: das kommt auf den DAC an, aber 500MHz an den IOs 
schafft ein Spartan 6 locker (max ~1GHz), intern arbeitet man dann mit 
groesseren Datenbreiten. Abarbeitung von mehreren Samples gleichzeitig, 
dafuer niedrigerer Takt.

Am besten waere es, wenn du Stueck fuer Stueck arbeitest, also erst 
einmal die Bildschirmausgabe, mit Mustern oder fertigen Bildern aus dem 
externen RAM, diese kannst du z.B. von einem Microblaze dort hin 
kopieren lassen.
Dieser wird spaeter bestimmt auch anderweitig Verwendung finden. (der 
Microblaze MCS ist kostenlos im WebPack enthalten, ist eine etwas 
abgespeckte Variante).

von Gustl B. (-gb-)


Lesenswert?

Hallo, vielen Dank!

Also Bildschirmausgabe habe ich schon, also aufgenommene Daten aus dem 
BlockRAM anzeigen, mit scrollen und allem. Mir geht es wirklich darum 
jetzt schneller zu werden, also schneller abzutasten und auch mehr zu 
speichern, gerade für "Digital Phosphor". Testen kann ich das jetzt 
leider noch nicht, weil dieser Thread dazu gedacht ist, dass ich mich 
danach besser entscheiden kann welche Hardware ich kaufen sollte, also 
lieber dickeren FPGA mit mehr BRAM oder lieber schnelles externes RAM 
und wenn ja welches? Mein aktueller Spartan 3 kann leider noch kein Bild 
mit "Farbtiefe" speichern weil der zu klein ist. Für 32kSamples reicht 
es jedoch.

von Christian R. (supachris)


Lesenswert?

500MS/s ist schon eine Marke. Spartan 6 kann intern so etwa 100...125MHz 
abarbeiten, ohne dass man viel frickeln und optimieren muss. An den 
ISERDES gehen bis zu 1080MBit/s aber das wird dann halt deserialisiert. 
Muss man halt sehen wie man das wegbekommt. 500MHz direkt geht 
eigentlich nur mit der Virtex Klasse, dein Spartan 3 macht da 
keinesfalls mit. Es gibt auch ADCs, die interne Sample-FIFOs haben. Die 
kannst du dann ganz bequem auslesen. Oder 4 ADCs mit 90° verschobenen 
Takten ansteuern, aber das ist auch eine haarige Sache.

von Tobias L. (murxwitz)


Lesenswert?

ich wuerde einen mit externem RAM nehmen, denn Speicher kann man nie 
genug haben. Der interne wird zum schnellen Zwischenspeichern und als 
Puffer fuer den externen verwendet.

von Gustl B. (-gb-)


Lesenswert?

Hallo Christian, hast Du da irgendwelche Empfehlungen an ADCs? >= 10Bit, 
>= 500MHz, 2 Kanäle und preislich unter 400€ wäre fein. Und natürlich 
irgendwie so dass man die an "übliche" FPGA Boards anbekommt.

Klar den Spartan 3 werde ich dafür nicht verwenden, ein Artix 7 oder 
Spartan 6 wäre ne Option oder eben was von Altera. Alles zusammen, also 
FPGA Board + ADC Karte sollten halt unter so 800€ liegen. Lieber noch 
weiter drunter. Weil es ein Oszi werden soll muss auch Bildausgabe und 
Bedienelemente irgendwie entweder vorhanden sein oder angeschlossen 
werden können.

von Hans-Georg L. (h-g-l)


Lesenswert?

Üblicherweise sind auf den Spartan6 Boards, die man so kaufen kann Chips 
mit Speedgrade 2 verbaut und die gehen an den LVDS Eingängen nur bis 950 
Mb/s.
Dickes internes Ram wird teuer und du landest sehr schnell bei Chips, 
die nicht mehr vom kostenlosen Webpack unterstützt werden. Von daher 
sind externe DDR Rams billiger.

Sagen wir mal ...

Für 4 A/D Kanäle mit je 8 Bit und parallel dazu 32 Kanäle Logic Analyzer
würde sich theoretisch ein Spartan6 LX75 mit 4 x 16 Bit breiten DDR3 
Rams anbieten. Aber so ein Board habe ich bisher noch nicht gesehen.

Ich würde mir aber die Fummelei mit dem Microblaze sparen und dann eher 
an den Zynq denken. Da hast du zusätzlich zur FPGA 2 Arm9 Cores und 
Standard Schnittstellen ohne Ende.

z.B:
High Speed USB OTG zum Abspeichern auf Sticks bei Standalone Betrieb 
oder zur Schnellen Datenübertragung auf einen PC. Ethernet geht auch. 
Und auch die ganzen Schalter, Drehencoder, LED, Relais, LCD-Display usw. 
lassen sich von der Arm-Cores viel besser bedienen.

von Gustl B. (-gb-)


Lesenswert?

Hallo, also eigentlich will ich das nur auf den Monitor bringen, 
Netzwerk und so habe ich eigentlich nicht vor. Also 2 Kanäle und 
schneller RAM wären mir wichtig. Wie sieht es mit ZBT SRAM aus? Ist der 
einfach zu benutzen? Oder so Dual-Port RAMs, habt ihr sowas schonmal 
gemacht? Man will ja gleichzeitig Daten aufnehmen und anzeigen. Also das 
soll sich möglichst wenig in die Quere kommen.

von Christian R. (supachris)


Lesenswert?

Hm, in dem Preisrahmen wirds schwierig, alleine der "kleine" Artix 
7-100T kostet schon über 100€. FMC Zusatzkarten gibts da wohl, die sind 
aber alle nicht unbedingt darauf ausgelegt, mit solchen Tricks wie den 
ISERDES angesprochen zu werden. Geht aber eventuell doch. Problem beim 
Spartan 6 ist, dass das Clocking für die ISERDES sehr beschränkt ist 
(halbe IO Bank), und die FMC Pins meist ziemlich wild über mehrere Bänke 
verteilt sind. Dann passt der ADC nicht an den FPGA.
DDR-RAM ist ja meist drauf, das SP605 hat DVI Ausgang und kostet ca. 500 
Dollar. Hat einen LX45T drauf mit Speedgrade 3. Aber für 800€ incl. ADC 
wirds sicher schwer.
Dual port RAM ist doch völlig unnötig, zwischen den Aktualisierungen des 
Bilschirms hat du doch alle Zeit der Welt, deinen Schnappschuss vom ADC 
abzuholen. Im Vergleich zu den 60 Hz sind doch die paar µs die du mit so 
einem schnellen ADC bei voller Geschwindigkeit speichern kannst extrem 
gering. Aber ZBT RAM wird heute kaum noch auf den Boards verbaut, da 
kenn ich nur die ollen Virtex 4 Boards. Da war interner BRAM halt teuer. 
Aber der DDR RAM ist nicht breit genug...verzwickt. Warum wohl kostet 
der extra Sample-Speicher bei schnellen DSOs nur solche Unmengen? Genau 
deswegen...

: Bearbeitet durch User
von Gustl B. (-gb-)


Lesenswert?

Hm ja. Naja also wenn ich mit 500MSpS aufnehme bei sagen wir 8 Bits 
(weil es einfacher ist) dann bekomme ich 500MBytes/s rein.

Wenn ich jetzt aber dieses "Digital Phosphor" oder "Intensity-grading" 
machen will, dann muss ich viele Aufnahmen überlagern.

Selbst wenn ich da einen Bildspeicher von nur 0.5MBytes verwende, also 
1024x512 Pixel (ok das sind 9Bits Auflösung) mal 8 Bit "Farbtiefe" Dann 
kann ich bei der "Farbtiefe" maximal 255 unterschiedliche helle 
Signalverläufe überlagern. Um die aber aufzunehmen braucht es auch Zeit, 
also 255*Samplezahl/Samplerate. Hier für ein Bild mit 1024 Pixeln in 
x-Richtung wären das schon 255*1024/500M = 0.5 Sekunden. Und ich will 
doch mehr wie 2 Frames je Sekunde anzeigen können.

Also entweder ich nehme immer auf und schreibe aber nur dort ins 
VideoRAM wo gerade nicht gelesen wird oder ich schreibe immer und lese 
nur dort wo gerade nicht geschrieben wird oder ich verwende 2 VideoRAMs. 
also 2x512KBytes. Dann kann ich in eines kontinuierlich schreiben und 
das dann im Videoblank ins andere kopieren und zwar so, dass immer nur 
da kopiert wird wo gerade nicht geschrieben wird. Dazu brauche ich also 
schon 1MByte echt schnelles RAM.

Für eine Aufnahme mit mehreren MPunkten zum Scrollen und so könnte man 
noch zusätzliches schnelles RAM verwenden, da muss man ja nicht 
gleichzeitig lesen und schreiben.

Auch interessant wird der x-y-Modus mit "Intensity-grading". Da könnte 
man ein Bild nehmen mit 512x512 Pixeln und wieder 8Bit Tiefe und als 
Schreibadresse eben beide ADC Werte nehmen. Aber wenn man das live will 
mit hoher Framerate wird man kaum um entweder extrem schnelles oder 
mehrere RAMs herumkommen.

Der Artix 7 200T hat das, der hat mehr als 1MByte drinnen und das Board 
bei ZTEX http://shop.ztex.de/product_info.php?products_id=76 ist 
bezahlbar. Leider habe ich keinen Plan ob ich das mit diesen 
"schlichten" Anschlussleisten mit schnellen ADCs verheiraten kann oder 
ob ich doch was teureres brauche.

von Sigi (Gast)


Lesenswert?

Falls du nicht unbedingt auf Xilinx fixiert bist: von TI gibt's
zu fast allen ADCs auch passende Testboards, leider mit
TI-spezifischem Connector. Aber dafür hat TI einen Adapter auf
HSMC im Angebot (HSMC: Standard-Connector auf Altera-Boards).
Damit sind dann 1-4 Kanal-Systeme mit 500MHz möglich.

von Gustl B. (-gb-)


Lesenswert?

Altera ist schon auch ok, aber da bräuchte ich auch ein FPGA mit viel 
BRAM oder schnellem externen RAM. Ich hab da leider keinen Überblick 
über die Boards, das neue Terasic Cyclone GX 
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=167&No=830&PartNo=2 
hat ja etwas BRAM und HSMC. Aber leider kein halbes MByte und schon gar 
nicht das Doppelte wie der Artix. Gibt es was vergleichbares zum Artix 
zu ähnlichen Preisen? Bei eBay.com gibt es günstige Stratix Boards mit 
HSMC. Die haben auch schnelles RAM aber ist wohl nur mit dem teuren 
Quartus zu verwenden.

von Sigi (Gast)


Lesenswert?

Das mit FPGA und Megabytes internem RAM solltest du lieber
vergessen: Um das interne RAM komplett(!) und schnell genug
anzusteuern müsstest du FPGA-intern viel Aufwand betreiben.
Die internen RAMs sind nur für lokale Geschichten gut.

Von Altera bzw. von Xilinx kriegst du DDR-SDRAM-Controller,
die sind dann schnell genug, und dass bei etlichen MegBytes.

Stratix: es werden nur wenige Stratixe (I bis III, idR nur
kleinere) in den alten+freien Quartus-Versionen unterstützt.
500MHz IO sind auch bei aktuellen Cyclons möglich.

von Gustl B. (-gb-)


Lesenswert?

Ich scheue etwas den DDR RAM weil ich vermute, dass das doch nicht sooo 
einfach ist wie BRAM. Also z.B. wenn ich da ein Vollbild speichern will, 
dann will ich da relativ zufällig an einzelne Punkte etwas schreiben, 
also nicht mehrere zusammenhängende Bytes am Stück an 
aufeinanderfolgende Stellen sondern eben irgendwo. Mit BRAM geht sowas 
ganz einfach, wie ist das bei DDR3? Wie groß ist der Aufwand den ich da 
treiben müsste?

Ich will ja von einer zufälligen Stelle im Bild den Farbwert lesen, was 
dazuaddieren und dann wieder dorthin schreiben, und das an 500M Stellen 
je Sekunde. Am Besten auch das noch doppelt mit 2 ADCs. Klar kann man 
das langsamer machen, also z.B. immer ein paar Kilopunkte aufnehmen, im 
BRAM puffern und die dann ins Bild einbauen. Aber dann bekommt man eben 
Totzeit, also Zeit in der das Signal nicht abgetastet wird oder zwar 
abgetastet wird, das aber nicht im Bild landet am Ende. Mit BRAM könnte 
man das relativ einfach umgehen.

von Lukas K. (carrotindustries)


Lesenswert?

Hans-Georg Lehnard schrieb:
> Ich würde mir aber die Fummelei mit dem Microblaze sparen und dann eher
> an den Zynq denken.

Insb. das microzedboard ist hier sehr interssant: 
http://www.microzed.org/product/microzed Das hat 1GB DDR3-Ram mit drauf. 
nur hängt dieser recht direkt am ARM und nur über den Amba-bus am FPGA. 
Weiß da wer, wie hohe Datenraten man über diesen Bus erreichen kann?

von Duke Scarring (Gast)


Lesenswert?

Christian R. schrieb:
> Warum wohl kostet
> der extra Sample-Speicher bei schnellen DSOs nur solche Unmengen? Genau
> deswegen...
So teuer kann es nicht sein. Als wir letztens ein Speicherupgrade 
gemacht haben, wurde uns nur ein Lizenzschlüssel zugeschickt.
Der zusätzliche Samplespeicher ist also beim Kauf schon dabei...

Duke

von Fpgakuechle K. (Gast)


Lesenswert?

beim Spartan6 hast du bis zu vier Hardcore-memorycontroller on board, 
schau mal in die UG388 ( 
http://www.xilinx.com/support/documentation/user_guides/ug388.pdf ) was 
die so eine transferrate erreichen. dabei Checken ob die Webpack-ISE 
auch die S6-varianten mit mit (mehreren) mem-controller unterstützt.
Flüchtig geschaut finde ich was von DDR3 mit 400MHz, es könnten also 800 
MS möglich sein.

Andere FPGA#s haben diese hardcore-memcontroller leider nicht, da muss 
man sich mit MIG und viel Erfahrungen einen schnellen memorycontroller 
selbst generieren. Das wird schnell schwieriger als es klingt, deshalb 
schätze ich die S6-memorycontroller sehr.


Falls der mem zu langsam ist kann man mit parallen datenbussen reserven 
erschließen.
Also bspw kommen 8 bit mit 200 MS/s rein dann sorttiert man diese 
entweder auf 4 SRAMs a 8 bit @50 MHZ, oder auf einen SRAM mit 32 bit.

MfG

von Gustl B. (-gb-)


Lesenswert?

Also nur um das klarzuszellen, ich will kein eigenes Board bauen. Wenn 
das Jemand kann und machen will gerne, wenn es in meinem Preisrahmen 
liegt kaufe ich vielleicht eines.

Microblaze oder ARM brauche ich auch nicht. Klar wäre vielleicht ganz 
fein für die GUI am Ende aber sonst? Ich will kein USB oder Ethernet 
oder so sondern wirklich nur einen Monitor anschließen.

Derzeit sieht für mich eine Lösung mit BRAM am besten aus. Also 
zumindest für den Bildspeicher. DDR3 als Samplespeicher zusätzlich wäre 
auch fein aber es muss für mich nicht viel sein. Wenige Kilosamples je 
Kanal würden mir reichen. Also so 128k Speicher je Kanal. Das würde gut 
noch ein den Artix passen, vielleicht sogar mehr.

Glaubt ihr man kann das ZTEX Artix 200T Board irgendwie mit schnellen 
ADCs verbinden, also funktionsfähig?

von Fpgakuechle K. (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> Glaubt ihr man kann das ZTEX Artix 200T Board irgendwie mit schnellen
> ADCs verbinden, also funktionsfähig?

Schnelle ADC's heistt meist LVDS, auf die schnelle sehe ich bei ZTEX nur 
die pfostenleiste und bin da skeptisch.

Für das Atlys habe ich ein ähnliches Projekt (AD-Wandler an FPGA-Board 
anschliessen) gefunden:

http://xellers.wordpress.com/2013/12/14/6-111-or-how-i-learned-to-stop-worrying-and-love-the-fpga/

Die AD-Wandler Platine ist allerdings selbst gemacht.

MfG,

von Crocodile Dundee in Shanghai (Gast)


Lesenswert?

Fpga Kuechle schrieb:
> Schnelle ADC's heistt meist LVDS, auf die schnelle sehe ich bei ZTEX nur
> die pfostenleiste und bin da skeptisch.


siehe auch:
www.mikrocontroller.net/topic/323654

von Gustl B. (-gb-)


Lesenswert?

Ja gut ich brauche ja keine MGTs. Kann man nicht auch normale IOs also 
je zwei zu einem LVDS Pärchen verbinden also als solches nutzen? Wenn 
ich da irgendwie parallel die Daten mit 500MHz je Pin oder je Pin 
Pärchen reinbekomme würde mir das genügen.

@Fpga Kuechle: Das Atlys ADC Projekt habe ich schon gesehen, Ich habe an 
einem Nexys2 einen ADC dran der auch fein mit 100MHz abtastet, ganz ohne 
LVDS und tolles Layout. Ich habe hier auch ein Celoxica RC10 mit 2x75MHz 
ADCs die sogar je 10 Bits haben. Leider ist da aber ausser dem BRAM im 
Spartan3 nix an zusätzlichem RAM verbaut.

Ich würde gerne etwas basteln, vor allem in VHDL und eben gerne 
irgendwie "Intensity Grading" und einen X-Y-Modus einbauen. Dazu brauche 
ich in beiden Fällen RAM um ein komplettes Bild zu speichern. BRAM würde 
mir genügen.

Natürlich könnte ich weiterhin einen oder dann zwei 100MHz 8Bit ADCs 
verwenden, aber wieso nicht was schnelleres? 200MHz und 8Bits sind auch 
günstig und ohne LVDS zu haben, aber 8 Bit sind mir etwas wenig, vor 
allem weil ich eine Auflösung von 1024x768 Pixeln verwenden möchte. Also 
es müssen ja keine 12 oder 14 Bits sein, aber 10 will ich schon, da kann 
man das kleinste weglassen und bekommt schöne 512 Pixel in der 
Vertikalen.

Hier das also dieser Thread dient für mich dazu, mich zu entscheiden was 
ich am geeignetsten kaufe, also lieber einen dicken FPGA mit viel BRAM 
weil das einfach ist, oder lieber was mit DDR3, da kann ich leider nicht 
abschätzen wie einfach oder schwer das ist wenn man zufällige Zugriffe 
hat. Vielleicht kennt Jemand auch ein Board mit schnellem DualPort SRAM 
oder so, da gibt es ja einiges exotisches wie auch ZBT SRAM.

Und wenn ich bei meiner aktuellen Lieblingslösung mit dem BRAM bleibe, 
dann bräuchte ich ein preiswertes Board mit einem solchen FPGA und ein 
passendes Board mit ADC. Zur Not wird es dann vielleicht dieses ZTEX 
Board (das leider weder HSMC noch FMC hat) und 2x 200MHz 10Bit Flash 
ADC. Die werden da schon irgendwie anschließbar sein. So 500MHz wären 
halt schöner ...

von Christoph Z. (christophz)


Lesenswert?

Gustl Buheitel schrieb:
> Ich will ja von einer zufälligen Stelle im Bild den Farbwert lesen, was
> dazuaddieren und dann wieder dorthin schreiben, und das an 500M Stellen
> je Sekunde.

Es ist schon so wie du vermutest, für zufällige Zugriffe ist ein 
einfaches SRAM (wie z. B. ein internes BRAM) gut geeignet und schnell. 
Es gibt auch externe SRAM Chips die sich für solche Projekte eignen.

Ein DDR-RAM kann man auch benutzen um nur einzelne Speicherzellen zu 
lesen/schreiben. Schnell ist das aber überhauptnicht.


Mein derzeigitges rudimentäres Verständnis von Intensity Grading lässt 
mich aber darauf schliessen, dass deine Speicherzugriffe alles andere 
als Zufällig sind, sondern stark sequentiell. (Du bearbeitest ja deinen 
Signalspeicher immer von links nach rechts, so wie der Kathodenstrahl 
früher auch). XY-Modus mit Grading ist dann wohl komplexer.

Vielleicht würde es mit XY so klappen:

Du brauchst 5 Speicher
- Video Speicher
- 2 Sample Speicher für ADC Werte (als SRAM/BRAM für zufälligen Zugriff)
- 2 Speicher für das Grading (DDR-RAM)

Der Video- und Grading Speicher ist gleich strukturiert, entspricht also 
dem Bildschirminhalt.

Die zwei Grading Speicher wechseln jeweils ab, einer ist Quelle (alt) 
und der andere ist die Senke (neu).

Der ADC liest konstant Werte ein in den neuen Sample Speicher, immer 
wenn er den Speicher ein mal vollgeschrieben hat wechselt er den Sample 
Speicher und startet einen neuen Zyklus (Damit ein Sample Speicher frei 
gelesen werden kann):

Der alte Grading Speicher wird sequentiell ausgelesen, die alten Werte 
werden zur Ausgabe in den Videospeicher geschrieben, die alten Werte 
werden zusammen mit dem Sample Speicher verrechnet (Den Sample Speicher 
kann man ja schnell zufällig Adressieren) und die Ergebnisse werden 
sequentiell im neuen Grading Speicher gespeichert.

Das ganze läuft synchron zum ADC (also von der Datenmenge her), das 
Grading ist fertig, wenn der ADC wieder einen Sample Speicher gefüllt 
hat, dann beginnt der Zyklus von vorne.


So wie ich mich kenne habe ich wahrscheinlich habe ich etwas wichtiges 
Vergessen und es funktioniert so nicht :-)

Was ich damit sagen möchte: Du musst dein Problem so zurechtbiegen, 
damit es sich mit DDR-RAM gut lösen lässt.

von Gustl B. (-gb-)


Lesenswert?

Naja also ich weiß nicht ob der Speicher so squentiell 
gelesen/geschrieben werden kann. Also das ist ja quasi "3D" also in 
x-Richtung habe ich die Zeit, in x-Richtung den Wert und in z-Richtung 
den Inhalt, also die "Farbe".

Wie ich mir das so vorstelle ist, dass da jetzt ein Sample reinkommt, 
dann wird in dem Speicher an die x-y-Stelle gegangen, da der Farbwert 
gelesen, verändert und dort wieder hingeschrieben. Das einzige was da 
sequenziell ist sind die x-Werte. Wenn ich den Speicher also so aufbaue, 
die Adresse die x-y-Position ist, und der Inhalt dort die Farbe dann 
sähe das in etwa so aus:

18 ... 9 8 ... 0 sind die Bits der Adresse, die oberen 10 sind die 
x-Richtung, die ändern sich schön nacheinander, aber dahinter ist es 
dann schon vorbei. Weil die y-Richtung ist ja beliebig durch das Signal 
vorgegeben, das kann sich langsam kontinuierlich ändern, kann aber auch 
große Sprünge machen. Für mich sieht da DDR3 einigermaßen ungeeignet 
aus, ausser man macht da viele Tricks die ich nicht kenne oder nutzt 
viele RAMs parallel oder so, aber eine günstige Lösung mit einem DDR3 
Stein wird das aus meiner Sicht erstmal nicht leisten können.

Also Deine Idee mit den 2 Speichern ist schon nicht schlecht, ich 
versuche das Problem nochmal zu beschreiben:

Von den 1024x512 Pixeln im Bild müssen ja bei einem "Durchlauf" von 1024 
Samples nicht alle 0,5MPixel gelesen und geschrieben werden, sondern 
eben nur 1024 Pixel - dafür diese aber zufällig, weil die eben gerade 
auf dem Signalverlauf liegen.

Man könnte aber auch immer alle lesen, vielleicht muss man das ja auch 
weil man die die nicht auf dem Signalverlauf liegen etwas abdunkeln 
möchte.

Das macht es aber eher komplizierter, also in der Zeit in der 1 neues 
Sample reinkommt hat man ja einen x-Wert. Den y-Wert entscheidet das 
Sample. Diese x-y-Stelle muss man lesen, verändern und speichern. UND 
vor allem muss man alle anderen Stellen die auf dieser y-Spalte liegen, 
(also das ist die Bildpixelspalte mit dem gleichen x-Wert) auch lesen, 
verändern (abdunkeln) und schreiben.
Wenn jetzt das Sample kommt muss man also nicht nur 1Byte lesen und 
schreiben, sondern sogar 512, das sind bei 500MSpS dann 500M*0.5kBytes = 
256GBytes/s (!). Na das ist schon ne andere Hausnummer :-D

Aber das hybsche daran: Es ist machbar! Man könnte jede Bildzeile also 
eigenes BRAM schreiben, dann hat man da also 512 BRAMs aus denen man 
parallel lesen kann, also wirklich bei 500MHz jeweils 1Byte/Takt. Aber 
das will man ja auch wieder schreiben. Gleichzeitig lesen und schreiben 
ginge mit Dualport, die Stellen wären für den Lese- und den 
Schreibzugriff auch unterschiedlich, denn es wird gelesen, verändert, 
geschrieben, also 2 Takte später wird dort geschrieben wo zuerst gelesen 
wurde.

DDR3 wäre damit dann raus und irgendwie sehe ich jetzt auch wieso Oszis 
so verdamt teuer sind. Habe ich was übersehen/falsch verstanden?

Edit: Die 256GBytes/s sind nur lesend, das muss auch noch geschrieben 
werden :-D

: Bearbeitet durch User
von Christoph Z. (christophz)


Lesenswert?

Gustl Buheitel schrieb:
> 18 ... 9 8 ... 0 sind die Bits der Adresse, die oberen 10 sind die
> x-Richtung, die ändern sich schön nacheinander, aber dahinter ist es
> dann schon vorbei.

Genau darum habe ich ja vorgeschlagen, das ganze umzudrehen.

Gustl Buheitel schrieb:
> DDR3 wäre damit dann raus und irgendwie sehe ich jetzt auch wieso Oszis
> so verdamt teuer sind. Habe ich was übersehen/falsch verstanden?

Irgendwas muss da noch falsch sein, mein TDS3012B Baujahr 2002 kann auch 
Digital-Phosphor und das Ding hat sicher keinen Supercomputer Speicher 
drin :-)
(Tek hat das zusammen mit National damals als ASIC gebaut).

von Gustl B. (-gb-)


Lesenswert?

Ein "Nachleuchten" kann man auch einfacher haben, klar. Also ich kann 
auch dauerhaft in viele kleine Speicher aufnehmen, also:

Man nehmen sagen wir 64KBytes BRAM eingeteilt in 64 einzelne 1KByte 
BRAMs.

Jetzt kommt der erste Trigger, der erste BRAM wird gefüllt, dann der 
nächste Trigger, der zweite wird gefüllt ... jeder einzelne mit 1024 ADC 
Werten.

Und dann Speichert man eben kein komplettes Bild, sondern fragt parallel 
alle hier 64 Speicher ab wenn man bei einem Pixel ist ob da ein Bit 
gesetzt ist oder nicht. Bei dem "neuesten" also dem als letztes 
gefüllten RAM wird das wenn da ein Bit in dem Pixel gesetzt ist dieses 
also volle Heligkeit ausgegeben, bei weiter in der Vergangenheit 
gelegenen RAMs dann etwas dunkler.

Man geht also wie der normale VGA Monitor sein RAM zeilenweise ab, ich 
mache das auch so, aber eben nur mit einem RAM. Die RAM Adresse ist die 
x-Position in der Zeile und dann wird eben verglichen ob der Inhalt des 
RAMs an dieser Stelle der Zeilennummer, also y-Position entspricht, wenn 
ja, wird das Pixel hell, wenn nicht bleibt es dunkel. Das könnte man 
auch mit mehreren kleinen RAMs hintereinander (kann man sich so 
vorstellen als lägen diese Signal-Datenreihen 
hintereinander/übereinander) parallel machen und die ältesten werden 
eben abgedunkelt ausgegeben.

Ja, könnte ich auch machen, braucht vor allem weniger Speicher weil man 
nur da Speichert wo auch Information ist und nicht den ganzen leeren 
Bereich im Bild.

Mir ist noch nicht klar wie das da mit schreiben und lesen geht, also 
während ich lese ändert sich ja die Reihenfolge der RAMs, weil alte 
wieder neu geschrieben werden und dann "neu" sind.

Man sollte da vielleicht auch unterscheiden, also dieses "Nachleuchten" 
beachtet ob Werte alt oder neu sind, "Intensity Grading" ist aber 
vermutlich eher, dass Orte (x-y-Punkte auf dem Monitor) an denen die 
Signalkurve oft vorbeikommt heller werden und andere nicht.

Bei den hintereinander/übereinander gelegten RAMs wie oben wäre das dann 
so, dass alle gleich bewertet werden und die Pixelhelligkeit dann die 
Summe ist. Wenn ein Pixel nur in einem RAM vorkommt, ist es dunkler wie 
wenn es in vielen RAMs vorkommt.

Man ist das schwer sich da für was zu entscheiden^^ vielleicht reicht ja 
doch der olle Spartan3.

von Gustl B. (-gb-)


Lesenswert?

So, also ja vielleicht sollte man da wirklich unterscheiden zwischen 
Nachleuchten und einem "Intensity grading" oder "Heatmap".

Das Nachleuchten kann man ja auch komplett nur für die Ausgabe machen, 
also für den Monitor. Sagen wir ich betreibe den mit 60Hz und will eine 
Sekunde nachleuchten. Dann Baue ich einen FIFO mit 60 Signaldatenreihen 
wie oben, also einen Stapel aus 60 Signalverläufen und nehme mit jedem 
Monitorframe das unterste weg und lege ein neues oben drauf. Das oberste 
ist am hellsten, das unterste am dunkelsten. Da bekäme man dann z.B. 60 
Signalverläufe.

Und wie ist das, also mich interessiert die Totzeit, ich möchte, dass 
möchlichst die ganze Zeit abgetastet wird und auch jedes Sample auf den 
Monitor kommt. Das wäre mit diesem Nachleuchten nicht der Fall, ausser 
ich schaffe es in jedem der 60 Bilder die ja maximal 1/60s Samplezeit 
abdecken auch die kompletten Daten dieser Zeit darzustellen, also bei 
500MSpS wären das dann 500M*1/60 = 8,33MPunkte. Das ist schon ziemlich 
viel für ein Display das nur 1024 Punkte in x-Richtung darstellen kann. 
Klar man kann Punkte zusammenfassen oder den Sampletakt ändern, ...

Mit der "Heatmap" oder "Intensity Grading" verliert man die Zeit glaube 
ich nicht, man verliert nur die Zeit zwischen einem Durchlauf und dem 
nächsten Trigger (gut das ist auch viel aber vermutlich weniger). Man 
kann da immer aufnehmen, der Trigger feuert, die Signalform wird ins 
Bild geschrieben, nach den 1024 Werten wird kurz auf den nächsten 
Trigger gewartet und es geht wieder los. Jedes Bild am Monitor enthält 
dann nicht nur einen Schnappschuss der einmal alle 1/60s gemacht wurde, 
sondern fast alle Daten die während der 1/60s aufgenommen wurde. Und bei 
1/60s kann bei 500MSpS und 1024 Werten in x-Richtung maximal 500M/1024 = 
488.000 Mal das Bild beschrieben werden (gut da fehlt jetzt die Totzeit 
wenn auf den Trigger gewartet wird, selbst wenn das 50% der Zeit sind 
sind das immernoch massig Signalverläufe). Es kann also ein ziemlich 
fein abgestuftes Bild aus sehr vielen Signalverläufen entstehen und wenn 
nur ganz selten ein andersartiger Verlauf dabei ist, ist die 
Wahrscheinlichkeit deutlich höher, dass auch dieser abgebildet wird.

Das ist jetzt halt "Nachleuchten" das auch mit wenig RAM oder DDR3 RAM 
geht vs. "Intensity grading" mit extrem hoher Datenrate und vermutlich 
zwingend viel BRAM.

von Gustl B. (-gb-)


Lesenswert?

Noch ne Frage zu BRAM und Bandbreite/Datenrate.

Der XC7A200T hat 365 36kb BRAMs. Jedes davon kann man ja mit 72Bit 
Breite ansprechen (maximal). Da ist dann noch Parity dabei vermutlich 
also sagen wir mal 64Bit Breite je BRAM. Das sind dann zusammen

64*365 = 23.360Bits. Und wenn man das jetzt mit 500MHz taktet bekommt 
man
23.360*500M = 11.680.000MBits/s = 1.460.000MBytes/s = 1,46TBytes/s

Kann man das wirklich nutzen? Das ist schon extrem viel an Datenrate 
aber halt auch richtig super wenn das geht. Oder wo ist der Fehler?

Klar das ist dann nichtmehr DualPort bei den 72Bits, aber trotzdem sehr 
fein.

von Grendel (Gast)


Lesenswert?

Das Problem ist wohl wie Du ALLE BRAMs gleichzeitig (und sinnvoll) so 
schnell mit Daten befüllen willst.
Die sind ja über den ganzen Chip verteilt und nicht ein gemeinsamer 
Speicherblock...

von Gustl B. (-gb-)


Lesenswert?

Klar, das ist ja auch gut so.

Also angenommen ich mache für jede Bildzeile einen RAM. Also mit 8Bit 
Farbtiefe und 1024 Pixeln in x-Richtung wären das 1kByte/RAM.

(Ja ich weiß, die kleinen RAMs haben 2KBytes aber erstmal egal.)

Da kommt dann also das abgetastete Signal Sample für Sample.
Jetzt hat das Sample für die x-Position X und das hat gerade den Wert Y.

Dann lese ich aus allen (!) RAMs den aktuellen Wert für das Pixel X 
(jedes RAM ist ja eine Zeile). Und dann entscheide ich:

Wenn der RAM die Zeile Y darstellt, also die Zeile mit dem aktuellen 
Sample-Wert, dann wird der Inhalt erhöht (also irgendwas addiert um das 
Pixel heller zu machen), und bei allen anderen RAMs, die also nicht der 
Zeile mit dem aktuellen Sample-Wert entsprechen, wird der Inhalt 
erniedrigt (subtrahiert oder sowas um das Pixel abzudunkeln).

Es wird also bei jedem Sample immer von allen RAMs gelesen, dann 
entweder heller oder dunkler gemacht und dann wieder geschrieben.

von Gustl B. (-gb-)


Lesenswert?

Hallo,
kann man bei Xilinx in diese 18kb BRAMs auch wirklich 18kb speichern, 
also 9 Bit Breite und 2048 Tiefe speichern? Oder ist der Parity Bereich 
wirklich nur für Parity da?

: Bearbeitet durch User
von Christian R. (supachris)


Lesenswert?

Nee, der ist frei verfügbar. Ich nutze den auch immer mal für 
Zusatz-Infos, die ich durch die FIFOs durchschieben muss. Man kriegt nur 
beim Bitgen dann eine Info, dass man die Parity Bits nicht als Parity 
benutzt.

von Gustl B. (-gb-)


Lesenswert?

Danke! Juhu! Das sind dann schon 9Bits Farbtiefe :-)

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.