Forum: FPGA, VHDL & Co. Welcher USB-Übertragungsmodus


von Michael (Gast)


Lesenswert?

Hi @ all

Ich erzeuge mit meinem FPGA 2000 mal 12 Bit Daten, die in den
Block-Rams zwischengespeichert sind. Alle 2 ms liegen neue Daten an
(also wieder 2000 mal 12 Bit)Diese möchte ich über USB an den PC
senden. Für die Übertragung werde ich einen Cypress High_Speed
USB-Baustein nehmen. Die Daten sollen vom FPGA zum USB-IC nicht
seriell, sondern parallel übertragen werden.

Meine Fragen zur Umsetzung:

1. Welcher übertragungsmodus ist dafür besonders geignet. (Ich möchte
keinen Treiber für den PC schreiben kann ich nicht den Maustreiber
dafür mißbrauchen?)

2. Muss ich erst alle Daten in den USB-IC schreiben und dann die
Übertragung starten?

3. Muss ich die Übertragung im IC selber programmieren, oder gibt es
die schon fertig.

4. Auf was muss ich bei der Umsetzung alles achten?

Grüsse

Michael

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Das wären also 500*2000*12Bit pro Sekunde. also 12MBit/sek netto, dazu
kommen vermutlich noch Verwaltungsdaten, d.h. die 12 MBt des USB1.1
reichen nicht aus ?

von Tobias O. (Gast)


Lesenswert?

Auf keinsten. 12Mbit entspricht der Bruttodatenrate bei USB1.1
Full-Speed. Dazu kommt noch das USB-Protokoll Fehlersicherung u.s.w.

1. Übertragungsmodus Bulk-Transfer ist am einfachsten zu implementieren
und erzeugt auch locker die Nutzdatenrate die du benötigst. Treiber gibt
es als Generic-USB Treiber z.B. Libusb oder vom Hersteller auch als
Generic Treiber, mit denen du alles machen kannst um Daten zu
schaufeln.


2. Ja so ist es. Die Übertragung wird dann gestartet wenn der PC
(Treiber) die Daten anfordert. Vorher sollten sich die Daten schon in
dem USB-Controller befinden. Da viele USB-Controller mehrere
Puffer-Speicher integriert haben in der die Daten zwischengespeichert
werden, kannst du während der Datenübertragung schon die wieder leeren
Pufferspeicher mit Daten füllen. Es kann sich also bei geeigneter
Implementierung ein kontinuierlicher Datenstrom von deiner Peripherie
zum PC ergeben.

3. Je nachdem um welchen USB-IC es sich handelt gibt es welche die nur

rein die Physikalische Verbindung mit dem USB herstellen oder
USB-Controller mit integriertem Mikrocontroller.
Für die zweite Art musst du eine Software für den Controller schreiben,
um die USB-Schnittstelle einzustellen, die virtuellen Datenkanäle
einrichten und auf die USB-Requests reagieren.

Für die erste Variante müßtest du das selbe auf dem FPGA implementieren
mittels Zustandsmaschine oder Soft-Prozessor und Schreib und
Lesezugriffe auf Register die auf dem USB-IC integriert sind
durchführen.

Dann gibt es noch USB-IC die schon einen großen Teil des USB-Protokolls
implementiert haben wo du nur noch die Descriptoren reinschreiben musst
und die Datenkanäle einzurichten hast.
Schau dir mal den CY7C68001 von Cypress an.

4. Wähle den richtigen Baustein, der für dich am leichtesten zu
handhaben ist. Ich habe für meine Diplomarbeit den CY7C68013A
vorgesetzt bekommen, und bin mit dem sehr gut klargekommen. Kann mir
vorstellen das die anderen USB-Controller ähnlich leicht zu handhaben
sind. Von Cypress gibt es für die USB-Controller hervorragende
Development Kits als Software mit Unmengen an Beispielen und
hervorragender Dokumentation. Nicht zu vergessen wird der Treiber
gleich mitgeliefert und funktioniert sehr gut!

Wenn du weitere Fragen hast ruhig stellen.

Tobias O.

von Michael (Gast)


Lesenswert?

Oh schon mal vielen Dank für Deine Mühe. An den CY7C68013A hatte ich
auch schon gedacht. Die Beispiele die ich gefunden hatte waren alle in
C. Ich persönlich komme mit Assmebler besser zurecht.

Fragen zum Treiber:

1. Gibt es eine Setup für die automatische Installation?
2. Kann ich den in Labview einbinden?
3. Eignet sich der Treiber auch für den Verkauft des fertigen Produkts
oder besitzt der Treiber noch Fehler?


4. Ich würde gerne einen USB-IC nehmen, bei dem das Prgramm schon
fertig ist. Ist der CY7C68013A solch ein USB-Controller?

5. Wenn ich die Daten vom FPGA zum CY7C68013A sende (übern parallelen
Port) schreibt der USB-Controller die Daten von alleine in eine freie
Speicherzelle, oder muss ich die Adresse extern an den IC anlegen?

6. Wie weiß ich ob der Speicher schon voll ist?

Könntest Du mir Deine Diplomarbeit per zukommen lassen?

Grüsse

Michael

von FPGAküchle (Gast)


Lesenswert?

#5. Wenn ich die Daten vom FPGA zum CY7C68013A sende (übern parallelen
#Port) schreibt der USB-Controller die Daten von alleine in eine freie
#Speicherzelle, oder muss ich die Adresse extern an den IC anlegen?

Also parallele port meint wohl das Slave Fifo Interface. Du hast 4
fifos, die du über die beiden fifoadr leitungen auswählst. 3 signale
geben dir den Füllstand an (Full,empty,user defined threshold).
Da fifos musst du keine speicheradresse extra angegen. Die Fifos sind
hinsichtlich Größe/Richtung/Endpunkt konfigurierbar.

(Wir hätten doch hier vor ein paar Monaten eine thread über Cy7 an
FPGA, schau mal dort nach.

von Tobias O. (Gast)


Lesenswert?

> Ich persönlich komme mit Assmebler besser zurecht.
C ist doch leichter zu lernen und einfacher zu debuggen



1. Der Treiber wird mit einer .inf Datei und mit einer sys Datei
ausgeliefert. Wenn das USB-Gerät mit dem PC verbunden wird fragt
Windows automatisch nach einem Treiber der sich dann meinetwegen auf
der Installations-CD befindet. Der Treiber wird dann automatisch
installiert. Die .inf Datei musst du an die Vendor-ID und die
Produkt-ID die du in der Software des USB-Controllers angegeben hast
anpassen. Den USB-Treiber und die .inf kannst du nach belieben
umbenennen so das nicht mehr erkennbar ist, dass der Treiber von
Cypress stammt. Den Treiber darfst du auch in kommerziellen Produkten
verwenden wenn du einen USB-Controller von Cypress einsetzt.

2. Mit Labview habe ich noch nicht gearbeitet deshalb erkundige dich
lieber noch mal bei einem der mit Labview schon gearbeitet hat, und wie
sich C/C++ Bibliotheken bzw. Funktionen einbinden lassen.

3. Der Treiber arbeitet einwandfrei und hat meineswissens keine
Fehler.
3.1 Der Nachteil des Treibers ist, dass er nicht besonders gut auf
Geschwindigkeit optimiert ist. Sprich 40MByte/s schafft der nicht, aber
15MByte/s ist locker drin.
3.2 Isochronen Transfer konnte ich mit dem Treiber leider nicht
realisieren, dass könnte aber auch an der Software des USB-Controllers

gelegen haben, aber wenn du Bulk-Transfer einsetzt ist das ja kein
Problem

4. Der CY7C68013A/LP besitzt zwar schon eine default-Firmware die als
Bootloader benutzt werden kann, aber eine eigene Software müsstest du
dir schon noch selbst schreiben. Dafür läßt sich der Controller sehr
flexibel einsetzen.
Wenn du keine eigene Firmware schreiben willst schau dir mal den
CY7C68001 an. Die Konfiguration des USB-Controllers müßtest du dann vom
FPGA aus erledigen. Ich kann nicht beurteilen wie gut du in VHDL oder
Verilog bist, oder ob das einfacher ist als eine mitgeliefertes
Beispiel-Firmware von Cypress anzupassen, zumal diese sehr gut sind und
funktionieren. Ich habe damals nur eine einzige Funktion anpassen müssen
und die Deskriptoren modifiziert. Die Entscheidung bleibt aber
letztendlich dir überlassen.


5. Die Daten werden ähnlich wie FIFO's in den USB-Controller
geschrieben. Wenn ein FIFO voll ist, wandert der zur USB-Schnittstelle
des Controllers und kann dann vom PC ausgelesen werden.
Also eine extra Adresse brauchst du dafür nicht anzugeben.

6. Flags teilen dir den Zustand der FIFO's mit.

>Könntest Du mir Deine Diplomarbeit per zukommen lassen?
Kein Problem, schicke mir deine E-Mail Adresse und ich lasse dir die
zukommmen.

Ist das was du machst eine Diplomarbeit, Projektarbeit oder in welchem

Rahmen sollst du dieses Projekt verwirklicht werden ?


MFG Tobias O.

von Michael (Gast)


Lesenswert?

Diplomarbeit habe ich seit 6 Monaten hinter mir. Bis jetzt ist es noch
privates Interesse, deshalb kann ich auch nur ab und zu Zeit
investieren.

joedoe1979@lycos.de

Grüsse

Michael

von TheMason (Gast)


Lesenswert?

@tobias

also das mit dem cypress controller hört sich ja echt gut an. mich täte
es auch interessieren größere datenmengen vom fpga/uc zum pc bzw.
umgekehrt zu schaufeln ohne den ftdi nutzen zu müssen (zumal der ja nur
bis 115kBaud geht).

hast du infos darüber wo man diese cypress-tierchen als privatperson
ordern kann ?
gibt es noch weiterführende infos ? (speziell apps mit schaltplan usw,
damit ich mir einen überblick über den nötigen sw/hw aufwand machen
kann)
ich würde dann auch den usb-treiber nehmen den cypress anbietet (da
mich bis jetzt bei usb immer die treiber-programmierung abgeschreckt
hat)

gruß
rene

von Tobias O. (Gast)


Lesenswert?

Alle meine Informationen stammen aus den Datenblättern und Quellen die
in dem Developerkit von Cypress mitgeliefert werden. Einfach mal auf
http://www.cypress.com gehen und im "Suchen" Feld CY3684 eingeben. In
dem Developerkit wird alles mitgeliefert (Software,Treiber,C-Compiler,
Schaltpläne,Tools,....) die für eigene Entwicklungen notwendig sind.
Mehr ist wirklich nicht notwendig und es ist mehr als irgend ein
anderer Hersteller an Support für seine Produkte anbietet. Es gibt
außerdem diverse Webseiten mit Projekten die von anderen Personen mit
diesen Tierchen verwirklicht wurden inklusive den Schaltplänen.

Die einzige mir bekannte Quelle für diese Tierchen ist Segor. Da diese
Käfer aber sehr verbreitet sind gibt es sicher noch andere
Bezugsquellen.

Als generic-Treiber läßt sich außer dem mitgelieferten Treiber auch der
http://libusb.sourceforge.net/ verwenden, mit dem sich von der
Performanceseite her bessere Ergebnisse erzielen lassen (mein Rekord
29MByte/s) . Oder aber Generic-Treiber die von anderen Herstellern für
ihre USB-Controller angeboten werden.

MFG Tobias O.

von TheMason (Gast)


Lesenswert?

hallo tobias,

erstmal danke für die infos. habe auch schonmal etwas gesucht und bin
bei csd-electronics fündig geworden. die haben den cy7c64613 da.
also 29mb/sek ist schon verdammt viel. also das reicht mehr als genug.
ich hatte daran gedacht audio-daten (evtl. mehrkanal) damit von meinem
fpga zum pc und umgekehrt schaufeln zu können. aber bei soviel
brandbeite lässt sich sicherlich auch ein logic-analyser bzw.
speicher-scope damit realisieren.
könnte interessant werden.

eine frage habe ich noch. und zwar kann man die starter-kits von
cypress auch als privat-person direkt bei cypress bestellen oder gibt
es einen privat-person-freundlichen distributor der die kits vertreibt
?

gruß
rene

von Tobias O. (Gast)


Lesenswert?

keine Ahnung, ich habe kein Starter-Kit benötigt. Allerding für 495 US$
sollte es doch möglich sein, sich die Teile selber zu beschaffen und
sich eine Platine nach den Herstellerschaltplänen von einer Firma als
Einzelanfertigung herstellen zu lassen. Ich denke bei den Preisen wird
wohl Cypress die Teile auch an Privatpersonen verkaufen (mit sattem
Gewinn).


Der CY3684 ist ein full-speed Device, mit dem wirst du im bestenfalls
knapp unter 1MB/sec erreichen. (Hände weg)
Alle Teile die von Cypress als USB-FX Device bezeichnet werden, sind
nur full-speed fähig. Nur die USB-FX2 Controller sind die richtig
schnellen.

>- Certified complient with USB Specifications 1.1 und 2.0 (full-speed
>device)

gruß Tobias

von Michael (Gast)


Lesenswert?

Schon mal vielen Dank für die ganzen Tips. Nachdem ich alles
durchgelesen habe, (dauert immer eine Zeit, denn nach Feierabend ist
man ganz schön fertig :-) ) sind einige Fragen aufgekommen. Aber zuerst
ein paar Worte zu meine Konfiguration:

1. Ich werde den USB-IC im Slavemodus betreiben. Zudem wird die
Datenübertragung durch einen externen Takt (erzeugt vom FPGA)
gesteuert. Die Datenbusbreite wird 16 Bit getragen. Momentan möchte ich
nur Daten vom FPGA zum PC übertragen, deshalb setze ich die ENDPIONTS
alle auf IN. Ich möchte Datenpakete übertragen die 4096Bytes groß sind.
Falls alle Daten übertragen wurden, aber das Datenpaket noch nicht voll
ist, möchte ich durch "Pktend" die Übertragung starten


Nun zu meinen Fragen:

1. Wenn ich das Bit "Wordwide" auf "1" setze dann ist der Datenbus
auf 16Bit konfiguriert. Muss ich auch die Endpoints auf 16Bit
Datenbreite umstellen?

2. Wenn ich einen externen Takt vorgebe muss der zwischen 5MHz und
48Mhz sein. Verändere ich dadurch auch den Takt mit dem der IC arbeitet
(wird ja durch einen speraten Quarz angesteuert)?

3. Wie schaffe ich es das ein Datenpaket 4096Bit groß ist. Hängt das
mit der Größe eines Endpoints zusammen? Habe gelesen, das EP2 512 oder
1024Byte groß sein kann. Dies sind aber keine 4096Byte. Wie kommt man
auf diese 4096Byte?

4.Was soll die Angabe der Endpointpufferung, die für einige Endpoints
2x,3x,4x sein kann?

5.Wenn ich einen Endpoint vollgeschrieben habe und weitere Daten zu
Übertragung habe, dann muss ich auf einen anderen Endpoint wechseln,
indem ich mit dem FPGA eine andere Enpointadresse anlege.(Lange Rede
kurzer Sinn) Wie starte ich die Übertragung (USB-IC soll Daten an PC
senden)? Muss ich dazu "Pktend" setzen?

6. Wenn ich den an den USB-Port einstecke, dann werden zuerst per
"Control" Transfer Informationen ausgetauscht. Stehen diese im
sogenannten IC-Firware?

7. Stehen in der Firmware auch die oben erwähnten Konfigurationen z.B.
die der Enpoints oder müssen diese im Hauptprogramm angegeben werden?



Das waren erst mal die Fragen zum USB-IC. Ich habe mir mal die Software
"KKeil uVision2" von www.cypress.com gesaugt und istalliert. Zudem
habe ich noch die beiden Treiberdatein "***.sys" und "***.inf"
heruntergeladen. Wie ich dise installiere weiß ich schon (muss nur noch
auf meine Hardware warten) Habe auf der Cypresshomepage ein
Muster-USB-IC angefordet und veruche es auf einer Lochleiterplatte zu
löten (wird schwierig aber ist nicht unlösbar).

Nachdem ich alles installiert habe, schaute ich mir zuerst die Beispiel
von Keil an. Dort habe ich keine Informationen über die Konfiguration
gefunden.

8. Wie gehe ich denn am besten vor wenn ich ein
Programm für die Datenübertragung schreibe?

9. Hast Du vielleicht ein kleine Testprogramm, dass die Daten, die von
der USB-Schnittstelle empfangen werden aussliest?

Ich weiß das es sehr viele Fragen sind und das es eine menge Arbeit
macht diese zu beantworten. Deshalb möchte ich mich schon mal für die
bis jetzt zur Verfügung gestellten Inforamtionen bedanken. Ich werde
mich noch weiter belesen. Vielleicht schaffe ich es ja mal

Viele Grüsse

Michael

von FPGAküchle (Gast)


Lesenswert?

#3. Wie schaffe ich es das ein Datenpaket 4096Bit groß ist. Hängt das
#mit der Größe eines Endpoints zusammen? Habe gelesen, das EP2 512
oder
#1024Byte groß sein kann. Dies sind aber keine 4096Byte. Wie kommt man
#auf diese 4096Byte?

z.B. senden zum USB:
-testen ob EP-Fifo leer ist -> nein EP deselektieren (CS oder FA
wechseln)
-Daten in Fifo reinstopfen bis diese voll (entweder FullFlag testen
oder daten mitzählen), also i.d.R 512 byte
- oberen beide Punkte wiederholen bis 4096Byte transferiert, jetzt
PKTEND für diese Fifo aktivieren -> fertig.
  Hinweis PKTEND wird nicht angenohmen wenn FIFO voll ist.

#6. Wenn ich den an den USB-Port einstecke, dann werden zuerst per
#"Control" Transfer Informationen ausgetauscht. Stehen diese im
#sogenannten IC-Firware?

Du meinst sicherlich die Konfiguration per EP0, also das anmelden am
usb-Host
das macht der Cy-IC für dich, da brauchst du nix schreiben.

#9. Hast Du vielleicht ein kleine Testprogramm, dass die Daten, die
von
#der USB-Schnittstelle empfangen werden aussliest?


Schau mal bei:

http://www.thesycon.de/

Die haben demos für ihre Kauf-Software. Damit kannst du Daten und
Konfiguration eines Cycpress USB Gerätes auslesen.

von Hendrik M. (Gast)


Lesenswert?

Hi,

ich habe nur einen Kommentar zu der Aussage von Tobias O., dass das
Evaluation-Board CY3684 kein USB2.0 High-Speed könne.

Zumindest auf der Cypress-Seite wird dies Board als High-Speed
beworben. Es trägt auch die von dir erwähnte FX2 bezeichnung, die nach
deinen Aussagen ebenfalls für High-Speed steht. Somit sollte das Board
sehr wohl für Michaels Anforderungen geeignet sein (falls er noch dabei
ist).

Viele Grüße
Hendrik

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.