Hallo,
ich benötige in meinem System einen langsameren Takt als das Clocksignal
und hab das mit Clock-Enable gelöst.
Es funktioniert soweit alles (in Simulation und auf dem FPGA), nur
erhalte ich wie erwartet unzählige Timing-Fehler.
In meinem UCF-File steht als Takt:
1
NET "clk" LOC = AA12 | IOSTANDARD = LVCMOS33 | TNM_NET = "tnm_clk";
2
TIMESPEC "TS_clk" = PERIOD "tnm_clk" 10 ns HIGH 50%;
Nun muss ich ja der Synthese sagen, dass der CE nur alle 10 Takte kommt.
Das löst man ja mit einem Multi-Cycle Constraint.
Ich hab zwar schon einiges an White-Papers dahingehend durchgelesen,
aber sonderlich schlau werd ich trotzdem nicht draus (hab noch nicht
sonderlich viel Erfahrung mit Timing-Constraints).
Kann mir jemand hierzu ein (verständliches) Beispiel empfehlen oder mir
zeigen, wie ich am Besten mein UCF-File ergänze?
Schonmal Vielen Dank!
Das kann man vom Constraint-Wizzard aus tun, siehe "Exceptions". Ich bin
aber nicht so sicher, ob das der richtige Ansatz ist. Wenn da ein enable
kommt, muss das sofort verarbeitet werden und nicht erst Takte später,
oder?
Ein einziges Signal kann ohnehin kein Problem sein, welches ein MCC
benötigt. Das müsste zeitlich passen.
Ein MMC benutzt man u.a. für parallele Architekuren von Mulitiplieren
oder ganzen Schaltungen, die man zeitlich verschachtelt hat.
Hallo Jürgen,
also wenn Clock-Enable Eins ist und eine positive Flanke von clk kommt,
dann werden neue Daten in FFs geladen und die nachfolgende Kombinatorik
rechnet.
Es gibt einen Reiter: Create Timing Constraints
Nur will das irgendwie nicht öffnen, hab ja schon ein UCF-File, dann
gehts glaub ich nicht mehr.
Ich hab folgende Zeile im UCF hinzugefügt:
1
TIMESPEC "TS_ce" = FROM FFS TO FFS 100 ns;
Innerhalb meines Top-Level-Moduls gibt es das Signal clk_enable.
Wie sag ich nun, dass clk_enable (was ja modulintern ist), zu TS_ce
gehört?
Doch, das geht. Es muss ja erst ein UCF angelegt werden, sonst fragt er
Dich ja danach.
Man muss das Toplevel anklicken und dann bei "User Constraints" auf
"Create Timing Constraints" klicken. Dann kommt der Wizzard.
Bei "Exceptions" "Path" muss jeweils eine Gruppe mit den FFs gebildet
werden, die entspannt werden sollen. "From" Group .. "Create Group".
Aber wie gesagt, ich bin nicht sicher, ob das das richtige für Deine
Schaltung ist.
Ok, jetzt gings,
ich musste erst bis zu Translate laufen lassen, bis das Fenster aufging.
Es wurde folgendes Constraint hinzugefügt (fast dasselbe wie oben):
1
TIMESPEC "TS_ce" = FROM "FFS" TO "FFS" 100 ns DATAPATHONLY;
Ich frag mich allerdings auch, ob das der richtige Weg ist dies zu
lösen.
So wie ichs im Moment verstehe, giltet das nun für alle FFS im
kompletten Design oder?
Es gibt aber auch einige FFS, die mit 100 MHz betrieben werden und
andere (das sind dann ganze Module) die mit 10 MHz betrieben werden.
Such mal nach folgenden PDFs:
"understanding timing and placement constraints"
(Folien, viele Diagramme, evtl. schwer zu finden:( )
"Timing Closure User Guide"
(alles über Timing Constraints und deren Analyse)
Zu MultiCycle-Contraints: Zuserst müssen zwei Gruppen
definiert werden, Quelle und Ziel (beide können auch
identisch sein). Dann wird per "From-To"-Constraint
die MC-Ausnahme definiert.
Zu den Gruppen gehöhrt auf keinen Fall das ClockEnable-Signal,
denn das wird ja NICHT im MC-Bereich beschrieben, sondern
im "normalen" Clock-Bereich. Die Gruppendefinition kann
zusätzlich per FFS/RAM/etc. verfeinert werden.
Dein Constraint (..FROM "FFS" TO "FFS"..) ist definitiv
falsch, denn damit schliesst du ja auch das ClockEnable
mit ein. Kann zwar rain zufällig funktionieren, bei
Fehlern gibt's aber bei der Synthese keine Meldung.
Das alles wird ausführlichst im 2. PDF beschrieben.
Eigentlich genau so, wie Du es Oben schon beschrieben
hast: Eine Komponente/Prozess generiert z.B.per Zähler
das ClockEnable-Signal, womit die Ziel-FFs angesteuert
werden. Dann noch die Quell- und Ziel-FFs zu Gruppen
zusammenfassen und das Constraint definieren. Das ist
der ganze Zauber.
Wo muss ich die Gruppe genau definieren?
Im UCF-File? Oder in der vhd-Datei?
Wie weiß ich welche FFs ich da gruppieren soll?
Sorry für die blöden Fragen...
Im HDL-File beschreibst Du Deine Schaltung
(mit allen FFs), im UCF-File werden dann
diese FFs zusammengefasst, z.B.
INST MyComponent/* TNM=MC_GRP;
und z.B. per
TIMESPEC TS_MC = FROM MC_GRP TO MC_GRP 10*TS_CLK;
constrained.
Du musst dabei immer auf den Instanzen-Pfad
achten, der muss beim Gruppieren mit angegeben
werden. Joker-Zeichen wie * sind dabei hilfreich.
TIMESPEC "TS_ce" = FROM "TNM_ce" TO "TNM_ce" 100 ns;
Hab die Entity von meinem Top-Modul angepasst:
1
Port (
2
...
3
clk_enable : inout STD_LOGIC := '0';
4
...
Ich erhalte beim Mappen folgende Warnung:
WARNING:Timing:3223 - Timing constraint TS_ce = MAXDELAY FROM TIMEGRP
"TNM_ce"
TO TIMEGRP "TNM_ce" 100 ns ignored during timing analysis.
und auch eine Timing-Fehler Warnung.
Also so einfach gehts dann wohl leider nicht...
Schau mal auf folgende Seite:
http://www.xilinx.com/support/answers/29290.html
Im ggs zu mir definierst Du die Gruppe per
NET (ich: per INST), was aber egal ist
(liess Dir dazu das "Xilinx Constraint Guide"
durch, das beschreibt alle Constraints und
Gruppierungen).
Ich vermute mal, Dein Problem ist, dass zwar
"clk_enable" als Port existiert, nicht aber
namentlich in der Netzliste (die "Leitung"
existiert natürlich schon!). Deine Gruppe
ist also leer.
Geh mal in den FPGA-Editor bzw. Floorplanner und
such nach dem Signal, dort findest Du auch den
vollständigen Namen (inkl Pfad).
Oder noch besser: setz einfach mal ein kleines
Demo-Projekt auf, dass nur eine Hauptkomponente
besitzt. Da hast Du dann keine Pfade und damit
keine Probleme beim Auffinden von Signalen
bzw. FFs/etc.