Hallo,
Ich bin noch relativ neu im Thema FPGA, und bin nun auf einen
Fehler gestoßen, den ich einfach nicht lösen kann und hoffe deshalb dass
mir hier geholfen wird ;)
Folgendes Szenario:
Ich habe 2 Boards,jeweils mit Morph-IC II bestückt,
Ich sende von einem Board (läuft mit 10 MHz-Clock) über einen Pin per
Kabel ans zweite Board (läuft mit 100Mhz-Clock),das ganze soll den
Chip-Select einer SPI darstellen.
Habe jeweils auf beiden Boards alles was ich sende/empfange noch an
jeweils einen 2.Pin rausgeführt um Messen zu können. Wenn ich mir jetzt
den Signalverlauf anschau,sendet er vom ersten Board alles raus wie es
sein soll,beim zweiten Board kommt auch alles an wie es sein soll
(Clock,MISO,MOSI) nur die Chip-Select Leitung ist um ganze 5,6µs
verzögert.
Heisst ich ziehe CSN auf low auf Board1(liegt auch am Ausgang an!,schon
gemessen)...5,6µs später...CSN low auf Board2...ziehe CSN auf High auf
Board1...hier wird der Wechsel sofort erkannt...nur immer am Anfang
jeder Message tritt die Verzögerung ein.
Dadurch verliere ich immer die ersten 5 Bits einer Message.
Normal müsste das zweite Board,dass ja viel schneller läuft,sofort
erkennen wenn sich der Chip-Select ändert.
Habe jetzt mal wirklich alles auskommentiert,bis auf den Code dass den
Chip-Select setzt,bzw am 2. Board aufnimmt und ausgibt,selbes Phänomen
Vielleicht könnt ihr mir ja helfen,
Vielen Dank schonmal!!!
MfG
Andreas
Andreas D schrieb:> Wenn ich mir jetzt den Signalverlauf anschau,sendet er vom ersten> Board alles raus wie es sein soll,beim zweiten Board kommt auch alles> an wie es sein soll (Clock,MISO,MOSI) nur die Chip-Select Leitung ist> um ganze 5,6µs verzögert.
Und dazwischen ist nur die Kupferleitung, oder wie muss man sich das
vorstellen? Kannst du da mal eine Skizze malen?
> ...nur immer am Anfang jeder Message tritt die Verzögerung ein.
Ist da irgendwo ein Optokoppler in der Signalkette?
Ich kenne dieses Board nicht, aber kann es vielleicht sein, dass dein
Empfängerboard zum fraglichen Zeitpunkt seine Konfiguration noch gar
nicht vollständig geladen hat und der Sender schon fleißig sendet?
Oder hast du die Verzögerung tatsächlich direkt auf dem Kupfer gemessen
(vermutlich nicht, oder?)
Die beiden Boards sind einfach mit einem Kabel verbunden,nichts
dazwischen,
und der Fehler tritt am Anfang jeder Message auf.
Interessant ist State 3,hab ich im Code dazugeschrieben
Board1: Läuft mit 10Mhz,in der State-Machine wird eine 1Mhz-Clock
generiert und aus den vorbelegten spi_mosi/spi_miso-arrays Daten
gesendet,ChipSelect und Clock sind mit 1 initialisiert.
Funktioniert eig alles gut,nur dass ich durch den verzögerten CSN immer
die
ersten 5 Bits verliere. Diese Verzögerung kann ich mir nicht erklären,da
CLK,MISO,MOSI auch wie gewünscht ankommen,nur CSN nicht.
1
2
3
send:PROCESS(clk_main)
4
BEGIN
5
IFrising_edge(clk_main)THEN
6
CASEstateIS
7
WHEN0=>
8
spi_csn<='0';--Chip-Select low
9
debug4<='0';--Debug-Pin(s)
10
state<=state+1;
11
WHEN1=>
12
state<=state+1;
13
WHEN2=>
14
state<=state+1;
15
WHEN3=>
16
-- Daten anlegen, durch Testen hab ich rausgefunden,dass der ChipSelect
17
-- wie gewollt kommt,wenn ich die folgenden 4 Zeilen weglasse
18
spi_mosi_bit<=spi_mosi(spi_bit_index);--Bitindex
19
debug6<=spi_mosi(spi_bit_index);
20
spi_miso_bit<=spi_miso(spi_bit_index);
21
debug7<=spi_miso(spi_bit_index);
22
state<=state+1;
23
WHEN4=>
24
spi_clk<='0';-- Clock-Generierung
25
debug5<='0';
26
state<=state+1;
27
WHEN5=>
28
state<=state+1;
29
WHEN6=>
30
state<=state+1;
31
WHEN7=>
32
state<=state+1;
33
WHEN8=>
34
state<=state+1;
35
WHEN9=>
36
spi_clk<='1';-- Clock-Generierung
37
debug5<='1';
38
IFspi_bit_index=0THEN-- Alle Bits gesendet,CSN high
39
spi_csn<='1';
40
debug4<='1';
41
counter<=counter+1;
42
43
-- Durch folgende IF soll Intermessage-Time von 10µs erzeugt werden
44
-- Hier sollte kein Fehler liegen,da es ohne die IF auch nicht geht
45
46
IFcounter=100THEN
47
spi_bit_index<=spi_bits-1;-- Reset des Index auf 31
48
counter<=0;
49
state<=0;-- Sprung zum ersten State
50
ENDIF;
51
52
ELSE
53
spi_bit_index<=spi_bit_index-1;--Bit runterzählen
54
state<=0;-- Sprung zum ersten State
55
ENDIF;
56
57
ENDCASE;
58
ENDPROCESS;
Board2: Ganz einfach,soll einfach nur zu Debug-Zwecken das empfangene
ausgeben,damit ichs am LogicAnalyzer seh. Alles habe ich mal nicht
mitgenommen,da es mit diesem einfachen Code-Schnipsel auch schon nicht
geht.
1
capture:PROCESS(clk_main)
2
BEGIN
3
4
IFrising_edge(clk_main)THEN
5
debug(0)<=spi_csn;
6
debug(1)<=spi_clk;
7
debug(2)<=spi_mosi_bit;
8
debug(3)<=spi_miso_bit;
9
ENDIF;
10
ENDPROCESS;
Falls nötig kann ich auch noch den Signalverlauf posten,aber leider erst
heut Abend!
Andreas D schrieb:> Die beiden Boards sind einfach mit einem Kabel verbunden,nichts> dazwischen,
Ja, und WAS hast du denn nun WO an WELCHER Hardware gemessen?
Und WAS ist zwischen diesen Messpunkten?
Lies einfach mal deine Fragestellung so, als ob du nichts von deinem
Aufbau wüsstest. So geht es allen Anderen... :-/
Um eine Fehlerquelle mehr zu eliminieren könntest du ja die Zuweisungen
debug(0) <= spi_csn;
debug(1) <= spi_clk;
debug(2) <= spi_mosi_bit;
debug(3) <= spi_miso_bit;
ausserhalb des Prozesses (also ohne clk) machen.
Lothar Miller schrieb:> Ja, und WAS hast du denn nun WO an WELCHER Hardware gemessen?> Und WAS ist zwischen diesen Messpunkten?
Genau das ist hier keinem klar!
Misst du beim Sender mit dem Oszi auf der physikalischen Leitung CS, die
von deinem Board zum Empfänger geht?
Und beim Empfänger? Misst du da direkt auf der Leitung, oder auf dem
FPGA-Pin debug(0) ?
spi_miso_bit <= spi_miso(spi_bit_index);
spi_mosi_bit <= spi_mosi(spi_bit_index);
???
Nur eins von beiden kann stimmen, oder?
den eins muss ein Eingang und das andere ein Ausgang sein.
Gruß
Andreas D schrieb:> Heisst ich ziehe CSN auf low auf Board1(liegt auch am Ausgang an!,schon> gemessen)...5,6µs später...CSN low auf Board2...ziehe CSN auf High auf
Sind tatsächlich die Signale an den Hardware-Pins verzögert (mit Oszi
gemessen)?
Oder kannst Du sicher nachvollziehen (und wenn ja: wie?), daß der
Eingangspin auf Board2 low geht und Deine Logik dies erst 5,6µs später
erkennt?