Forum: Mikrocontroller und Digitale Elektronik externes Daten-RAM!


von Robert B. (robert_b36)


Lesenswert?

Hallo zusammen,

folgende Teilaufgabe möchte ich derzeit lösen: Eine beliebige Anzahl von 
16bit-ADCs sollen zeitlich synchron Signal"fetzen" ausgeben. Die 
Signalfetzen sollen bei 2ksps 2s lang sein, also werden pro Kanal

16bit  2ksps  2s = 8kByte

benötigt. Im Sinne der "beliebigen" Anzahl an Kanälen soll das System 
modular aufgebaut werden, also vllt. sowas wie ein Steuermodul und dann 
Kanalmodule mit je 4, 6 oder 8 Kanälen, mal sehen, was draufgeht.
Mein Gedanke war auch wegen der beliebigen Kanalanzahl, die Komplexität 
in die einzelnen Kanäle zu verlagern. Sprich 1 RAM zum Speichern der 
Signal"fetzen" und 1 ADC pro Kanal.
Das Beschreiben der RAMs ist zeitlich unkritisch. Beim "Abspielen" 
sollen sie dann synchron sein.

So, nun die Frage: Ich habe noch nie mit externen RAMs gearbeitet, habe 
aber schon gesehen, dass man das Interface entweder ziemlich separat in 
SW programmieren kann oder n bisschen tiefer in die Architektur des µC 
einzubetten, sodass sie in dessen Adressraum liegen. Das könnte z.B. die 
AT32UC3A-Serie von ATMEL

Auszug aus Datenblatt:
SDRAM / SRAM Compatible Memory Bus (16-bit Data and 24-bit Address 
Buses)

Mit 24bit Adressbus hätte ich bei Verwendung eines 4k x 16bit RAM mit 12 
Bit auch genug Überschuss, um eine hinreichend beliebige Anzahl an 
RAMs/Kanälen abzudecken.

Für meine Anwendung wäre diese Einbettung ja nicht notwendig, da ich den 
RAM ja nicht als Arbeitsspeicher benötige oder sehe ich da was falsch? 
Ist es denn sinnvol, das dann zu machen oder lieber per SW selbst 
programmieren?

Bei einem konventionellen RAM sind m. E. nach für das separate schreiben 
vom µC und synchrone Lesen in Richtung der jeweiligen DACs ein paar 
Puffer-ICs notwendig, um Buskonflikte zu vermeiden. Eine Alternative 
wäre die Verwendung von Dual-Port-RAMs. Hat da jemand Erfahrung? Hat 
jemand ne ganz andere Idee? Erzähle ich hier vllt. sowieso nur Blödsinn? 
Vielen Dank schon mal für eure Antworten!

VG
Robert

von Uwe (Gast)


Lesenswert?

nen kleiner Tipp : nimm nen billig FPGA und pack da deine Gesammte 
Schaltung rein. z.B. EP3C5 bis EP3C25

von Reinhard Kern (Gast)


Lesenswert?

Uwe schrieb:
> Das Beschreiben der RAMs ist zeitlich unkritisch. Beim "Abspielen"
> sollen sie dann synchron sein.

Hallo,

die Daten synchron zu den DACs zu befördern, kann sehr aufwendig werden, 
z.B. mit DMA-Kanal zu jedem DAC, aber man sollte vorher prüfen, ob das 
überhaupt notwendig ist. Selbst einfache DACs wie DAC0830 haben eine 
Doppelregisterstruktur, bei ausreichend Zeit kann daher der Prozessor 
über den Bus die Daten nacheinander in eine ganze Reihe von DACs 
schreiben, am Ausgang aktiv werden die neuen Daten erst mit einem 
(gemeinsamen) XFER-Puls. D.h. ich würde versuchen, ADCs, Speicher und 
DACs direkt im Speicherbereich eines geeigneten Prozessors 
unterzubringen, alles an einem gemeinsamen Adress/Daten-Bus. 20 Bit 
Adresse sollten schon reichen.

So waren Prozessorsysteme schon im vorigen Jahrhundert strukturiert, 
aber deswegen ist das noch lange nicht veraltet.

Gruss Reinhard

von Jan M. (mueschel)


Lesenswert?

Bei dieser niedrigen Geschwindigkeit sollte eigentlich auch ein 
einfacher Atmega reichen - genügend Pins zur Steuerung des RAMs 
vorausgesetzt.
Entscheidende Fragen sind wie Reinhard sagte, die geforderte 
Gleichzeitigkeit und auch das Interface zu den DAC.


PS: Du schreibst mehrmals ADC in deinem Post, ich nehme an, das ist ein 
Tippfehler?

von Reinhard Kern (Gast)


Lesenswert?

Hallo,

noch zur Ergänzung:

du kannst da ein RAM-IC 1Mx8 einsetzen, das kostet ein paar Euro und hat 
schon mal Platz für 128 Kanaldaten.

Gruss Reinhard

von Robert B. (robert_b36)


Lesenswert?

Hallo zusammen,

erstmal vielen Dank für eure Antworten und Anregungen.

@Jan: Vollkommen korrekt. Das sind Tippfehler. Sorry dafür! Das System 
beinhaltet keine ADCs, lediglich DACs.

Das System hat noch einige Komponenten um die beschriebene 
Problemstellung herum, für die mir ein Controller schon sinnvoll 
erscheint. Hauptsächlich User Interface und Kommunikation. Deswegen 
gefällt mir die FPGA-Lösung erstmal nicht so gut. Aber vllt. kann man 
mich noch überzeugen. Bin da allerdings auch total ahnungslos, was das 
angeht.

Bzgl. der anderen Vorschläge: Wie gesagt, mein Gedanke war der, dass das 
ganze nicht mit zunehmender Kanalzahl kritisch wird. Zeitlich, wie auch 
speichertechnisch. Dass, die DACs erst "geladen" werden und dann per 
systemweitem DAC-Takt an den Ausgang übernommen werden, ist soweit klar, 
hatte ich mir auch so gedacht.

Die DACs per DMA in die Controllerarchitektur einzubinden, klingt 
erstmal ganz gut, allerdings hat der oben zitierte Controller z.B. nur 
15 DMA Kanäle. Das Sysstem soll zunächst mit 32 Kanälen aufgebaut 
werden, jedoch beliebig erweiterbar sein (ich denke mal 128 sollten 
reichen, mehr machen wohl keinen Sinn, ohne näher daruaf eingehen zu 
wollen, warum).

Bzgl. des ATMEGA: Hmm... Wenn die Daten von vornherein schon ein 
16-Bit-Struktur haben, ist es da der richtige Weg, von vornherein einen 
8-Bit-Controller zu verwenden? Schon klar, ich muss nix rechnen oder so, 
von daher brauche ich keine "großen" Controller, aber ich könnte mir 
vorstellen, dass das beim Programmieren nur unnötig kompliziert werden 
würde. Energie-, Platz- oder thermische Probleme gibt es nicht.

Haltet ihr meinen Vorschlag mit mehreren RAMs/DualPort-RAMs für nicht 
machbar oder nicht adäquat?

VG
Robert

von Robert B. (robert_b36)


Lesenswert?

Noch ne Überlegung zum Thema einen 1MB RAM Chip, statt viele kleine 
RAM-Chips: Nehmen wir mal an, der RAM ist per DMA an den Controller 
angebunden, die DACs parallel. Dann muss der Controller pro Kanal 2k mal 
in der Sekunde

- 128 x 16Bit über DMA aus einem externen RAM holen,
- diese über ein paralleles Interface an einen DAC zu schicken und
- die Wörter per systemweiten DAC-Takt ausgeben

Wie viele Takte braucht er dafür etwa (einen 16- oder 32-Bit Controller 
vorausgesetzt)? Ich denk mal, wenn man mal mit 16 Systemtaktzyklen 
rechnet, sind das nicht zu wenige oder? Das führt mich zu folgender 
überschlägigen Berechnung:

Klingt eigentlich in Ordnung. Wenn man das System vllt. mit 16 MHz 
betriebt, ist man auf der sicheren Seite denk ich. Voruasgesetzt, mit 
den 16 Taktzyklen bin ich nicht völlig daneben. Dann wäre das auf jeden 
Fall mal eine gangbare Möglichkeit, die auch die Kanalmodule ziemlich 
vereinfacht, weil sie keinen RAM benötigen.

Was meint ihr? Hat das, was ich da gerechnet habe, was mit der Realität 
zu tun?

VG
Robert

von Jan M. (mueschel)


Lesenswert?

Klingt soweit vernünftig, vielleicht zur Sicherheit eher 30 Takte 
einplanen. Allerdings musst du bei 128 DACs an einem Bus schon wieder 
mit Problemen wie Buslängen, Kapazitäten der I/O und so weiter rechnen.
So teuer sind die Controller und RAMs ja nicht - warum nicht auf 32 
Kanäle pro Controller beschränken und dafür noch ein wenig Code in die 
Kaskadierbarkeit dieser Module investieren. Entweder als serielle Kette 
per SPI oder auch SPI als multi-slave System mit einem zentralen Master. 
Die genaue Umsetzung hängt dann natürlich wieder von der geplanten Menge 
an Kanälen ab.

von Robert B. (robert_b36)


Lesenswert?

Naja, das wäre ja ein unidirektionaler Bus vom µC zum DAC und da ich auf 
diese Art ohne dedizierten RAM pro Kanal bestimmt 8 Kanäle in einem 
Modul unterkriegen würde, könnte ich das auf 16 Busteilnehmer 
reduzieren, wenn ich jedem Modul einen Treiber spendieren würde, oder?

Weiß jemand zufällig oder noch besser hat schon Erfahrung, wie viele 
Eingänge welchen Typs so ein Controller, z.B. die AT32UC3A-Serie von 
ATMEL treiben kann? Habe auf die Schnelle im DB nichts gefunden.

VG
Robert

von Reinhard Kern (Gast)


Lesenswert?

Robert B. schrieb:
> Haltet ihr meinen Vorschlag mit mehreren RAMs/DualPort-RAMs für nicht
> machbar oder nicht adäquat?

Das kommt drauf an, ob du Geld zum Wegwerfen hast. Ein 1kx8 
Dual-Port-RAM kostet etwa soviel wie ein 1M x 8 Static RAM, ist also pro 
Byte 1000mal so teuer. Deshalb werden auch kaum noch solche Bauteile 
hergestellt, bei den heutigen schnellen Prozessoren sind sie auch zu 
99,9% überflüssig.

Jeder Verkäufer will dir natürlich einen 16 oder besser 32bit-Prozessor 
einreden, aber was nützt dir bitte ein so breiter Datenbus, wenn der ADC 
byteweise organisierte Register hat?? Es gibt auch andere, aber 
jedenfalls muss man das im Zusammenhang betrachten. Es ist auch ein 
Unterschied, ob du x16 RAMs brauchst.

Ein Hardwareentwurf mit x DMA-Kanälen in einem Prozessor hilft dir auch 
nicht weiter, weil die ja genausowenig gleichzeitig auf den Speicher 
zugreifen können. Wenn DMA was bringen soll, brauchst du für jeden Kanal 
völlig getrennte Hardware, oder du kannst es gleich bleiben lassen.

Wenn natürlich dein Problem darin besteht, soviel Geld wie möglich 
unters Volk zu bringen, dann sag das gleich, dann machen wir keine 
Sparvorschläge mehr. Du könntest aber auch direkt einen Scheck schicken, 
geht schneller.

Gruss Reinhard

von Robert B. (robert_b36)


Lesenswert?

Hallo Reinhard,

danke für deine Antwort! Ich hoffe, du bist nicht so genervt, wie das 
jetzt klang. Ich war nur etwas verwundert, dass sich zu meinem initialen 
Vorschlag niemand geäußert hat, sondern ausschließlich 
Alternativvorschläge kamen. Ehrlichgesagt habe ich über den Kostenaspekt 
wirklich noch nicht nachgedacht, aber da ist natürlich was dran.

Hat jemand ne Idee, wo ich was zum Fanout von Controllern finden kann. 
Ggf. auch, wie man sich das aus anderen Größen ableiten kann? Man könnte 
ja theoretisch Leitungswiderstände und Leitungs- und Eingangskapazitäten 
verrechnen, aber kann da vllt. jemand mit Erfahrungswerten weiterhelfen? 
Das ganze soll kein allzu sehr verteiltes System werden. Alles in einem 
19"-Gehäuse wäre der Plan.

VG
Robert

von m.n. (Gast)


Lesenswert?

Deine Angaben sind mir noch nicht klar. Was bedeutet "zeitlich 
synchron"? Geht es hier um ns oder 10µs?
Dann, welche DACs sollen zum Einsatz kommen?

Grob gesagt, würde ich einen Prozessor für ein paar Kanäle verwenden, 
der dafür die notwendigen Innereien schon mit bringt: beispielsweise 
acht Kanäle/µC und das zusammen auf eine Platine/Baugruppe.

Bei 8KB/Kanal braucht er 64KB freies internes RAM und nur einen 
DMA-Kanal, der den burst-mode beherrscht. Die DACs liegen im externen 
Speicherbereich des µC an aufeinanderfolgenden Adressen (bei 16bit 
Busbreite). Die Kanal-Daten liegen verschachtelt im RAM, sodass die 
ersten acht 16bit-Werte den 1. Wert für Kanal 0, 1, 2,... liefern. Ein 
ext. DMA-request startet die Ausgabe eines "Fetzens".

Da der Preis der 16bit-DACs wohl den Hauptanteil der Kosten ausmacht, 
würde ich beim µC nicht geizen. Mein Vorschlag wäre ein RX621 von 
Renesas. Andere hier werden Dir einen µC mit Cortex-M3 Kern empfehlen, 
wie z. B. den LCP178x, dessen DMA-Eigenarten ich aber nicht kenne.

Robert B. schrieb:
> Hat jemand ne Idee, wo ich was zum Fanout von Controllern finden kann.

Im Datenblatt. Bustreiber (xx245 z. B.) erhöhen das fanout.

von Reinhard Kern (Gast)


Lesenswert?

Robert B. schrieb:
> Hat jemand ne Idee, wo ich was zum Fanout von Controllern finden kann.

Technisch gesehen steht das im Datenblatt, aber ganz allgemein kann man 
sagen: auf dem Board sind keine Treiber wegen zu geringen Fanouts nötig, 
einen Board zu Board Bus sollte man aber über Treiber ansteuern. 
Abgesehen vom Fanout ergibt sich das auch aus der Struktur, wenn du z.B. 
8 Leiterplatten direkt zusammenschaltest, hast du als Bus sehr lange und 
auch noch seitwärts verzweigte Leiterbahnen, die hi-speed-mässig kaum 
noch zu beherrschen sind.

Bei Systemen mit 2..3 LP, die mit weniger als 10 MHz laufen und direkt 
benachbart gesteckt werden, verwende ich allerdings auch den Bus des 
Prozessors direkt. Aber bei deiner möglichen Systemgrösse wird das nicht 
mehr klappen.

Gruss Reinhard

PS Entschuldigung für den etwas genervten Ton, aber ich bin es gewohnt, 
als erstes Preise und Verfügbarkeit zu checken, dann scheiden nämlich 
viele Varianten ohne weiteres Nachdenken sofort aus. Ich habe z.B. 
gerade einen absolut idealen Magnet- und Neigungssensor für einen 
Kompass gefunden, der völlig abgeglichen geliefert wird, nur leider 
leider kostet das Stück 300 Euro und damit mehr als der 
Verbraucherendpreis des ganzen Geräts betragen darf.

von Michael (Gast)


Lesenswert?

Da du sowieso sequentiell auf deinen Speicher zugreifen möchtest, kannst 
du 12/13 I/O-Leitungen am µC sparen, indem du einen Zähler (z.B. im 
FPGA) für die Adressierung innerhalb der Kanäle verwendest.

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.