Forum: FPGA, VHDL & Co. FTDI-USB + FPGA


von Andi (Gast)


Lesenswert?

Hi,

Ich habe ein Problem bei der USB-Kommunikation zwischen meinem Morph-IC 
II Board und dem PC,vielleicht könnt ihr mir helfen :)

Und zwar ist auf dem Board ein FT2232HQ von FTDI drauf,ich benutze ihn 
derzeit im Synchronous FIFO Mode. Das klappt auch ganz gut,ich kann 
Daten sowohl von PC->FPGA als auch FPGA->PC schicken.

Nun mein Problem,ich möchte z.B. Start/Stop-Signale vom PC an den FPGA 
schicken,der mir darauf Daten bereitstellt. Dieses Umstellen von 
Senden/Empfangen funktioniert leider nicht,immer nur eins von 
beiden(Umstellen kann ich derzeit nur durch auskommentieren der 
Sende/Empfangsfunktion und neukonfigurieren).
Soweit ich das Datenblatt richtig gelesen habe sollte das eig gehen,nur 
nicht gleichzeitig,was ich aber auch nicht brauch.

Ablauf sollte einfach so sein:
1.Start-Signal PC->FPGA
2.Daten FPGA->PC bis
3.Stop-Signal PC->FPGA

Hats vllt schonmal wer gemacht? Ist das so überhaupt möglich? Falls ja 
würde ich noch genaueres mit Code etc. posten.

Vielen Dank schonmal!

MfG
Andi

von BoeserFisch (Gast)


Lesenswert?

Hallo,

du musst dir ein Read/Write-Protokoll einfallen lassen oder abgucken.Wir 
verwenden z.B. netpp mit einem Cypress FX2. Google mal nach "netpp 
dclib" nach dem Source. Allerdings haben wir das protokoll für unsere 
Zwecke abgespeckt.

von Klaus (Gast)


Lesenswert?

Andi schrieb:
> Umstellen kann ich derzeit nur durch auskommentieren der
> Sende/Empfangsfunktion und neukonfigurieren

wenn man zwei verschiedene Modi verwenden will, dann muss man auch neu 
konfigurieren.

Andi schrieb:
> Soweit ich das Datenblatt richtig gelesen habe sollte das eig gehen,nur
> nicht gleichzeitig,was ich aber auch nicht brauch.

Vermutlich nutzt Du die D2XX Treiber. Dieses Datenblatt solltest Du mal 
lesen. Soweit ich das noch weiss, wird der FT2232H per EEPROM als Synch 
FIFO eingestellt. Per Software (->D2XX Interface) kann man den dann 
umstellen auf Asynch FIFO.

von jochen (Gast)


Lesenswert?

Andi schrieb:
> Hats vllt schonmal wer gemacht? Ist das so überhaupt möglich? Falls ja
> würde ich noch genaueres mit Code etc. posten.

Ja ich habe das auch schon gemacht und es funktioniert wunderbar. Wo 
musst du auskommentieren? PC-Applikation oder VHDL?

von Andi (Gast)


Lesenswert?

Im VHDL-Code habe ich jeweils einen Sende/Empfang-Prozess,
wenn ich z.B. im Sende-Prozess die Zeile auskommentiere in der ich die 
Daten abhole,kann ich empfangen und andersrum.

Wenn ich nichts auskommentiere und ein externes Startsignal 
benutze(Button)
Kann ich empfangen,das Startsignal vom PC aus senden geht dann aber 
nicht,
vllt ein Fehler in der Empfangs-State-Machine?
1
    IF rising_edge(CLKOUT) THEN 
2
       IF read_write = '0' THEN               
3
          CASE usb_read_state IS
4
          
5
          WHEN 0 =>
6
              IF RXF = '0' THEN
7
              usb_read_state := usb_read_state + 1;
8
              END IF;
9
              
10
          WHEN 1 =>
11
              OE <= '0';                 
12
              usb_read_state := usb_read_state + 1;
13
              
14
          WHEN 2 =>
15
              RD <= '0';  
16
              usb_read_state := usb_read_state + 1;
17
                        
18
          WHEN 3 =>
19
              data_output(7 DOWNTO 0) <= data(7 DOWNTO 0);  
20
              RD <= '1';
21
              OE <= '1';  
22
              usb_read_state := usb_read_state + 1;  
23
                            
24
          WHEN 4 =>
25
              config(7 DOWNTO 0) <= data_output(7 DOWNTO 0);
26
              usb_read_state := usb_read_state + 1;
27
              
28
          WHEN 5 =>
29
              config <= "00000000";
30
              usb_read_state := 0;               
31
          END CASE;
32
         END IF;               
33
      END IF;

read_write wird in einem anderen Prozess geändert,es ist
low wenn RXF low ist,also Daten vom PC zu empfangen sind, high,wenn 
keine Daten zu empfangen sind und ich zum PC senden kann.In config sende 
ich das empfangene Byte weiter an eine Control-Entity die das dann 
verarbeitet

Weiss nicht genau wie ich zwischen Read/Write umschalten soll,RXF zeigt 
mir an wenn Daten bereit stehen zum Empfangen,TXE ob der FTDI 
sendebereit ist,ich hab jetzt auf RXF reagiert,da start/stop/reset 
Signale Priorität haben,deswegen wollte ich das so mit read_write machen

von Andi (Gast)


Lesenswert?

Noch was vergessen: die State-Machine funktioniert so wenn ich im 
Sende-Prozess die Zeile:
1
data(7 DOWNTO 0) <= data_input(7+(8*usb_next_data_byte) DOWNTO 0+(8*usb_next_data_byte));

auskommentiere,in der Zeile übergebe ich die Sendedaten an den FTDI

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


Lesenswert?

Andi schrieb:
> rising_edge(CLKOUT)
Wieviele Takte hast du denn in deinem Design?

von Andi (Gast)


Lesenswert?

hab einen Main-Takt für alles andere und für die USB-Sachen
den CLKOUT,der vom FTDI geliefert wird

von Andi (Gast)


Lesenswert?

Hat vielleicht irgendwer funktionierende Code-Beispiele oder ähnliches?
Problem besteht leider immernoch...

von T. F. (tf2206)


Lesenswert?

Moin Andi,

schau dir mal folgendes Beispiel an:

http://opencores.org/websvn,filedetails?repname=ft2232hcore&path=%2Fft2232hcore%2Ftrunk%2Fvhdl%2Fusb_sync%2Fusb_sync.vhd

Für dich dürfte allerdings nur der Teil mit "-- Handle FIFOs to USB2232 
in synchronous mode" interessant sein.

Desweiteren schau mal auf der FTDI Homepage nach dem AN_130, dort stehen 
auch noch eine Menge an nützlichen Infos und Code-Beispiele drin.

Grüße TF

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.