64MB Externe RAM module

Hardware die niet past in bovenstaande onderwerpen
Gebruikers-avatar
Berichten: 5030
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

64MB Externe RAM module

Berichtdoor nicoverduin » 15 Mrt 2020, 16:55

Ik had al eerder een 1Mb geheugen module gemaakt. Die was op basis van statische RAM IC's (128kb x 8bit [ 8 stuks]). Echter kwam ik laatst een 8Mbx8 bit dynamische RAM tegen op de SPI bus. Op basis van het vorige ontwerp hoefde ik weinig te veranderen. Paar level shifters erbij, andere voetmaten (van SSOP8 naar SOIC8). Tegelijkertijd maar overschakeld naar 0603 weerstanden en condensatoren. En voila :)
Afbeelding
En hij werkt?......... NIET.
Er zit een MCP23S08 IO expander op die de /CS regelt van de geheugen ic's. Scope erop.... Helaas de klok puls werd niet hoger dan 2.4V. De oorzaak was ff zoeken. Maar uiteindelijk is mijn redenering als volgt:
a) alle SPI signalen lopen via mosfet Level shifters naar alle IC's
b) de load op de levelshifters was zo groot (23S08 + 8x geheugen ics) dat deze een te lage klok doorgaven
c) de MCP kon niet worden geprogrammeerd om slechts een (1) memory IC te selecteren en kon het dus nooit werken.

Back to the drawing board. Eerst maar weer een prototype gemaakt. Alle smd componenten op kleine adapter bordjes gezet tenzij ik een DIP formaat had liggen. Alles opnieuw bedraad maar dan voor een memory ic.
Afbeelding

De MCP wordt direct gevoed door de SPI bus (immes die kan zowel op 3.3V als op 5V werken. En nu werkt het wel. ..... Of toch niet helemaal...

Op dit moment moest ik de SPI op DIV8 zetten (2Mhz) anders had ik teveel memory failures. De oorzaak zit hem vermoedelijk in alle losse draden op het prototype. Wel luistert het aan en uitzetten van de CHIP Select (/CS) strakker dan bij statische RAMs. De nu gebruikte chips zijn zogn. dynamische RAMs .Die moet je binnen zoveel tijd lezen (oftewel refreshen). Als het te lang duurt, dan verliest een bitje zijn waarde. Ook lijkt het erop dat als je een memory transfer doet dat hij fouten vertoont bij een miljoen leesopdrachten van 32bit getallen.

Ik heb verschillende testen gedraaid en dit zijn de statistieken:

Schrijven van : 10 32-bit getallen duurt : 348 microseconden
Lezen van : 10 32-bit getallen duurt : 324 microseconden
Schrijven van : 100 32-bit getallen duurt : 2716 microseconden
Lezen van : 100 32-bit getallen duurt : 2524 microseconden
Schrijven van : 1000 32-bit getallen duurt : 24504 microseconden
Lezen van : 1000 32-bit getallen duurt : 23044 microseconden
Schrijven van : 10000 32-bit getallen duurt : 240084 microseconden
Lezen van : 10000 32-bit getallen duurt : 226036 microseconden
Schrijven van : 100000 32-bit getallen duurt : 2395884 microseconden
Lezen van : 100000 32-bit getallen duurt : 2255996 microseconden
Schrijven van : 1000000 32-bit getallen duurt : 23953772 microseconden
Fail at address 935468

En hier kreeg ik er een heleboel van.

Daarna nog een test gedraaid met blokken van 1K tegelijkertijd. Dit zou meer in de Arduino wereld passen. Bij een test met 8192 blokken van 1024 bytes te gelijkertijd, geen enkele fout gekregen.
Bordje moet wel opnieuw gemaakt worden maar dat kost ff tijd en dan kan ik ook kijken hoe de echte performance wordt.

Met behulp van unions en structs kan ik straks zonder moeite en enige vertraging (rond de 25msec op een UNO en een SPI van 2Mhz voor een Read of Write)
Dit zou er dan zo uit kunnen zien:
cpp code
union {
char buffer[1024];
struct blok1 {
uint32_t variabeleA;
uint16_t variabeleB;
uint8_t variabeleC;
uint8_t variabeleD;
};
struct blok2 {
char naam[25];
char adres[30;
.....
};
}


Wat hier gebeurt is dat ik een buffer maak van 1024 bytes. De daaronder liggende structs liggen ahw over die buffer heen. Ik kan in mijn code blok1 vullen en dan de buffer op bijv. adres 0 zetten. Daarna vul ik blok 2 en schrijf ik de buffer weg naar adres 1024. Later kan ik een van de blokken terughalen uit de module als ik daar een variabele nodig heb. Ik lees gewoon vanuit een bepaald adres en vul de buffer. Daarna kom ik de juiste data weer tegen in het gelezen blok. Dit vereist uiteraard wel goed management van variabelen en nadenken hoe zet ik mijn programma op. Maar zo kan je nu dus ook array's maken met bijv 1.000.000 floating point getallen (denk aan doorrekenen van een AI model). En zelfs op een UNO (en wat geduld :mrgreen: ) Waarom? gewoon om dat het kan.

Wordt vervolgt....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Advertisement

Berichten: 3167
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: 64MB Externe RAM module

Berichtdoor shooter » 15 Mrt 2020, 21:42

mooi man, leuk gemaakt zelfs een draadje om het op te hangen als kunswerk.
hihi.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 5030
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: 64MB Externe RAM module

Berichtdoor nicoverduin » 20 Mrt 2020, 17:22

Paar foutjes uit de software gehaald :) en gelijk een forse performance verbetering:

cpp code
Schrijven van :      10 32-bit getallen duurt :      124 microseconden
Lezen van : 10 32-bit getallen duurt : 200 microseconden
Schrijven van : 100 32-bit getallen duurt : 1060 microseconden
Lezen van : 100 32-bit getallen duurt : 1204 microseconden
Schrijven van : 1000 32-bit getallen duurt : 10392 microseconden
Lezen van : 1000 32-bit getallen duurt : 11224 microseconden
Schrijven van : 10000 32-bit getallen duurt : 103716 microseconden
Lezen van : 10000 32-bit getallen duurt : 111380 microseconden
Operatie van 1K duurde : 5320 microseconden


De operatie van 1K is een schrijf en daarna van 1024 bytes in een keer.

Sneller kan niet op de Arduino. De ESP32 test komt nog...

Nieuwe printjes zijn besteld. Zal wel weer een maand duren :(
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar Overige hardware

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten