Ich habe mir den JTag und Experimentierboard für XC9536 von ulrichradig.de nachgebaut. Mitlerweile scheint die Hardware stabil zu sein, programmieren ist problemlos möglich. Als Test habe ich das Tutorial zum WebPack 8.1 durchgearbeitet. Nun ein Problem mit dem simplen 4-Bit LED Counter: In der Simulation funktioniert alles prima. Belege ich nun die I/O Pins 22,21,20,19 dann zählt der CPLD in 10! Schritten aufwärts und zwar 2,3,5,6,7,10,11,13,14,15 es werden also einige Zahlen übersprungen. Seltsamerweise verhält sich der CPLD anders, wenn ich die Ausgänge 20,19,18,16 belege, dann zählt er nämlich mit dem gleichen Programm in 16 Schritten runter. Das er runterzählt ist denke ich sogar richtig, da die Ausgänge als Senken, d.h. wie Open Collector geschaltet sind. Gibt es da etwas was die Ausgänge unterscheidet ? Im Datenblatt stehen diese als I/O. Kann man im WebPack da noch etwas konfigurieren ?
Hallo, die Testschaltung ist eigentlich von Xilinx. Der von mir hochgeschätzte Ulrich hat auf seiner Seite die Xilinx pdfs verwendet. Ich habe genauso wie Du mit dieser Testschaltung angefangen. Ich hatte bei diesen simplen Counter-Beispiel ähnliche Probleme. Ich hatte auch noch das Problem, das der XC9535 ziemlich heiß wurde. Ich konnte mir das nicht so recht erklären. Nach ein paar Tagen habe ich dann die Lust verloren, weil nur Frust. Im zweiten Anlauf habe ich mir ein Spartan3 Starterkit gekauft und bin mit diesem sehr glücklich geworden. Aber ich habe meinen ersten Versuch mit dem XC9535 nicht vergessen. Am WE werde ich mir das Board nochmals genau unter die Lupe nehmen. Auch habe ich die ersten Pläne für ein eigenes XC9535 Board im Kopf. Poste doch mal deinen Quellcode. Ich habe da so einen Verdacht. Sebastian
Ich bin z.Zt. bei der Arbeit, daher kann ich den Quellcode eigentlich nicht posten. Grundsätzlich habe ich aber nur den Beispielcode genommen und das DIRECTION Bit entfernt. Es sollte also so aussehen: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; -- Uncomment the following library declaration if instantiating -- any Xilinx primitive in this code. -- library UNISIM; -- use UNISIM.VComponents.all; entity counter is Port ( CLOCK : in STD_LOGIC; COUNT_OUT : out STD_LOGIC_VECTOR (3 downto 0)); end counter; architecture Behavioral of counter is signal count_int : std_logic_vector(3 downto 0) := "0000"; begin process (CLOCK) begin if CLOCK='1' and CLOCK'event then count_int <= count_int + 1; end if; end process; COUNT_OUT <= count_int; end Behavioral; Das Tutorial ist unter http://toolbox.xilinx.com/docsan/xilinx8/books/docs/qst/qst.pdf zu finden. Die Xilinx-Schaltung von Ulrich Radigs Webseite hat bei mir auch erst nicht funktioniert. Ich brauchte einen zusätzlichen Elko an der Versorgung, da die Versorgungsspannung mit ich glaube 50 kHz (nicht 50 Hz) schwang.
Könnte es sein, daß Du keinen sauberen Takt hast? Wie erzeugst Du den Takt für deinen Zähler? Wahrscheinlich hast Du Glitches auf der Takt-Leitung. P.S.: Deine Argumentation bezüglich Runter-Zählen und Open-Collector habe ich nicht ganz verstanden. Die Ausgänge sind normalerweise alle gleichwertig, aber falls ein Ausgang fälschlicherweise fest mit GND oder VCC verbunden ist, kann es schon zu Fehlverhalten kommen. Grüße Klaus
Der Takt wird vom 555 erzeugt und beträgt etwa 2 Hz. Es ist kein prima Rechteck, aber einen Glitch zeigte mein Scope nicht an. Ich werde trotzdem noch einmal darauf achten am Wochenende. Das mit dem Open Collector meine ich folgendermaßen: Die LEDs hängen an gemeinsamen +5V, Die Anode geht an den CPLD (über Widerstand). Sind jetzt die 4 I/Os auf 0 leuchten alle LEDs. Liegt an den I/Os 0001, lese ich an den LEDs An,An,An,Aus u.s.w. Der CPLD zählt also hoch, die LEDs runter.
Ein 555 erzeugt sicherlich zu lansame Flanken für das CPLD. Wenn Du den 555 unbedingt als Takt verwenden willst, muß Du einen Schmitt-Trigger dazwischen schalten. Klaus
Âlso die Flanke vom 555 finde ich eigentlich ganz ok (siehe Anhang). Oder sehe ich das falsch ?
Die Taktflanke sieht zwar nicht schlimm aus, aber man erkennt eine Anstiegszeit (Rise-Time) von 40 ns. Das ist für ein CPLD sehr langsam. Im Datenblatt gibts eine Spezifikation dafür. Ich kann mich nicht erinnern, aber ich glaube doch daß sie unter 40 ns liegt. Muß natürlich alles nicht die Ursache sein. Grüße Klaus
@Xenu Die Web-Updatefunktion sagt mir daß keine updates verfügbar sind. @all Hat vielleicht noch jemand dieses Experimentierboard nachgebaut und ein garantiert funktionierendes LED-Blinkprogramm-Projekt dafür ?
Also, ich habe nochmals mein, irgendwann geätztes, XC9536XL CPLD-Board rausgewühlt. Im Anhang ist mein CounterLED-VHDL-Code. Ich denke das der Code sauber von Glitches ist. Die Simulation in ModelSim funktioniert wie erwartet. Leider funktioniert der Counter auf der Hardware nicht richtig. Der Counter funktioniert bei den 0-4 LSB LEDs richtig. Sobald ein Overflow auf die 5 LED (bzw 6,7) vorkommt bleibt die 0 LED (jeweils) an. :-( 11100000 + 1 => 00010000 OK 11110000 + 1 => 00001000 OK 11111000 + 1 => 10000100 Error (Keine Ahnung warum LSB 1) 11111100 + 1 => 10000010 Error (Keine Ahnung warum LSB 1) 11111110 + 1 => 10000001 Error (Keine Ahnung warum LSB 1) 11111111 + 1 => 00000000 OK Alle andere Übergänge sind richtig. Also ich habe wirklich keine Idee mehr was ich mit diesem CPLD noch anfangen kann. Wenn so ein einfacher Counter schon nicht richtig funktioniert... Das Problem der schlechten Taktflanke kann man denke ich ausschließen, da die Fehler immer an den selben Stellen auftreten. Sebastian
Ach, was ich noch mitteilen wollte. An einer zu hohen Strombelastung kann es auch nicht liegen. Ich verwende Low current LED. Das sollte der CPLD locker schaffen. Ich hoffe wirklich auf Ideen Eurer seits, Sebastian
- Der Fitter hat 2 Möglichkeiten beim Zähler sCnt. Er verwendet entweder den Wert den das Ausgangsregister hat, oder er verwendet den Wert, der an den Pins anliegt. Bei einem Kurzschluß, hoher Last oder Störungen müssen beide Werte nicht gleich sein. Du solltest im Fitter-Report nachschauen. Poste eventuell die ABEL-Gleichungen für die sCnt Signale. - Probiere immer nur 1 Pin zu vertauschen, vielleicht ist nur ein Ausgang kaputt. - Wenn Deine Taktflanke zu langsam ist, kann es auch zu solchen Auswirkungen kommen. Eine Taktflanke von 20 ns ist viel zu langsam, weil das CPLD selbst ja nur ca. 5 ns braucht. Eine Taktflanke max. 1-2 ns ist bei so schnellen Bauteilen sicher notwendig ! Grüße Klaus
Hallo, danke für die Bemühungen. In den ABEL Equations taucht kein sCnt auf. Anscheinend wurde es wegoptimiert. Das Programm ließt wohl aus dem LED_ARRAY-Register den Zustand. Zu langsamer Takt? Ich werde demnächst mal einen anderen Taktgeber verwenden. Und ich werde ein paar neue XC9536 bestellen um den kaputten Chip endgültig auszuschließen. Der oben gepostete Code funktioniert sicher. Ich habe mir die Mühe gemacht ein kleines LED-Testboard für das XC9500XL-XC2XL-Testboard zu basteln. Nach einer Anpassung von sFreqCnt läuft der Counter perfekt durch. Sebastian PS: Im Anhang die ABEL Equations.
Ob's etwas ändert weiss ich nicht, aber es werden die Pin's als Zählerstand in den Gleichungen verwendet. Du kannst in den Fitter-Optionen "Pin Feedback" auf Off setzen, dann wird das Ausgangs-FF selbst verwendet. Wenn es was ändert deutet es auf ein Problem mit der HW, ev. auf Ground Bounce oder schlechte Masse hin. Übrigens, nicht der Takt ist eventuell zu langsam, sondern die Takt-Flanke.
Hallo, so das Rätsel ist gelöst :-). Ich habe den NE555N durch einen Quarzoszillator 1,8432 MHz (vom Starterkit s.o) ersetzt, sFreqCnt angepasst und siehe da schon funktioniert es super. Danke schön Klaus; für Deinen Tipp mit der zu langsamen TaktFLANKE. War wirklich Gold/ein Bier wert. Ist schon super schwach von Xilinx eine nicht funktionierend Testschaltung ins Netz zu stellen. Das ist bestimmt keine gut Werbung für Ihre Devices. Sebastian PS: Im Anhang der modifizierte VHDL-Code. Funktioniert garantiert.
Ui, es scheint ich habe dieses Forum die letzten Tage etwas vernachlässigt. Werde mir dann mein Board demnächst auch nochmal vornehmen.
Danke Klaus, Sebastian ! Habe jetzt auch den 555 rausgeworfen und nen 1 MHz Oszillator draufgelötet. Das Beispiel von Sebastian läuft jetzt hier prima.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.