Hi liebe Mikrocotroller-user und Gäste, ich habe jetzt schon ein paar Monate Erfahrung in FPGA-Programmierung (hauptsächlich bei Altera und Lattice Produkten). Leider ist mir die Kommunikation zwischen meinen Boards und eines Hosts (PC) ziemliech unbekannt. Ich benutze USB und meine Boards haben alle FTDIs (ua ft2232hl). Ich habe jedoch leider nicht das grundlegende Wissen über USB und FTDIs. Ich weiss, dass es so verschiedene Modi gibt, wie z.B: UART, FIFO, JTAG, BitBang. Aber wie funktioniert denn überhaupt die Datenübertragung vom Host über USB zum FTDI-Chip? Schließlich hat der USB doch nur zwei Datenleitungen, wie kann man damit denn gescheit Daten übertragen? Empfängt der FTDI die Daten und wandelt das ganze in ein anderes Prokoll um (wie JTAG, wenn das eins ist)? Wie schon gesagt, ich verstehe das alles nicht, wäre super, wenn mir da jemand die ganze Sache erklären könnte! Gruß, Alexx
USB ist ein recht simples Protokoll, auf den zwei Leitungen wird im Halbduplex Betrieb gearbeitet. Da der Host immer Master und das Device immer Slave ist und an einem Kabel immer nur genau ein Slave ist, ist die Sache recht einfach vom Master steuerbar. Bis USB 2.0 ist das auch alles im Polling, das Device darf von sich aus keine Daten schicken. Das hat dich beim FTDI aber alles nicht zu interessieren. Du wählst ein für sich am besten passendes Protokoll (am FPGA sinnvollerweise ein FIFO-basiertes) und auf der Host-Seite sprichst du den FTDI Triber über die DLL an. Da kannst du dann angeben, welches Protokoll auf der Device-Seite gefahren wird, und der rest läuft dann im Treiber bzw. in den DLLs ab.
Alexx schrieb: > Leider ist mir die Kommunikation zwischen meinen Boards und eines Hosts > (PC) ziemliech unbekannt. Welche "Kommunikation"? Es gibt da grundsätzlich 2 Pfade, die nötig/möglich sind: 1. die Programmierschnittstelle und 2. ein Kommunikationspfad zur Datenübertragung? Auf deutsch: willst du selber einen Programmer bauen, oder willst du irgendwelche Daten ans FPGA schicken?
Moin, guck mal nach Stichwort "MPSSE" - der FTDI hat eine simple Engine um USB-Kommandoströme in SPI, JTAG, oder ähnliche Protokolle zu wandeln. Also vereinfacht: Um eine gewisse JTAG-Sequenz "rauszuclocken" schickst Du einfach die entsprechenden Befehle per ftdi-API und liest u.U. auch wieder Daten zurück. Da das ganze mit FIFO-Puffern und nicht duplex arbeitet (USB), musst Du Dir Gedanken machen, wie Du die Daten pufferst (Stichwort "Queueing"), damit a) der Link nicht lahm wird (Ping-Pong-Transfers sind schlecht), oder b) interne FIFOs vollaufen. Gibt aber für den FTDI schon ne Menge fertige Programme, z.B. xilprg, xcs3prog, etc. Zusätzlich kann der FTDI ja noch als FIFO arbeiten um richtig schnell Daten ans FPGA zu streamen. Aber den meintest Du vermutlich weniger? Der Vorteil des FT2232H gegenüber dem FX2 ist allerdings, neben der viel einfacherern Programmierung, dass man sich nicht von der usb.org abzocken lassen muss, wenn man Hardware auf den Markt bringen will. FTDIchip.com teilt einem relativ unbürokratisch auf Anfrage einen Satz PIDs zu. Grüsse, - Strubi
>USB ist ein recht simples Protokoll
Wenn dem so WÄRE, bräuchte man keine FTDI-Chips ;-)
VG, SuperWilly
SuperWilly schrieb: > Wenn dem so WÄRE, bräuchte man keine FTDI-Chips ;-) Naja, es ist wirklich simpel. Allerdings mit strengen Timing-Anforderungen. Daher die Spezial-Chips. Das Protokoll an sich ist wesentlich einfacher als beispielsweise FireWire oder PCIe. Bei Antwortzeitfenster im ns-Bereich ist es allerdings schon ratsam einen speziellen Controller zu nehmen, sonst artet das in Gefrickel wie V-USB aus.
Danke Leute, jetzt ist schon alles etwas klarer! Lothar Miller schrieb: > Auf deutsch: willst du selber einen Programmer bauen, > oder willst du irgendwelche Daten ans FPGA schicken? Eigentlich möchte ich erstmal irgendwelche Daten schicken. Das ganze sollte eben vom Host über USB zum FTDI geschickt werden und vom FPGA über FTDI zurück an den Host. Über MPSSE hab ich schon auf der FTDI-Herstellerseite was gelesen, aber welches Prokoll eignet sich denn am besten? Also welches ist denn einfach und schnell und auch einfach und zu als HDL Code zu schreiben? Ich hab gar nicht gewusst, dass man den FTDI auch als FIFO benutzen kann, eigentlich schreibe ich immer für den FPGA ein Modul. Ich hab mir nochmal das Datasheet angesehen (http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT2232H.pdf) und tatsächlich gibt es einen FIFO! Ich sehe mir jetzt mal die libFTDI an, die sieht ganz vielversprechend aus:) Mit welcher Frequenz muss ich eigentlich den FTDI auf dem Board tackten? Gruß -Alexx
Hallo @Alexx. Ich würde erst einmal einen UARTCORE via RS232 auf dem FPGA machen. Mit dem Host-Pc via FTDI2232 den FPGA-UART COM:xx B-Port damit koppeln. Beispiel hier: Xilinx VHDL UART Example FT2232 USB chip. UART mit 3Mbit/Sek via FPGA SPARTAN 6 VIDIO Tutorial 1 bis 3. ###################################################################### Board-base Clock @32MHz 3* @96Mhz @48MHz. a*16 via DCM… bit-Samples http://www.gadgetfactory.net/2010/11/xilinx-vhdl-uart-example/?main_page=wordpress ------------------------------------------------------------------ VHDL UART STATE ENGINE hat der mit dem VHDL-Uart erweitert. http://www.youtube.com/watch?v=-ysAlp-Lt5Q&context=C47343b2ADvjVQa1PpcFM0mMck76RlrUG_CdgcMq5heRFfkcqG91U= ………… Alternativ: FTDI FT2232H als MPSSE: (FT245 ,SPI, I2CBUS, JTAG… ) Ich muss mal checken ob ich die aktuelle libftd2xx.a mit meinem CHIP Rev. FT2232H von ELV Elektronik auch geht. Zitat: The MPSSE mode needs a different open/init sequence, thus ftdi_open() was split into ftdi_generic_open() and ftdi_std_open(): ------------------------------------------------------------------------ ------------------------------------------------------------ libftd2xx.a and ftd2xx.h When comes it with a Progammable CPU as Micro Seqencer Protocol Cammand Engine. http://sourceforge.net/apps/mediawiki/urjtag/index.php?title=FT2232_cable_driver#ftdi_Parport_Driver Stichwort: new ftdi_mpsse_connect() calls ftdi_parport_alloc() with specific driver and outbuf length for MPSSE mode ftdi_mpsse_open ftdi_parport_free( parport_t *port ) libftdi-config ftdi_write_data ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++ Für MPSSE mode muss ich das EEPROM vom FT2232H auch noch Mit dem MSProg Tool umproggen. Was ein USB3.0 Chip von Cypress mit ARM 3 Core angeht sind damit noch Reserven * 10 drin. Das JTAG: http://www.fpga4fun.com/JTAG2.html https://github.com/makestuff/libfpgalink/blob/master/firmware/jtag.c Viel Erfolg. Gruss Holger.
Was die diversen JTAG Sourcen von dem github.com/makestuff/…. Betrifft Habe ich bemerkt das da was faul mit dem TMS im vorletzten Bit ist. TMS und CLOCK sind now „COMMON“, und da ist „kein“ CLOCK mehr noetig. (Vorher adequaten TDI Bit-Pegel anlegen …) Da das der TMS Pegel „Flip-back to High“ in diesem Moment macht. Hier ist das richtig: while ( i && leftOver ) { leftOver--; if ( (m_flagByte & bmISLAST) && !leftOver ) { TMS = 1; // Exit Shift-DR state on next clock } TDI = tdiByte & 1; tdiByte >>= 1; TCK = 1; TCK = 0; i <<= 1; } } else { // This is not the last chunk, so we've to 512 bytes to shift blockShiftOut(); } Gruss Holger.
SuperWilly schrieb: >>USB ist ein recht simples Protokoll > > Wenn dem so WÄRE, bräuchte man keine FTDI-Chips ;-) > > VG, SuperWilly ...braucht man ja auch nicht: http://www.cesko.host.sk/IgorPlugUSB/IgorPlug-USB%20(AVR)_eng.htm
Um schnell Daten zwischen PC und FPGA mit den FTDI Chips auszutauschen dient der FIFO Modus. Asynchronous FIFO kann bei den nicht -H Typen vielleicht bis zu 1 MByte/s, bei den -H Typen ist 8 MByte angegeben. Single channel synchronous FIFO ist mit > 25 MByte angegeben. Wenn es langsamer sein kann, darf man auch an die seriellen Protokolle denken. Was dann zwischen FTDI, USB Stecker, USB Kabel und PC passiert, interessiert Dich in erster Naeherung nicht. Erst wieder, wie Du die Daten in deinem Programmen bereitstellst/abholst.
@uwebonnes: Ich denke, dass ich den FIFO-Mode für meinen FTDI (FT2232HL) benutzen werde, die Geschwindigkeit ist jedenfalls beachtlich! Kennst du dich zufällig auch mit der FTDI-Programmierung in C auf der Seite des Hosts aus? Ich benutze den Treiber bzw. die D2XX.dll, um den Chip anzusprechen. Ich würde jetzt gerne ein kleines Tool schreiben, das den FIFO des FTDIs ausließt, wenn er voll ist (er wird nur vom FPGA gefüllt und der Host ließt nur). Dazu setze ich den FTDI mit "FT_SetBitmode" mit dem ucMode-Parameter 0x40 (für Single Channel Synchronous 245 FIFO Mode) in den FIFO Mode. Dann muss ich ihn noch mit FT_Read auslesen, oder wie? Vorher muss ich den EEPROM natürlich noch mit "FT_EEPROM_Program" programmieren, sodass Channel A für den FT245 FIFO-Mode konfiguriert wird. Wie mache ich das denn genau? Gruß, Alex
Ich habe einigen Code fuer libftdi http://www.intra2net.com/en/developer/libftdi/repository.php geschrieben, darunter streamtest fuer den synchronen Fifo Modus im 1.0 branch. Wenn Du dass fuer FTD2XX umschreiben willst, dann schau Dir das mal an, oder benutrze gleich libftdi. Bei Interesse kann ich auch meinen Verilog Code fuer das Fifo im FPGA bereitstellen. Um die hohen Raten zu erreichen, muss das Betriebssystem Leseanfragen in ausreichender Rate an den FTDI schicken. Eine "Warte auf xxx" ist das kontraproduktiv. EEPROM Programmieren geht auch mit libftdi.Nur braucht libftdi1 libusb1, und das ist unter Windows nicht ohne... Tschuess
Ich kenne die libftdi, die benutze ich immer unter Linux. Ich möchte aber auch mal was für Windows coden, deswegen hab ich das D2XX benutzt (libftdi unter Windows ist schwer zu benutzen). Ich schau mir mal den Code von libftdi an, mal sehen, ob ich das einigermaßen umschreiben kann... Wäre wirklich super, wenn du mir den Verilog-Code geben könntest! Handelt es sich dabei auch um ein Design, das den ft2232h(l) im FIFO-Mode benutzt? Gruß, Alex
Wie ist denn der FTDI am FPGA angeschlossen ? Wird er schon als JTAG programmieradapter benutzt und hängt am JTAG des FPGAs ? Mußt dir halt mal den Schaltplan angucken.
Bei uns dient ein FT2232H als USB nach JTAG (Interface 2) oder synchrones FIFO (Interface 1, Interface 2 dann nicht benutzbar)
Wie gesagt: bei mir wird er als USB zu JTAG-Wandler benutzt, aber ich möchte ihn jetzt auch in seinem FIFO Modus nutzen. Ich hoffe, dass das mit meinem Board funktioniert (ob die dazu nötigen Pins des FTDI am FPGA angeschlossen sind)... Übrigens vielen Dank für den source, den du mir gemailt hast! Sieht schonmal vielversprechend aus, am Wochenende kann ich ihn mir dann mal genauer ansehen. Gruß, Alex
Leider benutzt mein Board den FT2232H nur als Schnittstellen-Wandler. Ich kann den FIFO-Mode leider so nicht nutzen! Ganz einfach, weil die Pins vom FTDI nicht ans FPGA angeschlossen sind:/ Ich kann jetzt leider nur das JTAG-output vom FTDI benutzen. Ansonsten müsste ich mich mal nach einem anderen Board umschauen oder eins selber entwickeln (das habe ich aber noch nie gemacht)...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.