Forum: FPGA, VHDL & Co. CF Card Daten mit = 10MB/s schreiben


von hric (Gast)


Lesenswert?

Hallo Experten,
haben Probleme auf eine CF Card (Tran..., 16GB, 400x)Daten mit 10MB/s 
mittels FPGA zu schreiben. Bisher werden ca. 4 MB/s erreicht. Die CF 
Card wird im Memory Mode mit 8 bit Datenbus betrieben. Eine Erweiterung 
auf einen 16 bit Datenbus wird vermutlich auch nicht die gewünsche 
Geschwindigkeit bringen. Wenn die Zykluszeiten im IDE Mode betrachtet 
werden, scheint es auch nicht schneller zu gehen.
Die Karte ist mit 60 MB/s read und 30 MB/s write spezifiziert.
Am PC wird eine 100 MB große Datei in 6 s geschrieben, d.h. diese 
genannte CF Card wird mit ca. 16 MB/s beschreiben.
Wo liegt der Fehler, kann jemand helfen?
Danke hric

von Falk B. (falk)


Lesenswert?

@ hric (Gast)

>haben Probleme auf eine CF Card (Tran..., 16GB, 400x)Daten mit 10MB/s
>mittels FPGA zu schreiben.

Klingt nicht zu schwierig.

>Bisher werden ca. 4 MB/s erreicht.

Hmm.

Mal gemessen, wie lange es dauert,

1 Byte übertragn
1 Block a 512 Byte zu Übertragen
2048 Blöck = 1 MiB zu Übertragen?

Ich wette, dort sind zeitliche Lücken, was darauf schließen lässt, dass 
die FAT-Adressierung oder änhnliches zu langsam ist.

> Die CF
>Card wird im Memory Mode mit 8 bit Datenbus betrieben. Eine Erweiterung
>auf einen 16 bit Datenbus wird vermutlich auch nicht die gewünsche
>Geschwindigkeit bringen.

Ach so? Also sind 16 Bit sinnlos? Warum wurden sie dann erfunden und 
eingebaut? Leute gibts.

> Wenn die Zykluszeiten im IDE Mode betrachtet
>werden, scheint es auch nicht schneller zu gehen.
>Die Karte ist mit 60 MB/s read und 30 MB/s write spezifiziert.
>Am PC wird eine 100 MB große Datei in 6 s geschrieben, d.h. diese
>genannte CF Card wird mit ca. 16 MB/s beschreiben.

Immer noch knapp Faktor 2 langsamer als in der Spec, aber viermal 
schneller als dein Schreibzugriff. Wollen wir wetten, dass der PC mit 16 
Bit arbeitet?

>Wo liegt der Fehler, kann jemand helfen?

Lies mal was über Netiquette.

von Frank K. (fchk)


Lesenswert?

Hast Du schon mal was von den verschiedenen IDE-Übertragungsmodi wie 
PIO0-PIO4, MWDMA oder UDMA2-UDMA6 gehört?

Nur mit den UDMA-Modi erreichst Du die volle 
Übertragungsgeschwindigkeit.

Näheres liest Du unter http://www.t13.org/ nach.

fchk

von hric (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank Brunner und Falk K.
danke erstmal. Habe mal einen Oszibild angehängt. Strahl 1 stellt das 
READY Signal und Strahl 2 das WE(WriteEnable Signal) dar. Das ca. 56µs 
lange Paket ist der Schreibvorgang für einen 512 byte Sektor in 8 byte 
Datenbreite. Das schmale Paket nach ca. 16 µs ist der Schreibvorgang für 
die Taskregister (RegSecCount, RegLBA_low, ..._mid, ...high, RegHead, 
RegCommand). Hier ist nur der Betrieb für einen Sektor schreiben, danach 
neue LBA Adresse einstellen dargestellt.
Getaktet wird mit 80 MHz und realisiert wurde folgendes:
TaskRegister schreiben: Adresse setzen 3 Takte, danach für 13 Takte WE 
auf low und gleichzeitig Daten anlegen, für weitere 3 Takte Daten halten 
-->237,5 ns Zeit für ein Schreibvorgang je Register
MemoryWrite: WE auf low und Daten anlegen für 5 Takte, 1 Takt Daten noch 
halten ---> 75 ns für ein Byte (dürften nur 38,4 µs statt 56 µs sein ?)
Die vorstehenden Zeiten sind gemäß CF Card Spezifikation realisiert und 
hoffentlich ok.
Kann mir die relativ langen Pausen, in denen READY low ist, zwischen 
Ende Sektorwrite bis Taskregisterwrite und danach wieder bis Beginn 
Sektorwrite nicht erklären.
Im Oszibild sieht man eine zusätzliche Pause, die alle 54 ms für ca. 1,3 
ms anfällt leider nicht.
Sind jetzt dabei zu testen welche Geschwindigkeitssteigerung durch 
vorhergehendes Sektorlöschen (Command c0h) und Write Sectors w/o erase 
(Command 38h) mit RegSecCount >1 erreichbar ist.
Der Schreibvorgang für einen Sektor wird sich bei 16 bit Datenbreite 
hoffentlich halbieren lassen, dazu muss aber erst mal die hardware 
geändert werden.

@ Frank K.
Ist eine reine private Nutzung, so dass ich die Gebühren nicht 
aufbringen kann.
gruß hric

von Falk B. (falk)


Lesenswert?

@ hric (Gast)

>Getaktet wird mit 80 MHz und realisiert wurde folgendes:
>TaskRegister schreiben: Adresse setzen 3 Takte, danach für 13 Takte WE
>auf low und gleichzeitig Daten anlegen, für weitere 3 Takte Daten halten
>-->237,5 ns Zeit für ein Schreibvorgang je Register

Klingt OK.

>MemoryWrite: WE auf low und Daten anlegen für 5 Takte, 1 Takt Daten noch
>halten ---> 75 ns für ein Byte (dürften nur 38,4 µs statt 56 µs sein ?)

Klingt auch OK, aber das sind nur 8 Bit. Macht bis zu 13,3MiB/s

>Kann mir die relativ langen Pausen, in denen READY low ist, zwischen
>Ende Sektorwrite bis Taskregisterwrite und danach wieder bis Beginn
>Sektorwrite nicht erklären.

Wer macht denn die High Level Steuerung? Eine State Machine im FPGA, ein 
Softcore oder ein "echter" Prozessor, der über den FPGA auf den CF 
zugreift? Dort muss man suchen.

>Der Schreibvorgang für einen Sektor wird sich bei 16 bit Datenbreite
>hoffentlich halbieren lassen, dazu muss aber erst mal die hardware
>geändert werden.

Erstmal müssen die Gedenkpausen weg. Mach das erstmal mit 8 Bit schnell 
mit minimalen Lücken.

>Ist eine reine private Nutzung, so dass ich die Gebühren nicht
>aufbringen kann.

Infos gibt es auch an anderen Stellen im Netz, man braucht nicht die 
offizielle Spec.

von Frank K. (fchk)


Lesenswert?

hric schrieb:

> @ Frank K.
> Ist eine reine private Nutzung, so dass ich die Gebühren nicht
> aufbringen kann.

Lies das hier

http://www.t10.org/t13/project/d1321r3-ATA-ATAPI-5.pdf

Das ist eine alte Version, aber die sollte fürs erste reichen. Da 
schaust Du Dir das UltraDMA Feature Set an. Interessant sind auch die 
Teile, wo es um die für UltraDMA erforderliche Serienterminierung und 
Transceiver etc geht.

Wie gesagt: ohne UltraDMA erreichst Du nicht die volle Geschwindigkeit. 
Deine CF-Karte sollte mindestens UDMA2 können. Was sie tatsächlich kann, 
sagt sie Dir im IDENTIFY DEVICE Command. Während der UDMA-Transfers 
haben die IDE-Signale andere Bedeutungen als in den PIO-Modi.

Wie gesagt, dieses PDF sollte das Thema erschöpfend behandeln.

fchk

von hric (Gast)


Lesenswert?

@ Falk Brunner
danke nochmal für Deine Hilfe.
Die komplette Steuerung macht nur der FPGA. Das READY Signal kommt von 
der CF Card und der FPGA wartet mit seinen Aktivitäten, bis das Signal 
high ist. So vermute ich, dass die "Gedenkpausen" durch die CF Card 
begründet sind, aber habe bisher noch keine Erklärung dafür gefunden. 
D.h. Spezifikation der Karte zum wiederholten Male lesen und 
weitersuchen.
Gruß hric

von hric (Gast)


Lesenswert?

@ Frank K.
Danke für den link. Mache mich sofort ran.
Gruß hric

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


Lesenswert?

hric schrieb:
> vermute ich, dass die "Gedenkpausen" durch die CF Card begründet sind
Hast du ein Oszi? Damit könnte man aus Vermutung Gewissheit werden 
lassen. Und: probier mal eine andere Karte mit einem anderen Controller 
und anderer Software...

von Falk B. (falk)


Lesenswert?

@ Lothar Miller (lkmiller) (Moderator) Benutzerseite

>Hast du ein Oszi? Damit könnte man aus Vermutung Gewissheit werden
>lassen.

Sieht wohl so aus.

> Und: probier mal eine andere Karte mit einem anderen Controller
> und anderer Software...

Hat er, am PC.

von hric (Gast)


Lesenswert?

@ Frank K.
Der link ist sehr hilfreich. Habe natürlich viel zu lesen, immerhin sind 
es ca. 400 Seiten, sobald ich glaube alles Wichtige gefunden und 
verstanden zu haben, werde ich mich hier nochmals melden. Entweder mit 
Vollzug (hoffentlich) oder weitergehenden Fragen.
hric

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.