Was ist bei AVR externem RAM die Spitze des Machbaren? (in mb/s)

#900772
Lesenswert?

Hallo Forum,

Die 4kb meines 664 werden zu knapp, und ich möchte externen Ram von 
mindestens 64kB (so das Adressen nich größer als 16bit). Hintergrund 
ist, das ich viele tausend 8bit/10bit ADC Samples, bzw Messergebnisse 
Buffern will, bald mit Mhz Samplerate.

Was ist dann der beste Durchsatz, den ich mit externen Rambaustein 
realisieren kann? Welchen Typ Ram sollte ich bestenfalls nehmen, welche 
Features gibt es, sollte er haben für besten Durchsatz?

Gibt es so Dinge wie Burstmode, wo je Clock ein Byte ausgegeben oder 
geschrieben wird, mit Autoinkrement? Oder gäbge es Chips die ein 
doppeltes R/W-Interface haben, also auf die ein Schreiber und ein Leser 
gleichzeitig (an verschiedenen Adressen) zugreifen kann?

Ich würde evtl meinen pipeline ADC (max 60Mhz, würde ihn gerne auf 1Mhz 
sampeln lassen) mit parallelinterfacfe dann direkt auf den externen Ram 
schreiben lassen, und von AVR (20Mhz) lesen lassen, paralleler 
(inkrementeller) Lesezugriff wäre dann fein (Möglichkeit A), oder ich 
lagere alles andere an Variablen bis auf Stack auf extern (Dann wäre 
schneller Random Access gut), um den internen Ram für die Berechnungen 
auf den Samples zu benutzen (Möglichkeit B). Da vermutlich pipelined 
Sachen mit inkrementellen Zugriff schneller sind wohl eher A.

Empfehlungen für bestimmte Typen nehme ich natürlich auch gerne an. Ich 
kenne bisher nur die einfachen Rams ohne interne Adressschaltwerke.
Gast #900788
Lesenswert?

>wo je Clock ein Byte ausgegeben oder
>geschrieben wird, mit Autoinkrement?

Ja, es gibt (Assembler)Befehle mit autoincrement/dekrement.


>Was ist dann der beste Durchsatz

Besagte Befehle können eine Speicherzelle (Byte) beschreiben (benötigen 
mW. 2 Prozessor=Quartztakte)


>mit parallelinterfacfe dann direkt auf den externen Ram
>schreiben lassen

Weiß nicht genau was du meinst, aber du könntest eine kleine Hardware 
bauen, die so konstruiert ist, dass der parallele Lesevorgang aus dem 
ADC gleichzeitig ein Schreibvorgang in den RAM ist. Musst dir nur 
Gedanken über die Adressen machen...


>einfachen Rams ohne interne Adressschaltwerke.

??
#900793
Lesenswert?

Moritz,

>>Gibt es so Dinge wie Burstmode, wo je Clock ein Byte ausgegeben oder
>>geschrieben wird, mit Autoinkrement?
Erstaunlicherweise gibt es GENAU DIE Modi, die im Datenblatt genannt 
werden. Das Datenblatt ist kostenlos und sofort und ohne Ansehen von 
Rasse, Alter, Geschlecht verfügbar.
Du weisst aber schon was ein Datenblatt ist?

>>Oder gäbge es Chips die ein doppeltes R/W-Interface haben,
>>also auf die ein Schreiber und ein Leser gleichzeitig (an verschiedenen 
>>Adressen) zugreifen kann?
Schau mal hier: http://de.wikipedia.org/wiki/Dual-Port-RAM
Schau mal auf der Website von Ulrich Radig, der hat solche Dinger aus 
alten Motherboards mal für eine GraKa verwendet (glaube ich), zwar eine 
andere Applikation, aber gleiche Funktionsweise.

Jochen  Müller
#900794
Lesenswert?

Matthias Lipinsky wrote:
> Ja, es gibt (Assembler)Befehle mit autoincrement/dekrement.

Ich verstehe nicht ganz was du meinst, es geht doch um externes Ram, das 
der Assembler LD/ST Autoinkrement hat ist mir bewusst, aber sowas 
bräuchte ich ja als Externes Analogon. Also Implizites Autoinkrement, 
ohne das man die Adresse zuvor (neu) anlegen muss.

>
> Besagte Befehle können eine Speicherzelle (Byte) beschreiben (benötigen
> mW. 2 Prozessor=Quartztakte)

Das gilt für internes Ram, mit Autoinkrement müsste ein Externer aber 
pro Clock ein Byte schreiben können oder nicht? Ich brauch ja schoin 
mehrere ASM Befehle (=mehrere AVR Clocks) im AVR, um Bytes von Intern an 
den Port zu legen.

>
> Weiß nicht genau was du meinst, aber du könntest eine kleine Hardware
> bauen, die so konstruiert ist, dass der parallele Lesevorgang aus dem
> ADC gleichzeitig ein Schreibvorgang in den RAM ist. Musst dir nur
> Gedanken über die Adressen machen...

Wenn der Chip nicht explizit Parallelen Zugriff gestattet, wie soll das 
gehen? Ich müsste die Zugriffe dann in der HW irgendwie serialisieren.



>
>
>>einfachen Rams ohne interne Adressschaltwerke.
>
> ??

Ich meine damit vermutllich was als statische Rams bezeichnet wird: 
Adresse anlegen, und ein statisches Logiknetzwerk wirft das Byte raus, 
ohne das intern ein Schalt*Werk* (also mit internen Zustandsspeichern) 
zugange ist.

Ich suche dann vermutlich Spielarten von dynamischen Rams, da gibts ja 
einige.
#900798
Lesenswert?

Jochen Müller wrote:

> Erstaunlicherweise gibt es GENAU DIE Modi, die im Datenblatt genannt
> werden. Das Datenblatt ist kostenlos und sofort und ohne Ansehen von
> Rasse, Alter, Geschlecht verfügbar.
> Du weisst aber schon was ein Datenblatt ist?
>

Ich beziehe mich im ganzen Post auf externe Rams, wie der AVR bzw dessen 
Ram funktioniert ist mir bekannt. Da ich noch keinen Kandidaten habe, 
dessen Funktionsweise ich aus dem Datenblatt ersehen kann hilft diese 
Information ja wenig, es sei denn ich würde eine Liste von 
Bauteilbezeichnungen unterschiedlicher RAMS bekommen, von denen ich mir 
dann die Datenblätter saugen und vergleichen kann, was auch nicht so 
verkehrt wäre wenn ichs mir recht überlege :).
#900802
Lesenswert?

> Schau mal hier: http://de.wikipedia.org/wiki/Dual-Port-RAM
> Schau mal auf der Website von Ulrich Radig, der hat solche Dinger aus
> alten Motherboards mal für eine GraKa verwendet (glaube ich), zwar eine
> andere Applikation, aber gleiche Funktionsweise.
>
> Jochen  Müller

Danke für das Stichwort, das war was ich meinte, die scheinen aber teuer 
und rar zu sein, vielleicht baut man es sich doch per HW selber...
#900806
Lesenswert?

Teuer nicht, aber rar schon, weil nicht mehr hergestellt. Jedenfalls in 
der von Radig erwähnten Video-RAM Version. Segor hat noch solche VRAMs, 
in 64Kx4 und 256Kx4 Versionen. Damit sind Abtastraten bis zu 40Ms/s 
möglich. Allerdings nur was das RAM angeht, der AVR kommt natürlich 
nicht annähernd damit hinterher, die so schnell gespeicherten Daten 
wieder aus dem RAM rauszufischen. Es sollte möglich sein, mit max. etwa 
2MB/sec auszulesen.
Gast #900810
Lesenswert?

>Ich verstehe nicht ganz was du meinst, es geht doch um externes Ram, das
>der Assembler LD/ST Autoinkrement hat ist mir bewusst, aber sowas
>bräuchte ich ja als Externes Analogon. Also Implizites Autoinkrement,
>ohne das man die Adresse zuvor (neu) anlegen muss.

>Das gilt für internes Ram, mit Autoinkrement müsste ein Externer aber
>pro Clock ein Byte schreiben können oder nicht? Ich brauch ja schoin
>mehrere ASM Befehle (=mehrere AVR Clocks) im AVR, um Bytes von Intern an
>den Port zu legen.

Würd ich nicht sagen.

LD/ST mit Auto Inc/Dec tut WÄHREND der Ausführung des Befehls: Die 
Adresse inc/dec, an den Adressausgang geben und das ensprechende Datum 
lesen/schreiben. Alles innerhalb zweier Taktzyklen. Der externe ist 
meines wissens (ohne waitstates) so schnell. (der interne glaub nur ein 
takt)

Wozu soll der RAM eine Adresse zählen, wenn du die explizit anlegst?


>ch meine damit vermutllich was
Ja, das ist klassischer SRAM.

PS:
guck dir mal den AT45DB642 an. der hat nen Paralleleingang, ohne 
Adressenangabe. Incrementiert intern hoch..
Aber den reizt du NIE mit dem Atmel aus..
Gast #900878
Lesenswert?

Hab ich was verpasst? Dual-Port-RAMs aus Caches von alten Mainboards?
Das sind schnelle asynchrone SRAMs, mehr nicht. Dann habe ich auch
noch irgendwie im Hinterkopf das Zugriffe auf den externen Speicher
mindestens 2 Takte brauchen.
Die Idee mit dem Dualport-RAM würde z.B. Sinn machen wenn man den
Transfer vom Wandler in den Speicher von einem CPLD/FPGA machen
läßt und parallel mit einem Controller die Daten lesen möchte.
Wenn es nur der Controller sein soll ist das schon angesprochene
DMA eine Variante oder einfach ein möglichst schneller Controller.

Jens
Gast #901010
Lesenswert?

> Oder gäbge es Chips die ein
> doppeltes R/W-Interface haben, also auf die ein Schreiber und ein Leser
> gleichzeitig (an verschiedenen Adressen) zugreifen kann?

Es gibt Microcontroller (z.B M16C) die haben eine oder mehrere DMAs 
eingebaut. Da geht sowas alleine im Hintergrund waehrend der Prozessor
was anderes macht.

> Die Idee mit dem Dualport-RAM würde z.B. Sinn machen wenn man den
> Transfer vom Wandler in den Speicher von einem CPLD/FPGA machen

Eigentlich nicht. Dualport-Ram ist ziemlich exotisch und sehr teuer.
Es ist dann besser wenn man ein sehr schnelles Ram nimmt und der
FPGA das simuliert. Und wenn es noch schneller sein muss dann
koennte man ja auch zwei Rams parallel am FPGA betreiben und die 
Zugriffe verteilen, bzw. 16Bit auf einmal schreiben. Genug Beine haben 
die Teile ja.


Olaf
#901045
Lesenswert?

Olaf wrote:
> Es gibt Microcontroller (z.B M16C) die haben eine oder mehrere DMAs
> eingebaut. Da geht sowas alleine im Hintergrund waehrend der Prozessor
> was anderes macht.

Nicht ganz: Beim M16C wird die CPU angehalten, während per DMA Daten 
übertragen werden. dsPICs haben dagegen einen echten Dualport SRAM 
(zumindest 1-2kByte davon) mit dem wirklich im Hintergrund per DMA Daten 
übertragen werden.
#901231
Lesenswert?

Danke euch für die vielen Antworten,

Also Fazit, Dualport brauche ich nicht, weil AVR eh zulangsam. 2MB/s 
sind toll, muss mal gleich nachrechnen obs hinhaut.

Weitere Unklarheiten:
@Matthias Lipinsky

"Würd ich nicht sagen.

LD/ST mit Auto Inc/Dec tut WÄHREND der Ausführung des Befehls: Die
Adresse inc/dec, an den Adressausgang geben und das ensprechende Datum
lesen/schreiben"

Meinst du das im Zusammenhang mit integrierten Schnittstellen für 
externes RAM, wie sie wohl auf anderen/größeren Kontrollern zu finden 
sind? Der 644 hat sowas nicht, ich muss ein LD vom ExtRam also per 
Software wrappen:

.macro _LD    ;@0: Dest.Adr IntRam, @1:lowbyte der SpeicherAdr für 
ExtRam
ldi     r20, @1
out     PortA, r20

(für max speed sei das obere adressbyte als kontant angenommen, muss 
dann nicht gesetzt werden, spart takte)
(in HW vielleicht ein ReadClock erzeugen, spart 2 takte)

(Waitstate? Digital IO Synchlatch (1.5 AVR clocks soweit ich mich 
entsinne)
nop
nop

in      r20, PortD
sts     @0, r20
.endmacro

ich komme hier also bestenfalls auf 7 clocks, wobei vermutlich noch 2-3 
nops mehr für Waitstate rein müssen. wäre dann ~2 MB/s


schöner fände ich es so:

;ExtRamadresse wurde gesetzt

in    r20, PORTD  ;AVR-CPU Clock wird nach außen geführt, und erzeugt 
synchronen Readclock, ExtRAM autoinkrementiert,
st    Y+, r20
in    r20, PORTD
st    Y+, r20
in    r20, PORTD
st    Y+, r20
...

so würde ich einen happen ins ram kopieren, und brauche dafür vom avr 
her nur 3 clocks. Also gibt es derartige Autoinkrement-Funktionen bei 
Rams? Ist das dann typisch dyn. RAM, oder kann stat. RAM solche features 
auch besitzen?

Mit Waitstate ist wohl die Zeit gemeint zwischen Read-Befehl und 
Anliegen der Datenbits, welche bei stat. Ram in der Bauteilbezeichnung 
angegeben sind? Z.b. finde ich bei Katalogen unter statischen Rams Werte 
zwischen 50-100ns, das wären immerhin 3-5 AVR-Takte, gibt es keine RAMs 
die sagen wir mal auf 10ns kommen (mit pipepline?).

@Jörg
Mein 644 hat leider kein DMA oder Externes Ram-Interface, da meine 
Schaltung und Programm inzwischen quasi fertig ist muss ich nun dabei 
bleiben (obwohl rückblickend man ruhig 10 euro mehr für die nächste 
Controller-Liga investieren hätte können). Übrigens, warst du es nicht 
der mir mal letztes Jahr zu multiplexten Widertandsmessungen in DSE 
weitergeholfen hat? Vielleicht interessiert es dich ja zu hören, dass es 
sich genau um die Anwendung handelt, und nach 10 Monaten Krampf sogar 
halbwegs funktioniert :). Danke auch nochmal an der Stelle, damals in 
der Konzeptfindungsphase hat du mich auf die richtige Idee mit der 
4-Wire Multiplexten Messung gebracht...
Moderator Persönliche Seite #901236
Lesenswert?

Moritz E. wrote:

> Mein 644 hat leider kein DMA oder Externes Ram-Interface, da meine
> Schaltung und Programm inzwischen quasi fertig ist muss ich nun dabei
> bleiben

OK.  Bringt dir vielleicht ein Upgrade auf einen ATmega1284P dann
was?  Der hat 16 KiB internen SRAM.

> Übrigens, warst du es nicht
> der mir mal letztes Jahr zu multiplexten Widertandsmessungen in DSE
> weitergeholfen hat?

Kann ich mich zwar nicht mehr dran erinnern, aber kann schon sein,
ich lese relativ regelmäßig in d.s.e mit.
Persönliche Seite #901281
Lesenswert?

Ich mach das bei einem Mega32 mit externem Adresszähler.
74HC4040 + 74HC4024, Der AVR muß dann halt einen Reset durchführen und 
kann danach fröhlich reinschreiben per out und Write Strobe (3clk) dann 
einen höchzählen (2clk)
1
//Counter defines
2
#define COUNTUP   sbi PORTB, 4\cbi PORTB, 4
3
#define COUNTRESET   sbi PORTB, 3\cbi PORTB, 3
4
//SRAM defines
5
#define SRAM_WE    PORTB, 2
6
#define SRAM_OE    PORTB, 0
7
#define SRAM_ENA  PORTD, 7
8
#define WRITEBUS  ldi temp, 0xFF \ out DDRC, temp
9
#define READBUS    ldi temp, 0x00 \ out DDRC, temp
10
#define SRAM_AUS  sbi SRAM_ENA  ;SRAM Aus
11
#define SRAM_AN    cbi SRAM_ENA  ;SRAM An
12
.
13
.
14
.
15
COUNTRESET
16
sbi SRAM_WE    ;Writenable auf High
17
sbi SRAM_OE    ;Outputbuffer aus
18
SRAM_AN
19
WRITEBUS
20
.
21
.
22
.
23
loop:
24
.
25
  cbi SRAM_WE  ;Writenable auf LOW
26
  out PORTC, adcresult
27
  sbi SRAM_WE  ;WE = High um Daten zu übernehmen
28
  COUNTUP
29

30
.
31
.
32
.
33
rjmp loop

Man hat dan natürlich keinen "ram" mehr sondern ein "lam" ;)
Aber ich habs eh so verstanden das du Meßwerte buffern willst, da will 
man meistnes ja eh einen großen Block ins Ram reinschaufeln und später 
wieder ausgeben.

Sind dan bei 16Mhz maximal 3,0517578125 MB/sek ... mußt natürlich noch 
das abziehen was du verbrauchst um den ADC wert einzulesen :)
Waitstates nutz ich zumindest nicht, benutzen tu ich ein altes Cache Ram 
aus nem Mainboard ich glaub mit 15ns
#901289
Lesenswert?

Wobei man den ADC auch direkt in das Läubi'sche RAM reinschreiben lassen 
kann. Der AVR muss dann nur die Strobes liefern, der ADC hängt direkt am 
Datenbus und liefert die Daten für's RAM. DMA für Arme. Später schaltet 
man den ADC dann ab und liest an aller Ruhe aus.

Wenn man statt der langsamen SBI/CBI- die schnelleren OUT-Befehle 
benutzt, ist damit deutlich mehr drin als gezeigt. Bei äquidistantem 
Sampling über grösseren Strecken 4 Takte, also 5Ms/s inklusive ADC. Bei 
kürzeren Strecken 2 Takte, also 10Ms/s. Ein asynchroner Zähler wie der 
HC4040 kommt dann allerdings nicht mehr mit, dafür muss er fixer sein.

Schwierig wird es nur, wenn kontinuierlicher Betrieb verlangt ist. Aber 
dann ist eher die Software im AVR und dessen weitere Kommunikation 
relevant.
#901323
Lesenswert?

Blöde Frage - du verwendest nicht den internen ADC des Controllers, 
oder? Der kann bei dieser Geschwindigkeit meines Wissens nach nicht 
mithalten.

Und wenn du eh einen externen ADC benutzt, wäre das lineare Schreiben 
der Daten in einen RAM ohne Controller-Bremse vermutlich einfacher.

>Schwierig wird es nur, wenn kontinuierlicher Betrieb verlangt ist. Aber
>dann ist eher die Software im AVR und dessen weitere Kommunikation
>relevant.

Was soll denn mit den Daten passieren? Wenn die wirklich kontinuierlich 
verarbeitet werden sollen, dann kann man sich u.U. eh den Puffer sparen.

schöne Grüße
Kai
Gast #901456
Lesenswert?

Ob es eine gute Idee ist einen AVR an der absoluten Grenze
zu betreiben um Daten von einem ADC abzuholen? Sobald mit
den Daten etwas passieren soll muß dann das Einlesen unter-
brochen werden. Ist das so gewollt?

Jens

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren