Moin zusammen,
ich hatte eine Diskussion mit einem Kollegen zum Thema VHDL Design. Wir
haben eine Reihe von Komponenten, die Daten miteinander austauschen und
synchron aus der gleichen Taktquelle versorgt werden.
Er vertritt die Meinung, dass eine Komponente die Daten auf der
fallenden Flanke auf z.B. ein Signal oder einen Bus geben sollte,
während die andere Komponente diese auf der steigenden Flanke abrufen
soll, damit die Daten sicher anstehen, wenn der Zugriff erfolgt.
Ich bin der Meinung, dass es ausreicht beide Komponenten ihre Daten auf
der steigenden Flanke abgeben und lesen zu lassen, da das Synthesetool
(in dem Fall die Xilinx ISE 14.7 für einen Spartan6) die Laufzeiten
bereits mit einbezieht und darauf auslegt. Eine solche
fallend-schreiben-steigend-lesen Methode würde ja quasi zu einem Dual
Data Rate auf dem Bus führen und damit es nur schwerer machen ein
ordentliches Timing ohne Verletzung von Setupzeiten zu erzeugen.
Wer hat recht? Wie ist eure Meinung dazu? Habt ihr Quellen, aus denen
hervor geht, dass die eine oder andere Lösung sinnvoll/sinnfrei ist?
Gruß,
Björn
Innerhalb des selben Chips ist das der Sinn und Zweck von Timing
Constraints. Solange die eingehalten werden, kann man die Flip Flops
gefahrlos mit der selben Flanke betreiben.
Hier mal eine Quelle:
>The PERIOD constraint on a clock net analyzes all delays on all paths that >terminate at a>pin with a setup and hold analysis relative to the clock net. A typical>analysis includes the>data paths of:>• Intrinsic Clock-to-Out delay of the synchronous elements>• Routing and Logic delay>• Intrinsic Setup/hold delay of the synchronous elementshttps://www.xilinx.com/support/documentation/sw_manuals/xilinx11/ug612.pdf
Wenn man unterschiedliche Flanken verwendet, halbiert man sogar die
verfügbare Zeit für die Übertragung zwischen den Flip-Flops.
Björn V. schrieb:> Ich bin der Meinung, dass es ausreicht beide Komponenten ihre Daten auf> der steigenden Flanke abgeben und lesen zu lassen
Also deine Frage ließt sich etwas missverständlich daher will ich das
nur etwas klarstellen.
Wir betrachten also immer die Strecke zwischen zwei Registern
(Flipflops). Bei einer Taktflanke übernimmt das FF die am Eingang
anliegenden Daten auf den Ausgang. Das FlopFlop dannach hat aber gerader
ersten die "alten" Daten des ersten Flipflops übernommen. Deine
Beschreibung ließt sich so als würdest du denken bei einer Taktflanke
"gibt" man ein Signal auf den Bus und "ließt" es exakt gleichzeitig. Das
ist NICHT so, im Prinzip ließt das nächste FF die Daten genau einen
Takt "später". Das mit dem Steigende/Fallende ist in den meisten
praktischen Anwendungen eher unüblich. DualDataRate sorgt ja eher dafür
das eine Taktperiode nur die Hälfte eines 1-0 Taktzykluses dauert, aber
das Prinzip ist wieder das selbe.
Oder um es kurz zu sagen: mit steigender und fallender Flanke im
selben Design arbeiten nur die, die das Prinzip "Synchrones Design" noch
nicht ganz verstanden haben.
Ich bezahle den FPGA Hersteller dafür, dass er eine sauber balancierte
Taktverteilung implementiert. So gut, dass der Takt überall gleichzeitig
anliegt und ich keine Race-Condition bekomme.
Björn V. schrieb:> Er vertritt die Meinung, dass eine Komponente die Daten auf der> fallenden Flanke auf z.B. ein Signal oder einen Bus geben sollte,> während die andere Komponente diese auf der steigenden Flanke abrufen> soll, damit die Daten sicher anstehen, wenn der Zugriff erfolgt.
Falls dein Kollege einen Hintergrund im ASIC Design hat, dann könnte es
sein, dass er Konzepte wie dual-phase Clocks in den FPGA übersetzten
möchte.
Dual-Phase Clocking ist eine Technik wo es anstatt einem Clocktree zwei
davon gibt. Beide Clocks sind synchron zu einander und 180°
Phasenverschoben. Im RTL Design wird eine Stufe mit der ersten Clock und
die nachfolgende Stufe mit dem Phasenverschobenen Takt versorgt.
Die dazu nötigen sehr genauen Timings dieser zwei Clocktrees sind
eigentlich nur im Full-custom Design erreichbar und es wird daher immer
seltener verwendet. Intel war lange Zeit ein Verfechter dieser Methode,
scheint aber auch umgeschwenkt zu haben (Hat jemand vielleicht sogar
eine Quelle dafür für mich?)
Denn letztlich läuft das lediglich darauf hinaus, dass quasi die
Taktfrequenz des Designs verdoppelt wird. Und dann mit
Multi-Cycle-Pfaden gearbeitet wird. Das über das gesamte FPGA
durchzuziehen, ist enorm fehlerträchtig und handarbeitsaufwändig.
Vielen Dank an alle!
Die meisten Meinungen decken sich also mit meiner Vermutung. Es handelt
sich in der Tat um eine FPGA-interne Logik in verschiedenen Komponenten.
Dass z.B. Interfaces wie SPI mit unterschiedlichen Flanken Daten auf die
MISO und MOSI, ist ja verständlich, aber wir haben wirklich nur VHDL
Blöcke.
Die Anmerkung mit dem Dual-Phase Clock ist interessant zu wissen, aber
leider liegt der Fall hier in der Tat nicht vor.
Besten Dank an Felix für die Nennung einer belastbaren Quelle! Ich werde
das Thema damit bewaffnet noch einmal aufwärmen.
Christoph Z. schrieb:> Intel war lange Zeit ein Verfechter dieser Methode,> scheint aber auch umgeschwenkt zu haben (Hat jemand vielleicht sogar> eine Quelle dafür für mich?)
ich vermute, du meinst damit LSSD (level sensitive scan design).
Gabs/gibts auch bei IBM, da waren am Master-Latch 2 Takte: Master-Takt
und Scan-Takt. Am 2. Latch dann Slave-Takt.
Wurde auch im Standart-Zell Design verwendet, Clock-Tree war da aber
echt happig...
Björn V. schrieb:> Dass z.B. Interfaces wie SPI mit unterschiedlichen Flanken Daten auf die> MISO und MOSI, ist ja verständlich
Und der Takt dort ist nicht mal ein richtiger Takt, sondern lediglich
ein Signal, das einsynchronisiert gehört wie jedes andere Signal.