Forum: FPGA, VHDL & Co. CPLD Anfängerproblem


von Beeblebrox (Gast)


Lesenswert?

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 ?

von Sebastian (Gast)


Lesenswert?

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

von beeblebrox (Gast)


Lesenswert?

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.

von Klaus F. (kfalser)


Lesenswert?

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

von beeblebrox (Gast)


Lesenswert?

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.

von Klaus F. (kfalser)


Lesenswert?

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

von beeblebrox (Gast)


Lesenswert?

Danke, das mit dem Schmitt-Trigger werde ich auch versuchen.

von Beeblebrox (Gast)


Angehängte Dateien:

Lesenswert?

Âlso die Flanke vom 555 finde ich eigentlich ganz ok (siehe Anhang).
Oder sehe ich das falsch ?

von Xenu (Gast)


Lesenswert?

Hast Du das aktuelle Servicepack installiert?

von Klaus Falser (Gast)


Lesenswert?

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

von Beeblebrox (Gast)


Lesenswert?

@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 ?

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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

von Klaus F. (kfalser)


Lesenswert?

- 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

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Klaus F. (kfalser)


Lesenswert?

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.

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Beeblebrox (Gast)


Lesenswert?

Ui, es scheint ich habe dieses Forum die letzten Tage etwas
vernachlässigt. Werde mir dann mein Board demnächst auch nochmal
vornehmen.

von Beeblebrox (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.