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