Forum: FPGA, VHDL & Co. Timing Constraints und FF-Enable in ISE


von Hans (Gast)


Lesenswert?

Hallo zusammen

Ich möchte, dass ein Teil meines Codes nur jeden 8 Clock ausgeführt wird 
(und daher 8 mal länger zur ausführung Zeit hat). Daher ist der EN_25 
nur alle 25 MHz einen 200MHz Takt lang '1' und geht auf den Enable 
Eingang der FlipFlops. Meine Frage ist nun, wie kann ich ISE diese 
Constraint mitteilen?

Ich habe mir folgende Struktur ausgedacht:

Logik: process(Current)
begin
   -- "Next" berechnen
end process Logik;

FlipFlops: process(INT_200MHZ,GLOBAL_RESET)
begin
if GLOBAL_RESET = '1' then
   Neuer_Wert <= (others => '0');
elsif INT_200MHZ='1' and INT_200MHZ'event then
   if EN_25MHz = '1' then
     Current <= Next;
   else
     Current <= Current;
   end if;
end if;
end process FlipFlops;

Merci, Gruss Hans

von Duke Scarring (Gast)


Lesenswert?

Du gibst ihm die 200 MHz mit. Fertig.
An Deine FFs gehen dann auch die 200 MHz und Dein enable.
Das FF weiß ja nicht, ob es evtl. jeden Takt enabled wird und muss daher 
mit 200 MHz klarkommen.

Duke

P.S.: Und schreib lieber sowas:
1
elsif rising_edge( INT_200MHZ) then ...
VHDL ist schon schwierig genug zu lesen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Das FF weiß ja nicht, ob es evtl. jeden Takt enabled wird
> und muss daher mit 200 MHz klarkommen.
Stimmt: das FF nicht.
Aber wir wissen das, und wir können das der Toolchain sagen:
das Stichwort heißt hier Multi-Cycle-Path.

Wenn das Enable nur alle 1/25MHz kommt, hat die Logik wesentlich mehr 
Zeit, ohne das Setup-Timing der betroffenen FF zu verletzen.

@ Hans
Du mußt im Constraint-Editor erst eine Gruppe der betroffenen Signale 
bilden, danach kannst du ein Multi-Cycle-Constraint angeben.

> P.S.: Und schreib lieber sowas: ...
Noch besser:
1
if INT_200MHZ='1' and INT_200MHZ'event then
2
   if EN_25MHz = '1' then
3
     Current <= Next;
4
   else
5
     Current <= Current;
6
   end if;
7
   if GLOBAL_RESET = '1' then  -- synchroner Reset, falls überhaupt nötig
8
      Neuer_Wert <= (others => '0');
9
   end if;
10
end if;


Und noch viel besser:
lass die Finger weg von der Viel-Prozess-FSM-Schreibweise 
(kombinatorisch er Prozess und getakteter Prozess). Du machst dir damit 
das Leben langfristig einfacher ;-)

von Hans (Gast)


Lesenswert?

Besten Dank Lothar

Funktioniert wunderbar mit der Multi-Cycle Constraint.

gruss Hans

von Stephan (Gast)


Lesenswert?

Ich stand auch des öfteren schonmal vor dem gleichen Problem, habe es 
aber nicht so richtig hinbekommen, den Multi-Cycle Constraint korrekt zu 
setzen. Könnte das mal einer an einem praktischen Beispiel zeigen (z.B. 
an dem FSM Code von oben)? Im speziellen wusste ich nicht so richtig, 
welche Signale ich zu welchen Gruppen zusammenfassen sollte. Vielleicht 
hat ja einer Lust das mal zu erklären.

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
Noch kein Account? Hier anmelden.