Forum: FPGA, VHDL & Co. Hilfe bei FPGA,unerklärliche Verzögerung


von Andreas D (Gast)


Lesenswert?

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

von PittyJ (Gast)


Lesenswert?

Ich kann im Code keinen Fehler erkennen.

von Naja (Gast)


Lesenswert?

Bin mal gespannt, ob Du mit der lückenhaften Beschreibung, hilfe 
bekommen kannst.

von Andreas D (Gast)


Lesenswert?

Sorry,dachte den Code hab ich eig angehängt...reich ich gleich nach

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


Lesenswert?

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?

von Schlumpf (Gast)


Lesenswert?

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?)

von Andreas D (Gast)


Lesenswert?

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!

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


Lesenswert?

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...  :-/

von jochen (Gast)


Lesenswert?

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.

von Schlumpf (Gast)


Lesenswert?

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) ?

von franke (Gast)


Lesenswert?

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ß

von Bronco (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.