www.mikrocontroller.net

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


Autor: Beeblebrox (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: beeblebrox (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/doc... 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.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: beeblebrox (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: beeblebrox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, das mit dem Schmitt-Trigger werde ich auch versuchen.

Autor: Beeblebrox (Gast)
Datum:
Angehängte Dateien:

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

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du das aktuelle Servicepack installiert?

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Beeblebrox (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Sebastian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Beeblebrox (Gast)
Datum:

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

Autor: Beeblebrox (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.