Hallo.
Ich entwickle mit Altera QuartusII und in meinem FPGA-Design kommen
folgende Takte vor:
Externer Takt mit 40MHz. Dieser wird mittels PLL in einem 100MHz-Takt,
der den Systemtakt darstellt, gewandelt.
Mehrere Module (mit den FPGAs drauf) sind mittels
DaisyChain-Verschaltung über eine serielle Schnittstelle verbunden.
Genauer gesagt: Die Datenleitungen werden gedaisychained, der Takt der
Schnittstelle erreicht alle Module einzeln.
Um Jitter durch die zueinander asynchron laufenden Module gering zu
halten, musste ich den Takt der Schnittstelle (ich nenne es jetzt SCLK)
als Clockdomain für den Kommunikationsteil verwenden damit die Module
gleichzeitig die Daten weiterschieben.
Ich habe das vor längerer Zeit schon mal constrained, sodass es keine
Timing-Verletzung gab.
Jetzt habe ich einige Module in einen eigenen Wrapper gesteckt, um nur
diesen testen zu können. In diesen Modulen wird nur der Systemtakt
verwendet. Das Kommunikationsmodul mit dem Clock-Domain-Crossing blieb
unangetastet.
Ich staunte, als ich plötzlich
1.) mehr LE brauchte und
2.) das Timing nicht mehr passte.
Während der Synthese braucht er gleich viele Ressourcen, aber letztlich
ändert sich das, da versucht wird das Timing zu schaffen, da es jetzt
nicht mehr passt.
Ich dachte, dann dass es daran liegt, dass sich intern die Namen
geändert haben und wollte das sdc-File neu machen bzw überarbeiten.
Irgendwie bin ich gerade nicht imstande, dass zu tun:
1 | # base clocks
|
2 | create_clock -name { InClk_40MHz } -period 25.000 -waveform { 0.000 12.500 } [get_ports { InClk_40MHz }]
|
3 | create_clock -name { ispiClk } -period 62.500 -waveform { 0.000 31.25 } [get_ports { ispiClk }] -add
|
4 |
|
5 | derive_pll_clocks
|
6 | derive_clock_uncertainty
|
7 |
|
8 | # use the derived pll clock and name it "sysClk"
|
9 | set sysClk { PLL_inst|altpll_component|pll|clk[0] }
|
10 |
|
11 | # pfade trennen
|
12 | set_clock_groups -exclusive -group { ispiClk } -group { InClk_40MHz }
|
13 | set_clock_groups -exclusive -group { ispiClk } -group { PLL_inst|altpll_component|pll|clk[0] }
|
Wenn ich mir mit dem TimeQuestAnalyzer die Clocks reporten lasse, dann
werden alle 3 Clocks aufgelistet. Als Warnung kommt aber beim Ausführen:
Warning: At least one of the filters had some problems and could not be
matched.
Warning: ispiClk could not be matched with a clock.
Warning: At least one of the filters had some problems and could not be
matched.
Warning: InClk_40MHz could not be matched with a clock.
Warning: Ignored assignment: set_clock_groups -exclusive -group
[get_clocks { ispiClk }] -group [get_clocks { InClk_40MHz }]
Warning: Argument -group with value [get_clocks { ispiClk }] contains
zero elements
Warning: Argument -group with value [get_clocks { InClk_40MHz }]
contains zero elements
Auch wenn ich über die GUI mir die Constrains zusammenklicke, kommt das
heraus. Ich habe mir einige Unterlagen dazu schon zu Gemüte geführt,
allerdings nutzen mir auch die Examples nicht.
Ich werde mir mal einen Online-Kurs ansehen/wiederholen...
Mich hat das schon öfters verwundert mit den ganzen cells, pins, ports,
usw. und wann man was verwenden darf/soll/muss.
Kann mir jemand mit mehr sdc-Erfahrung einen Tipp geben, wie ich das
hinbekommen kann oder welche Unterlagen ich bemühen konnte?
Verwende ich derive_pll_clocks korrekt? Sprich kann ich nach dem
Kommando das machen: set sysClk { PLL_inst|altpll_component|pll|clk[0] }
?
LG, Matthias