Forum: FPGA, VHDL & Co. erstes FPGA Projekt unter Quartus II


von Michael W. (Gast)


Lesenswert?

Hallo !

Ich möchte mein erstes Projekt auf einem DEO Nano Board erstellen und 
bin dem User Manual gefolgt.

Das Top Level Design ist soweit fertig (zum testen ein ganz einfaches 
VHDL Entity eingebunden), das Pin Assignment ebenfalls. Nun heißt es, 
man muss ein SDC File für Time Settings erstellen.

Der Sinn dieser Aktion ist mir derzeit noch völlig unklar.

Das File enthält:
1
create_clock -period 20.000 -name CLOCK_50
2
derive_pll_clocks
3
derive_clock_uncertainty

Wrum muss ich die Clock Periode (20ns) angeben, wo doch ein 50MHz 
Oszillator fix mit dem Pin R8 verbunden ist (ich habe einen Input, der 
"CLOCK_50" heisst, und eben mit R8 verbunden ist). Wozu noch diese 
Zusatzangaben?

Was bewirken diese drei Angaben? Ich will eigentlich VHDL lernen, das 
scheint aber eine Art "Meta Information" zu sein- oder?

Wenn es funktionierte, wäre ich ja erst einmal zufrieden, jedoch sagt 
der Compiler:
1
Warning: Node: CLOCK_50 was determined to be a clock but was found without an associated clock assignment.
2
Warning: PLL cross checking found inconsistent PLL clock settings:
3
  Warning: Node: inst1|altpll_component|auto_generated|pll1|clk[0] was found missing 1 generated clock that corresponds to a base clock with a period of: 20.000
4
Warning: Virtual clock CLOCK_50 is never referenced in any input or output delay assignment.
5
Warning: The master clock for this clock assignment could not be derived.  Clock: inst1|altpll_component|auto_generated|pll1|clk[0] was not created.
6
  Warning: No clocks found on or feeding the specified source node: inst1|altpll_component|auto_generated|pll1|inclk[0]
7
Warning: Node: CLOCK_50 was determined to be a clock but was found without an associated clock assignment.
8
Warning: PLL cross checking found inconsistent PLL clock settings:
9
  Warning: Node: inst1|altpll_component|auto_generated|pll1|clk[0] was found missing 1 generated clock that corresponds to a base clock with a period of: 20.000
10
Warning: Virtual clock CLOCK_50 is never referenced in any input or output delay assignment.

Ich bin auch nicht sicher, ob Quartus das SDC File übernommen hat, denn 
bei Proccessing->analyze current file kommt die Meldung:
1
Error: File D:/altera/example/example1.sdc is not a recognized design file type

Wie komme ich hier weiter?

Danke!

von Karl (Gast)


Lesenswert?

Hallo,

du benötigst in deinem Quartus Projekt einige Zusatzinformationen über 
die Pinbelegung etc. Dazu gehört dann auch die Information welche Takte 
in den Chip gehen und mit welcher Frequenz diese ankommen. Sonst weiß 
Quartus ja nicht welche Frequenz dein "clk"-Signal hat und kann dadurch 
auch nicht entscheiden wie es die Logikelemente platzieren muss um die 
Frequenz zu ermöglichen.

Wie du schon erkannt hast definiert man alle Timing-spezifischen 
Vorgaben in einem SDC File.

create_clock -period 20.000 -name CLOCK_50
>> definiert einen Takt mit dem Namen CLOCK_50 und 50MHz, jedoch fehlt hier wohl 
die Angabe welcher Pin gemeint ist. (man spricht auch von virtuellem Takt)
derive_pll_clocks
>> Durch eine PLL werden ggf. neue Frequenzen erzeugt, die als eigenständige Takte 
analysiert werden. Mit diesem Befehl sagst du dass er die doch bitte anhand deiner 
Einstellungen im Megawizard selbst finden soll. Sonst müsstest du die alle einzeln 
angeben und das ist gelinde gesagt unschön.
derive_clock_uncertainty
>> Analog



Warning: Node: CLOCK_50 was determined to be a clock but was found 
without an associated clock assignment.
>> er hat kein constraint für deinen pin gefunden
Warning: PLL cross checking found inconsistent PLL clock settings:
  Warning: Node: inst1|altpll_component|auto_generated|pll1|clk[0] was 
found missing 1 generated clock that corresponds to a base clock with a 
period of: 20.000
Warning: Virtual clock CLOCK_50 is never referenced in any input or 
output delay assignment.
>> virtual clocks erhältst du wenn du ne clock definierst und keinen pin angibst 
(siehe oben)
Warning: The master clock for this clock assignment could not be 
derived.  Clock: inst1|altpll_component|auto_generated|pll1|clk[0] was 
not created.
  Warning: No clocks found on or feeding the specified source node: 
inst1|altpll_component|auto_generated|pll1|inclk[0]
Warning: Node: CLOCK_50 was determined to be a clock but was found 
without an associated clock assignment.
>> kein constraint auf den pin CLOCK_50 gesetzt
Warning: PLL cross checking found inconsistent PLL clock settings:
  Warning: Node: inst1|altpll_component|auto_generated|pll1|clk[0] was 
found missing 1 generated clock that corresponds to a base clock with a 
period of: 20.000
Warning: Virtual clock CLOCK_50 is never referenced in any input or 
output delay assignment.

Wenn du also an deine Taktdefinition noch den entsprechenden Port des 
Takteingangs bindest, dann sollte es fürs erste klappen.
Ich würde mal folgendes Vorschlagen:

create_clock -period 20.000 -name MY_CLOCK_50 [get_ports PIN_CLOCK_50]

siehe auch:
http://quartushelp.altera.com/12.1/mergedProjects/tafs/tafs/tcl_pkg_sdc_ver_1.5_cmd_create_clock.htm


Zu dem Problem des nicht gefundenen Files: Kompilier dein Design mal und 
schau ob er dann auch dein .sdc File nicht findet. Das sollte als 
Warning auftreten (blaue Schrift).
Das SDC File muss natürlich unter dem Settings-Fenster angegeben werden, 
dann sollte er es aber auch finden!

Grüße und viel Spaß bei den ersten Schritten :)

von Michael W. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo und vielen Dank für die ausführliche Antwort.

Ich habe mir jetzt das SCD File von einem Wizzard erzeugen lassen, und 
es funktioniert.
1
# Clock constraints
2
3
create_clock -name "CLOCK_50" -period 20.000ns [get_ports {CLOCK_50}]
4
5
# Automatically constrain PLL and other generated clocks
6
derive_pll_clocks -create_base_clocks
7
8
# Automatically calculate clock uncertainty to jitter and other effects.
9
derive_clock_uncertainty

Was heißt das nun?

create_clock erzeugt eine "clock" namens CLOCK_50 und verbindet diese 
logisch mit dem zufällig gleichnamigen Port CLOCK_50 meines Modells 
(siehe Bild)?

Du schreibst:

Dazu gehört dann auch die Information welche Takte
in den Chip gehen und mit welcher Frequenz diese ankommen. Sonst weiß
Quartus ja nicht welche Frequenz dein "clk"-Signal hat und kann dadurch
auch nicht entscheiden wie es die Logikelemente platzieren muss um die
Frequenz zu ermöglichen.

Ich habe aber ja auch noch einen anderen Eingangspin KEY. Warum ist es 
hier nicht notwendig etwas darüber zu sagen, mit welcher Frequenz 
Signale hier ankommen? Ich könnte dort ja auch etwas sehr hochfrequentes 
einspeisen. Warum muss Quartus bei dem einen wissen, um welche Frequenz 
es sich handelt, und beim anderen nicht?


Du schreibst weiter:

derive_pll_clocks

Durch eine PLL werden ggf. neue Frequenzen erzeugt, die als 
eigenständige Takte analysiert werden. Mit diesem Befehl sagst du dass 
er die doch bitte anhand deiner  Einstellungen im Megawizard selbst 
finden soll.

Die PLL ist doch eine eigene VHDL-Komponente, die durch ein Modell 
beschrieben wird. Der Ausgang liefert eine Frequenz, die auf ein Zehntel 
der Eingangsfrequenz reduziert ist. Warum muss man nun extra angeben, 
dass sich Quartus darum kümmert? Ich habe das nicht verstanden. Wodurch 
unterscheidet sich ein PLL von anderen Komponenten (z.B. meinen Counter, 
wo ich ja auch nichts angeben muss)? Hätte ich den "PLL" (oder eben 
einen Frequenzteiler) selbst in VHDL entworfen, müsste ich ja auch 
nichts extra angeben, dass Quartus die Ausgangsfrequenz erst findet.

Das ganze ist noch etwas diffus für mich...

Danke + Liebe Grüße,
michael

von Karl (Gast)


Lesenswert?

Ich habe aber ja auch noch einen anderen Eingangspin KEY. Warum ist es
hier nicht notwendig etwas darüber zu sagen, mit welcher Frequenz
Signale hier ankommen? Ich könnte dort ja auch etwas sehr hochfrequentes
einspeisen. Warum muss Quartus bei dem einen wissen, um welche Frequenz
es sich handelt, und beim anderen nicht?

>> Es ist nur notwendig die Takte zu definieren. Du kannst bei anderen 
Inputs/Outputs andere Constraints setzen wie z.B. max-/min delay, zeitliche 
Relationen zu Taktsignale usw. Es reicht aber wenn du ihm sagst was dein Takt ist 
denn alle Daten werden ja mit diesem Takt verarbeitet.


Die PLL ist doch eine eigene VHDL-Komponente, die durch ein Modell
beschrieben wird. Der Ausgang liefert eine Frequenz, die auf ein Zehntel
der Eingangsfrequenz reduziert ist. Warum muss man nun extra angeben,
dass sich Quartus darum kümmert? Ich habe das nicht verstanden.
>> Quartus erkennt zwar teilweise vom Nutzer in VHDL genutzte Takte. Um sauber zu 
sein sollteste du diese allerdings auch definieren und das macht diese Kommando 
eben automatisch für dich. Siehe auch: 
http://quartushelp.altera.com/12.1/mergedProjects/tafs/tafs/tcl_pkg_sdc_ext_ver_1.0_cmd_derive_pll_clocks.htm

unterscheidet sich ein PLL von anderen Komponenten (z.B. meinen Counter,
wo ich ja auch nichts angeben muss)?
>> Ja
Hätte ich den "PLL" (oder eben einen Frequenzteiler) selbst in VHDL 
entworfen, müsste ich ja auch nichts extra angeben, dass Quartus die 
Ausgangsfrequenz erst findet.
>> Kommt drauf, an unter Umständen schon. Das sind aber schon Detailfragen die man 
eben ausprobieren müsste. Man erzeugt sich seinen Takt allerdings auch nicht in 
der Logik sondern nimmt - wenn irgendwie möglich - den Takt der aus einer PLL 
kommt.

Kompilier mal dein Projek und starte den Timequest. Dann lasst du dir 
mal die Reports erstellen (links unten im Menü weit unten "Repoert ALL" 
oder sowas und schau die alle Taktsignale an. Nun probier es mal 
mit/ohne dem derive-Kommando aus.

Alternativ kann ich dir die Online-Trainings-Videos von Altera ans Herz 
legen. Die sind eigentlich recht gut und du erhältst in kurzer Zeit nen 
schönen Einstieg in die Thematik FPGA.

Grüße

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.