Forum: FPGA, VHDL & Co. sorry nochma ne Frage zur Datenübernahme SPI/Schieberegister


von Steve (Gast)


Angehängte Dateien:

Lesenswert?

Hallo diese Frage geht an alle aber besonders auch an Lothar, weil ich 
ein Stück seiner Codepassage noch nicht ganz verstehe.

Ich versuche gerade eine SPI Slave in meinem FPGA zu implementieren, 
aber leider klappt es noch nicht so ganz. Ich hab mich bei meinem Code 
ziemlich an Falk Brunners Code orientiert.

Ich hab  dann nur einen Prozess in eine State Machine verändert, da ich 
für mein weiteres Programm noch ein Rxrdy usw. benötige.

Ich hab Verstanden, dass ich die Datenausgabe synchronisieren muss, 
jedoch verstehe ich nicht ganz wie dieser Codeabschnitt funktioniert:

SS_sr   <= SS_sr(0) & SS;      -- Slave-Select

if (SS_sr="10") then           -- fallende Flanke

Ich hab Ihn in einem anderen SPI Forumeintrag gefunden und Lothar hat 
ihn geposted. Ich versteh nicht, wie das als ein Schieberegister 
funktionieren soll. Ich dachte das SS wird immer nur auf das zweite Bit 
vom SS_sr geschrieben, also wie kann da jemals die Kombination 
SS_sr="10" zustandekommen?

Da mein SPI Master das SS bei Selektion des Slaves von 0 auf 1 geht und 
bei Deselektion von 1 auf 0 musste ich im Gegensatz zu Falks Code auf 
eine fallende Flanke schauen, um eine Synchronisation zu bewirken.

Vielleicht kannst Du mir ja nochmal helfen Lothar....wäre echt super.
Andere Kommentare sind nat. auch erwünscht.


mfg

Steve

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


Lesenswert?

1
SS_sr   <= SS_sr(0) & SS;
Hier wird über den concatenation-Operator & ein 2 Bit breiter Vektor aus 
dem "alten" SS_sr Bit 0 und dem "neuen" SS im SS_sr zusammengesetzt.
1
if (SS_sr="10") then ...
Und wenn der alte Wert "1" ist und der neue Wert "0", dann ist das SS_sr 
"10" und damit wird eine fallende Flanke erkannt.

von Iulius (Gast)


Lesenswert?

mal ein Beispiel...

zu Beginn sei SS_sr = "00"

nun nehmen wir an SS wäre '1'.

Daraus ergibt sich : SS_sr   <= '0' & '1';
also SS_sr <= "01"

Die Null kommt in dem Fall von der "rechtesten" Stelle, also Position 0 
-> ganz recht im Bitstring von SS_sr.

im nächsten Takt mit SS = '0' dann entsprechend :

SS_sr   <= '1' & '0';
also SS_sr <= "01"

die '1' diesmal, weil vor der Operation ganz rechts eine 1 in SS_sr 
stand und diese nun ganz ganz links hin rutscht und an die rechte 
Position wieder SS wandert.

von Steve (Gast)


Lesenswert?

Ahh endlich hab ichs kapiert :)...Gott sei Dank....trotzdem kann es 
sein, dass Du Dich bei Deinem 2. Beispiel verschrieben hast?

müsste statt dem hier:

SS_sr   <= '1' & '0';
also SS_sr <= "01"

nicht

SS_sr   <= '1' & '0';
also SS_sr <= "10"

rauskommen?

mfg

Steve

von Iulius (Gast)


Lesenswert?

Gut aufgepasst, da hat copy und paste wohl zugeschlagen.

Na jedenfalls ist jetzt klar das du es verstanden hast und das war ja 
die Hauptsache :)

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.