Forum: FPGA, VHDL & Co. VHDL R/W Register erzeugen


von vhdl-anfänger (Gast)


Lesenswert?

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?

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


Lesenswert?

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?

von vhdl-anfänger (Gast)


Lesenswert?

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.

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


Lesenswert?

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

von vhdl-anfänger (Gast)


Lesenswert?

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?

von Dennis R. (dennis_r93)


Lesenswert?

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
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von uwe (Gast)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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.

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


Lesenswert?

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.

von Vancouver (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.