Forum: FPGA, VHDL & Co. USB Datenaustausch bei Nexys2 von Digilent


von Christian H. (cavorca)


Lesenswert?

Hallo,

Ich würde gerne von meinem Nexys2 aus Daten per USB an den PC senden. 
Leider ist die Dokumentation sehr dürftig oder ich habe das 
entsprechende PDF bisher nicht gefunden. Es gibt den Schaltplan zu dem 
Board und ein ausführliches Testprojekt. Dieses ist allerdings in VHDL 
geschrieben (bisher habe ich nur mit Verilog gearbeitet). Herausgefunden 
habe ich dass die Kommunikation wohl in einem EPP ähnlichen Protokoll 
abläuft.
Das Problem beginnt eigentlich schon damit, dass ich nicht weiß welche 
Pins an der FPGA für das Kommunikationsprotokoll mit dem CYC68013 
vorgesehen sind. Die Pins für Die 8 Bit Daten konnte ich vermutlich 
identifizieren.
Irgendwo habe ich gelesen das das Protokoll dazu noch 6 weitere 
Leitungen benötigt, aber da weiß ich jetzt nicht wo die an der FPGA 
liegen, bzw welcher Pin welche Leitung ist (Meiner Meinung nach kommen 
11 Pins in Frage, die Namen im Schaltplan haben jedoch nichts mit den 
Namen die man auf Internetseiten über das EPP-Protokoll findet 
gemeinsam.)

War hiermit jemand schon mal erfolgreicher als ich, oder kann mir sonst 
jemand Tips geben, wo ich was zu lesen finde? Das Beispielprojekt 
enthält zwar viele Kommentare, allerdings nur stichpunktartig, was nicht 
grade die Lesbarkeit verbessert.


Viele Grüße,
Christian

von gast (Gast)


Lesenswert?

Hi!

EPP ?! Ne eher nicht...
Such dir im inet das manual vom Cypress FX2 chip.
Die Verbindungen aufm Board bekommst du raus wenn du im Schaltplan
beim FX2 guckst und vergleichst wo sie zum FPGA gehen.

Auf den ersten Blick wirkt der FX2 sehr kompliziert. Wenn man das mit 
der Firmware
schreiben und den Endpoints erstmal verstanden hat ist er aber 
schlichtweg genial :)

von Christian H. (cavorca)


Lesenswert?

Hi,
Vielen Dank für die Antwort!

Eigentlich wollte ich nicht unbedingt eine neue Firmware für den FX2 
schreiben. Mit der Firmware die von Digilent aus drauf ist kann man 
nämlich auch den FPGA über USB programmieren.
Ich hatte es jetzt so verstanden als ob Digilent eine Firmware 
Programmiert hat, sodass sich der FX2 nach außen verhält als ob er einen 
EPP port hat. Im Schaltplan heißen manche Leitungen zwischen FPGA und 
FX2 explizit "EPP_..." Oder ist das falsch?

Oder meinen die, dass das VHDL Modul, das im Beispielprojekt vorhanden 
ist, die EPP Schnittstelle emuliert und man dann mit diesem Modul über 
die EPP Schnittstelle kommunizieren kann?

Es gibt ja von Digilent sogar einen speziellen Treiber für den USB 
Datentransfer. Das legt für mich eigentlich wieder ehr die Vermutung 
nahe, dass das EPP Protokoll um FX2 implementiert ist.

Wenn ich jetzt doch eine eigene Firmware schreibe geht sicher die 
Möglichkeit  verloren den FPGA zu programmieren, oder ist das irgendwie 
Hardwaremäßig im FX2 vorhanden?

Viele Grüße,
Christian

von gast (Gast)


Lesenswert?

Also ne eigene firmware fürs fx2 ist mit ein bisschen literatur 
recherche schnell zusammengehackt.
Die von digilent hab ich mir nicht angeguckt, wenn wollte ich das board 
mal für sehr
große Datenmengen (>20 MByte/s) verwenden und da brauch ich eh zugriff 
auf die endpoints
und meine eigene fifostruktur im fpga.
Die FX2 Firmware kann man übrigends sehr schön per C Programm und usb 
lib jedesmal ins fx2 laden. funzt echt super.

EPP:
wie gesagt, kenn die digilent fw nicht...
Für meine Anwendung wär das eh zu langsam da noch irgendein Protokoll 
drüber zu fahren.
Außerdem brauchst du dann auf der PC Seite wieder Treiber für den FX2 
die deinem Programm irgendwie die EPP Schnittstelle vorgaukeln.
Da schreib ich lieber nen eigenes Protokoll über die endpoints direkt,
da gibts ne nette lib für (linux) und das erreicht dann auch usb2 
Geschwindigkeit.
Wenn du nur <=800kByte/s brauchst ist nen FT245 für dich evtl besser.
Der ist noch viel einfacher anzusteuern.

Programmieren des fpgas:
ja, digilent hat da was eigenes in der fx2 firmware. Das kann man aber 
auch selber nachbauen
denk ich mal. Bzw was eigenes basteln. Das xilinx Protokoll zum laden 
der
Fpga config ist relativ einfach ;)

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Hier gibt es ein paar Informationen zur Firmware des Nexys 1:
http://www.hackdaworld.org/cgi-bin/awki.cgi/NexysFPGA

von Christian H. (cavorca)


Lesenswert?

gast wrote:
> Also ne eigene firmware fürs fx2 ist mit ein bisschen literatur
> recherche schnell zusammengehackt.
Gut. Über kurz oder lang wollte ich mich sowieso mit dem Thema 
beschäftigen.

> Die von digilent hab ich mir nicht angeguckt, wenn wollte ich das board
> mal für sehr
> große Datenmengen (>20 MByte/s) verwenden und da brauch ich eh zugriff
> auf die endpoints
> und meine eigene fifostruktur im fpga.

> Die FX2 Firmware kann man übrigends sehr schön per C Programm und usb
> lib jedesmal ins fx2 laden. funzt echt super.
>
Habe ich das richtig verstanden:
- Digilent Code im externen EEPROM, wird beim Einschalten in den FX2 
geladen.
- Anschließend kann ich meinen eigenen Code in den internen 
Programmspeicher des FX2 laden, beim neustart ist der aber wieder 
verschwunden.

Das wäre eine gute Alternative. Zwar vermutlich im Endeffekt beim 
Entwickeln etwas aufwändig, aber sicher der bessere Weg.
Vor allem da ich mich so direkt in den FX2 einarbeiten kann.

> EPP:
> wie gesagt, kenn die digilent fw nicht...
> Für meine Anwendung wär das eh zu langsam da noch irgendein Protokoll
> drüber zu fahren.
Ich habe gelesen, das Externe USB-Board geht bis 5,7MB/s

> Außerdem brauchst du dann auf der PC Seite wieder Treiber für den FX2
> die deinem Programm irgendwie die EPP Schnittstelle vorgaukeln.
> Da schreib ich lieber nen eigenes Protokoll über die endpoints direkt,
> da gibts ne nette lib für (linux) und das erreicht dann auch usb2
> Geschwindigkeit.

hast du einen Link dazu?

> Wenn du nur <=800kByte/s brauchst ist nen FT245 für dich evtl besser.
> Der ist noch viel einfacher anzusteuern.

Ja, den habe ich bisher genutzt. Den Chip würde ich jederzeit 
wiederverwenden, allerdings wollte ich auch mal über die Datenrate 
hinaus.
Mit dem EPP-Modus wäre man schon mal deutlich drüber, aber wenn ich um 
das Protokoll drum herum komme wäre das natürlich besser.

> Programmieren des fpgas:
> ja, digilent hat da was eigenes in der fx2 firmware. Das kann man aber
> auch selber nachbauen
> denk ich mal. Bzw was eigenes basteln. Das xilinx Protokoll zum laden
> der
> Fpga config ist relativ einfach ;)

Ok, ich will nur nicht zu viele Sachen gleichzeitig machen. Wenn ich das 
oben richtig verstanden habe wäre das schon mal genug.

Hast du vielleicht ein paar Beispiele? Oder Links wo es etwas zu lesen 
gibt? Gibt es ein Programm mit dem man den FX2 konfiguriert wie beim 
FT245? So eins konnte ich jedenfalls nicht auf der Cypress Homepage 
finden.


Viele Grüße,
Christian

von Christian H. (cavorca)


Lesenswert?

Andreas Schwarz wrote:
> Hier gibt es ein paar Informationen zur Firmware des Nexys 1:
> http://www.hackdaworld.org/cgi-bin/awki.cgi/NexysFPGA

Oh, ich habe irgendwie im Irrglauben gelebt, dass der Nexys1 kein USB 
drauf hatte. Die Seite kann ich mir mal ansehen. Danke!
Allerdings bin ich im Moment doch ehr überzeugt die Möglichkeit mit 
eigener Firmware zu nehmen. Vorausgesetzt das funktioniert wie ich es 
verstanden habe.

von gast (Gast)


Lesenswert?

code im fx2:
Ich bin mir grad nicht sicher, aber ich glaub in der nähe vom fx2
ist ein nicht eingelöteter jumper.
Der jumper ist unten aufm pcb kurzgeschlossen, dort die leiterbahn 
durchtrennen und einen jumper einlöten.
Jumper gesteckt -> fx2 bottet ausm eeprom
Jumper ab -> fx2 lädt keine firmware (nur die standardfirmware) und man 
kann ihn über usb bespielen
(weiss nimmer obs nötig war mit dem durchtrennen, ist aber schnell 
gemacht und dank jjumper reversibel)

fx2 infos:
uff ist schon 2 monate her dass ich rumgespielt hab und ich hab die 
links nicht alle bei mir.

hier eine quelle:
http://www.cip.physik.uni-muenchen.de/~wwieser/elec/periph/USB-FX2/

da vorallem die software sektion:
http://www.cip.physik.uni-muenchen.de/~wwieser/elec/periph/USB-FX2/software/

von Christian H. (cavorca)


Lesenswert?

gast wrote:
> code im fx2:
> Ich bin mir grad nicht sicher, aber ich glaub in der nähe vom fx2
> ist ein nicht eingelöteter jumper.
> Der jumper ist unten aufm pcb kurzgeschlossen, dort die leiterbahn
> durchtrennen und einen jumper einlöten.
> Jumper gesteckt -> fx2 bottet ausm eeprom
> Jumper ab -> fx2 lädt keine firmware (nur die standardfirmware) und man
> kann ihn über usb bespielen
> (weiss nimmer obs nötig war mit dem durchtrennen, ist aber schnell
> gemacht und dank jjumper reversibel)

http://www.digilentinc.com/Data/Products/NEXYS2/Nexys2_sch.pdf
Seite 2 JP6. Meinst du den? Ich habe mal sehr schlechte Erfahrungen 
gemacht, als ich von I2C Hardware einfach die Pull-UP Widerstände 
entfrernt habe: Es war ein Temperatursensor. Plötzlich roch es nach 
frisch gelötet. Am Temperatursensor habe ich mir die Finger verbrannt, 
als ich ihn dann angefasst habe. Er hat um die 150mA gezogen, wie ich 
später herausgefunden habe(im SOT Gehäuse). Ich könnte mir vorstellen, 
dass das der Grund ist warum der Jumper aus dem Design wieder entfernt 
wurde.
In einem Datenblatt zu dem EEPROM konnte ich nicht finden ob man ihn mit 
Floating SDA betreiben darf. Ich würde es lieber lassen.

Kann man nicht nachträglich, also wenn das Programm aus dem EEPROM 
geladen wurde ein anderes in den FX2 schreiben? Dann müsste ich mich 
auch nicht drum kümmern ein eigenes Programm zu schreiben um den FPGA zu 
Programmieren.

> fx2 infos:
> uff ist schon 2 monate her dass ich rumgespielt hab und ich hab die
> links nicht alle bei mir.
>
So lange ist das nu auch wieder nicht ;-)

> hier eine quelle:
> http://www.cip.physik.uni-muenchen.de/~wwieser/elec/periph/USB-FX2/
>
> da vorallem die software sektion:
> >http://www.cip.physik.uni-muenchen.de/~wwieser/elec/periph/USB-FX2/software/

Danke! Ich werde es mir mal durchlesen.
Vielleicht baue ich auch besser ein separates Board mit einem FX2.

Viele Grüße und Danke für eure Hilfe,

Christian

von gast (Gast)


Lesenswert?

Also die I2C eeproms sind sehr robust...
Ich glaube nicht dass da was passiert.

Das weglassen wird eher andere Gründe haben, evtl vor DAUs die
den support nerven weil nix geht.
Ich habs bei mir durchtrennt und das Board lief so schon einige Stunden.

Oder löte einfach nen 10k pullup hinter den Jumper auf die eeprom seite
wenn du sicher gehen willst ;)
Oder nen 100k pulldown falls gnd in der nähe ist :)

von Christian H. (cavorca)


Lesenswert?

Also am Board wirklich was ändern würde ich ehr ungern. Aber mal sehen, 
vielleicht ist es die beste Lösung.
Trotzdem ist es mir mulmig bei dem Gedanken an einem Multilayerboard 
herumzuschnitzen. Ein mal zu tief oder dumm abgerutscht und nix geht 
mehr.

Das mit den DAUs glaube ich ehr nicht. Ich finde die Dokumentation zu 
dem Board ja dermaßen miserabel. Bzw eigentlich ist sie ja nicht mal 
vorhanden. DAUs schmeißen das Board entweder direkt in die Ecke, oder 
stehen in Dauerkontakt mit dem Support. ;-) Falls es ihn gibt.
Wenn ich mich erinnere wie lange ich gesucht habe bis ich den Schalter 
on/off gefunden habe... Naja ein kleiner DAU steckt wohl in jedem von 
uns ;-) Trotzdem finde ich es könnte ein klein wenig mehr Dokumentation 
zu dem Board geben. Ich habe eigentlich keine Lust die Funktion der 
einzelnen Jumper aus dem Schaltplan und Datenblätter der Bauteile zu 
erschließen.

Apropos, konntest Du ein Datenblatt zu dem "PSDRAM" finden? Zu wissen 
wie man den ansteuert, oder ehr was man bei den Timings beachten muss 
wäre auch nicht schlecht zu wissen.

Vielleicht nehme ich auch zuerst mein altes FT245 Board und lege mir 
irgendwann ein FX2 Board zu. Das würde zumindest direkt Funktionieren. 
Schon ärgerlich. Als ich mir das FPGA Board gekauft habe war 
Grundvoraussetzung, dass es eine USB Schnittstelle hat. Aber dass es so 
ein Akt ist die zu nutzen hätte ich nicht gedacht. Ich habe kein Problem 
damit Zeit zu investieren und mich in ein Thema einzuarbeiten. Aber wenn 
wie bei dieser Digilent EPP Schnitstelle jeglicher Startpunkt fehlt 
vergeht die Arbeitslust sehr schnell.



Noch mal die Frage: Eine eigene Firmware in den FX2 laden, wenn die aus 
dem EEPROM geladen wurde geht nicht? Oder muss ich mich dafür mal genau 
auf der Cypress Seite umschauen? Das wäre für mich die eleganteste 
Lösung. Angepasste Firmware ohne was an der Hardware rum zu basteln.

Und gibt es Windowssoftware um die Firmware in den FX2 zu laden? Auf 
Andreas Seite konnte ich nur was für Linux finden.



Viele Grüße,
Christian

von gast (Gast)


Lesenswert?

>Trotzdem ist es mir mulmig bei dem Gedanken an einem Multilayerboard
>herumzuschnitzen. Ein mal zu tief oder dumm abgerutscht und nix geht
>mehr.
keine sorge, um bis in die mittleren lagen durchzudringen musst du sehr 
grobmotorisch sein
oder sehr sehr hartnäckig ;)
Die leiterbahn auf der oberfläche kannst du ganz leicht mit nem 
Schraubenzieher oä durchtrennen.

>Noch mal die Frage: Eine eigene Firmware in den FX2 laden, wenn die aus
>dem EEPROM geladen wurde geht nicht? Oder muss ich mich dafür mal genau
>auf der Cypress Seite umschauen? Das wäre für mich die eleganteste
>Lösung. Angepasste Firmware ohne was an der Hardware rum zu basteln.
ich weiß nicht mehr warum ich das gemacht hab.
Ich weiss nicht mehr ob man auch während das eeprom lief die firmware 
laden konnte.
Evtl hab ich es auch nur durchgekrazt um zu sehen ob meine fw wirklich 
geladen wird oder so (glaub ich eher nicht)

>Und gibt es Windowssoftware um die Firmware in den FX2 zu laden? Auf
>Andreas Seite konnte ich nur was für Linux finden.
keine ahnung.. ich hab nur linux kisten hier ;)
ausserdem hab ich die software zum firmware laden aber selber in C 
geschrieben.
Mit der usb lib geht das ganz fix und braucht nur wenige Zeilen code.
Wie es unter win geht: ka :-\ sorry

von Christian H. (cavorca)


Lesenswert?

> keine sorge, um bis in die mittleren lagen durchzudringen musst du sehr
> grobmotorisch sein
> oder sehr sehr hartnäckig ;)
> Die leiterbahn auf der oberfläche kannst du ganz leicht mit nem
> Schraubenzieher oä durchtrennen.
Auf der Uni habe ich mal eine Leiterbahn unter einem 3D Mikroskop 
durchtrennt. Das sah echt gruselig aus. Aber grobmotorisch bin ich 
eigentlich nicht.

> ich weiß nicht mehr warum ich das gemacht hab.
> Ich weiss nicht mehr ob man auch während das eeprom lief die firmware
> laden konnte.
> Evtl hab ich es auch nur durchgekrazt um zu sehen ob meine fw wirklich
> geladen wird oder so (glaub ich eher nicht)
Bin mittlerweile auch ehr pessimistisch.

> keine ahnung.. ich hab nur linux kisten hier ;)
> ausserdem hab ich die software zum firmware laden aber selber in C
> geschrieben.
> Mit der usb lib geht das ganz fix und braucht nur wenige Zeilen code.
> Wie es unter win geht: ka :-\ sorry
Linux versuche ich momentan ein wenig auszuweichen, da da die 
Lüftersteuerung von meinem Notebook nicht richtig Funktioniert. Und das 
nervt auf dauer. Mehr als Windows.
Läuft Modelsim eigentlich unter Linux? Das war für mich auch immer ein 
wichtiger Windows-Grund.

Ich bin mir überhaupt nicht mehr sicher ob ich nicht lieber eine 
separate Platine für den FX2 bastele. Aber vielleicht sollte ich auch 
einfach ein bisschen mutiger sein und die Leiterbahn durchkratzen. ;-)

Viele Grüße,
Christian

von DerDan (Gast)


Lesenswert?

Hallo FX2'ler


also ich auch auch eine Nexys Board mit durchgekratzter EEPROM Brücke.
Ohne EEPROM Zugriff startet der FX2 mit einer anderen VID / PID wodurch 
unter Windows ein anderer Treiber geladen wird. Mit EEPROM wird ja der 
Digilent Treiber geladen. Mit dem Digilent Treiber hab ich mich nicht 
weiter beschäftigt. Aber ich denke das es nicht möglich ist eine eigene 
Firmware über diesen Treiber in den FX2 zu laden.


Ohne EEPROM kann man die Entwicklungsumgebung von Cypress nutzen.
um deren Beispiel FW zu testen.
Da die FW-Quelltexte dabei liegen kann man die auch modifizieren. Geht 
soweit ganz gut.

über den FX2/68013/68013A gibt es hier im Forum noch ein paar Fäden 
(Thread)

Vor allem für Leute die mit C# arbeiten wollen gibt es wohl einfachen 
zugriff auf den FX2

Ich nehme lieber Delphi und bin dabei einen Treiber für die CyUsb.sys zu 
schreiben.


Viele Dinge funktionieren schon.

Bei mir scheitert es im Moment daran, ein FPGA Design zu haben, welches 
Daten über den Slave Fifo Mode in den FX2 pumpt.

Demnächst werde ich wohl mal ein Delphi Program haben welches den 
"bulkloop" (Cypress) verwendet.

mfg


DerDan

von Christian H. (cavorca)


Lesenswert?

Hi

> Ich nehme lieber Delphi und bin dabei einen Treiber für die CyUsb.sys zu
> schreiben.
Warum willst du einen Treiber selbst schreiben? Kann man nicht auch den 
fertigen von Cypress nehmen?

Ich habe mir ein Board gebastelt auf dem ein eigener FX2 drauf ist. Ich 
habe mich dafür entschieden, da die Prozedur, wenn ich mal das Design 
des FPGAs verändern will, deutlich kürzer ist.
Ist auch sicher mal eine gute Erfahrung so eine Platine mal selbst von 
Grund auf aufzubauen.

Viele Grüße,
Christian

von Gast (Gast)


Lesenswert?

hi *,

unter:

 http://www.hackdaworld.org/~hunz/open_nexys.tar.bz2

gibt's ne fx2 fw fuer das nexys board inklusive gepatchtem xilprg.

programmierung ueber das beiliegende gepatchte xilprg (-- bisher nur 
unter linux getestet) moeglich u. auch rudimentaerer usb transfer 
implementiert..

ganz nett als ausgangsbasis. -- beachte:

* die bruecke zum eeprom muss beim fx2 unterbrochen werden, damit der 
nicht gleich seine interne fw laedt. dann alles wie in der enthaltenen 
readme.txt..

* das usbtest modul darf unter linux nicht geladen sein, sonst kommt der 
fx2/fxload durcheinander (rmmod usbtest).

gruss,
k.

von DerDan (Gast)


Lesenswert?

Hallo,

Ich hab mich vielleicht falsch ausgedrückt. Ich möchte nicht CyUsb.sys 
ersetzen sondern auf CyUsb.sys mit Delphi Pascal zugreifen.
Es funktioniert ja auch schon einiges.

Im Moment hab ich nur einen seltsamen Effekt, dass ich die Deskriptoren 
nicht mehr einwandfrei lesen kann, nachdem ich den FPGA konfiguriert 
habe.

und fertig ist auch noch nicht alles.


mfg DerDan

von Christian H. (cavorca)


Lesenswert?

DerDan wrote:
> Hallo,
>
> Ich hab mich vielleicht falsch ausgedrückt. Ich möchte nicht CyUsb.sys
> ersetzen sondern auf CyUsb.sys mit Delphi Pascal zugreifen.
Aso.
> Es funktioniert ja auch schon einiges.
>
Was denn z.B.?
Ich habe mich bisher nur mit der Firmware Programmierung beschäftigt und 
die Daten dann mit dem Cypress Tool abgerufen.

> Im Moment hab ich nur einen seltsamen Effekt, dass ich die Deskriptoren
> nicht mehr einwandfrei lesen kann, nachdem ich den FPGA konfiguriert
> habe.
>
Hm. Was ist denn im FPGA drin? Bei mir bisher nur ein Design, dass mir 
die Ports B oder D an die LEDs gibt. Der nächste Schritt wird bei mir 
sein den FX2 als Slave Fifo zu konfigurieren und mit dem FPGA Daten rein 
zu schreiben.

Verwendest du noch den Standard Descriptor oder hast du da schon mal was 
angepasst? Ich habe den Descriptor schon mal verändert, würde aber gerne 
etwas genauer über das Thema bescheid wissen...

> und fertig ist auch noch nicht alles.
klar. bei mir auch nicht. Das wird auch noch sicher etwas dauern ;-)

Viele Grüße,
Christian

von DerDan (Gast)


Lesenswert?

Hallo Christian,


ins FPGA wird im Moment die Demo App von Digilent geladen. Einfach nur 
um zu sehen, ob das FPGA Konfigurieren geht. ein spezielles FPGA Design 
hab ich noch nicht.

Nach allem was ich gelesen habe ist es sehr sinnvoll den Slave Fifo Mode 
zu verwenden.

Bevor ich mich damit befasse, wollte ich meine eigene PC SW Haben um 
auch den  Bulkloop im FX2 zu testen.
dazu habe ich die Bulkloop Demo und mein FX2 Programm zur JTAG 
Konfiguration zusammengebastelt. damit lade ich nur noch eine Hex File 
und kann sowohl den FPGA Konfigurieren als auch den Bulkloop testen.

Um den Bulkloop zu testen habe ich meine Delphi Interface zur CyUSB.sys 
ausgebaut und dann festgestellt, dass die Abfrage der Deskriptoren nicht 
richtig funktioniert.

Mit welcher PC Entwicklungsumgebung willst du denn auf der PC Seite die 
SW generieren?

mfg und schöne Grüße aus BaWü

DerDan

von Christian H. (cavorca)


Lesenswert?

Hi,

> Nach allem was ich gelesen habe ist es sehr sinnvoll den Slave Fifo Mode
> zu verwenden.
Auf jeden Fall. Oder das GPIF. Das ist aber erst mal uninteressant für 
mich, weil auf jeden Fall ein FPGA am FX2 hängt. Daher werde ich mich 
erst mal nur mit dem Fifo beschäftigen.

> Bevor ich mich damit befasse, wollte ich meine eigene PC SW Haben um
> auch den  Bulkloop im FX2 zu testen.
Steht bei mir an, wenn das Fifo läuft.

> dazu habe ich die Bulkloop Demo und mein FX2 Programm zur JTAG
> Konfiguration zusammengebastelt. damit lade ich nur noch eine Hex File
> und kann sowohl den FPGA Konfigurieren als auch den Bulkloop testen.
>
> Um den Bulkloop zu testen habe ich meine Delphi Interface zur CyUSB.sys
> ausgebaut und dann festgestellt, dass die Abfrage der Deskriptoren nicht
> richtig funktioniert.
>
Hast du das nur mit deiner Software getestet oder auch mal mit dem EZ 
Control Panel?

> Mit welcher PC Entwicklungsumgebung willst du denn auf der PC Seite die
> SW generieren?
Vermutlich irgendwas C. Auf dem PC habe ich diese abgespeckte Version 
von Visual C++.
Lange Zeit habe ich in Visual Basic programmiert, daher schließe ich das 
auch nicht ganz aus. Hätte halt den Vorteil, dass ich mich mit der 
Umgebung gut auskenne. Nur wird es wenige Beispiele dafür geben. 
Außerdem könnte ich mir vorstellen, dass C einfach besser geeignet ist 
als VB.

Aber wie man die CyUSB.sys nutzt sollte ja von der Programmiersprache 
ehr unabhängig sein.
Mich würde interessieren wie dein Code dazu aussieht und was du raus 
gefunden hast worauf man achten muss.
Ich kann dir auch ein paar Firmware Code schnipsel schicken, falls es 
dich interessiert. Ist aber wirklich nicht viel bisher...

Viele Grüße aus Bonn,
Christian

von DerDan (Gast)


Lesenswert?

Hallo Christian,

FW Schnipsel wären schon ganz nett, am besten mit einer FPGA 
Konfiguration, welches Daten für den FX2 generiert, irgend ein 
spezielles Pattern (zur not auch einfach hochzählen). Verwendest du auch 
das Nexys oder Nexys2 Board von Digilent?


Visual Basic: da kann man sich bei Cypress den "SuiteUSB.NET" laden und 
dann unter  "Visual Basic.net" damit arbeiten. Ansonsten hast du das 
gleiche Problem wie ich, ein Interface zu CyUsb.sys zu basteln.

Cypress unterstützt wohl nur Microsoft Programmier-Umgebungen.
Irgendwie will ich mir das nicht auch noch antun.

Viel von meinem Delphi Code habe ich aus der Dokumentation und der Datei 
"CyUsb.pdf" abgeleitet. Meine Unit für das Interface ist mittlerweile 
über 1300 Zeilen lang.


mfg

DerDan

von Christian H. (cavorca)


Lesenswert?

> Visual Basic: da kann man sich bei Cypress den "SuiteUSB.NET" laden und
> dann unter  "Visual Basic.net" damit arbeiten. Ansonsten hast du das
> gleiche Problem wie ich, ein Interface zu CyUsb.sys zu basteln.
>
So weit ich weiß ist VB.Net doch schon ne Ecke anders als VB. Ich wollte 
eh mal früher oder später ordentlich anfangen was in C zu schreiben. 
Wäre ein guter Vorwand.

> Cypress unterstützt wohl nur Microsoft Programmier-Umgebungen.
> Irgendwie will ich mir das nicht auch noch antun.
Aus Überzeugung oder aus Gewohnheit?


> FW Schnipsel wären schon ganz nett, am besten mit einer FPGA
> Konfiguration, welches Daten für den FX2 generiert, irgend ein
> spezielles Pattern (zur not auch einfach hochzählen). Verwendest du auch
> das Nexys oder Nexys2 Board von Digilent?
Ich habe das Nexys2 (Daher ja überhaupt dieser Thread...)

Meine FPGA Konfigurationen nutzen dir wahrscheinlich nicht so viel, da 
ich ja ein externes FX2 Board nutze.

Aber mal zum Code:

Zuerst möchte ich sagen, dass ich keineswegs sicher bin, dass das was 
ich hier schreibe richtig ist. Es basiert auf meinen spärlichen 
Erfahrungen. Für Ergänzungen bin ich immer Dankbar.


Ich habe mit dem Bulkloop Beispiel angefangen. Bulksrc ist aber glaube 
ich genau so gut.

Im Projekt gibt es - so weit ich bisher weis - 3 wichtige Dateien.

1) fw.c
hier steht das hauptprogramm drin. Behandlung von Anfragen auf endpoint 
0 und sowas. Die Datei habe ich erst mal gelassen wie sie ist.

2) descr.a51
hier steht die Endpoint-Konfiguration drin. Kann man anfangs so lassen, 
aber sobald man die Endpunkte anders verwenden möchte muss man hier 
Änderungen vornehmen. Später dazu mehr.

3) bulkloop.src
hier stehen 2 wichtige Funktionen drin

I)void TD_Init(void)
wird einmal am anfang aufgerufen.
II)void TD_Poll(void)
wird permanent aufgerufen, außer der chip ist im suspend mode.


Das erste was ich gemacht habe, war in de TD_init reinzuschreiben, dass 
etwas an den ports ausgegeben werden soll:

Zuerst muss man die Ports auf Output stellen. Das geht bitweise mit:

OEB=255;
OED=255;

In einem anderen Register kann man einstellen ob die Pins als Port, 
Slave-Fifo oder GPIF genutzt werden. Da die standarteinstellung Port ist 
muss man hier erst mal nichts machen.

Dann stellt man die Werte ein die ausgegeben werden:

IOB=170;
IOD=85;

Das kann man per FPGA mal auf die LEDs ausgeben und sehen, dass das 
erste Hello World Programm funktioniert.
----------------------------------------------------------
Der meiner Meinung nach nächste sinnvolle Schritt ist die Nutzung von 
Endpoint 1.

Der FX2 hat 6 Endpunkte.
Wie ich es verstanden habe ist EP0 nur für Konfiguration bzw. USB 
Protokoll. Auf EP0 gehe ich nicht weiter ein, schon alleine weil ich da 
nicht viel weiß.

EP2,4,6,8 sind Hauptsächlich gedacht um über Slave FIFO oder GPIF Daten 
mit hoher Rate über USB zu schaufeln. Das geht ohne Tätigkeit des 
Prozessors und daher so schnell. Wenn man will kann man aber auch mit 
dem Prozessor auf die Register des FIFOs zugreifen.
Die Richtung (IN oder OUT) ist konfigurierbar, aber fest.


Dann gibt es noch EP1. Auf den kann man nicht von außen direkt 
schreiben. Das geht nur vom Prozessor aus.
Die Fifos von EP1 sin 64 Byte groß. Es gibt 2. Einen für IN einen für 
OUT.
Die Fifos sind einfach gebuffert. d.h., wenn ein Buffer vom SIE 
verwendet wird kann/sollte man nicht daraus lesen/darein schreiben.

Will man EP1 verwenden muss man zuerst den descriptor anpassen.
Mit der Struktur der Datei muss ich mich noch auseinander setzen, aber 
hier mal ein Anfang der funktioniert.

Es gibt mehrere Konfigurationen, da mein Notebook Highspeed USB Ports 
hat passe ich erst mal nur den Highspeed Teil an.

Es gibt einen Teil, drüber steht:
;; Interface Descriptor
hier muss man
;; Number of end points
anpassen. Ich ändere den Wert von 4 auf 6, da ich EP1 In und OUT nutzen 
will.

Darunter muss man 2 neue ;; Endpoint Descriptor
einfügen. Natürlich samt den 7 Zeilen die direkt drunter stehen.

anpassen muss man:
db   01H               ;; Endpoint number, and direction
beim 2. steht da 81H, die 8 steht scheinbar für die Richtung

optional kann man die transferart ändern: Erlaubt sind Interrupt und 
Bulk,  Isochronous hingegen nicht.

db   ET_INT            ;; Endpoint type

Die Werte habe ich auf die größe des Fifos gestellt. Also 64 Byte.
db   40H               ;; Maximun packet size (LSB)
db   00H               ;; Max packect size (MSB)

Das kann man jetzt speichern und erst mal neu compilieren. Wenn man das 
auf den FX2 spielt und ihn dann im EZ Control-Panel öffnet sollten nun 6 
Pipes erscheinen.
-----------------

Jetzt muss man sich noch darum kümmern die endpunkte in der Firmware zu 
verwenden.

Ich habe die Endpunkte als interrupt konfiguriert. Wenn man das macht 
muss man die Konfiguration in der Firmware anpassen, da die 
Standarteinstellung Bulk ist.

Das geht in der void TD_Init(void).

Angepasst werden müssen:
EP1OUTCFG
und
EP1INCFG

(siehe TRM Seite 346 (Ich spreche immer von der Seitenzahl die im Reader 
angezeigt wird. Nicht die die auf der Seite steht.)

Beide werte müssen auf 0xB0 gestellt werden für: EP ist aktiviert und 
transfermode=interrupt.

Jetzt muss man EP1OUT scharf machen. D.h. freischalten, dass vom PC aus 
was reingeschrieben werden kann.

Das geht mit:
EP1OUTBC=64;
Man kann auch jeden anderen Wert reinschreiben (auch 0 oder den 
aktuellen Wert.) Scharf machen geht alleine durch den Schribzugriff.

Hier muss man aufpassen! Es gibt register zwischen deren schreib lese 
zugriffen man ein Syncronisationdelay einbauen muss. Das geht einfach 
mit:
SYNCDELAY;
welche register das genau sind guckt man im TRM auf seite 425 nach.
das EP1OUTBC gehört denke ich dazu.
Zum Glück sind die Buffer nicht Alphabetisch sortiert. Dann hat man mehr 
Spaß beim suchen.

Sonst braucht man dieses Byte noch: Es gibt an wie viele Bytes im Buffer 
sind die der PC gesendet hat.


Wenn der PC etwas gesendet hat ist folgende Aussage wahr:
!(EP1OUTCS&2)
m.a.W. das Bit Nr. 2 in EP1OUTCS ist 0.

Ist das Bit=1 sollte man keinesfalls aus in das fifo schreiben oder 
draus lesen, da die SIE das FIFO grade nutzt.

Sind also Daten vom PC angekommen (Das überprüfte Bit oben ist 0) so 
kann man die Lesen.
z.B. auf Port B wird der Inhalt des ersten Bytes ausgegeben, auf PORTD 
die anzahl der übertragenen Bytes. Das geht mit:

if (!(EP1OUTCS&2)){
  IOB=EP1OUTBUF[0];
  IOD=EP1OUTBC;
        SYNCDELAY;
  EP1OUTBC=0; //wieder scharf machen
}

Hier würde ich nochmal compilieren und testen.


Als nächstes kann man versuchen Daten an den PC zu schicken. Ich habe 
mal einfach die Daten die der PC gesendet hat an den PC zurück 
geschickt.

das geht mit:

  int j,cnt;

  cnt=EP1OUTBC; //abfragen wie viele bytes vom pc zum fx2 gesendet 
wurden

for (j=0;j<cnt;j++){
   EP1INBUF[j]=EP1OUTBUF[j]; //Daten vom einen in den anderen Buffer 
kopieren
}

SYNCDELAY; EP1OUTBC=0;  //neu scharf machen
SYNCDELAY; EP1INBC=cnt; //bekannt geben wie viele bytes man in den EP1 
geschrieben hat. jetzt können sie vom pc abgerufen werden.

Ich glaube das erste Syncdelay ist überflüssig. Auch damit muss ich mich 
noch genauer beschäftigen.


So ich hoffe das macht dir den Start in die Firmware Programmierung 
etwas leichter als mir. War doch recht mühsehlig, da man nirgends eine 
VOLLSTÄNDIGE Anleitung findet die wirklich NUR das enthält was man am 
Anfang braucht. Viele Sachen muss man sich natürlich noch genauer 
angucken. Aber immerhin ist ein Anfang geschafft. Ich denke auch, dass 
der schwierigste Teil hinter mir liegt.

Falls dieses kleine Tutorial noch jemandem mal hilfreich ist würde ich 
mich sehr über eine kleine Nachricht in diesem Thread freuen!

> Viel von meinem Delphi Code habe ich aus der Dokumentation und der Datei
> "CyUsb.pdf" abgeleitet. Meine Unit für das Interface ist mittlerweile
> über 1300 Zeilen lang.

Habe ich eben gesagt das Schwierigste liegt hinter mir? Die PC Seite 
hatte ich ja ganz vergessen... Naja wird auch irgendwie klappen.

So jetzt muss ich endlich noch was für meine Prüfung lernen.

Viele Grüße,
Christian

von Christian H. (cavorca)


Lesenswert?

Hi,

@DerDan:
Arbeitest du noch am Projekt? Daten vom FPGA per FIFO in den FX2 
funktioniert bei mir jetzt. Kommt auch alles richtig an. Jetzt sitze ich 
vor der Aufgabe die Software auf dem PC zu schreiben... Wie weit bist du 
dabei gekommen?

Viele Grüße,

Christian

von DerDan (Gast)


Lesenswert?

Hallo,


Delphi - SW funktioniert soweit, das im Bulkloop Mode Daten verschoben 
werden. Ich erreiche damit zwar "nur" ca 10MByte pro Sekunde, aber 
immerhin.

Ich bin dabei eine Design fürs FPGA zu basteln um Daten zu generieren 
und in den FX2 zu füttern. Wenn ich dann wieder auf 10MByte/sec komme 
bin ich schon mal happy. den IFCLK hab ich schon benutzt um eine LED 
blinken zu lassen...


MFG


DerDan

von Christian H. (cavorca)


Lesenswert?

DerDan wrote:
> Hallo,
>
>
> Delphi - SW funktioniert soweit, das im Bulkloop Mode Daten verschoben
> werden. Ich erreiche damit zwar "nur" ca 10MByte pro Sekunde, aber
> immerhin.
>
Klingt nicht schlecht. Kannst du mir den Source Code schicken? Würde 
mich sehr freuen. Das Beispiel das von Cypress in C dabei ist lässt sich 
bei mir nicht Compilieren.

> Ich bin dabei eine Design fürs FPGA zu basteln um Daten zu generieren
> und in den FX2 zu füttern. Wenn ich dann wieder auf 10MByte/sec komme
> bin ich schon mal happy. den IFCLK hab ich schon benutzt um eine LED
> blinken zu lassen...

In Verilog oder VHDL? In Verilog könnte ich dir meinen Code schicken, 
wenn es dich interessiert. Ist aber auch nix großartiges... Flags werden 
an die LEDs gegeben, am Port wird hochgezählt sofern das FIFO nicht voll 
ist, der Wert des Fifos wird zusätzlich an der 7 Segement Anzeige 
ausgegeben.

Viele Grüße,
Christian

von DerDan (Gast)


Lesenswert?

Hallo Christian,


wir können gerne drüber reden Quelltexte zu tauschen. Aber was nutzen 
dir meine Delphi Quellen, wenn du in C programmieren möchtest.

Das was ich über die aktuelle Entwicklungsumgebung für C# unter .Net 
gelesen habe hört sich doch ganz gut an.
Ich mach halt das was ich kann, und das ist Delphi.


mfg


derDan

von Christian H. (cavorca)


Lesenswert?

DerDan wrote:
> Hallo Christian,
>
>
> wir können gerne drüber reden Quelltexte zu tauschen. Aber was nutzen
> dir meine Delphi Quellen, wenn du in C programmieren möchtest.
>
Dann weiß ich immerhin mit welchen Befehlen ich die Lib initialisiere...
Die Beschreibung der CyAPI im PDF ist zwar gut, aber ich denke mit einem 
einfachen Beispiel könnte der Einstieg einfacher sein.

Viele Grüße
Christian

von DerDan (Gast)


Lesenswert?

Hallo,

ich habe es hinbekommen:

FX2 läuft als Slave Fifo mit EP6 512Byte double buffered.
CyUsb Treiber wird unter Delphi angesteuert.
FPGA füttert den FX2 mit Daten.

Receive im Bulk Mode liegt bei bis zu 37 MByte / sec.

Der Turbo Knopf ist echt die CyUsb Funktion 
"IOCTL_ADAPT_SET_TRANSFER_SIZE"
mit 128kByte kommen die o.g Werte raus.

-----

Leider gibt es im Datenstrom immer wieder mal größere Lücken (bis zu 
3ms) in denen keine Daten übertragen werden.

3ms * 48MByte / sek = 144 kByte.

So groß müsste ein Fifo sein um Datenverluste zu vermeiden, wenn in 
dieser Zeit Daten mit 48MHz anfallen.

ganz schön viel. Ist mit dem interen Blockram des Spartan leider nicht 
zu schultern.


Ist mir ein Rätsel, wie man einen kontinuierlichen Datentransfer hin 
bekommt bei denen das interne Fifo des FX2 ausreicht.


Ich bin mir fast sicher, dass sie Lücken auftreten, wenn der USB Treiber 
seine Daten an den Thread übergibt.


mfg


DerDan

von Christian H. (cavorca)


Lesenswert?

Hi,


> Receive im Bulk Mode liegt bei bis zu 37 MByte / sec.
Klint ja super. Wenn ich das auch hinbekomme bin ich zufrieden.

> Der Turbo Knopf ist echt die CyUsb Funktion
> "IOCTL_ADAPT_SET_TRANSFER_SIZE"
> mit 128kByte kommen die o.g Werte raus.
Gut zu wissn.


> Leider gibt es im Datenstrom immer wieder mal größere Lücken (bis zu
> 3ms) in denen keine Daten übertragen werden.
>
> 3ms * 48MByte / sek = 144 kByte.
>
nicht ehr 3ms*37MB/s? Wenn die Daten mit 48MB/s kommen bekommt man ja eh 
nicht alles übertragen.
aber ok, das ist nicht bedeutend weniger.

> Ist mir ein Rätsel, wie man einen kontinuierlichen Datentransfer hin
> bekommt bei denen das interne Fifo des FX2 ausreicht.
>
Hast du mal den Isochronous Modus versucht?

Mir persönlich würden die Pausen aber auch nichts ausmachen. Ich kann 
mir auch keine Anwendung vorstellen bei der man die hohe Datenrate 
wirklich permanent braucht.

Leider hatte ich bisher noch keine Zeit mich mit der PC Seite zu 
beschäftigen. Aber das kommt als nächstes.

Viele Grüße,
Christian

von Michael (Gast)


Lesenswert?

Probier doch mal, den EP6 als quad-buffered zu konfigurieren. Vielleicht 
bringt es was.

von Jan (Gast)


Lesenswert?

Habt ihr den USB Datentransfer zustande bekommen?

von Christian H. (cavorca)


Lesenswert?

Ohne dass ich jetzt nochmal den ganzen Thread durchlese und wieder weiß 
was ich vor 2 jahren alles getan habe:

- Mit einem separaten FX2 habe ich etwas hinbekommen. Mit den Datenraten 
war ich ganz zufrieden. Seitdem habe ich aber nichts weiter dran 
gemacht.
- Zum Transfer mit dem FX2 der auf dem nexys2-Board drauf ist habe ich 
nichts mehr probiert. Allerdings habe ich gesehen, dass das digilent 
interface in der doku mittlerweile ganz gut beschrieben ist.

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.