Hallo, ich möchte eine Schnittstelle/ein Register in VHDL definieren, das ich aus der HW sowohl Schreiben als auch Lesen kann. Die "andere" Seite soll auch beides können. Wie realisiert man sowas? Brauch ich da einen Treiber dazwischen, der beschreibt wer "Vorrang" hat wenn beide gleichzeitig schreiben?
vhdl-anfänger schrieb: > Wie realisiert man sowas? Mit einem DP-RAM. Das kann auch in LUTs abgenbildet werden. > Brauch ich da einen Treiber dazwischen, der beschreibt wer "Vorrang" hat > wenn beide gleichzeitig schreiben? Wenn beide "gleichzeitig" schreiben, dann geht das sowieso schief. Aber viel schlimmer ist es, wenn sie asynchron ein paar ns versetzt schreiben... > das ich aus der HW sowohl Schreiben als auch Lesen kann. Wer sind die beiden "Teilnehmer"? Sind die synchron zueinander?
Lothar M. schrieb: > vhdl-anfänger schrieb: >> Wie realisiert man sowas? > Mit einem DP-RAM. Das kann auch in LUTs abgenbildet werden. Ok. hast du auf deiner Homepage etwas dazu? Lothar M. schrieb: > >> Brauch ich da einen Treiber dazwischen, der beschreibt wer "Vorrang" hat >> wenn beide gleichzeitig schreiben? > Wenn beide "gleichzeitig" schreiben, dann geht das sowieso schief. Aber > viel schlimmer ist es, wenn sie asynchron ein paar ns versetzt > schreiben... > >> das ich aus der HW sowohl Schreiben als auch Lesen kann. > Wer sind die beiden "Teilnehmer"? Sind die synchron zueinander? beide Teilnehmer sind synchron zueinander. Ich hab mir das so vorgestellt(bitte korrigiere mich wenn ich jetzt zu kompliziert denke): Ich will zwischen 2 entitys symbolisieren, das etwas passiert ist. Dazu setzt A) einen Port auf High. Wenn B den High-Pegel erkannt hat, setzt er ihn wieder zurück auf Low.
vhdl-anfänger schrieb: > beide Teilnehmer sind synchron zueinander. Wenn beide mit dem selben Takt laufen, dann ist das kein Problem... > Ich will zwischen 2 entitys symbolisieren, das etwas passiert ist. > Dazu setzt A) einen Port auf High. Wenn B den High-Pegel erkannt hat, > setzt er ihn wieder zurück auf Low. Das ist umständlich, denn dafür brauchst du einen inout Port im FPGA. dort gibt es sowas gar nicht, und deshalb muss der Synthesizer das aufwändig mit einem Multiplexer auflösen. Sinnvoller ist ein traditionelles Handshake mit einer Hin- und einer Rückleitung: 1. A setzt ein "Anfordern"-Signal. 2. B erkennt die Anforderung und setzt das "Erkannt"-Signal 3. A sieht das "Erkannt"-Signal und deaktiviert sein "Anfordern"-Signal 4. B sieht, dass das "Anfordern" Signal inaktiv ist und setzt das "Erkannt"-Signal inaktiv
Lothar M. schrieb: > vhdl-anfänger schrieb: >> beide Teilnehmer sind synchron zueinander. > Wenn beide mit dem selben Takt laufen, dann ist das kein Problem... > >> Ich will zwischen 2 entitys symbolisieren, das etwas passiert ist. >> Dazu setzt A) einen Port auf High. Wenn B den High-Pegel erkannt hat, >> setzt er ihn wieder zurück auf Low. > Das ist umständlich, denn dafür brauchst du einen inout Port im > FPGA. dort gibt es sowas gar nicht, und deshalb muss der Synthesizer das > aufwändig mit einem Multiplexer auflösen. > > Sinnvoller ist ein traditionelles Handshake mit einer Hin- und einer > Rückleitung: > 1. A setzt ein "Anfordern"-Signal. > 2. B erkennt die Anforderung und setzt das "Erkannt"-Signal > 3. A sieht das "Erkannt"-Signal und deaktiviert sein "Anfordern"-Signal > 4. B sieht, dass das "Anfordern" Signal inaktiv ist und setzt das > "Erkannt"-Signal inaktiv Danke. Bei mir ist es zwar eine leicht andere Situation, aber es lässt sich mappen. Danke schonmal. Trotzdem würd mich interessieren wie man das mit einem "DP-RAM" umsetzt. Also doch inout-Port und Tri-State Treiber dazwischen?
nein, der DP-Ram hat 2 Ports. Und jeder Port hat auch einen Dateneingang und einen Datenausgang. Nur die Addressleitungen sind nur einmal pro Port vorhanden. Durch beide Ports können Daten gelesen und/oder geschrieben werden. Das genaue Verhalten bei Konfliktsituationen kann man aus der Doku lesen und zum Teil im VHDL Code beeinflussen.
:
Bearbeitet durch User
Dennis R. schrieb: > Das genaue Verhalten bei Konfliktsituationen kann man aus der Doku lesen > und zum Teil im VHDL Code beeinflussen. Und trotzdem darf man sich nicht wundern, wenn was eigenartiges passiert, wenn von beiden Ports "quasi gleichzeitig" geschrieben wird...
> Und trotzdem darf man sich nicht wundern, wenn was eigenartiges > passiert, wenn von beiden Ports "quasi gleichzeitig" geschrieben wird Wenn auf unterschiedliche Adressen geschrieben wird ist das doch OK. Was passiert wenn auf den gleichen Bereich geschrieben wird ist unterschiedlich, da gibt es DP-RAMs die einen Port bevorzugen und am andren Port einen Busy melden usw.
Lothar M. schrieb: > Und trotzdem darf man sich nicht wundern, wenn was eigenartiges > passiert, wenn von beiden Ports "quasi gleichzeitig" geschrieben wird... Naja, für solche Spezialfällr muss man dann den Synthese Guide des jeweiligen Herstellers zu Rate ziehen. Bei XSt steht drin, wie man die verschiedenen Fälle beschreiben muss, damit man sie auch bekommt.
uwe schrieb: > Wenn auf unterschiedliche Adressen geschrieben wird ist das doch OK. Es ist ein einziges Statusbit. Das hat sicher von beiden Seiten die selbe Adresse... > Was passiert wenn auf den gleichen Bereich geschrieben wird ist > unterschiedlich, da gibt es DP-RAMs die einen Port bevorzugen und am > andren Port einen Busy melden usw. Hilft alles nichts, wenn die Zugriffe asynchron sind. Da gibt es dann auf jeden Fall irgendwo eine Setup/Hold Verletzung, wenn nicht irgendwie einsynchronisiert wird.
clockReg:process(clk) begin if rising_edge(clk) then reg_out <= reg_in; end if; end process clockReg; reg_in <= inA when (weA='1') else inB when (weB='1') else reg_out; oder reg_in <= inB when (weB='1') else inA when (weA='1') else reg_out; oder regin <= inA when (weA='1' and weB='0') else inB when (weA='0' and weB='1') else reg_out; writeError <= weA and weB; In den ersten beiden Fällen hat A bzw. B write-priority. Im letzten Fall wird der Schreibzugriff ignoriert, wenn beide gleichztig schreiben und ein error-Signal gesetzt. Welche Semantik geeigent ist, musst Du eben entscheiden. Tristates brauchst Du nicht, bei moderen (Xilinx-)FPGAs gibts die auch nur noch in den IO-Ports und nicht mehr in der Logik. Welche Hardware willst Du überhaupt verwenden? Oder brauchst Du vielleicht nur ein Simulationsmodell?
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.