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 imFPGA. 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.
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?