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