Forum: FPGA, VHDL & Co. SD card controller Test Projekt


von Christian G (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe hier mal eine kleines Übungs-Projekt gebastelt und wollte das 
evtl Interresierten nicht vorenthalten. Vielleicht kann der ein oder 
andere ja Teile davon gebrauchen, vorne weg es ist schlecht bis gar 
nicht in noch schlechterem englisch dokumentiert, ich habs auf Basis des 
DE0-nano boards gebastelt, es gibt mit Sicherheit tausend Wege es besser 
zu machen, aber für mich als Neuling was hardware design angeht bin ich 
erst mal damit zufrieden das es bis jetzt stabil läuft. Vielleicht hat 
ja jemand mal die Muße es sich an nem schlecht Wetter Tag an zu schauen 
und ggf. Verbesserungsvorschläge zu machen und Tipps zu geben :). Ich 
habe als Anhang nur die relevanten soure files angehängt.

Also das Ganze ist ein remote, nur lese- , Zugriff auf eine SD Karte. 
Die remote Verbindung läuft über seriell (115200 baud) PC <-> FPGA.
Die Initialisierung der SD Karte übernimmt der FPGA (card clock: 400KHz 
während init danach 25MHz, 4 bit SD mode, nur SingleReadBlock(512 
bytes).

Die c-sharp test Anwendung kann also per serieller Schnittstelle die 
Sektor-Daten der SD Karte lesen.
Der MBR wird gelesen, die Paritions Tabelle wird gelesen, die erste 
FAT32 Partition wird ausgewählt, die FAT Partitionsdaten werden gelesen 
und es geht in einen einfachen Terminal Modus in dem man durch die 
Verzeichnisse "browsen" kann, und sich Dateien im Terminal ausgeben und 
auch downloaden kann.

Das ist soweit auch schon alles.
Wie gesagt nix dolles, aber evtl. kann es ja jemand irgendwie 
gebrauchen.

Es ist zu erwähnen im source der c-sharp Anwendung(Program.cs) gibt es:
"static string COM = "COM3";" - das ist der zu verwendende COM Port

"const bool COMDISABLED = false;" - die Konstante auf true setzen wenn 
man NICHT "live" mit dem FPGA arbeiten möchte. Die Sektor-Daten werden 
dann aus Dateien ausgelesen zu Simulationszwecken.

des weiteren gibt es:
"const string STORAGE_PATH = @".\bin\";" das ist der Pfad an dem sich 
die Sektor-Daten Dateien befinden und auch abgelegt werden.

wer nicht möchte das Sektor-Daten Dateien angelegt werden wenn man 
"live" mit dem FPGA arbeitet der sollte an denn Stellen im code wo die 
"ReadSector" Methode aufgerufen wird, den letzten Parameter ", true" 
entfernen oder in ", false" ändern - ja könnte man auch schöner 
gestalten.

Zum Schluss, ich plane weitere Experimente mit dem sdcard controller 
(MultiSektorRead und evtl. auch schreiben auf die Karte) aber zu erst 
fände ich eine Art von cache gut um Zugriffe auf die Karte zu minimieren 
nur hatte ich da noch keine gute Idee, evtl. reicht es nur eine Teil zu 
cachen  z.B. den der FAT... mal schauen, vielleicht hat jemand von euch 
eine Idee?

...

von Christian G. (Gast)


Lesenswert?

Oh ich glaube mir ist da grad ein Fehler aufgefallen, die card clock 
kann wohl nur 12,5MHz in meinem Beispiel sein und nicht 25MHz, wenn ich 
mich nicht irre... aber es ist auch schon spät...

von Christian G (Gast)


Lesenswert?

Christian G. schrieb:
> Oh ich glaube mir ist da grad ein Fehler aufgefallen, die card clock
> kann wohl nur 12,5MHz in meinem Beispiel sein und nicht 25MHz, wenn ich
> mich nicht irre... aber es ist auch schon spät...

... bzw eher 16 MHz (100 MHz / 6) und CLOCK_DIV_INIT kann man ruhig auf 
62 runter setzen dann passts auch wieder mit den 400KHz.

oha, wohl doch noch nicht so ganz fertig...

von Markus F. (mfro)


Lesenswert?

Christian G schrieb:
> oha, wohl doch noch nicht so ganz fertig...

... auch wenn's noch nicht ganz fertig ist: ich hab' schon viel 
Schlechteres gesehen. M.A.n. eine stolze Leistung für einen Anfänger. 
Sowohl was die Idee als auch was die Umsetzung angeht.

von Christian G (Gast)


Lesenswert?

Markus F. schrieb:
> ... auch wenn's noch nicht ganz fertig ist: ich hab' schon viel
> Schlechteres gesehen. M.A.n. eine stolze Leistung für einen Anfänger.
> Sowohl was die Idee als auch was die Umsetzung angeht.

Vielen Dank, das macht Mut zu mehr!
Ich werde den controller bei genug Freizeit nochmal überarbeiten um auf 
die 25MHz card clock zu kommen, muss doch zu schaffen sein. Momentan 
trifft man halt beim setzen und lesen von der command Leitung genau den 
ich nenne es mal "sweet spot" wenn die card_clock low ist auf der 
höheren Geschwindigkeit, klappt aber nur wenn ich mir da halt 3 Takte 
Zeit lasse. Aber fürs experiementieren ist es so schnell genug.

von Sigi (Gast)


Lesenswert?

Ohne es jetzt nachgeprüft zu haben:
In deinen UART-Modulen (RX/TX) wird die Konstante
<prscl_half> definiert als:
1
  prscl_half : integer range 0 to ((clock_speed / baud) - 1) / 2
müsste es nicht
1
  prscl_half : integer range 0 to ((clock_speed / baud / 2) - 1)
sein?

---------------------------------------------
MOD: [pre] Tags eingefügt

: Bearbeitet durch Moderator
von Christian G (Gast)


Lesenswert?

Sigi schrieb:
> Ohne es jetzt nachgeprüft zu haben:
> In deinen UART-Modulen (RX/TX) wird die Konstante
> <prscl_half> definiert als:
>
>   prscl_half : integer range 0 to ((clock_speed / baud) - 1) / 2
>
> müsste es nicht
>
>   prscl_half : integer range 0 to ((clock_speed  baud  2) - 1)
>
> sein?

Ich denke du hast Recht, aber wenn ich mich jetzt nicht selbst 
verrechnet habe läufts, dadurch das es ein ganzzahliger integer wird, 
aufs gleiche Ergebniss hinaus. Müsste man einfach mal simulieren um 
sicher zu gehen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Christian G schrieb:
> aber wenn ich mich jetzt nicht selbst verrechnet habe
Es ist das übliche "off by one" Problem, das "nichts ausmacht", so lange 
die Zahl groß (und mithin der Fehler klein) genug ist   ;-)

> läufts ... aufs gleiche Ergebniss hinaus.
Mit beispeilsweise 255 und 3 kommen mal 42 und mal 41 (abgeschnittene 
41,5) raus. Ist ja naheliegend: einmal wird 1 abgezogen und einmal 
1/2...

: Bearbeitet durch Moderator
von Christian G (Gast)


Lesenswert?

Lothar M. schrieb:
> Christian G schrieb:
>> aber wenn ich mich jetzt nicht selbst verrechnet habe
> Es ist das übliche "off by one" Problem, das "nichts ausmacht", so lange
> die Zahl groß (und mithin der Fehler klein) genug ist   ;-)
>
>> läufts ... aufs gleiche Ergebniss hinaus.
> Mit beispeilsweise 255 und 3 kommen mal 42 und mal 41 (abgeschnittene
> 41,5) raus. Ist ja naheliegend: einmal wird 1 abgezogen und einmal
> 1/2...

... hat etwas gedauert aber konnte mich nun erinnern warum ich diese 
Rechnung gewählt habe... es war einfach ein sehr naiver Gedanke, mit der 
Rechnung ist im Zweifelsfall die uart clock einen Takt langsamer und das 
fand ich zu dem Zeitpunkt einfach besser als evtl mal einen Takt zu 
schnell zu sein.... ja ich merke auch wie sich das nun anhört....


Btw. habe es heute Nacht noch hinbekommen die SD Karte mit der 25MHz 
clock zu betreiben (command , response läuft, Datentransfer noch nicht 
getestet),  musste dafür aber ein paar Dinge "umbauen" und ob es auch 
mit einem langsameren Haupttakt als 100MHz läuft ist auch noch 
fraglich...

Ich werde die aktuellen files wenn dann alles wieder läuft 
bereitstellen.

von Christian G (Gast)


Angehängte Dateien:

Lesenswert?

... im Anhang dann die überarbeitete Version 2.0 jetzt mit Kommentaren 
und 25MHz SD Karten clock(nur getestet mit 100MHz "System clock")...

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.