Hallo Leute,
Ich habe ein Problem und komm einfach nicht weiter.
Ich benutze ein gekauftes FPGA Board (Trentz eletronic TE0300-01BM) auf
dem ein Spartan 3E und der geläufige Cypress FX2 USB2.0
CY7C68013A-56LFXC drauf sind.
Was ich mach will ist vom FPGA aus alle 50µs ein Datenpaket an den FX2
schicken zu lassen und diese dann am PC zu loggen. Ich benutze ein
fertiges VHDL-Modul zur Anbindung des FX2. In der Simulation
funktioniert das Senden der Daten einwandfrei. Ebenfalls wenn ich mir
die Signale im Chipscope ansehe.
Da das natürlich für einen Anwender nicht sonderlich komfortabel ist,
habe ich ein C++ Programm geschrieben, welches die Daten vom FX2 in
500Byte großen Paketen abholt und in eine Datei schreibt.
Und jetzt kommt mein eigentliches Problem:
Der Datentransfer mit dem C++ Programm funktioniert einwandfrei, wenn
ich Chipscope nebenbei triggern lasse. Bsp nach jedem Paket. Das
funktioniert auch mehrmals hintereinander.
Jedoch funktioniert der Datentransfer nie, wenn ich Chipscope nicht
triggern lasse oder die Chipscope-Blöcke garnicht erst mit
synthetisiere. Das ist doch verrückt?!
Kennt jemand solch ein Verhalten und weis am besten noch was man dagegen
tun kann? Gerne gebe ich auch weitere Informationen oder Quelltext
weiter.
Grüße GH
alle Timing constraints sind erfüllt!
ich frag mich halt, wie die beeinflussung zustande kommt?
bis auf das benötigte control signal sind am chipscope_core keine
ausgänge vorhanden, die irgendwas beeinflussen könnten
ist das komisch gebaut? die trigger eingänge sind ja immer vom typ
std_logic_vector auch wenn nur 1 bit beobachtet werden soll
Sowas kann eigentlich nur passieren, wenn das Timing so knapp ist, dass
das Hinzufügen/Entfernen einer Komponente was durcheinanderbringt. Schau
nochmal genau die FX2 Timings an, der ist da ziemlich anspruchsvoll. Mit
welcher Frequenz lässt du denn den IFCLK laufen? Läuft denn die
Simulation ohne ChipScope?
Otto Normalverbraucher schrieb:> alle Timing constraints sind erfüllt!
Welche Constraints sind denn gesetzt? Reichen die aus? Das Fehlerbild
weisst stark auf Timingprobleme hin, in dieser Richtung würde ich weiter
suchen, gucken, ob alle Pfade mit Constraints abgedeckt sind usw. Wenn
sich ISE die Timings selber suchen muss, kann er sie auch erfüllen ohne
das was sinnvolles rauskommt.
Ohoh, 48MHz, ich habs fast vermutet. Bei 48 MHz ist das Timing kaum zu
schaffen, vor allem, was die Flags angeht, wenn man im selben Takt noch
reagieren und ggf. das Schreiben/Lesen stoppen muss. Da sind Setup- plus
Delay größer als die 20,83ns. Wir haben den FX2 mit 48MHz nicht stabil
zum Laufen bekommen. Nutzen daher einen externen IFCLK von 25MHz. Damit
ist man im 16 Bit Modus immer noch um einiges schneller als der die
Daten per USB wegschaufeln kann.
danke für den tip
hab jetzt usb_clk auf 24 MHz runtergesetzt und die Systemclock ebenfalls
(auf 50 MHz), leider ändert, dass nichts an dem skurrilen Einfluss von
Chipscope :-/
Otto Normalverbraucher schrieb:> Net USB_IFCLK_pin TNM_Net = USB_IFCLK_pin;> TIMESPEC TS_USB_IFCLK_pin = PERIOD USB_IFCLK_pin 20833 ps;>> mehr timing contraints habe ich nicht gesetzt>> usb_ifclk: 48 Mhz> sys_clk: 100 Mhz
Kein Constraint für sys_clk?
Manchmal liegt der Fehler ganz wo anders. Wir haben auch mal ewig im
Design gesucht, welches sporadisch einen externen FIFO nicht korrekt
ausgelesen hatte. Mit ChipScope gings auch, aber ohne nicht. Grund war,
dass der FIFO nach dem Power Up nochmal explizit ein Reset auf der
TRST-Leitung oder einen TAP-Reset über JTAG haben möchte (IDT). Durch
die ChipScope Verbindung hat der den JTAG-Reset korrekt bekommen, und
dann liefs. Hat aber eine Weile gebraucht, bis wir die Fußnote im
Datenblatt des FIFO gefunden und uns das rekonstruieren konnten.
ich wollte den thread nochmal hochholen und vermelden, dass es zum teil
an den einhaltungen der contraints lag, was ich jetzt zum teil
erfolgreich beheben konnte, hierzu habe ich nochmal eine frage
contraints mit AFTER, wie bspw.:
NET "USB_SLWR_pin" OFFSET = OUT 9 ns AFTER "USB_IFCLK_pin" RISING;
habe ich über ein flipflop realisiert um das signal "auszuclocken" (sagt
man das so?)
1
process(USB_IFCLK_pin)
2
begin
3
if(USB_IFCLK_pin'eventandUSB_IFCLK_pin='1')then
4
USB_SLWR_pin<=USB_SLWR;
5
endif;
6
endprocess;
wie mache ich das aber mit BEFORE ? für bspw.:
NET "USB_FLAGB_pin" OFFSET = IN 10 ns BEFORE "USB_IFCLK_pin" RISING;
wie funktioniert, dass mit dem "einclocken"?
so geht es jedenfalls nicht, da sich bereits in der behavioral
simulation ein fehlverhalten ergibt