Ich möchte die Laufzeit und Schaltzeiten in FPGAs vermessen und dazu einzelne Inverter hintereinanderschalten. Das Problem ist, daß alle bis auf einen für den ungeraden Zweig und sämtliche für den gerade Zweig weggenomen werden, wenn man das wie üblich deklariert. Wie baue ich eine echte Registerarchitektur, die nicht verändert wird ? Geht das mit den Altera Primitiven ?
Fuer was brauchst du denn die Schalt und Laufzeiten zu messen? Ist es nicht einfacher diese im Datenblatt nachzuschauen, oder eine Post-Implementation Simulation zu machen?
Hast du schon überlegt was du tatsächlich messen würdest? Auch wenn ein einzelner Inverter mit Hilfe eines FPGAs implementiert wurde, so liegen zwischen dem Eingangs- und Ausgangspin des FPGAs mehr als dutzende programmierbare Schalter, die das Signal weiterleiten. Und die Verzögerung der Verdrahtungselemente macht ca. 70-80% der Gesamtverzägerung aus. Wenn dann der Inverter eine Schaltzeit von 2ns aufweist, dann entfallen ca. 200ps auf die LUT, die den Inverter implementiert. Und je nach dem welcher Eingang der LUT verwendet wird, hast du auch bis zu zweifache Variation... In dem Sinne, Messen heisst Mist messen!
Du kannst jeden Zwischenwert auf ein Pin geben. Ob das realitätsnahe Ergebnisse bringt, wage ich zu bezweifeln. Rick
Das mit dem "auf den Pin geben" reicht aber noch nicht, weil es - egeal wieivel Inverter es weren - nur zwei Sorten Ausgänge gibt: "IN" und "not IN."
Ok. Bei Xilinx hilft Dir vielleicht folgendes: [Xilinx Constraint Guide] VHDL Syntax Example Declare the VHDL constraint as follows: attribute keep : string; Specify the VHDL constraint as follows: attribute keep of signal_name: signal is “true”; For more information on basic VHDL syntax, see “VHDL” in Chapter 3. Bei Deinem Synthesetool gibt es sichr was ähnliches. Rick
Xilinx hilft mir (im Moment) nicht weiter. Ich will auch garnicht den Sinn der Schaltung(-smessung) diskutieren. Ich möchte nur einfach eine solche Inverterkette aufbauen und sicherstellen, daß ich die dadurch verzögerten Signale messbar habe. In einem Fall werden die parallel abgesampelt, sodaß dann je nach Flanke und Vrrzögerung einigen Registern noch der alte Wert - in einigen anderen Registern bereits der neue Wert steht. Das soll u.a. ein Messsignal sein und angezeigt werden.
Dafür gibt es Constraints. Das "Wegoptimieren" von Komponenten kannst du durch Signaldeklarationen im VHDL-Code verhindern. Wie das geht steht in der Literatur deines Synthesetools (ich nehme an Altera Quartus). Lesen must du schon selber.
Wie "constraine" ich das? Habe diverses probiert, aber Quartus erzeugt erwartungsgemäß immer nur 2 Pfade mit einem Inverter für alle theoretischen 8 sequenziellen Verzweigungen. Das einzigste, was ich geschafft habe ist, daß er die Register nicht wegoptimiert, obwohl wegen der wegoptmierten Kombinatorik in jeweils 4 davon dasselbe steht.
Was du vorhast ist, wenn ich es richtig verstanden habe, schon im Ansatz zum Scheitern verurteilt. Du kannst die Verzögerungszeiten einer Inverterkette nicht messen weil es auf dem FPGA keine Inverterkette gibt, egal wie du ihn konfigurierst. Was du konfigurieren kannst ist z.B. eine LUT-Kette, aber es gibt auch nicht "die" LUT-Kette, weil die Verzögerungszeiten von der Platzierung (Entfernung auf dem Chip) und dem Routing (z.B. Long Lines vs. kurzer Verbindung) abhängen. Soll heißen: Kleine Änderungen an völlig anderen Teilen einer Konfiguration können andere PAR-Ergebnisse und damit andere Verzögerungszeiten als Ergebnis haben. Was du machen kannst ist: - Die Verzögerungen einzelner CLBs im Datenblatt nachschlagen. Da sind dann natürlich keine Routing-Laufzeiten drin, aber dafür hast du sofort einen konkreten Wert vor dir. Beispiel: Verzögerungszeit zwischen F-LUT-Input und X-Output eines CLB auf einem Spartan-3 mit Speed Grade -4: 0.21 - 0.61 ns. - Das Timing einer fertigen Schaltung messen. Macht man typischerweise in der letzten Phase der Optimierung und mit Hilfe spzieller Timing-Tools (da kenne ich mich leider noch nicht aus). - Eine gute Abschätzung, indem du die LUT-Kette samt Platzierung vorgibst (soweit ich weiß kann das Routing nicht vorgegeben werden. Dadurch ist die Abschätzung dann auch nicht exakt, weil andere Teile die später dazukommen dieselben Routing-Ressourcen benutzen "wollen"). Das geht indem du LUT-Primitive im VHDL-/Verilog-Code instanziierst und per constraints deren Lage vorgibst. Hab ich leider auch noch nicht gemacht.
Aufgepasst jetzt könnt ihr was lernen: Wenn der Hasso das unbedingt will dann soll er doch (vielleicht braucht er es ja für was anderes). Es gibt durchaus sinnvolle Anwendungszwecke, DDR-SDRAM Controller zum Beispiel. Der Morin hat recht, nach einem einzelnen Inverter kann man in einem FPGA lange suchen. Die Logik versteckt sich in den LUT (Look Up Table) die sich in sogeneannten CLBs verstecken. Also die Lösung ist: 1.) Im Manual nach diesen LUT's suchen, diese direkt in VHDL mit Port Map einbinden. 2.) Im Constraint's file festlegen das nichts weggekürzt wird. Den Platzierungsort ebenfalls in einem Constraints File festlegen 3.) Synthesize, PnR... Zu den Constraints files kann ich dir leider keine genauen Angaben machen weil ich aus der HDL-Designer/Precision/Xilinx-Ecke komme. Da musst du wohl oder übel selber nachschauen, oder hier irgendjemanden finden der mit Altera arbeitet und zusätzlich noch ein bisschen drauskommt. Bitte.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.