Hallo,
sicherlich mache ich hier irgendeinen dummen Anfängerfehler aber
momentan komme ich nicht weiter und weiß auch nicht warum. Im folgenden
VHDL Code werden per DCM zwei verschiedene Taktsignale (100MHz und
200MHz) erzeugt. Diese werden in zwei parallelen Prozessen
heruntergeteilt und sollen zwei LEDs mit jeweils unterschiedlichem Takt
blinken lassen.
Das Seltsame ist, kommentiere ich einen der beiden Prozesse aus und
synthetisiere das Ganze, läuft es wie erwartet. D.h. die jeweils
angesteuerte LED blinkt im erwarteten Takt. Synthetisiere ich das Ganze
jedoch mit beiden Prozessen funktioniert nichts. Es kommen auch keine
Warnungen oder Fehlermeldungen.
Hier gibts sicherlich Fachleute, die mein Problem auf den ersten Blick
erkennen und mir helfen können. Vielen Dank schon mal dafür.
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.NUMERIC_STD.ALL;
4
5
entityBlinkledis
6
port(clk:instd_logic;
7
rst:instd_logic;
8
Led1:outstd_logic;
9
Led2:outstd_logic
10
);
11
endBlinkled;
12
13
architectureBehavioralofBlinkledis
14
15
signalc1:integerrange0to49999999:=0;-- 0,5s bei 100MHz fosc
16
signalx1:std_logic:='0';
17
signalc2:integerrange0to49999999:=0;-- 0,25s bei 200MHz fosc
18
signalx2:std_logic:='0';
19
signalclk1:std_logic;
20
signalclk2:std_logic;
21
22
componentmod_dcm
23
port
24
(-- Clock in ports
25
CLK_IN1:instd_logic;
26
-- Clock out ports
27
CLK_OUT1:outstd_logic;
28
CLK_OUT2:outstd_logic;
29
-- Status and control signals
30
RESET:instd_logic
31
);
32
endcomponent;
33
34
begin
35
inst_mod_dcm:mod_dcm
36
portmap
37
(-- Clock in ports
38
CLK_IN1=>clk,
39
-- Clock out ports
40
CLK_OUT1=>clk1,
41
CLK_OUT2=>clk2,
42
-- Status and control signals
43
RESET=>rst);
44
45
processbegin
46
waituntilrising_edge(clk1);-- warten bis zum nächsten Takt
47
if(c1<49999999)then-- 0…49999999 = 100000000 Takte = 1/2 Sekunde bei 100MHz
48
c1<=c1+1;-- wenn kleiner: weiterzählen
49
else-- wenn Zählerende erreicht:
50
c1<=0;-- Zähler zurücksetzen
51
x1<=notx1;-- und Signal x1 togglen
52
endif;
53
endprocess;
54
Led1<=x1;-- Signal x1 an Led1 ausgeben
55
56
processbegin
57
waituntilrising_edge(clk2);-- warten bis zum nächsten Takt
58
if(c2<49999999)then-- 0…49999999 = 100000000 Takte = 1/4 Sekunde bei 200MHz
59
c2<=c2+1;-- wenn kleiner: weiterzählen
60
else-- wenn Zählerende erreicht:
61
c2<=0;-- Zähler zurücksetzen
62
x2<=notx2;-- und Signal x2 togglen
63
endif;
64
endprocess;
65
Led2<=x2;-- Signal x2 an Led2 ausgeben
66
67
endBehavioral;
Vielen Dank schon mal für Eure Hilfe!
Beste Grüße,
Norbert
Ich bin jetzt nicht so der VHDL-Spezi aber musst Du deinen Prozessen
nicht eindeutige Namen geben?
Also
blink_led_1: process
begin
...
end process;
und
blink_led_2: process
begin
...
end process;
V. Baumann schrieb:> Ich bin jetzt nicht so der VHDL-Spezi aber musst Du deinen Prozessen> nicht eindeutige Namen geben?
Ich weiß nicht. Ich glaube eigentlich nicht. Auf der Website von Lothar
Miller gibts Beispiele bei denen das nicht so ist. Siehe hier z.B. die
Stoppuhr in VHDL:
http://www.lothar-miller.de/s9y/
V. Baumann schrieb:> Und ist ne sensitivity list in diesem fall nicht auch notwendig?
Auf diese Frage hat mir der Synthesizer schon die passende Antwort
gegeben:
"Process cannot have both a wait statement and a sensitivity list."
Daher denke ich mal, dass das so ok ist. Oder etwa nicht?
V. Baumann schrieb:> Ich bin jetzt nicht so der VHDL-Spezi aber
... muss unbedingt meinen Senf dazu geben. OK, zu erkennen, dass man
selber keine Ahnung hat ist schonmal eine wichtige Fähigkeit. Bravo!
Zweiter Schritt: Überlegen, was sich daraus für Konsequenzen ergeben.
Wie zum Beispiel, einfach mal die Klappe halten, wenn man keine Ahnung
hat. Das übst du jetzt besser nochmal.
Man darf ruhig mal Raten, auch wenn das nicht von Rat kommt. Das Problem
hier hat allerdings nichts mit VHDL an sich zu tun...
Wenn die beiden Takte unabhängig voneinander funktionieren, dann wäre es
interessant, ob die Leds auch blinken, wenn auf beide Takte der selbe
DCM Ausgang gelegt wird. Wie sieht die DCM Instantiierung aus? Was
passiert, wenn du den Reset anlegst? Mit welchem Takt gehst du in den
DCM rein? Kannst du dir mal das locked Siganl des DCM anzeigen?
Klaus schrieb:> V. Baumann schrieb:>> Ich bin jetzt nicht so der VHDL-Spezi aber>> ... muss unbedingt meinen Senf dazu geben. OK, zu erkennen, dass man> selber keine Ahnung hat ist schonmal eine wichtige Fähigkeit. Bravo!> Zweiter Schritt: Überlegen, was sich daraus für Konsequenzen ergeben.> Wie zum Beispiel, einfach mal die Klappe halten, wenn man keine Ahnung> hat. Das übst du jetzt besser nochmal.
Äh.. hallo? Was ist dir denn über die Leber gelaufen?? Man kann doch mal
eine Vermutung äußern! Und ich habe sie ja extra als Frage formuliert,
weil ich mir nicht sicher bin und man gerne darüber diskutieren kann -
also trag' doch lieber was Konstruktives bei!
Hallo Lothar
> Wenn die beiden Takte unabhängig voneinander funktionieren, dann wäre es> interessant, ob die Leds auch blinken, wenn auf beide Takte der selbe> DCM Ausgang gelegt wird.
Diese Frage verstehe ich nicht so ganz. Bei dem Port-Mapping kann ich
jeweils nur 1:1 Zuweisungen machen. Wenn ich bei beiden Prozessen "wait
until rising_edge(clk1)" eintrage (wovon ich annehme, dass es das ist,
was Du meinst), habe ich das selbe Ergebnis, es funktioniert nicht.
>Wie sieht die DCM Instantiierung aus?
Ich füge mal das Listing des funktionalen Modells des DCM ganz unten
ein. Dir sagt das sicherlich mehr als einem Anfänger wie mir.
>Was passiert, wenn du den Reset anlegst?
Seltsamerweise nichts. D.h. wenn ich einen der Prozesse auskommentiere
und dann das Ganze synthetisiere und in mein Board lade, blinkt ja
zumindest eine LED, so wie gewünscht. Ich habe mal folgendes ergänzt ...
1
port
2
(
3
...
4
-- Status and control signals
5
RESET:instd_logic:='1'
6
);
... um RESET zwangsweise auf '1' (oder '0') zu legen aber es macht
keinen Unterschied. Die LED blinkt munter weiter. Das erstaunt mich
jetzt aber.
>Mit welchem Takt gehst du in den DCM rein?
Mit dem Systemtakt (100MHz), gepuffert.
>Kannst du dir mal das locked Siganl des DCM anzeigen?
Uff, jetzt übersteigt es meine Kenntnisse und Fähigkeiten. Du meinst,
mit Chipscope oder so? Ich weiß nicht, ob ich das mit der kostenlosen
Webpack-Version überhaupt nutzen kann.
Also hier jedenfalls mal das Listing des funktionalen DCM Modells.
Vielleicht sieht man ja hier welchen Unsinn ich verbockt habe ;-)
Jedenfalls schon mal vielen Dank für Deine Hilfe. Nur mal nebenbei
bemerkt, ich finde Deine Website wirklich klasse. Die Beispiele haben
mir schon sehr geholfen. Aber dass ich dort abgekupfert hab, hast Du ja
sicherlich schon bemerkt :-)
Beste Grüße,
Norbert
Norbert schrieb:> Also hier jedenfalls mal das Listing des funktionalen DCM Modells.
Wer hat denn da die ganzen Clockbuffer reingebastelt? Sind die alle
nötig? Das macht die Toolchain üblicherweise von sich aus...
>> Kannst du dir mal das locked Siganl des DCM anzeigen?> Uff, jetzt übersteigt es meine Kenntnisse und Fähigkeiten.
Du nimmst das Signal locked_internal und gibst es über einen zu
definierenden Port an ein LED aus...
> Wenn ich bei beiden Prozessen "wait until rising_edge(clk1)" eintrage> (wovon ich annehme, dass es das ist, was Du meinst), habe ich das selbe> Ergebnis, es funktioniert nicht.
Das ist nurn wirklich kurios. Sieh dir mal die "Technology Schematic"
deines Designs an und kontrollier, ob du alle erwarteten Komponenten
findest...
Norbert schrieb:> Es kommen auch keine Warnungen oder Fehlermeldungen.
Oft ist eine lapidare "Info" der einzige Hinweis auf einen kapitalen
Fehler...
Lothar Miller schrieb:> Norbert schrieb:>> Also hier jedenfalls mal das Listing des funktionalen DCM Modells.> Wer hat denn da die ganzen Clockbuffer reingebastelt? Sind die alle> nötig? Das macht die Toolchain üblicherweise von sich aus...
Neenee, jedenfalls nicht wenn man den DCM manuell instanziiert. Beim
Core Generator kann man das anklicken, aber ansonsten muss man sich
darum selber kümmern.
hast du den gleichen Effekt, wenn du wahlweise den einen oder den
anderen Prozess auskommentierst?
Sprich:
clk1-Prozess auskommentiert, dann funktioniert clk2-Prozess
clk2-Prozess auskommentiert, dann funktioniert clk1-Prozess
Auch wenn alles "sauber" aussieht, das Output-Buffering in der DCM
erfolgt für die beiden Ausgänge nicht identisch.. Vielleicht führt das
auf eine Spur.
Hallo an alle und vielen Dank für die Fragen zu meinem Problem.
>Wer hat denn da die ganzen Clockbuffer reingebastelt?
Das war der wundersame Clock Wizard of Xilinx.
>Sind die alle nötig?
Man hat mir in diesem Thread auf meine Fragen zum DCM hin geantwortet,
dass das nötig sei.
Beitrag "Xilinx Digital Clock Manager, einfache VHDL Beispiele gesucht"
Außerdem ist das die Standardvorgabe des Templates.
>Du nimmst das Signal locked_internal und gibst es über einen zu definierenden
Port an ein LED aus...
Ok, ich habe LOCKED auf ein Signal vom Typ std_logic gemapt und damit
eine LED angesteuert. Die LED ist an und leuchtet hell. Das Signal ist
sicherlich konstant auf '1'.
>hast du den gleichen Effekt, wenn du wahlweise den einen oder den anderen Prozess>auskommentierst?>Sprich:>clk1-Prozess auskommentiert, dann funktioniert clk2-Prozess>clk2-Prozess auskommentiert, dann funktioniert clk1-Prozess
Ja, genauso verhält es sich.
>Das könnte ggf auch eine Ursache sein...
Leider nicht, hab ich auch schon ausprobiert.
Was ich dazu noch sagen möchte, ich beschäftige mich nun seit ziemlich
genau 3 Wochen (!) mit der Materie. Solange ist es nun her, seit ich
mein Nexys 3 Board bekommen habe und mir das Webpack von Xilinx auf
meinen PC installiert habe. Am 12.06. hatte ich in dem Forum noch eine
Frage zu der Lizenz der Xilinx Software gestellt. Zu diesem Zeitpunkt
wußte ich noch überhaupt nichts über die Xilinx Software und VHDL kannte
ich nur aus der Beschreibung von Wikipedia. Außerdem bin ich schon über
50. Man versteht leider nicht mehr alles so schnell wie früher.
Glücklicherweise habe ich mal ein wenig Ada programmiert. Da kommt einem
wenigstens der Syntax von VHDL schon mal recht bekannt vor. Das ist
zumindest ein Pluspunkt den ich noch habe.
Naja, aber ich gebe die Hoffnung nicht auf, dass die Lösung dieses
Problems noch gefunden wird. Danke an Euch alle für Eure Hilfe!
Beste Grüße,
Norbert
Lothar Miller schrieb:> Das ist nurn wirklich kurios. Sieh dir mal die "Technology Schematic"> deines Designs an und kontrollier, ob du alle erwarteten Komponenten> findest...
Ich glaube, die Antwort wird Dir nicht gefallen. Da sieht man ein großes
grünes Kästchen namens "Blinkled" mit den Eingängen rst und clk und den
Ausgängen Led1, Led2 und Led3 (die dritte Led auf der ich das LOCKED
Signal ausgebe).
Wenn ich zweimal drauf klicke um in die nächste Auflösungsstufe zu
gelangen werde ich erschlagen von sehr vielen kleinen grünen Kästchen
und richtig vielen roten Leitungen. Das hat leider keinen großen
Wiedererkennungswert. Irgendwas dazwischen wäre nicht schlecht. Aber ich
habe keine Ahnung, ob sowas möglich ist.
Gruß, Norbert
Ist die Pinzuordnung korrekt? Also hast du in deinem projekt
abgespeichert, welches Signal auf welchen physikalischen Pin gemappt
ist, oder überlässt du das dem "Zufall"?
Schlumpf schrieb:> Ist die Pinzuordnung korrekt? Also hast du in deinem projekt> abgespeichert, welches Signal auf welchen physikalischen Pin gemappt> ist, oder überlässt du das dem "Zufall"?
Nenee, ich hab schon eine UCF Datei mit den entsprechenden
physikalischen Zuordnungen für Takt, LEDs usw. Da wird nichts dem Zufall
überlassen. Mal abgesehen davon, da käme auch nicht viel Sinnvolles raus
wenn das alles zufällig stattfinden würde.
Nun, dein Code sieht korrekt aus und auch sonst scheinst du alles
richtig zu machen, soweit ich das anhand der Informationen, die du uns
gibst, überblicken kann. Daher dachte ich, ob der Fehler vielleicht an
einer Stelle zu suchen sei, die du uns noch nicht mitgeteilt hast.
Weil, ganz ehrlich: Ich mag nicht so recht glauben, dass es sich hier um
einen Bug bei der IDE handelt
Schlumpf schrieb:> Weil, ganz ehrlich: Ich mag nicht so recht glauben, dass es sich hier um> einen Bug bei der IDE handelt
Das ursächliche Problem befindet sich ca. 70cm vor dem Bildschirm.
Dessen bin ich mir ziemlich sicher.
Norbert schrieb:> Das ursächliche Problem befindet sich ca. 70cm vor dem Bildschirm.> Dessen bin ich mir ziemlich sicher.
Das trifft aber auch auf die Programmierer der Toolchain zu ;-)
Naja, mal ehrlich, jeder, der in der IT Branche tätig ist, kennt dieses
Phänomen. Setze einen ahnungslosen Anfänger vor eine komplexe IT
Anwendung und er produziert Fehler am laufenden Band, die selbst alle
Fachleute in Erstaunen versetzen.
Ganz einfach deshalb, weil er Dinge mit der Software macht, die einem
erfahrenen Anwender niemals in den Sinn kommen würden. Man kann nicht
jegliche Fehlbedienung bei einer komplexen Software mit entsprechenden
Eingaberestriktionen und Plausibilitätskontrollen abfangen. Das ist
unmöglich.
Und genau das ist mit Sicherheit mein momentanes Problem. Wenn der
Fehler gefunden wird, lachen sehrwahrscheinlich alle hier in dem Forum
darüber und daraus wird der nächste Stammtischwitz in
Hardwaredesignerkreisen.
Ganz nach dem Motto: "Hast du schon gehört, da hat doch tatsächlich
jemand ..."
Alle möglichen Fehlerursachen, die den Experten eingefallen sind,
scheinen ja ausgeschlossen. Lad doch mal das Projekt als Zip hoch.
Vielleicht fällt ja jemandem noch was auf.
Norbert, jetzt lass mal die Kirche im Dorf. Hier lacht bestimmt keiner,
falls wir den Fehler überhaupt finden.
Jeder hat irgendwann mal angefangen und selbst wenn der Fehler ganz
offensichtlich wäre, würden sich nur diejenigen daran belustigen, die
sonst nichts zu lachen haben.
Du hast höflich gefragt, hast dich vorbildlich an die Netiquette
gehalten, hast alle aus deiner Sicht relevante Informationen
bereitgestellt und daher besteht kein Grund, dass du befürchten musst,
dass du am Ende ausgelacht wirst.
Offensichtlich ist es bis jetzt noch keinem gelungen, anhand der zur
Verfügung gestellten Informationen das Problem einzukreisen.
Jetzt gibt es zwei Möglichkeiten:
entweder du rückst auch noch Informationen raus, die aus deiner Sicht
vielleicht unrelevant sind, oder wir einigen uns darauf, dass du keinen
Fehler gemacht hast, und die IDE buggy ist.
Ich könnte, wie vorgeschlagen, das komplette Projekt hochladen. Aber
ohne entsprechende Modifikationen könnte damit nur jemand was anfangen,
der auch ein Digilent Nexys3 besitzt.
Ansonsten kann ich ein einfaches Rezept nennen falls jemand das
nachvollziehen möchte. Einfach mit dem Clocking Wizard ein DCM Modul
generieren, das zwei Ausgänge mit 100MHz und 200MHz hat. Alle
Einstellungen so übernehmen wie sie standardmäßig vorgegeben werden und
dann einfach den VHDL Code drumherum stricken, wie er in meinem
Eingangsposting zu sehen ist. Ursprünglich fehlt lediglich der "LOCKED"
Ausgang, den hatte ich deselektiert und dann später zur Beantwortung der
Frage von Lothar im Modul wieder aktiviert. Aber das spielt keine Rolle.
Die Instantiation Templates werden vom Clocking Wizard fertig vorgegeben
und brauchen nur noch mit copy&paste in den eigenen VHDL Code eingefügt
zu werden, wie in meinem Beispiel oben zu sehen ist.
Hier gibts ein Beispielvideo zum DCM. Leider ohne Ton aber man kann
sehen, wie es funktioniert.
http://www.youtube.com/watch?v=5IR4Yno8U0w
Jeder, der die Web-Pack Software auf seinem PC installiert hat, kann das
alles in wenigen Minuten nachvollziehen. Man muß nur noch die Ports für
entsprechende LED-Ansteuerung und für den Systemtakt entsprechend dem
eigenen Prototyping Board in der UCF-Datei eintragen und schon kann man
nach dem Durchlauf der Tool-Kette den fertigen Code in seinen FPGA
hineinladen und ausprobieren.
Das ist eigentlich alles. Geht recht schnell und ist kein Hexenwerk. Wer
es mag, kann das Ganze ja mal auf seiner Hardware austesten. Bin mal
gespannt, ob es eventuell bei jemandem so läuft, wie es sollte.
Gruß, Norbert
Norbert schrieb:> Aber> ohne entsprechende Modifikationen könnte damit nur jemand was anfangen,> der auch ein Digilent Nexys3 besitzt.
Ist das tatsächlich so?
der "Experte" braucht dazu u.U. die reale Hardware gar nicht, sondern
schaut sich mal in Ruhe an, was die Synthese so reported.
Poste doch mal deinen Synthese- und PaR-Report..
Der(die,das?) DCM_SP sollte eigtl. auch so tun
aber evtl. hilft dies weiter:
Aus den "Spartan-6 FPGA Clocking Resources User Guide"
http://www.xilinx.com/support/documentation/user_guides/ug382.pdf
"The RST input must be asserted for three valid CLKIN cycles or longer."
Also RST 3 clocks lang 1 dann erst 0.
bko schrieb:> Der(die,das?) DCM_SP sollte eigtl. auch so tun> aber evtl. hilft dies weiter:> Aus den "Spartan-6 FPGA Clocking Resources User Guide"> http://www.xilinx.com/support/documentation/user_guides/ug382.pdf> "The RST input must be asserted for three valid CLKIN cycles or longer."> Also RST 3 clocks lang 1 dann erst 0.
Der DCM ist nicht das eigentliche Problem. Die Taktsignale an den beiden
Ausgängen werden ja beide mit den richtigen Frequenzen erzeugt. Das läßt
sich nachvollziehen wenn man den Code mit jeweils einem auskommentierten
Prozess synthetisiert. Oder wenn man wahlweise jeweils den einen oder
den anderen Takt in die wait-Anweisung setzt. Die LED blinkt genau mit
der erwarteten Frequenz.
Ich habe mittlerweile eher das Gefühl, dass der FPGA mit den zwei
getrennten Taktfrequenzen in den zwei getrennten Prozessen innerhalb der
selben Entität nicht zurecht kommt weil der Synthesizer irgendwas
durcheinander wirft. Ist aber nur so ein Gefühl. Man könnte ja anstatt
des DCM mal einen einfachen Teiler nehmen, der einem zwei getrennte
Taktfrequenzen erzeugt und schauen, wie es dann aussieht. Ich muß das
mal austesten.
Schlumpf schrieb:> Poste doch mal deinen Synthese- und PaR-Report..
Ich persönlich halte es eher für zielführend, wenn jemand, der wirklich
Interesse an der Lösung dieses Problems hat, den "Versuchsaufbau" anhand
meines Rezepts nachstellt. Das ist schnell getan und einfach zu machen.
Ehrlich gesagt, wundert es mich schon ein wenig, dass das noch niemand
getan hat.
Bitte verstehe mich nicht falsch, das ist keine Faulheit von mir. Aber
die Menschen glauben im Grunde nur das, was sie selbst nachvollziehen
können und genau das möchte ich damit erreichen. Selbst wenn ich hier
nun weitere Diagnoseinformationen ins Forum stelle (die recht
umfangreich sind), kommen weitere Fragen der Art, wie hast du dieses
oder jenes eingestellt, schau mal hier oder schau mal da und probiere
mal dies und mach mal das. Das bringt es nicht wirklich.
Wie schon gesagt, wenn jemand wirklich Interesse an der Lösung des
Problems hat, das Rezept zum Nachstellen liegt vor und der Aufwand ist
wirklich minimal. Es dauert nur wenige Minuten. Der Sourcecode kann
direkt mit copy&paste übernommen werden, es ist so gut wie kein weiterer
Tippaufwand erforderlich. Und sicherlich hat fast jeder hier im Forum
auch irgendeine Form von Hardware, auf der er das Ganze dann in der
Realität nachvollziehen kann.
Wer weiß, vielleicht tritt das Problem nur bei einem Spartan 6 auf und
bei einem 3E ist es nicht vorhanden? Möglich wäre alles.
Gruß, Norbert
Norbert schrieb:> Ich habe mittlerweile eher das Gefühl, dass der FPGA mit den zwei> getrennten Taktfrequenzen in den zwei getrennten Prozessen innerhalb der> selben Entität nicht zurecht kommt weil der Synthesizer irgendwas> durcheinander wirft.
Nein, das sicher nicht. Manche schaffen es ohne weiteres, 5 Takte (z.B.
von Tastern) in einem Modul zu verwenden...
> Der DCM ist nicht das eigentliche Problem. Die Taktsignale an den beiden> Ausgängen werden ja beide mit den richtigen Frequenzen erzeugt.
Aber eben immer nur eine davon. Das ist kurios.
Mach es doch mal so, dass das DMC-Modul nur die Frequenz verdoppelt, und
der 100MHz Oszillatortakt direkt im Basismodul verdrahtet wird.
> Ich persönlich halte es eher für zielführend, wenn jemand, der wirklich> Interesse an der Lösung dieses Problems hat, den "Versuchsaufbau" anhand> meines Rezepts nachstellt.
Da bin ich anderer Meinung
> Bitte verstehe mich nicht falsch, das ist keine Faulheit von mir. Aber> die Menschen glauben im Grunde nur das, was sie selbst nachvollziehen> können und genau das möchte ich damit erreichen.
Also du möchtest nicht nur DASS dir geholfen wird, sondern würdest auch
noch gerne festlegen WIE dir geholfen wird.
Mit dem Hintergrund, dass für uns der Lerneffekt möglichst groß ist?
Bist du Lehrer?
> Wie schon gesagt, wenn jemand wirklich Interesse an der Lösung des> Problems hat, das Rezept zum Nachstellen liegt vor und der Aufwand ist> wirklich minimal.
Wenn man selber mit Xilinx arbeitet, ist er gering, da gebe ich dir
recht. Aber ich werde mir jetzt sicher nicht wegen dir die IDE laden und
installieren.
Nun, ich hätte dir wirklich gerne geholfen, indem ich mir deine Reports
angeschaut hätte. Aber da du der Meinung bist, dass das nicht
zielführend sei, ziehe ich mich an dieser Stelle zurück. Ich kann dir
dann leider nicht mehr weiterhelfen.
Grüße
Also jetzt wird es noch kurioser. Wenn ich zusammen mit dem zweiten
Prozess die Zeile
Led2 <= x2;
auskommentiere (dazu muß ich natürlich auch Led2 in der UCF-Datei
auskommentieren), dann läuft der andere Prozess, d.h. die Led1 blinkt.
Kommentiere ich nur den gesamten zweiten Prozess von process begin bis
end process aus, lasse aber die oben erwähnte Zeile stehen, kommt zwar
eine Warnung, dass das Signal x2 Null enthält und niemals einen anderen
Wert zugewiesen bekommt (was ja auch korrekt ist aber nicht stört),
läuft auch nichts mehr.
D. h. alleine der Umstand, dass ich die Zuweisung des Signals x2 an Led2
auskommentiere oder drin lasse, bewirkt hier, dass es entweder läuft
oder nicht läuft.
Wie würde Mr. Spock vom Raumschiff Enterprise nun sagen?
Faszinierend!
>Nein, das sicher nicht. Manche schaffen es ohne weiteres, 5 Takte (z.B.>von Tastern) in einem Modul zu verwenden...
Ich glaube, ich muß mich mal in meinem Arbeitszimmer umschauen ob nicht
irgendwo eine versteckte Kamera installiert ist.
>Mach es doch mal so, dass das DMC-Modul nur die Frequenz verdoppelt, und>der 100MHz Oszillatortakt direkt im Basismodul verdrahtet wird.
Ok, versuchen wir das mal ...
Lothar Miller schrieb:> Mach es doch mal so, dass das DMC-Modul nur die Frequenz verdoppelt, und> der 100MHz Oszillatortakt direkt im Basismodul verdrahtet wird.
Das bekomme ich leider nicht hin weil der DCM sich den Systemtakt krallt
und das funktionelle Modell des DCM sich nicht editieren läßt.
Ok, ich gebe auf. Ich habe mir mal dieses Video angesehen, verstehe aber
nur wenig davon, was der nette Herr erzählt.
http://www.xilinx.com/csi/training/spartan-6-clocking-resources.htm
Auf jeden Fall erzählt er viel darüber, was mit Virtex FPGAs möglich ist
und mit der Spartan Serie nicht funktioniert. Und er erzählt einiges,
worauf man bei der Verwendung des DCM in Verbindung mit der Spartan
Serie achten muß. Er erwähnt auch einige Sachen, von denen abgeraten
wird.
Die Verwendung unterschiedlicher Takte in getrennten Prozessen könnte ja
möglicherweise, aus welchen Gründen auch immer, dazugehören. Wenn ich
das, was in dem Video erzählt wird, auch verstehen kann, habe ich
sicherlich die Lösung zu meinem Problem aber davon bin ich noch ein
gutes Stück entfernt.
Auf jeden Fall danke ich allen Forenteilnehmern, die versucht haben, mir
mit Ratschlägen zu helfen.
Beste Grüße,
Norbert
Was sagt eine Gatternetzlisten-Timing-Simulation?
Also ran an den Speck: .vho zusammen mit .sdf simulieren und schauen ob
in der Simulation etwas blinkt...
Dr. Schnaggels schrieb:> Was sagt eine Gatternetzlisten-Timing-Simulation?>> Also ran an den Speck: .vho zusammen mit .sdf simulieren und schauen ob> in der Simulation etwas blinkt...
Ich muß mal schauen, ob in der kostenfreien Version Modelsim nutzbar
ist. Ansonsten muß ich mir mal iSIM anschauen. Damit habe ich mich noch
nicht befaßt.
Aber danke für den Hinweis. So eine Simulation kann ja auch einiges
aufzeigen.
Stell doch einfach mal deine VHDL-Dateien und die UCF-Datei
hier rein. Aus deinen Komentaren kann man jedenfalls
offensichtlich nicht den Fehler finden. Ein einfaches
Projekt ist ja schnell aufgesetzt.
Dr. Schnaggels schrieb:> Was sagt eine Gatternetzlisten-Timing-Simulation?>> Also ran an den Speck: .vho zusammen mit .sdf simulieren und schauen ob> in der Simulation etwas blinkt...
Ok, ich habe lediglich das Limit der Zähler in den beiden Prozessen
verkleinert um die Blinkfrequenz zu erhöhen weil sich ansonsten der
Simulator zu Tode läuft.
Hier das Resultat (siehe Anlage). Alles läuft wie es soll. Beide Takte
sind vorhanden und die LEDs blinken wie gewünscht. Aber das ist ja nur
eine Simulation und nicht die Realität.
Norbert schrieb:> Aber das ist ja nur > eine Simulation und nicht die Realität.
Wenn du VHO und SDF simuliert hast, dann kommt es aber der Realität
recht nahe. Denn das ist letztendlich das, was am Ende deiner Synthese
und PaR rauskommt.
Sollte die Synthese etwas wegoptimiert haben, dann würdest du das in der
Simulation sehen.
Hast du hingegen eine RTL-Simulation durchgeführt, dann gebe ich dir
recht. Dann ist es in deinem speziellen Fall nicht sonderlich
aussagekräftig.
Also das ist jetzt wirklich lustig. Sobald ich eine der beiden Ports für
die LEDs in der UCF-Datei auskommentiere, blinkt jeweils die andere LED
(im richtigen Takt!!!), deren Port noch in der UCF-Datei drin ist.
Ich habe das jeweils mit beiden LEDs ausprobiert.
Sind jedoch beide Ports/Pins für beide LEDs in der UCF-Datei enthalten,
funktioniert nichts.
Keine Fehler, keine Warnungen.
Routing Results:
All Signals Completely Routed
Timing Constraints:
All Constraints Met
0 timing errors detected. (0 component switching limit errors)
Ich glaube langsam, diese blöde Software will mich veräppeln. Das gibts
doch nicht!
Schlumpf schrieb:> Sollte die Synthese etwas wegoptimiert haben, dann würdest du das in der> Simulation sehen.
nee, ganz sicher nicht. Synthese und Simulation haben erstmal nix
miteinander zu tun. Das sind sogar wahrscheinlich verschiedene
Compiler...
Der S6 den der Norbert verwendet hat ja schon einige Macken. Und
Design-bugs pflegen die bei Xilinx erstmal (wenn sie's nicht wissen)
weder in den Synthese-Compiler noch in den Simulator ein.
Es geht eigentlich darum, eine Testschaltung zu entwickeln, die die
(Fehl-)Funktion des Chips belegt. Und mitgelieferte Testschaltungen des
Boardherstellers verwenden selten PLLs mit 2 Ausgangstakten...
Mag ja sein, dass das Teil einfach einen Schlag hat...
Schlumpf schrieb:> Hast du hingegen eine RTL-Simulation durchgeführt ...
Hallo Schlumpf,
da muß ich leider passen. Ich habe das Ganze mit iSIM simuliert. Das ist
(soweit ich das verstanden habe) nur eine Simulation des VHDL Modells.
Für die RTL Simulation braucht man wohl Modelsim. Das ist in meiner
Webpack Software nicht (mehr) dabei.
berndl schrieb:> Mag ja sein, dass das Teil einfach einen Schlag hat...
Also ich habe nun eine andere Variante ausprobiert, bei der ich an
Stelle des DCM folgenden Generator verwende, der aus dem Eingangstakt
drei unterschiedliche Ausgangstakte in 3 verschiedenen Phasenlagen
erzeugt. Damit funktioniert es mit 3 Prozessen und 3 blinkenden LEDs
einwandfrei.
Norbert schrieb:> Ich glaube langsam, diese blöde Software will mich veräppeln. Das gibts> doch nicht!
welche ISE genau verwendest du?
War hier ja auch schon Thema, aber koenntest du die .ucf, .xise, *.vhd
mal hier hochladen?
Welches Board verwendest du? Evalboard oder eigenes?
berndl schrieb:> Der S6 den der Norbert verwendet hat ja schon einige Macken.
Darüber habe ich auch schon an anderen Stellen einiges gelesen. Mit dem
S6 sind die Entwickler nicht sonderlich froh.
Mittlerweile bin ich schon am zweifeln, ob ich nicht doch besser das
Vorgängerboard mit einem 3E-1200 genommen hätte. Da hätte ich zudem noch
mehr LUTs zur Verfügung gehabt.
Norbert schrieb:> Also das ist jetzt wirklich lustig. Sobald ich eine der beiden Ports für> die LEDs in der UCF-Datei auskommentiere, blinkt jeweils die andere LED> (im richtigen Takt!!!), deren Port noch in der UCF-Datei drin ist.>> Ich habe das jeweils mit beiden LEDs ausprobiert.>> Sind jedoch beide Ports/Pins für beide LEDs in der UCF-Datei enthalten,> funktioniert nichts.>
Leg doch mal die LED-Ausgänge im UCF auf andere Pins
(auf eine Steckerleiste oder so) und schließe
dort mal 2 LEDs+Widerstand an.
berndl schrieb:> welche ISE genau verwendest du?>> War hier ja auch schon Thema, aber koenntest du die .ucf, .xise, *.vhd> mal hier hochladen?>> Welches Board verwendest du? Evalboard oder eigenes?
Ok, ich lade die gewünschten Dateien mal als ZIP-Archiv hoch. Den DCM
muß man aber eventuell mit dem Wizard nochmal neu kreieren.
Meine ISE Version ist 14.5
Das Board ist ein Digilent Nexys3
berndl schrieb:> nee, ganz sicher nicht. Synthese und Simulation haben erstmal nix> miteinander zu tun. Das sind sogar wahrscheinlich verschiedene> Compiler...
Richtig, haben sie nicht.. aber das Modell, welches simuliert wird, hat
sehr wohl etwas mit der Synthese zu tun. Stichwort: Backannotation
Und wenn dieses, von der Synthese generierte Modell, bereits den Fehler
zeigen würde, könnte man mit nahezu 100%iger Sicherheit darauf
schließen, dass das Design irgendwo in der Toolchain zerhagelt wird.
Norbert,
ich habe aus Interesse mal den Code von ganz oben implementiert - läuft
ohne Probleme auf meinem Nexys3.
Dann habe ich mal dein Projekt genommen - läuft nicht - hm.
Der Fehler liegt im .ucf file: "rst" ist nicht constraint, lag also mal
da, mal da - und je nach Beschaltung ist rst high oder low und es tut
oder auch nicht.
Das steht übrigens im pad Report (siehe Anhang), da steht bei "rst" ein
"unlocated" ;-)
Tschaebe schrieb:> Norbert,>> ich habe aus Interesse mal den Code von ganz oben implementiert - läuft> ohne Probleme auf meinem Nexys3.> Dann habe ich mal dein Projekt genommen - läuft nicht - hm.>> Der Fehler liegt im .ucf file: "rst" ist nicht constraint, lag also mal> da, mal da - und je nach Beschaltung ist rst high oder low und es tut> oder auch nicht.>> Das steht übrigens im pad Report (siehe Anhang), da steht bei "rst" ein> "unlocated" ;-)
Hallo Tschaebe,
vielen Dank für den Hinweis. Da weiß ich wenigstens, dass ich den Fehler
gemacht habe. Aber dazu habe ich mal eine dumme Frage. Wie sieht denn
der Eintrag in der UCF-Datei aus? Kann ich dafür einfach einen Eingang
eines Tasters der Platine zuweisen? Oder muß dieser Eintrag in der
UCF-Datei eine bestimmte Form haben? Liegt er eventuell an einem ganz
bestimmten Port des FPGA?
Danke schon mal für weitere Hinweise.
Gruß, Norbert
Das ist im Prinzip ähnlich wie mit den clk und Led-Pins.
Ich habe gedacht, dass Du den reset per Button auslösen willst, also
habe ich das dann einfach in dem Master ucf von Digilent entsprechend
geändert (habe mal die entsprechend geänderte master .ucf von Digilent
angehängt).
## Buttons
NET "rst" LOC = "B8" |IOSTANDARD = "LVCMOS33"; #Bank = 0, Pin
name = IO_L33P, Sch name = BTNS
Der Netzname entspricht dabei dem I/O Portnamen in deinem VHDL Code (ich
habe noch nie geschaut, ob das bei Xilinx case sensitive ist, habe es
einfach mal angenommen)
Prinzipiell musst Du
* entweder alle Eingänge (eigentlich alle I/Os in deinem Toplevel), die
du verwendest (also auch "rst"!) fest zuweisen,
* oder nach Deine Platine nach dem bauen, was P&R für FPGA Pins
verwendet. Nachdem du schon ein Nexys3 hast also ersteres ;-))
Ansonsten hast du ev. offene oder falsch belegte Eingänge (nicht gut)
oder Ausgänge die gegen die restliche Beschaltung Deines Boards treiben
(auch nicht gut).
Die nächste Frage wäre dann, ob du "rst" überhaupt brauchst (wurde hier
auch schon verschiedentlich behandelt)
Gruss,
Tschaebe
Tschaebe schrieb:> da steht bei "rst" ein "unlocated" ;-)
Aua! Das hatte ich auch schon und es ist hier das eigentliche Problem,
denn die DCM brauchen unbedingt einen Reset, sonst kommen die nicht
richtig ans Laufen...
Dazu der UG382 auf Seite 70::
1
RST: Reset DCM block.
2
Hold RST pulse High for at least three valid CLKIN cycles
> Die nächste Frage wäre dann, ob du "rst" überhaupt brauchst
Für ein Design eigentlich nicht, weil es ja Initwerte gibt ...
> (wurde hier auch schon verschiedentlich behandelt)
... aber dann muss trotzdem irgendwie ein Zähler laufen, der mindestens
3 Eingangstakte abzählt und dann den Reset am DCM wegnimmt. Das war
früher schon so und wird liebevoll weitergepflegt:
http://www.xilinx.com/support/answers/20724.htm
Und immer wieder gibt es auch sonst Probleme mit nicht richtig
zurückgesetzten DCM: http://www.xilinx.com/support/answers/34675.htm
Dr. Schnaggels schrieb:> OK, das hätte man in der Backannotation-Simulation auch nicht gesehen
Wohl aber in den mehrfach eingeforderten Log-Dateien der Toolchain. Dann
hätte man das viel eher finden können.
Spartan3(E) DCM und Reset:
Die DCM braucht eigentlich kein Reset, sie läuft
auch ohne an. Wenn man aber doch Reset verwendet,
dann sollte man sich an die 3-Zyklen-Regel halten.
(habs selber mal ausprobiert, bei 1 oder 2 bleibt
die DCM stehen).
Sigi schrieb:> Spartan3(E) DCM und Reset:> Die DCM braucht eigentlich kein Reset, sie läuft> auch ohne an.
Das kann ich nicht in allen Fällen bestätigen....
Lothar Miller schrieb:> Sigi schrieb:>> Spartan3(E) DCM und Reset:>> Die DCM braucht eigentlich kein Reset, sie läuft>> auch ohne an.> Das kann ich nicht in allen Fällen bestätigen....
Also man kann auf jeden Fall im Clocking Wizard den Reset-Eingang
deselektieren. Dann generiert er den DCM ohne Reset-Eingang und der
läuft, zumindest nach meiner bisherigen (wenn auch geringen) Erfahrung
eiegntlich problemlos.
Aus dem Konfig-Reset heraus geht das. Wenn aber zwischendurch mal der
EIngangstakt abhanden kommt, kommt auch der S3 DCM nicht wieder korrekt
zum Laufen ohne Reset. Beim Spartan 6 hingegen, um den es hier ging
läuft ohne manuellen Reset der DCM selbst nach der Konfig nicht immer
zuverlässig an. Aber da hilft die Verknüpfung mit dem Status-Ausgang aus
dem Clocking User Guide sehr zuverlässig.
Sigi schrieb:> Spartan3(E) DCM und Reset:> Die DCM braucht eigentlich kein Reset, sie läuft> auch ohne an.
Das hängt m.E. auch von den verwendeten Funktionen (DLL, DFS, DPS) ab.
Duke