Erhaltung von Gattern im FPGA erzwingen

Gast #697487
Lesenswert?

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 ?
#697531
Lesenswert?

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!
Gast #697887
Lesenswert?

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
Gast #699148
Lesenswert?

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.
Gast #699245
Lesenswert?

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.
Gast #700005
Lesenswert?

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.
Angehängte Dateien:
Gast #702739
Lesenswert?

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.
Gast #704576
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren