Forum: FPGA, VHDL & Co. Fehler in der Übertragung


von Lassmiranda Densiwillja (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

habe eine Kommunikation zwischen FPGA und PC. Die Kommunikation erfolgt 
mittels USB und dem FT2232H von FTDI. Ich betreibe den FT2232H in 
Synchronous FIFO Mode.

Habe zur Inbetriebnahme der Strecke einen 16Bit Vector den ich einfach 
nur inkrementiere (0....FFFF-0...FFFF). Wenn ich auf dem PC mir die 
Daten anschau die ankommen, hab ich immer folgenden Fehler:

35FE 35FF 3500 3601 3601...

Das MSB wird immer um eins zu spät inkrementiert...

Habt ihr eine Idee woran es liegen könnte?

Vielen Dank eure Ideen

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


Lesenswert?

Lassmiranda Densiwillja schrieb:
> Habe zur Inbetriebnahme der Strecke einen 16Bit Vector
Welchen?
Was wird wie von wo nach wo übertragen?

> Habt ihr eine Idee woran es liegen könnte?
Das ist vermutlich ein Problem mit der Byte-Reihenfolge und/oder 
Little/Big-Endian. Wenn du die Zuordnung der Bytes und die Endianess 
umsortierst, passt es:
35FD 35FE 35FF 3500 3601 3602...

  FD 35 FE 35 FF 35 00 36 01 36 02 36...

FD35 FE35 FF35 0036 0136 0236...

35FD 35FE 35FF 3600 3601 3602...


BTW:
Meine VHDL-Dateien heißen *.vhdl mit Nachnamen.
Meine C-Dateien heißen *.c!
Warum heißen deine Dateien alle *.txt?

von Lassmiranda Densiwillja (Gast)


Lesenswert?

Hey,

hab die Dateien in einem Texteditor zwischengespeichert... Im Orgnial 
enden sie auch mit *.vhd bzw. *.cpp

Der Addierer sitzt vor dem DCFIFO (Mit unterschiedlichen Eingang und 
Ausgang Breiten)
Code für den Addierer ist jetzt untenstehend. Den Code zum FIFO hab ich 
via MegaWizard erstellen lassen und alles über Schematic miteinander 
"verbunden".

Hab einen 16 Bit Addierer im FPGA beschrieben, der alle 150ns um zwei 
inkrementiert.
1
entity S2P_Sync is
2
generic (width : natural := 16); 
3
port (main_clk : in std_logic; --Main_clk 100MHz
4
      wrreq : out std_logic;
5
      DCFIFO : out std_logic_vector (width-1 downto 0));
6
end S2P_Sync;
7
8
architecture behavirol of S2P_Sync is
9
type states is (idle, Data0, Data1);
10
signal FSM1 : states := idle;
11
signal intdb0: std_logic_vector (width-1 downto 0) := (others=>'0');
12
signal dummy : integer range 0 to 50 := 0;
13
14
begin
15
process begin
16
 wait until rising_edge(main_clk);
17
 dummy <= dummy + 1;
18
 if (dummy = 15) then
19
  dummy <= 0;
20
 end if;
21
end process;
22
23
24
25
process  begin
26
 wait until falling_edge(main_clk);
27
 case FSM1 is
28
  when idle => if (dummy=15) then
29
                FSM1 <= Data0;
30
                intdb0 <= intdb0 + '1'; 
31
               end if;
32
               wrreq <= '0';
33
  when Data0 => FSM1 <= Data1;
34
                intdb0 <= intdb0 + '1';
35
                DCFIFO <= intdb0;
36
                wrreq <= '1';
37
  when Data1 => FSM1 <= idle;
38
                DCFIFO <= intdb0;
39
                wrreq <= '1';
40
  when others => null;
41
 end case;
42
end process;

Bzgl deiner vermutung hatte ich auch schon die Idee, dass das Problem 
auf PC Seite ist da ich davor mit einem 8 Bit Addierer es versucht hatte 
und keinerlei Fehler hatte und als ich auf 16Bit umgestiegen bin kam das 
Problem...
Wenn ich im C++ Programm mir mittels Breakpoint die Werte anschaue, die 
in dem "RxBuffer" sind stimmt die Reihenfolge leider wie die Daten 
reinkommen und ausgegeben werden...

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


Lesenswert?

1
 wait until rising_edge(main_clk);
2
  :
3
 wait until falling_edge(main_clk);
Warum unterschiedliche Takte?

Dir ist klar, dass ich diese Zeilen:
1
  when Data0 => FSM1 <= Data1;
2
                intdb0 <= intdb0 + '1';
3
                DCFIFO <= intdb0;
4
                wrreq <= '1';
ohne jegliche funktionelle Änderung auch so schreiben kann:
1
  when Data0 => FSM1 <= Data1;
2
                DCFIFO <= intdb0;
3
                intdb0 <= intdb0 + '1';
4
                wrreq <= '1';
Kann das deinen FIFO durcheinanderbringen?
Immerhin wird da ja zwischen Data0 und Data1 unterschieden.

BTW: was sagt denn deine Testbench zu diesem Problem?

von Lassmiranda Densiwillja (Gast)


Lesenswert?

Die Daten werden bei dem DCFIFO auf steigende Flanke "übernommen" und 
damit die Daten "stabil" anliegen schreib ich sie auf fallende Flanke 
raus und auf steigende übernehm ich sie in den DCFIFO...

Wo genau liegt der unterschied in deiner Beschreibung von dem "state" zu 
meiner? Bzw. was für einen Vorteil hat deine?

Testbench sagt das es funktioniert...

Wenn ich im C-Code die Indexe (RxBuffer[p] RxBuffer[p+1]) zum Auslesen 
des Buffers ändere auf RxBuffer[p+1] und RxBuffer[p+2] ist das Problem 
mit der Zuordnung weg allerdings hab ich jetzt das Problem das 
zwischendrin ein Byte verloren geht und die Zuordnung nimmer stimmt und 
dann das MSB und LSB vertauscht sind...

von Lassmiranda Densiwillja (Gast)


Lesenswert?

Mir ist gerade noch aufgefallen beim lesen des Fehlerreports das immer 
nach ca. 2**16 Bytes der Datenverlust eintritt...

Ich habe die InTransferSize des FT2232H auf 2**16 eingestellt. Kann es 
sein, dass wenn der "InTransferBuffer" voll ist es zu einem Überlauf 
kommt und ich Daten verliere?

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


Lesenswert?

Lassmiranda Densiwillja schrieb:
> und ich Daten verliere?
Vermutlich genau 1 Byte...

von Lassmiranda Densiwillja (Gast)


Lesenswert?

Jain es ist unterschiedlich hab mal unten den "Fehlerreport" angehängt.

Fehler : 60b9    5fb9    1029
Fehler : 61b9    60b9    1030
Fehler : 62b9    61b9    1030
Fehler : 63b9    62b9    1030
Fehler : 64b9    63b9    1030
Fehler : 65b9    64b9    1030
Fehler : b966    65b9    1030
Fehler : b966    65b9    1030
Fehler : 3966    3964    2340
Fehler : b966    b964    3651
Fehler : 3966    3964    4962
Fehler : b966    b964    6272
Fehler : 3966    3964    7583
Fehler : b966    b964    8894
Fehler : 3966    3964    10204
Fehler : 0cd1    5ac6    10546
Fehler : 0cd3    0cd1    10546
Fehler : 6b71    6b6f    11515
Fehler : f96f    8c51    11852

Der erste Wert der steht ist der "neue Wert" der mittlere Wert ist der 
"alte Wert" und rechts steht die Zeile in der sich der Fehler befindet. 
Jede Zeile umfasst 25 Werte.

Bis Zeile 1030 hab ich die MSB-LSB vertauschung und dann verliere ich 
eine ungerade Anzahl an Bytes welche mir dann die MSB-LSB vertauschung 
wieder aufhebt...
Wenn ich das Programm erneut starte, kann es sein das am Anfang die MSB 
und LSB korrekt sind und dann zwischendrin eine ungerade anzahl verliere 
und dann MSB LSB vertauscht sind...

Was mich wundert hatte ja erst alles mit einem Bit Wert versucht und da 
hat es wunderbar funktioniert hatte einen 1 Stündigen Dauerlauf gemacht 
und null Fehler bekommen...

von Duke Scarring (Gast)


Lesenswert?

Lothar Miller schrieb:
> BTW:
> Meine VHDL-Dateien heißen *.vhdl mit Nachnamen.
> Meine C-Dateien heißen *.c!

Und Deine Freundinnen? Heißen die alle *.jpg mit Nachnamen?
SCNR

Duke

von Klaus (Gast)


Lesenswert?

Duke Scarring schrieb:
> Und Deine Freundinnen? Heißen die alle *.jpg mit Nachnamen?
> SCNR

Na jedenfalls heißen die nicht *.txt! ;-)

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


Lesenswert?

Duke Scarring schrieb:
> Und Deine Freundinnen? Heißen die alle *.jpg mit Nachnamen?
Nur die Hübschen...  ;-)

von tim (Gast)


Lesenswert?

Lassmiranda Densiwillja schrieb:
> Die Daten werden bei dem DCFIFO auf steigende Flanke "übernommen" und
> damit die Daten "stabil" anliegen schreib ich sie auf fallende Flanke
> raus und auf steigende übernehm ich sie in den DCFIFO...

Macht für mich nicht viel Sinn, ich würde beides auf die steigende 
Flanke machen.

von Lassmiranda Densiwillja (Gast)


Angehängte Dateien:

Lesenswert?

@ tim

Die von Altera machen es so im Userguide und hab mich an den Userguide 
gehalten.

Hab dir das Diagramm mal angehängt.

Unter folgendem Link ist der Userguide: 
http://www.altera.com/literature/ug/ug_fifo.pdf

Den Addierer hab ich inzwischen auf fallende Flanke abgeändert...

von tim (Gast)


Lesenswert?

Hallo Lassmiranda
Du hast Recht im Userguide haben es die Jungs von Altera wirklich so 
gezeichnet. Ich habe es trotzdem noch nie so gemacht, bin allerdings 
auch noch am lernen;). Zeigt die Quartus "Critical Warnings" an? Hast du 
mal mit Signal-Tab eine Aufnahme gemacht um zu kontrollieren ob dein 
Handling OK ist wenn der FTDI-Buffer voll ist?

von Christian R. (supachris)


Lesenswert?

Vielleicht hast du ein Problem mit den knackigen Setup-Zeiten die der 
FT2232H verlangt. Schau mal ins Datenblatt, Seite 28, die Tabelle. TXE# 
braucht im Worst Case 7,15ns zum Aktivieren nach dem CLK, WR# will aber 
mindestens 8ns vor der nächsten Flanke gesetzt sein. Bei den 60MHz CLK 
hast du dann im Worst Case gerade mal 1,52ns Zeit für die 
kombinatorische Verknüpfung im FPGA....das könnte zu Datenverlust 
führen.

von Bronco (Gast)


Lesenswert?

Christian R. schrieb:
> Vielleicht hast du ein Problem mit den knackigen Setup-Zeiten die der
> FT2232H verlangt.

In dem Fall würde es auf jeden Fall helfen, entsprechende 
Timing-Constrains anzulegen.
Dann erkennt der Build, ob er es hinbekommt, bzw. weiß überhaupt erst, 
worauf er hinarbeiten muß

von Lassmiranda Densiwillja (Gast)


Lesenswert?

Morgen,

hatte/hab auch dir Vermutung das es mit den Contraints zusammenhängt. 
Allerdings was dagegen spricht ist halt, das es zuvor bei einem 8Bit 
Addierer einwandfrei funktioniert hatte... Hatte keinerlei Datenverlust 
bei einem 16 stündigen Dauerlauf...
Was habt ihr gemacht damit ihr das Timing einhaltet? Arbeitet ihr mit 
einer PLL die das 60MHz Signal um 90/270° verschiebt?

von Christian R. (supachris)


Lesenswert?

Ich arbeite gar nicht mit dem FTDI. Aber selbst wenn es knapp wird, 
sollte es zu keinem Datenverlust kommen, solange du sicherstellst, dass 
du das Auslesen des FIFOs rechtzeitig nach High des TXE# stoppen kannst. 
Im Notfall wird dann das letzte Wort doppelt in den FIFO des FTDI 
geschrieben, was aber nichts machen sollte, da der ja eh voll ist, und 
das Wort dann im Nirvana landen sollte. Aber genau kann ich das auch 
nicht sagen, das Problem hatten aber schon ab und zu welche hier im 
Forum.
ich verwende den FX2 und FX3 von Cypress, die sind da flexibler, auch 
weil man den Interface Takt von außen vorgeben kann.

von tim (Gast)


Lesenswert?

Falls du Zweifel an deinem FTDI Core hast, kannst du es mal mit diesem 
probieren:
http://opencores.org/project,ft2232hcore

von Bronco (Gast)


Lesenswert?

Lassmiranda Densiwillja schrieb:
> Was habt ihr gemacht damit ihr das Timing einhaltet?

Ich meinte, Du solltest die Setup/Hold-Zeiten aus dem Datenblatt des 
FTDI in entsprechende Timing-Constraints für Deine FPGA-I/O-Pins 
umsetzen.
Dann weiß der Build, wann die Signale gültig/stabil sein müssen.

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.