Forum: FPGA, VHDL & Co. Zweck des Zwischenregisters in Lattice SPI Reference Design unklar


von noips (Gast)


Lesenswert?

Hallo an alle,

ich benutze ein SPI-Modul von den Lattice Reference Designes. Da ist mir 
eine Sache unklar. Die SPI-Daten werden über Vektor DATA_IN ans Modul 
übergeben und vom Modul dann an MOSI rausgeschoben. Aber sie gelangen 
nicht direkt in das Schieberegister reg_txdata, sondern werden zuerst in 
einem weiteren Register latch_s_data zwischengespeichert. Was ist der 
Zweck des Ganzen?
1
  PROCESS(CLK_I,RST_I)
2
     BEGIN
3
         IF (RST_I = '0') THEN
4
           latch_s_data <= X"0000";--AFTER to_time(UDLY);
5
         ELSIF(CLK_I'EVENT AND CLK_I = '1') THEN
6
           latch_s_data <= DATA_IN;-- AFTER to_time(UDLY);
7
        END IF;
8
     END PROCESS;

und dann
1
     PROCESS(CLK_I,RST_I)
2
     BEGIN
3
         IF (RST_I = '0') THEN
4
             reg_txdata <= (OTHERS => '0');
5
         ELSIF(CLK_I'EVENT AND CLK_I = '1')Then
6
        if ((reg_wr and reg_trdy) = '1') then
7
              reg_txdata <= latch_s_data;-- AFTER to_time(UDLY);
8
             END IF;
9
        END IF;
10
     END PROCESS;

Warum werden die Daten von DATA_IN nicht direkt in reg_txdata 
geschrieben?
Ich will das Design jetzt so erweitern, dass die Adresse des 
anzusprechenden SPI-Slave auch in einem Vektor (3 Bit breit) eingelesen 
wird und dann entsprechen die Slave Select Leitungen gesetzt werden. Und 
dabei frage ich mich, ob ich diese Adresse auch über so ein 
Zwischenregister einlesen soll.

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


Lesenswert?

noips schrieb:
> Aber sie gelangen nicht direkt in das Schieberegister reg_txdata,
> sondern werden zuerst in einem weiteren Register latch_s_data
> zwischengespeichert. Was ist der Zweck des Ganzen?
Das nennt sich "Double Buffering" Du kannst dadurch das nächste zu 
sendende Datum schon in das vorgelagerte Senderegister schreiben, auch 
wenn noch einen Übertragung via reg_txdata im Gange ist. Erst nachdem 
die Übertragung beendet ist, werden die gepufferten Daten ins reg_txdata 
übernommen.
M.E. ist diese Geschichte auf Hardwareebene unsinnig, denn du kannst dir 
dieses Zwischenregister ohne jegliche Probleme bei Bedarf selber 
erzeugen. In einem uC ist so ein "Schattenregister" aber schon sinnvoll, 
damit kontinuierlich Daten gesendet werden können, weil die Software 
u.U. nicht so schnell neue Daten ins TX-Register schreiben kann.

von noips (Gast)


Lesenswert?

Besten Dank für die Antwort!

> M.E. ist diese Geschichte auf Hardwareebene unsinnig, denn du kannst dir
> dieses Zwischenregister ohne jegliche Probleme bei Bedarf selber
> erzeugen.

Ich dachte mir auch, ich könnte diese Zwischenspeicherung aus dem Code 
entfernen, da ich bei meiner Anwendung keine Bedeutung sehe. Aber ich 
dachte, bevor ich das mache, muss ich wissen aus welchem Grund man so 
etwas überhaupt reinbaut.

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.