Forum: FPGA, VHDL & Co. Datenübernahme in einen von 4 Buffer


von Sebastian (Gast)


Lesenswert?

Ich bin noch nicht ganz so fest in VHDL und habe deshalb mal eine Frage, 
auf die vielleicht jemand eine Lösung hat.

Ich habe versucht eine SPI-Interface auf dem FPGA zu implemendtieren. 
Dies funktioniert soweit auch schon ganz gut.

Ich übertrage immer 12 Bit davon sind Bit 0 bis Bit 9 (also 10 Bits) die 
Daten. Die beiden obersten Bits (MSB und MSB - 1) Sind Status Bits.

Wenn ich die 12 Bits an den FPGA übertragen habe dann sollen die 
Datenbits von den SPI_DATA_BUFFER in einen anderen Register bestehen aus 
Flip Flops kopiert werden. Es gibt insgesamt 4 Register die alle 10 Bit 
groß sind. Anhand der Statusbits soll nun entschieden werden in welches 
der 4 Register die Daten geschrieben (gespeichert werden)

Ich habe es wie folgt gelöst jedoch die der Code etwas komisch aus daher 
meine Frage ob es eine bessere Möglichkeit gibt.

process (SPI_CLK)
begin
  if(SPI_CLK'event and SPI_CLK = '1')then
      elsif(S_SPI_DATA_TRANSFER_READY = '1' and S_SPI_DATA_BUFFER(11 
downto 10) = "00")then
      TRIGGER_DELAY <= S_SPI_DATA_BUFFER(9 downto 0);

    elsif(S_SPI_DATA_TRANSFER_READY = '1' and S_SPI_DATA_BUFFER(11 
downto 10) = "01")then
      PIXEL_COUNTER <= S_SPI_DATA_BUFFER(9 downto 0);
    end if;
   end if;
end process;


ACHTUNG Ich habe das jetzt mal nur für 2 Register gemacht.

von PittyJ (Gast)


Lesenswert?

Es gibt da immer 1000 Möglichkeiten.

Ich würde da noch eine zusätzliche IF-Ebenen, und danach einen Case 
nehmen. Etwa in der Art:
  if(SPI_CLK'event and SPI_CLK = '1')then

    if(S_SPI_DATA_TRANSFER_READY = '1') then

       case S_SPI_DATA_BUFFER(11 downto 10) is
       when "00" =>
          TRIGGER_DELAY <= S_SPI_DATA_BUFFER(9 downto 0);
       when "01" =>
          --- und so weiter
       end case;

    end if;

  end if;


Aber jeder macht das wohl etwas anders.

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


Lesenswert?

Sebastian schrieb:
> Wenn ich die 12 Bits an den FPGA übertragen habe dann sollen die
> Datenbits von den SPI_DATA_BUFFER in einen anderen Register bestehen aus
> Flip Flops kopiert werden.
Ja, das ist nun eben ungünstig, weil für die Frame-Synchronisation bei 
SPI üblicherweise der SlaveSelect verwendet wird. Mit dessen Flanke sind 
die Daten übertragen und gültig. Denn bei deiner "Bitzählmethode" hast 
du sofort ein Problem, wenn auf der Taktleitung mal ein Spike ist. Ab 
diesem Zeitpunkt bis zur nächsten Synchronisationsmöglichkeit (wenn es 
eine gibt) sind Sender und Empfänger asynchron...

> Wenn ich die 12 Bits an den FPGA übertragen habe dann sollen die
> Datenbits von den SPI_DATA_BUFFER in einen anderen Register bestehen aus
> Flip Flops kopiert werden.
Wenn du die Bits übertragen hast, deaktivierst du den SlaveSelect und 
kannst die Daten übernehmen. Ich mache das im CPLD so:
http://www.lothar-miller.de/s9y/categories/26-SPI-Slave
Im FPGA übertrage ich die Daten mit dem SCLK, synchronisiere dann aber 
den SS auf den FPGA-Takt, mache dort die "übliche" Flankenerkennung und 
habe so die Daten korrekt in die andere Taktdomäne übernommen...

von Sebastian (Gast)


Lesenswert?

Hallo Lothar,

die Daten habe ich auch mit einem Schieberegister empfangen.

Meine Lösung war jedoch über einen zusätzlichen Zähler. Der zählte dann 
bis 12 und hat anschließend das FLag S_SPI_DATA_TRANSFER_READY gesetzt. 
Dann habe ich die Daten übernommen.

Das man das CS-Signal auch als Clock benutzen kann ist natürlich ein 
deutlich elegantere Lösung. Jedoch habe ich die CS Leitung bei meinem 
FPGA auf keinen Clock Pin gelegt. Macht dies etwas aus oder ist es dem 
FPGA egal?



Ich dachte immer bei der Caser Lösung entsteht ein Multiplexer und da 
ich nicht mehrere Eingänge habe sondern mehrere Ausgänge habe ich die 
obige Quellcode Variante gewählt.

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


Lesenswert?

Sebastian schrieb:
> Das man das CS-Signal auch als Clock benutzen kann ist natürlich ein
> deutlich elegantere Lösung.
Du hast den 2. Abschnitt meines Posts nicht gelesen? Und die Anmerkung:
>>> Ich mache das im CPLD so

> Jedoch habe ich die CS Leitung bei meinem FPGA auf keinen Clock Pin
> gelegt. Macht dies etwas aus oder ist es dem FPGA egal?
Der SS wird auf einem FPGA nicht als Takt verwendet. Er wird 
einsynchronisiert und die steigende Flanke mit einer klassischen 
Flankenerkennung detektiert. Wenn dieser Flanke erkannt wurde, wird das 
vorher mit SCLK eingetaktete Wort in die FPGA-Taktdomäne übernommen.

> Ich dachte immer bei der Caser Lösung entsteht ein Multiplexer
???

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.