Forum: FPGA, VHDL & Co. Par:228 - At least one timing constraint is impossible to meet because component delays.


von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Mein "Ziel": Ich möchte ne Status LED für die RS232 Kommunikation, 
welche Lustig vor sich hinblinkt. Leider kriege ich beim "verbinden" des 
Ausgabe Ports einene Fehler:
1
Par:228 - At least one timing constraint is impossible to meet because component delays alone exceed the constraint.

Meine Portdefinition sieht folgendes vor
1
Port ( CLK_50M : in  STD_LOGIC;
2
SW             : in STD_LOGIC_vector(3 downto 0);
3
FPGA_AWAKE     : out std_logic;
4
RS232_DCE_TXD  : out  STD_LOGIC);

Mittels eines Signals (tx_out), lege ich die RS232 Daten auf den 
Ausgang:
1
RS232_DCE_TXD <= tx_out;
was sich auch einwandfrei übersetzen läßt.
Weise ich jezt aber in einem Prozess dieses Sigal auch der LED zu kommt 
obiger Fehler
1
txtest: process(CLK_50M)
2
    begin
3
        if rising_edge(CLK_50M) then
4
           FPGA_AWAKE <= tx_out;
5
            tx_data <= "01010101" XOR "0000"&SW;
6
            if (tx_full = '0') then
7
                tx_write <= '1';
8
            else
9
               tx_write <= '0';
10
            end if;
11
       end if;
12
    end process;

Die Konstraints sind aus dem Userguide für das Board (Sparta-3A Starter) 
entnommen:
1
NET "CLK_50M"       LOC = "E12"  | IOSTANDARD = LVCMOS33 | PERIOD = 20.000 ;
2
OFFSET = IN  10.000 VALID 20.000 BEFORE "CLK_50M" ;
3
OFFSET = OUT 20.000 AFTER "CLK_50M" ;
4
NET "FPGA_AWAKE" LOC = "AB15" | IOSTANDARD = LVTTL | SLEW = QUIETIO | DRIVE = 4;
5
NET "RS232_DCE_TXD" LOC = "F15"  | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
Das Place Tool schlägt vor das ich die Konstraints lockern soll, das 
scheint mir auf den ersten Blick aber keine Gute Lösung zu sein 
schließlich haben diese sicherlich ihre Bewandnis.

Gibt es hierfür eine Lösung (außer Hardverdrahtung) oder ist meine 
Anforderung in irgeneiner Weise "Hardwareinkompatibel", prinzipiell seh 
ich erstmal keinen Grund warum das nicht gehen sollte-

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Habs jezt dadurch lösen könne das ich die Konstraints angepaßt habe:
1
NET "FPGA_AWAKE" LOC = "AB15" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW;
2
NET "RS232_DCE_TXD" LOC = "F15"  | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW;
Hat das irgenwelche Nachteile? Ich mein der LED sollte es nicht schaden, 
aber die bei Xilinx werden sich bei der Ursprünglichen Definition was 
gedacht haben...

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


Lesenswert?

Wenigstens den Takt solltest du einschränken (constrainen):
1
NET "CLK_50M"       LOC = "E12"  | IOSTANDARD = LVCMOS33 | PERIOD = 20.000 ;
Wenn das dann immer noch schiefgeht (aber 50MHz sind noch gar nicht 
sooooo arg schnell), solltest du einen Blick in die Statische 
Timinganalyse werfen. Dort wird dir der langsamste Pfad angegeben. 
Üblicherweise kannst du da dann mit geringen Anpassungen schnell noch 
ein paar MHz rausholen.

von Michael (Gast)


Lesenswert?

Ich denke mal hier liegt der hund begraben:

OFFSET = OUT 20.000 AFTER "CLK_50M" ;


lass die constraint einfach mal raus, sollte eigentlich nicht schaden.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Äh ja die Taktkonstraints hab ich natürlich belassen, habe nur die 
Konstraints für die LED an die des UART angegelichen. Der Konstraint der 
nicht erfüllt werden kann war der für den Takt wenn ich den Report 
richtig verstanden habe.

Also entweder die sache mit dem SLEW oder DRIVE war wohl untereiander so 
unverträglich das er da durcheinader gekommen ist.

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


Lesenswert?

Das mit DRIVE und SLEW sollte für jeden Ausgangstreiber unabhängig 
einstellbar sein...

> ... IOSTANDARD = LVTTL ....
> ... IOSTANDARD = LVCMOS33 ....
Hat es damit was zu tun? Allerdings ist es seltsam, dass dann an den 
Timings herumgemäkelt wird... :-/

von Läubi .. (laeubi) Benutzerseite


Angehängte Dateien:

Lesenswert?

Also sobald ich SLEW auf QUIETIO ändere kommt der Fehler, im Anhang mal 
der komplette Bericht. Zeile 51 ist der Fehler...

(Der IOStandard hat keinen Einfluß)

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


Lesenswert?

> QUIETIO
ist 5 mal langsamer als SLOW und im Zeitbereich um 30ns. Wenn du nur 
20ns Ausgangsdelay zulässt, ist dieser Wert mit QUIETIO nicht zu 
erfüllen. Du solltest diesen QUIETIO-Pfad weniger streng einschränken.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Hab das jezt mal rausgenommen, ich denk der LED ist es egal :)
Kann man QUIETIO dann überhaupt sinnvoll bei der Taktfrequenz einsetzen? 
Vermutlich dann nicht in nem getakteten Prozess..

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


Lesenswert?

> Kann man QUIETIO dann überhaupt sinnvoll bei der Taktfrequenz einsetzen?
> Vermutlich dann nicht in nem getakteten Prozess..
Nicht, wenn du eine externe Komponente angeschlossen hast, die mit dem 
selben Takt wie das FPGA betrieben wird...

Wie gesagt, du kannst durchaus auch an ein FF mit 50MHz einen 
QUIETIO-Pin anschliessen, nur muß dann der Signalpfad vom 
Takt-Constraint herausgenommen werden.

> ich denk der LED ist es egal :)
Genau für sowas ist das QUIETIO auch gemacht: zeitlich unkritische 
Signale.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Wie kann ich den "QuietIO" von den Taktkonstraints ausnehmen? Ich hatte 
die LED schonmal als "BlinkTest" mißbraucht da hat er komischerweise 
sich nicht beschwert...

von bko (Gast)


Lesenswert?

Dies nennt sich in Synthese-Neu-Deutsch dann "False Path";
nun aus dem "ise92-constraints guide" Seite 63 hierher kopiert:
"False Paths by Pin
You can define false paths for all paths that pass through a particular 
instance pin using the
following UCF syntax:
PIN “instance.pin_name” TIG;"

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

So... da es bisher nicht akut war hab ich nicht weiterverfolgt, da ich 
es jezt aber doch nochmal benötigt habe hier mal meine Lösung:
1
# Aktive HIGH
2
NET "HALT_LED" LOC = "AB15" | IOSTANDARD = LVTTL | SLEW = QUIETIO | DRIVE = 4 | TIG;
3
# Aktive LOW
4
NET "ERROR_LED" LOC = "V13" | IOSTANDARD = LVTTL | SLEW = QUIETIO | DRIVE = 4 | TIG;

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.