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?
...
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...
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...
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.
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.
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.
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...
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.