Hallo,
ich hatte in einem anderen Posting ein Problem beschrieben, dass
gentrennte Prozesse, die mit unterschiedlichen Clock-Frequenzen getaktet
werden, Probleme machten bzw. das Ganze hat nicht funktioniert. Ich habe
nun auch mal anstelle des DCM alternativ den Systemtakt vom Board und
einen zweiten Takt, den ich mit einem digitalen Ringoszillator
generiere, für diesen Code verwende.
Hier habe ich das selbe seltsame Resultat. Sobald mehrere Taktfrequenzen
in irgendeiner beliebigen Form im Spiel sind, funktioniert nichts mehr.
Das geht sogar soweit, dass ein VHDL Code, der einfach den Systemtakt
herunterteilt und eine LED blinken läßt, plötzlich nicht mehr
funktioniert wenn eine weitere Architektur ins Spiel kommt, auf der ein
weiterer Takt generiert wird (z.B. mit dem Ringoszillator). Selbst dann,
wenn diese zusätzliche Architektur logisch völlig getrennt und in sich
gekapselt ist, d.h. keinerlei Verbindungen zur "Außenwelt" bestehen!!!
Selbst das einfache Auskommentieren einer Zuweisung eines Signals zu
einem Port mit einer LED verursacht seltsame Effekte, obwohl das Signal
von allem Anderen getrennt ist.
Mittlerweile habe ich starke Bedenken, dass der FPGA auf meinem Board
irgendwelche internen Defekte hat und nicht korrekt funktioniert. Das
wäre die einzige logische Erklärung für die Probleme, die ich schon bei
relativ einfachen Teststellungen erlebe. Es gibt zwar von Digilent
Testroutinen für mein Board (Digilent Nexys3), aber diese überprüfen nur
die Peripherie. Also ob z.B. alle LEDS und Schalter richtig
funktionieren und ob Ein- und Ausgänge des FPGA keine Kurzschlüsse
untereinander oder zur Masse hin haben. Desweiteren kann man die
Speicherbausteine auf dem Board prüfen. Aber das alles sagt ja nichts
über die 100%ige Funktionsfähigkeit des FPGA aus.
Gibt es eigentlich irgendwelche Testmöglichkeiten, um so einen FPGA
(Spartan 6) komplett durchchecken zu können? Oder zumindest
irgendwelche Teststellungen als VHDL Code, die eine relativ hohe
Auslastung bzw. Ausnutzung der vorhandenen LUTS und der weiteren
Logikblöcke erreichen um so eine Aussage über deren Zustand bzw.
Funktionsfähigkeit zu erhalten?
Wenn der FPGA wirklich eine Macke haben sollte, würde ich das Board
gerne beim Händler reklamieren. Dazu muß ich solch einen Defekt
allerdings nachweisen können.
Vielen Dank für Eure Hilfe!
Beste Grüße,
Norbert
Norbert schrieb:> ich hatte in einem anderen Posting ein Problem beschrieben
Siehe den Beitrag "Anfänger hat Probleme mit parallelen Prozessen"> Selbst dann, wenn diese zusätzliche Architektur logisch völlig getrennt> und in sich gekapselt ist, d.h. keinerlei Verbindungen zur "Außenwelt"> bestehen!!!
Dann sollte das ganze Zeug eigentlich einfach rausoptimiert werden...
Probiers doch einfach mal so: nimm Taster als Taktquelle und lass damit
eine LED toggeln. Klar prellen die Taster, aber man erkennt wenigstens,
ob sich überhaupt was tut...
Schau doch mal in den Place&route resp Map report für ein
funkrtionierendes und für ein nichtfunktionierendes design. Gut
möglich, das durch einen schaltfehler (reset permanent Aktiv) alles
wegoptimiert wird und daher der FPGA nix tut.
Zitat:
Hier habe ich das selbe seltsame Resultat. Sobald mehrere Taktfrequenzen
in irgendeiner beliebigen Form im Spiel sind, funktioniert nichts mehr.
Das geht sogar soweit, dass ein VHDL Code, der einfach den Systemtakt
herunterteilt und eine LED blinken läßt, plötzlich nicht mehr
funktioniert wenn eine weitere Architektur ins Spiel kommt, auf der ein
weiterer Takt generiert wird (z.B. mit dem Ringoszillator). Selbst dann,
wenn diese zusätzliche Architektur logisch völlig getrennt und in sich
gekapselt ist, d.h. keinerlei Verbindungen zur "Außenwelt" bestehen!!!
Selbst das einfache Auskommentieren einer Zuweisung eines Signals zu
einem Port mit einer LED verursacht seltsame Effekte, obwohl das Signal
von allem Anderen getrennt ist.
Hallo Lothar,
ehrlich gesagt, ich glaube, ich habe heute einen schlechten Tag.
Ich verwende folgende Source
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
4
entitytestis
5
port(
6
Btn1:instd_logic;
7
Led1:outstd_logic
8
);
9
endtest;
10
11
architectureBehavioraloftestis
12
13
signalsig1:std_logic:='0';
14
15
begin
16
processbegin
17
waituntil(Btn1'eventandBtn1='1');
18
if(Btn1='1')then
19
sig1<=notsig1;
20
endif;
21
endprocess;
22
Led1<=sig1;
23
24
endBehavioral;
und folgende UCF Definition
1
NET"Btn1"LOC="B8"|IOSTANDARD="LVCMOS33";
2
NET"Led1"LOC="U16"|IOSTANDARD="LVCMOS33";
Der Synthesizer läuft ohne Warnungen und Fehler durch und bei Place &
Route kommt dann folgende Fehlermeldung:
ERROR:Place:1108 - A clock IOB / BUFGMUX clock component pair have been
found that are not placed at an optimal clock IOB / BUFGMUX site pair.
The clock IOB component <Btn1> is placed at site <B8>. The corresponding
BUFG component
<Btn1_IBUF_BUFG> is placed at site <BUFGMUX_X2Y3>. There is only a
select set of IOBs that can use the fast path to the Clocker buffer, and
they are not being used. You may want to analyze why this problem exists
and correct it.
If this sub optimal condition is acceptable for this design, you may use
the CLOCK_DEDICATED_ROUTE constraint in the .ucf file to demote this
message to a WARNING and allow your design to continue. However, the use
of this override is highly discouraged as it may lead to very poor
timing results. It is recommended that this error condition be corrected
in the design. A list of all the COMP.PINs used in this clock placement
rule is listed below. These ERROR:Pack:1654 - The timing-driven
placement phase encountered an error.
Sicherlich mag ISE es nicht, wenn man ihm einen Taster als Systemtakt
verkaufen möchte. Ich würde ja noch weitere Prozesse mit Buttons und
LEDs einbauen aber zunächst muß das hier mal gelöst werden.
Habe ich irgendwo ein Komma oder einen Punkt vergessen? Durch sowas
sollen ja schon Weltraumraketen abgestürzt sein ;-)
Beste Grüße,
Norbert
Lothar Miller schrieb:> led0 <= not led0 when rising_edge(taster0);
Das konnte ich übrigens so nicht übernehmen weil es nicht dem VHDL93
Standard entspricht.
> Sicherlich mag ISE es nicht, wenn man ihm einen Taster als Systemtakt> verkaufen möchte. Ich würde ja noch weitere Prozesse mit Buttons und> LEDs einbauen aber zunächst muß das hier mal gelöst werden.
Woher soll denn die ISE wissen, was da außen am FPGA angeklemmt ist?
> Habe ich irgendwo ein Komma oder einen Punkt vergessen? Durch sowas> sollen ja schon Weltraumraketen abgestürzt sein ;-)
Nein, was du falsch gemacht hast, steht in dem sehr ausführlichen
Report, den du selbst gepostet hast.
Du hast den Takt auf einen Eingang gemapped, der nicht als Takteingang
geeignet ist. Es geht zwar trotzdem, aber, mal laienhaft ausgedrückt,
nicht so gut. Was dagegen zu unternehmen ist, steht auch gleich noch
dabei.
Vielleicht überlegst du dir ja nochmal, ob es doch zielführend sein
kann, Reports zu lesen, auch wenn du in deinem anderen Thread da anderer
Meinung warst.
>Woher soll denn die ISE wissen, was da außen am FPGA angeklemmt ist?
Du hast selbst weiter unten die Antwort auf diese Frage gegeben.
Irgendwie hats schon bemerkt, dass es kein Takteingang ist.
>> Habe ich irgendwo ein Komma oder einen Punkt vergessen? Durch sowas>> sollen ja schon Weltraumraketen abgestürzt sein ;-)>Nein, was du falsch gemacht hast, steht in dem sehr ausführlichen>Report, den du selbst gepostet hast.
Ok, das war jetzt eine ironische Bemerkung. Leider gibts keinen
entsprechenden Tag um sowas entsprechend zu kennzeichnen.
>Du hast den Takt auf einen Eingang gemapped, der nicht als Takteingang>geeignet ist. Es geht zwar trotzdem, aber, mal laienhaft ausgedrückt,>nicht so gut. Was dagegen zu unternehmen ist, steht auch gleich noch>dabei.
Ja, indem man einen CLOCK_DEDICATED_ROUTE Constraint in die UCF-Datei
einfügt. Ich hab das schon gelesen. Aber da ich nicht genau weiß, was
das ist und was es bewirkt, habe ich es nicht getan. Wie bereits
erwähnt, ich beschäftige mich gerade mal einen Monat mit dem Thema. Da
kann man noch nicht alles wissen.
>Vielleicht überlegst du dir ja nochmal, ob es doch zielführend sein>kann, Reports zu lesen, auch wenn du in deinem anderen Thread da anderer>Meinung warst.
Jawohl Chef ;-)
Mach ich!
Norbert schrieb:> Ja, indem man einen CLOCK_DEDICATED_ROUTE Constraint in die UCF-Datei> einfügt. Ich hab das schon gelesen. Aber da ich nicht genau weiß, was> das ist und was es bewirkt, habe ich es nicht getan.
Naja, das solltest du aber mal machen... Ein CLOCK Tree ist etwas
fundamental anderes als Logikverdrahtung. Guck mal in die Datenblaetter
deines FPGA und staune, wenn das so eine 'H-Struktur' ueber das ganze
Chip gelegt wird. Das musst du halt entweder wissen oder auch
(schmerzhaft) lernen...
Norbert schrieb:>>Woher soll denn die ISE wissen, was da außen am FPGA angeklemmt ist?>> Du hast selbst weiter unten die Antwort auf diese Frage gegeben.> Irgendwie hats schon bemerkt, dass es kein Takteingang ist.
Leider falsch. "Takt" meint nicht, dass es ein intermettierendes,
wiederkehrendes Signal sein muss, sondern Takt meint, dass dieser Pin
auf einen dedizierten Clock-Tree geroutet werden kann, der dann wiederum
auf den CLK-Eingang der Register führt.
Daher habe ich die Frage nicht, wie du sagst, weiter unten selbst
beantwortet, sondern du hast nicht verstanden, was damit gemeint ist.
TAKT bedeutet lediglich, dass das an diesem Port anstehende Signal zum
Takten der internen Register genutzt wird. Und das hat sie Synthese auch
richtig erkannt und dich darauf hingewiesen, dass der Port, den du dafür
verwendest eher ungeeeignet ist und du deswegen damit rechnen musst,
dass es eventuell zu Problemen führen kann.
Was die Synthese aber nicht weiss und was ihr auch vollkommen egal ist,
ist die Tatsache, ob du den Takt mit einem Oszillator oder einem ollen
Lichtschalter machst..
Norbert schrieb:> Ja, indem man einen CLOCK_DEDICATED_ROUTE Constraint in die UCF-Datei> einfügt.
Auch falsch. Damit beseitigst du nicht das Problem, sondern sagst des
Synthese lediglich, dass du weisst, dass es zu einem Problem führen
kann, es dir aber vollkommen hupe ist und sie dich nicht weiter damit
nerven soll.. Lese doch einfach den Report zuende.
Was hilft ist, den Eingang auf einen Port zu routen, der mit dem
Clocktree verbunden werden kann. Welche das sind, das verrät dir das
Datenblatt
Norbert schrieb:> Jawohl Chef ;-)> Mach ich!
Ne, nicht Chef, aber ich begreife ganz ehrlich nicht, warum du hier um
Hilfe schreist, aber dann denjenigen, die dich um weiterführende
Inforamtioen bitten, diese vorenthältst. Stattdessen machst du wilde
weitere Exprimente und veruchst, das Problem empirisch irgendwie
einzukreisen. Ich bin da eher der Fan von einer strukturierten
Vorgehensweise. Aber gut, jeder hat da einen anderen Stil.
berndl schrieb:> Naja, das solltest du aber mal machen... Ein CLOCK Tree ist etwas> fundamental anderes als Logikverdrahtung. Guck mal in die Datenblaetter> deines FPGA und staune, wenn das so eine 'H-Struktur' ueber das ganze> Chip gelegt wird. Das musst du halt entweder wissen oder auch> (schmerzhaft) lernen...
Da gibts so ein schönes Trainigsvideo auf der Xilinx Website, wo ein
netter Herr eine geschlagene dreiviertel Stunde über dieses Thema
(Spartan6 Clocking Ressources) referiert. Da geht es ziemlich ins
Eingemachte und ich kann mir ungefähr vorstellen, was Du mir damit sagen
willst. Ist wohl eine Wissenschaft für sich.
@Norbert: setz einfach den Constraint und sei dir bewusst, dass die
Taktverteilung dann ungünstig ist, für einen Test aber trotzdem reicht.
Und sieh dir mal deinen Code an und beantworte dir die Frage, warum und
ob da zweimal auf btn='1' abgefragt werden muss...
Man kann im Allgemeinen von einem Pin über einen BUFG gehen und von dort
in das Taktnetz. Das ist auch das, was Xilinx baut, wenn man das
dedicate route constraint von oben verwendet. Man hat dann nur ein
skew-Problem und weniger Taktreserve für high speed Anwendungen sowie
leider etwas mehr Jitter.
Zur Prüfung eines FPGA einfach alle Ausgänge an eine lange Registerkette
legen und per Timer durchzählen. Dann hat man wenigstens mal die
Ausgänge und die Ladefunktion gecheckt.
Lothar Miller schrieb:> @Norbert: setz einfach den Constraint und sei dir bewusst, dass die> Taktverteilung dann ungünstig ist, für einen Test aber trotzdem reicht.>> Und sieh dir mal deinen Code an und beantworte dir die Frage, warum und> ob da zweimal auf btn='1' abgefragt werden muss...
Hallo Lothar,
das mit der zweiten Abfrage ist natürlich Unsinn. Ich habs mal so
gemacht.
Leider funktioniert es nicht. Bestimmt wieder ein Fehler.
1) mich würde mal noch interessieren, was du mit "Ringoszillator"
gemeint, bzw. realisiert hast?
2) Hast du Timing Constraints angegeben? Gerade bei "blos" eine Led
Blinken lassen steckt dahinter ein Zähler, dass eine etwas längere carry
chain nach sich ziehen kann. Timing kann hier kritisch sein. Ohne Timing
Constrains zwingst du die Synthese nicht in seine Schranken!
Lothar Miller schrieb:> Was ist "es"?
Naja, in der PAD-Datei steht bei den constraints überall unlocated. Ich
weiß auch nicht genau, wie dieser CLOCK_DEDICATED_ROUTE Eintrag in der
UCF-Datei aussehen muß. Ist das evtl so richtig?
NET "<Pin-Name>" CLOCK_DEDICATED_ROUTE = FALSE;
Wo kann ich nachschauen um die Ursachen dieser unlocated Fehler zu
finden?
Danke für die Hinweise.
Gruß, Norbert
Poste doch mal bitte endlich mal die Report Dateien.
Synthesis Report *.syr
Mapping Report *.mrp
Place and Route Report *.par
Und die pad.txt Datei zum Vergleich. Dann muss man nicht so rätseln.
Christian R. schrieb:> Poste doch mal bitte endlich mal die Report Dateien.
Sorry, ich wußte nicht welche von den vielen Dateien relevant sind.
Hier sind sie.
Norbert schrieb:>> Naja, das solltest du aber mal machen... Ein CLOCK Tree ist etwas>> fundamental anderes als Logikverdrahtung. Guck mal in die Datenblaetter>> deines FPGA und staune, wenn das so eine 'H-Struktur' ueber das ganze>> Chip gelegt wird. Das musst du halt entweder wissen oder auch>> (schmerzhaft) lernen...>> Da gibts so ein schönes Trainigsvideo auf der Xilinx Website, wo ein> netter Herr eine geschlagene dreiviertel Stunde über dieses Thema> (Spartan6 Clocking Ressources) referiert. Da geht es ziemlich ins> Eingemachte und ich kann mir ungefähr vorstellen, was Du mir damit sagen> willst. Ist wohl eine Wissenschaft für sich.
also ueberleg mal: Idealerweise bekommen alle FFs in deinem FPGA den
gleichen Takt, z.B. 10ns. Gefuettert wird der D-Eingang des FFs mit
irgendwelcher Logik, die halt 'Laufzeit' braucht. Was willst du also
haben: Alle FFs sehen den Takt zur gleichen Zeit. Dafuer ist der
sogenannte Clock-Tree da. Und nur damit kann die Toolchain auch
berechnen, ob deine fliegende Logik, die in den D-Eingang will, das
Timing schafft.
Wenn du jetzt ueber 'normale' Logikverdrahtung den Takt an ein oder
(noch schlimmer) mehrere FFs bringst, dann kannst du dieses
Zeitverhalten nicht mehr oder nur noch schwer vorhersagen, du hast also
einfach am FF mehr Jitter.
Einfach im Datenblatt mal die Anordnung des Clock-Tree und auch die
Anordnung der sog. 'routing resources' anschauen.
Hm, entweder ist die UCF Datei falsch, oder nicht korrekt ins Design
eingebunden. Bis auf die Pin-Zuweisung sieht alles soweit korrekt aus.
Poste mal bitte noch die bld Datei und die UCF Datei. Da scheint was
nicht zusammen zu passen. Wird die UCF Datei im Projekt Navigator ganz
unten angezeigt?
Christian R. schrieb:> Hm, entweder ist die UCF Datei falsch, oder nicht korrekt ins Design> eingebunden. Bis auf die Pin-Zuweisung sieht alles soweit korrekt aus.> Poste mal bitte noch die bld Datei und die UCF Datei. Da scheint was> nicht zusammen zu passen. Wird die UCF Datei im Projekt Navigator ganz> unten angezeigt?
Hallo Christian,
vielen Dank für den Hinweis. Die UCF-Datei war nicht richtig
eingebunden. Da hatte ich irgendwie was falsch gemacht. Ich habe die
UCF-Datei rausgeworfen und nochmal eine neue erstellt. Sie lag im
Projekt Navigator nicht unterhalb des Top Level Objekts, sondern auf der
selben Ebene. Jetzt sind alle Pins in der PAD-Datei als LOCATED markiert
und das Ganze läuft wie erwartet. Wegen der CLOCK_DEDICATED_ROUTE
Direktive bekomme ich Warnungen aber ich denke mal, dass die so ok sind.
Dass die Buttons so ab und zu prellen weil hier keine Entprellung
vorliegt ist auch klar, das wurde ja schon erwähnt. Aber es
funktioniert.
Vielen Dank für die Unterstützung! Erst muß man mal mit den kleinen
Sachen zurecht kommen um überhaupt ein Gefühl für die ganze Sache zu
erhalten.
Alleine hier habe ich schon viel gelernt. Z.B. welche Dateien es gibt,
die wichtige Diagnoseinformationen über den Vorgang enthalten und wo man
mal hineinschauen sollte, wenn etwas nicht wie erwartet funktioniert.
Beste Grüße,
Norbert
Na prima, wenn es jetzt klappt. Das mit der ucf Datei ist manchmal
seltsam, ich hatte auch schon oft, dass die nicht als zum Projekt
gehörend drin war. Weiß der (Xilinx-)Geier wieso. Du wirst noch auf sehr
viele Merkwürdigkeiten bei ISE und Co stoßen. Die kriegen das bis heute
z.B. nicht auf die Reihe, Packages in der Projektübersicht anzuzeigen.
Aber damit lernt man leben ;)