Forum: FPGA, VHDL & Co. doppelt schnell synchronisieren


von FPGA-Sultan (Gast)


Lesenswert?

Es geht um Datenstrommischung von 2 auf einen Kanal. Ich möchte mit 
steigender und fallender Flanke arbeiten und damit doppelt so schnell 
eintakten. Darf man das so machen?
1
double_synch : process(nrst, clk, ?) is
2
begin
3
    if nrst = '0' then
4
        reg1 <= (others => '0');
5
        reg2 <= (others => '0');
6
    elsif rising_edge(clk) then
7
      if (channel = '1') then
8
          reg1 <= regin1;
9
    else
10
      reg1 <= regin2;
11
    end if;
12
    elsif falling_edge(clk) then
13
      reg2 <= reg1;
14
    end if;
15
end process double_synch;

ModelSIM will plötzlich eines der Register in der Sensitivity-Liste 
haben. Wieso ?

von Morin (Gast)


Lesenswert?

Welches Register will es denn in der SL haben?

Bin auch jetzt nicht sicher, ob das so synthetisierbar ist. Zur 
Simulation sollte es gehen.

von Rick Dangerus (Gast)


Lesenswert?

Probier mal sowas aus:
1
process (clk)
2
begin
3
  if rising_edge(clk) then
4
    data_out <= data_1;
5
  end if;
6
  if falling_edge(clk) then
7
    data_out <= data_2;
8
  end if;
9
end process;
Wenn das nicht geht, kannst Du evtl. mit einer DCM deinen Takt für den 
Ausgabeprozess verdoppeln.

Rick

von Sultan (Gast)


Lesenswert?

Ich wollte eigentlich nut wissen, ob man das so machen darf, also risign 
und flaling innerhalb einer entity benutzen. Doppelter Takt ginge auch, 
aber ich brauche es nur hier.

von Roger S. (edge)


Lesenswert?

bei praktisch allen FPGAs laesst sich Rick's code nicht implementieren, 
wenn data_out auf ein pad geht, dann kannst du DDR IOs verwenden, sofern 
dein FPGA ueber solche verfuegt.

Wenn es sich nur um input handelt, kannst du den vorzugsweise in zwei 
Prozessen mit jeweils positiver und negativer Taktflanke sampeln.

in etwa so:
1
process(clk)
2
begin
3
  if falling_edge(clk) then
4
    input_falling_edge <= input;
5
  end if;
6
end process;
7
8
process(clk)
9
begin
10
  if rising_edge(clk) then
11
    combined <= input & input_falling_edge;
12
  end if;
13
end process;

Cheers, Roger

von Matthias F. (flint)


Lesenswert?

Sultan wrote:
> Ich wollte eigentlich nut wissen, ob man das so machen darf, also risign
> und flaling innerhalb einer entity benutzen. Doppelter Takt ginge auch,
> aber ich brauche es nur hier.

Innerhalb einer entity schon, innerhalb eines Prozesses würde ich es 
nicht machen, einfach damit die Synthesetools nicht verwirrt werden.

von FPGA-Sultan (Gast)


Lesenswert?

Die Lösung mit dem "combined" ist aber nicht dasselbe, wie das, was ich 
wollte, oder? Ich brauche die Ins ja in verschiedenen Registern.

von Roger S. (edge)


Lesenswert?

Mit "combined" haettest du deine daten in der selben clock domain.
Du kannst natuerlich die Daten von beiden Flanken in separaten Registern 
speichern, ich sehe da dein Problem nicht.

Cheers, Roger

von Willivonbienemaya .. (willivonbienemaya)


Lesenswert?

Worauf muss man denn bei DDR achten?
Wann kommt es zu Problemen?

Welche Einschränkungen habe ich wenn ich bei steigernder UND bei 
fallender Flanke Daten verarbeiten will?

von Klaus Falser (Gast)


Lesenswert?

DDR Register sind Ein- oder Ausgangsregister die es nur in bestimmten 
FPGA Familien gibt. Diese können kein Verarbeitung der Daten vornehmen, 
sondern nur das Eingang-, bzw. Ausgangspin jeweils an beiden Taktflanken 
abtakten.
Bei einem Eingangs-DDR hat man dann 2 Ausgänge, an einem liegen die 
Daten der steigenden und am anderen die Daten der fallenden Flanke an.

Die Weiterverarbeitung erfolgt dann getrennt jeweils für die Daten der 
fallenden und für die Daten der steigenden Flanke, weil die internen 
FF's des FPGA's nur an einer Flanke arbeiten.
Du brauchst 2 Datenpfade parallel. Du kannst aber in der Verarbeitung 
für die eine Flanke auf die Daten für die andere Flanke zugreifen.

Grüße
Klaus

von FPGA-Sultan (Gast)


Lesenswert?

Eine Frage dazu : Angenommen ich verwende 2 Register, die jeweil mit 
steigendem und fallendem Takt die Ausgänge einer DDR-Zelle annehmen. 
Wenn ich rechts, also auf der annehmenden Seite einen sagen wir 100MHz 
Takt habe, dann habe ich immer 10 ns Zeit von dem jeweiligen Ausgangspin 
der Zelle zu einem weiteren Register.

Aber für die Weiterverarbeitung der Daten im unteren Register, das mit 
der fallenden Flanke arbeitet, habe ich später nur noch 5ns Zeit. 
Irgendwann muss man ja mal auf den positiven Takt wechseln, oder ?

von Jan M. (mueschel)


Lesenswert?

Das Wechseln macht das DDR-Register fuer dich. Das hat zwei Eingaenge, 
die auf die positive Flanke triggern und einen Ausgang, in dem bei jeder 
Flanke zwischen den beiden Eingaengen gewechselt wird.   Bei einem 
input-DDR ist es genau umgekehrt.

von FPGA-Sultan (Gast)


Lesenswert?

Das ist mir schon klar, denke ich. Aber die Frage bleibt: Wenn der Takt 
am DDR auf lo geht und damit das Register den lo-Pfadeingang übernimmt, 
habe ich nur einen halben Takt Zeit für Kombinatorik bis zum nächsten 
Register, oder?

Sollte man hinter DDRs damit noch Register stecken ?

Oder betreibt man Designs dann mit dem doppelten Takt gegenüber dem 
Eingang?

Ich stelle mir das bisher so vor :

Links : 100 MHz DDR, damit faktisch 200MHz Daten.
Rechts : 100 MHz non-DDR, damit faktisch 100 MHz Daten auf doppelt 
sovielen Kanälen.

?

von Roger S. (edge)


Lesenswert?

Lies doch einfach mal das Datenblatt zu deinem FPGA.
Normalerweise ist der Takt fuer DDR IO und der verarbeitenden User Logik 
derselbe. Intern ist der Bus halt doppelt so breit, womit der 
Datendurchsatz gleich bleibt. Das Synchronisieren der Daten der 
negativen Flanke wird direkt beim DDR IO gemacht, das ermoeglicht dir 
hoehere Taktfrequenzen als wenn du das irgendwo in der Logik selbst 
machst.

Um was geht es bei deinem Problem eigentlich?

Cheers, Roger

von FPGA-Sultan (Gast)


Lesenswert?

>Das Synchronisieren der Daten der
>negativen Flanke wird direkt beim DDR IO gemacht, das ermoeglicht dir
>hoehere Taktfrequenzen als wenn du das irgendwo in der Logik selbst
>machst.

Das war schonmal ein guter Huinweis, Danke!

>Um was geht es bei deinem Problem eigentlich?

Um Geschwindigkeit, ohne einen doppelt so schnellen Tak einsetzen zu 
müssen, der noch eine PLL braucht, oder einen Ausgang derselben.

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.