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
Bin mal gespannt, ob Du mit der lückenhaften Beschreibung, hilfe bekommen kannst.
Sorry,dachte den Code hab ich eig angehängt...reich ich gleich nach
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 | IF rising_edge(clk_main) THEN |
6 | CASE state IS |
7 | WHEN 0 => |
8 | spi_csn <= '0'; --Chip-Select low |
9 | debug4 <= '0'; --Debug-Pin(s) |
10 | state <= state + 1; |
11 | WHEN 1 => |
12 | state <= state + 1; |
13 | WHEN 2 => |
14 | state <= state + 1; |
15 | WHEN 3 => |
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 | WHEN 4 => |
24 | spi_clk <= '0'; -- Clock-Generierung |
25 | debug5 <= '0'; |
26 | state <= state + 1; |
27 | WHEN 5 => |
28 | state <= state + 1; |
29 | WHEN 6 => |
30 | state <= state + 1; |
31 | WHEN 7 => |
32 | state <= state + 1; |
33 | WHEN 8 => |
34 | state <= state + 1; |
35 | WHEN 9 => |
36 | spi_clk <= '1'; -- Clock-Generierung |
37 | debug5 <= '1'; |
38 | IF spi_bit_index = 0 THEN -- 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 | IF counter = 100 THEN |
47 | spi_bit_index <= spi_bits - 1; -- Reset des Index auf 31 |
48 | counter <= 0; |
49 | state <= 0; -- Sprung zum ersten State |
50 | END IF; |
51 | |
52 | ELSE
|
53 | spi_bit_index <= spi_bit_index - 1; --Bit runterzählen |
54 | state <= 0; -- Sprung zum ersten State |
55 | END IF; |
56 | |
57 | END CASE; |
58 | END PROCESS; |
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 | IF rising_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 | END IF; |
10 | END PROCESS; |
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?
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.