Forum: FPGA, VHDL & Co. Master zu Master Kommunikation SPI


von Abud D. (kalko)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

eigentlich wollte ich mal "schnell" eine kommunikation zwischen zwei 
controller mit jeweils einen SPI-Master Interface (besitzen kein 
SPI-Slave) in VHDL realisieren. Was leider irgendwie doch nicht so 
leicht ist. Arbeite mit dem EFM01 Board von Cesys mit einem SPARTAN-3E 
XC3S500E FPGA.

Ich Schiebe die Daten des ersten Master in das Register RX_reg. Bei der 
steigenden Flanke von CS kopiere ich den RX_reg zum TX_reg und setze ein 
data avail signal womit der zweite Master die Daten vom TX_reg ausliest. 
Und da liegt das Problem. Manchmal kommen die Daten am MISO pin richtig 
raus ansonsten nur Müll. Habe versucht den TX_reg direkt mit einen wert 
zu beschreiben, trotzdem kommt meistens nur Müll raus. Könnt ihr euch 
mal den Code bitte Anschauen, vielleicht fällt euch was auf.

Noch eine andere Frage. Ist es überhaupt sinvoll 272 Bits als register 
zu verwenden oder ist es besser den BlockRam zu verwenden. Eigentlich 
wollte ich es nich kompliziert machen.

Danke schonmal im voraus!!!

von Tilo (Gast)


Lesenswert?

Auch wenn ich noch nicht so viel mit VHDL gemacht habe, hört es sich für 
mich so an, dass die Probleme durch die unterschiedlichen Clock Domains 
verursacht wird.
Als Lösung wird oft ein asynchrones FIFO empfohlen.

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


Lesenswert?

1
    vChipSel_M0   := 'U';
2
    vChipSel_M1   := 'U';
Sowas ist auf realer Hardware mit Verlaub Blödsinn. Woher soll denn da 
ein U kommen? Wie soll sich das elektrisch von einer 1 oder 0 
unterscheiden? Aber: Glück gehabt: der Synthesizer ignoriert solche 
Konstrukte und gibt bestenfalls eine gut gemeinte Info aus...

1
variable vSCL_M0    : STD_ULOGIC := 'U';
2
variable vSCL_M1    : STD_ULOGIC := 'U';
Das ist unnötig, weil VHDL das sowieso tut: ein nicht initialisiertes 
Signal (Variable) nimmt automatisch den 'left Wert an. Und bei std_logic 
ist 'left = 'U'.


Abed D. schrieb:
> Ist es überhaupt sinvoll 272 Bits als register zu verwenden
Wenn du Platz hast...
> oder ist es besser den BlockRam zu verwenden.
Eigentlich nicht, denn dann vergeudest du den ganzen Block für die paar 
Bits...
> Eigentlich wollte ich es nich kompliziert machen.
Du hast schon einen komplizierten Ansatz und den dann auch noch 
kompliziert aufgebaut... :-o

Und der Hauptfehler in deinem Design ist, aus einem Single Master Bus 
(das ist SPI nämlich) einen Multi Master Bus zu machen. Wozu brauchst du 
überhaupt 2 Master? Bei SPI wird IMMER gleichzeitig gesendet UND 
empfangen. Wenn dann also der Slave an den Master was zu übertragen 
hätte, dann muß er nur eine zusätzliche Leitung als 
Übertragungsanforderung setzen, und daraufhin beginnt der Master eine 
Übertragung.

BTW: warum std_Ulogic und nicht std_logic?
BTW2: warum die vielen Variablen?
Lies mal den Beitrag "Variable vs Signal"

Tilo Lutz schrieb:
> Auch wenn ich noch nicht so viel mit VHDL gemacht habe, hört es sich für
> mich so an, dass die Probleme durch die unterschiedlichen Clock Domains
> verursacht wird.
Das ist auch hier der Fall:
1
if SCL_M0 = '1' and vSCL_M0 = '0' then
Da wird direkt auf dem asynchronen Eingangspin gelesen.
Und dann passiert z.B. sowas:
http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren
Und daraus resultierend das:
http://www.lothar-miller.de/s9y/archives/64-State-Machine-mit-asynchronem-Eingang.html

> Als Lösung wird oft ein asynchrones FIFO empfohlen.
Als Lösung empfehle ich ein geeignetes Konzept. HIER wird ein Fifo 
nichts helfen können, denn einmal dient ja ein externer Takt als 
Schiebetakt (wenn Slave), und einmal ein interner (wenn Master). Das 
geht nicht gut.

von Abud D. (kalko)


Lesenswert?

Vielen Dank für die schnellen Antworten.

Danke dir Lothar Miller, jetzt ist mir eigenes klar geworden. Wozu 
benutze ich eigentlich einen internen Takt wenn ich ein Slave bin. werde 
jetzt einfach mit dem Schiebetakt gleichzeitig empfangen und senden, so 
wie es sich gehört.

Werde mich dann nochmals melden wenn es klappt. Danke euch erstmal!!!

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.