Datum: 14.05.2008 11:02
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?
double_synch : process(nrst, clk, ?) is begin if nrst = '0' then reg1 <= (others => '0'); reg2 <= (others => '0'); elsif rising_edge(clk) then if (channel = '1') then reg1 <= regin1; else reg1 <= regin2; end if; elsif falling_edge(clk) then reg2 <= reg1; end if; end process double_synch; |
ModelSIM will plötzlich eines der Register in der Sensitivity-Liste haben. Wieso ?
Datum: 14.05.2008 20:20
Welches Register will es denn in der SL haben? Bin auch jetzt nicht sicher, ob das so synthetisierbar ist. Zur Simulation sollte es gehen.
Datum: 14.05.2008 21:20
Probier mal sowas aus:
process (clk) begin if rising_edge(clk) then data_out <= data_1; end if; if falling_edge(clk) then data_out <= data_2; end if; end process; |
Wenn das nicht geht, kannst Du evtl. mit einer DCM deinen Takt für den Ausgabeprozess verdoppeln. Rick
Datum: 15.05.2008 10:29
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.
Datum: 15.05.2008 11:31
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:
process(clk) begin if falling_edge(clk) then input_falling_edge <= input; end if; end process; process(clk) begin if rising_edge(clk) then combined <= input & input_falling_edge; end if; end process; |
Cheers, Roger
Datum: 15.05.2008 13:21
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.
Datum: 15.05.2008 16:19
Die Lösung mit dem "combined" ist aber nicht dasselbe, wie das, was ich wollte, oder? Ich brauche die Ins ja in verschiedenen Registern.
Datum: 15.05.2008 17:32
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
Datum: 15.05.2008 20:49
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?
Datum: 15.05.2008 21:54
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
Datum: 16.05.2008 10:07
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 ?
Datum: 16.05.2008 12:55
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.
Datum: 16.05.2008 13:15
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. ?
Datum: 16.05.2008 14:26
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
Datum: 19.05.2008 14:09
>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.
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [vhdl]VHDL-Code[/vhdl]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel