Forum: FPGA, VHDL & Co. CPLD Problem; Ausgang hat rückwirkungen auf die programmierte Logik


von Frieder S. (frieders)


Lesenswert?

Servus,

ich habe mich schon länger durch das Forum glesen und leider nichts 
gefunden was mir helfen könnte.
Nun hoffe ich einer kann mir bei meinem Problem helfen.

Problem:
Das Problem ist folgendes. Und Zwar habe ich den CPLD 
"ispM4A5-64/32-10VC der Firma Lattice. Auf diesem ist ein "Zähler von 
0-15" Programmiert der bei "0" stopt und mit dem Eingang "Start" startet 
(Start kommt von einem externen UND Logikgatter funktioniert auch). Der 
Takt für diesen Zähler kommt von einem NE555 und hat ca. 60 Hz. Der Takt 
wird über ein norgalen I/O Pin eingelesen nicht über den Speziellen 
CLOCK Eingang.
Als zusatz gibt es nun noch ein Signal welches während der Zählerzahl 3 
(0011b) ausgegeben wird, also nur ein Impuls.

Meine Logikgatter auserhalb sind TTL und der CPLD ist ein CMOS aber 5V 
tollerant am Eingang und auch TTL Tollerangt am Ausgang.

Nun ist es so, dass der Zähler zählt wenn der "Start-Impuls" kommt, dies 
funktioniert auch ganz gut. Mit dem Oszi gemessen kommt am besagten Pin 
an dem der Impuls bei Zahl 3 (0011b) anliegen soll auch der besagte 
Impuls.
Schließe ich aber nun diesen Pin an meine externe TTL-Beschaltung an und 
starte dann den Zähler, fängt der Zähler an zu Spinnen. Erst hat er 
immer die Zahl 4,8 und 14 ausgelassen, indem er das LSB des Zählers 
nicht zurücksetzte. Als wir dann das Programm ein bisschen geändert 
haben, also die (Register) Makrozellen des Zählers nicht gleich auf 
einen Ausgang sondern zuerst über "node" intern und dann nach ausen an 
einen Pin geführt haben, hat er plötzlich nur noch gezählt wie er lust 
hatte, ich könnte es mir leider nicht erklären.

Ich muss noch dazu sagen das ganze ist in Abel geschrieben. Da ich noch 
keine Kenntnisse über VHDL besitze.

Ich hoffe ihr könnt mir irgend wie helfen.
Ich Danke schon mal im Vorraus.

MFG
Frieder

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Der Takt für diesen Zähler kommt von einem NE555 und hat ca. 60 Hz.
Passt die Flankensteilheit?
Ist die Flanke monoton steigend bzw. fallend, oder hat sie 
Einbrüche/Spikes?

von Frieder S. (frieders)


Lesenswert?

Also die Flankensteilheit sollte eigentlich passen...
Mit was für einem Baustein am besten Fertigbaustein könnte ich sie 
verbessern? Schmittriggerbaustein 5V oder so ?
Oder reicht es wenn ich den Takt einfach durch eine Makrozelle laufen 
lass und dann intern erst an meine jetzige Logikverknüpfung?

Danke

Frieder

von Joschi (Gast)


Lesenswert?

>Oder reicht es wenn ich den Takt einfach durch eine Makrozelle laufen
>lass und dann intern erst an meine jetzige Logikverknüpfung?

Nein, die Flanke muss bereits am Pin ordentlich sein.
Ein Schmittrigger ist auf jeden Fall dein Freund ;-)

Ist euer Design synchron? also werden alle Register im CPLD mit dem 
gleichen Takt versorgt?
Kannst ja mal den Code posten

von Frieder S. (frieders)


Lesenswert?

Hi Joschi

Ja,das Design ist synchron. Alle Reg's werden synchron angesteuert soll 
ein synchron Zähler sein ;) .

Also hier mal den Abel-Quellcode
************************************************************************ 
**
MODULE Zaehler
declarations

start pin 2;
starts pin 8 istype'buffer,com';
takt pin 5;
Q0..Q3 pin 44,41,37,34 istype'buffer,reg';
CNT = [Q3..Q0];


equations

CNT.clk = takt;

starts = Q0.q & Q1.q & !Q2.q & !Q3.q;

Q0 := (!Q0 & start) # (!Q0 & Q3 & !start) # (!Q0 & Q2 & !start) # (!Q0 & 
Q1 & !Q2 & !start);

Q1 := (!Q0 & Q1) # (Q0 & !Q1);

Q2 := (!Q0 & Q2) # (!Q1 & Q2) # (Q0 & Q1 & !Q2);

Q3 := (!Q0 & Q3) # (!Q1 & Q3) # (!Q2 & Q3) # (Q0 & Q1 & Q2 & !Q3);



END
************************************************************************ 
*


Wir haben nun herrausgefunden das es tatsächlich am Takt liegt (also so 
sieht es zumindest aus).
Die steigende Flanke vom NE555 ist 500ns lang, was warscheinlich viel zu 
lange ist.

Kennst du zufällig ein Baustein mit Schmitt-Trigger als IC am besten ein 
Single-Gate? Oder gibts zufällig direkt einen für Digitale Bausteine, 
welcher speziell für digitale Funktionen (um Flanken steiler zu machen) 
vorgesehen ist.


****************
EDIT
Kleine Änderung mein CPLD ist nun kein ispM4A5-64/32-10VC mehr sondern 
ein ispM4A5-32/32-10VC
(Hat keine große bedeutung wollte es nur gesagt haben)
****************


Danke und Gruß
Frieder

von Joschi (Gast)


Lesenswert?

Du fauler Hund! Schau im SAP nach, da stehen alle Schmitt-Trigger drin 
und dann dappst in´s Lager rüber und holst dir einen raus. (Aber 
Entnahmeschein nicht vergessen!)
Tiny-Schmitt-Trigger (Single Gate) haben wir auch auf Lager ;-)
Aber Obacht, Schmitt-Trigger invertieren, aber wenn dich das stört, dann 
kannst es ja im CPLD-Code rumdrehen!

Am Donnerstag sind meine Überstunden abgebaut und ich bin wieder in der 
Firma und dann schau ich mal zu euch beiden rüber.

Echt ein witziger Zufall, was?

von Joschi (Gast)


Lesenswert?

Kannst dir natürlich auch nen Besen schnappen und unter´m Rüstplatz mal 
fegen. Da findest sicher den einen oder anderen Schmitt-Trigger.

Ich mach nur Spass, gell? Kennst mich ja ;-)

Sag mal bescheid, ob´s mit dem Trigger tut. Irgendwie find ich da 
lustig, wenn ich Gleitzeit mache, mit nem Bier und nem Leberkäsewecken 
hier sitz und du musst schaffen :-)

von Frieder S. (frieders)


Lesenswert?

Ja ein sehr witziger Zufall, nur ich fang mit Joschi nix an?

SAP ist eigentlich das erste was ich frag wenn ich n Baustein brauch 
aber leider find ich da nix. Wenn du mir sagen kannst was ich genau 
suchen muss dann schau ich gleich noch mal nach.


Gruß
Frieder

von Joschi (Gast)


Lesenswert?

Na ich war doch neulich bei euch beiden in der Azubiwerkstatt, um euch 
die Software von Lattice zu installieren ;-)

frag mich jetzt bitte nicht nach dem Transaktionscode von SAP

Aber du suchst unter "Teile- Elektische Bauelemente - Digitale IC´s" und 
dann irgendwas mit "Standrad-Logik" oder sowas.

Dann bei Funktion "Schmitt-Trigger" auswählen und das ganze noch über 
die Anzahl der Gatter pro IC eingrenzen.

von Frieder S. (frieders)


Lesenswert?

AH okay Ding ding ding ding  jetzt hats gschnaggelt.

Treibsch du dich öfters im Forum hier rum...
Wir wollten eigentlich genau zu dir mit dem Problem, haben dir auch ne 
Mail geschrieben aber da kam dann das du bis zum Do außer Haus bist.
Dann ist das hier nun wirklich so n super Zufall!

Den Schmitt-Trigger den haben wir nun gefunden.
Werden den nachher noch auslagern.
Und eventuell nachher noch ausprobieren aber spätestens morgen...

Ich schreib dir dann morgen noch mal,
zumindest hier im Forum.


Dank dir

Frieder

ps: genies deine Gleittage noch
und n Gruß von Vera

von Joschi (Gast)


Lesenswert?

Ahh der Groschen ist gefallen ;-)

Nee ich bin eher selten hier unterwegs, aber war grad am Stöbern, da ich 
nach was ganz anderem geschaut habe.

Na dann hoff ich mal, dass es mit dem Schmitt-Trigger am Ende auch tut.
Und wie gesagt, am Donnerstag bin ich ja wieder da. Wenn´s dann net tut, 
schau ich mal rüber zu euch beiden.

Vielleicht schau ich ja aber auch morgen mal schnell hier im Forum, ob 
ihr weitergekommen seid.

Dann hab nen schönen Feierabend und Grüße (auch an Vera)

von Frieder S. (frieders)


Angehängte Dateien:

Lesenswert?

Hey Joschi ich hab dir hier mal des Oszi-Bild von dem Zähler ohne den 
Schmitt-Trigger.

Mit Schmitt-Trigger funktioniert der Zähler nun komischerweise garnicht 
mehr.

Bild kommt

von Frieder S. (frieders)


Angehängte Dateien:

Lesenswert?

Das ist mit Schmitt-Trigger.

Die Flanke ist nach dem Schmitt-Trigger eigentlich super wir können es 
uns auch nicht erklären.

von Frieder S. (frieders)


Angehängte Dateien:

Lesenswert?

Noch mal mit Schmitt-Trigger.

Er macht nur was er will.

Verzweiflung

von Klaus F. (kfalser)


Lesenswert?

Frieder S. schrieb:
> Das ist mit Schmitt-Trigger.
>
> Die Flanke ist nach dem Schmitt-Trigger eigentlich super wir können es
> uns auch nicht erklären.

Wie kannst Du das beurteilen, wenn dein OSZI Anstiegszeiten von 20 ms 
zeigt, oder lese ich falsch.
Zoomt das Ganze mal ein bischen auf, mit 10 ns/div oder so, dann kannst 
Du sehen ob Du Glitches oder Spikes drauf hast.

von Frieder S. (frieders)


Angehängte Dateien:

Lesenswert?

Nochmal das richtigere Bild0

Hallo Klaus
das Bild hat nichts mit der Flanke zu tun es geht bei dem Bild nur um 
die Zählfolge unseres CPLD's mit und einmal ohne Schmitt-Trigger.

Die Flanke ist schön sauber ansteigend beim Schmitt-Trigger und schwingt 
sich auch normal ein.

von Klaus F. (kfalser)


Lesenswert?

Aus der Zählfolge sieht man nichts, diese ist sowieso falsch.

Versuch einmal, den Ausgang starts auch als Register zu definieren.
Dann geht er zwar erst bei 4 auf High, aber das kannst Du später noch 
korrigieren.
Es kann schon sein, dass Du den Ausgang zu stark belastet, das kann die 
Schaltung schon durcheinanderbringen.
Wenn Du den Ausgang starts auch über ein FF führst, dann wird Ausgang 
und interne Logik entkoppelt.

von Frieder S. (frieders)


Lesenswert?

Genau, die Zählerfolge ist falsch. Das ist unser Problem. Deshalb haben 
wir versucht die Flanken mit einem Schmitt-Trigger zu verbessern.
Die Folge davon war nur schlimmer als zuvor/ geschweige denn, wir 
konnten es uns erklären.

Danke für die Tipps, wir probieren es mal aus.

von Frieder S. (frieders)


Lesenswert?

Hallo Klaus,
wie meinst du das mit dem 'starts' auf ein FlipFlop legen?
Könntest du einen kurzen Code zum Verständnis posten?
Das wäre super, danke.

von Joschi (Gast)


Lesenswert?

Soo, da bin ich mal kurz wieder ;-)
Was mir aufgefallen ist:
Das Signal start, mit dem ihr den Zähler loslaufen lasst, wird direkt in 
das Bit0 des Zählers verknüpft.
Das start-signal ist aber so, wie es von aussen kommt, also nicht 
synchron zu eurem Takt. Das ist auf jeden Fall mal nicht sauber und ihr 
solltet ein Register einbauen, über das ihr das start-Signal 
einsynchronisiert.
Dazu einfach das Start-Signal auf den Eingang eines Registers geben, 
welches mit dem gleichen Takt, wie der Zähler getaktet wird und den 
Ausgang dieses Registers als Startbedingung für euren Zähler verwenden.
Natürlich setzt ihr jetzt kein externes Register, sondern beschreibt 
dieses Register auch im CPLD.

Ob das die Ursache für euer Problem ist, kann ich nicht sicher sagen, 
aber es ist auf jeden Fall eine Stelle, die ein unsauber ist.

von Klaus F. (kfalser)


Lesenswert?

Frieder S. schrieb:
> Ich muss noch dazu sagen das ganze ist in Abel geschrieben. Da ich noch
> keine Kenntnisse über VHDL besitze.

und

> Hallo Klaus,
> wie meinst du das mit dem 'starts' auf ein FlipFlop legen?
> Könntest du einen kurzen Code zum Verständnis posten?
> Das wäre super, danke.

Naja, bei Abel scheint es auch zu hapern, ich kann (und will) mich aber 
auch nicht erinnern.
So ähnlich wird's wohl gehen.

starts pin 8 istype'buffer,reg';
starts.clk = takt

von Joschi (Gast)


Lesenswert?

@Klaus:
Stimmt, man will sich am Besten nicht mehr an Abel erinnern ;-)

Aber dennoch auch hier der Code für das Eingangsregister (ich hoffe, das 
stimmt so):

bei declarations das Register deklarieren:

start_reg istype'reg';

dann bei equations:

start_reg.clk = takt;

und in der Zuweisung für Q0 alle "start" durch "start_reg" ersetzen

von Frieder S. (frieders)


Lesenswert?

Also die Änderungen sind nun mal vorgenommen.
Konnte es nur noch nicht probieren!

Nur eine Frage
@ Klaus könnte es nicht Probleme mit dem Signal "starts" geben, wenn der 
Takt für das Register "starts(reg)" zur selben Zeit oder ein paar ns vor 
der UND Verknüpfung der Zählerausgänge kommt? Da hätten wir doch die 
0011b verpasst.
Oder meintest du diesbezüglich, dass das Signal erst bei 4 kommt?

von Klaus F. (kfalser)


Lesenswert?

Frieder S. schrieb:
> ur eine Frage
> @ Klaus könnte es nicht Probleme mit dem Signal "starts" geben, wenn der
> Takt für das Register "starts(reg)" zur selben Zeit oder ein paar ns vor
> der UND Verknüpfung der Zählerausgänge kommt? Da hätten wir doch die
> 0011b verpasst.
Nein, kann es nicht.
Der Takt für starts und die Q-Signale kommt "gleichzeitig". Interne 
Laufzeitunteschiede sind höchstens ein paar ps, aber das ist im Design 
des CPLDs berücksichtigt.
Alle FF reagieren nur auf den Zustand der Eingänge VOR dem Takt und der 
Eingang von starts ist nur '1' nachdem der Zähler CNT oder Q[3:0] stabil 
auf 3 steht, d.h. nach der Taktflanke, bei der er von 2 auf 3 gesprungen 
ist.

> Oder meintest du diesbezüglich, dass das Signal erst bei 4 kommt?
Genau.
Der Ausgang starts geht auf 1 an der Taktflanke, an der am Ausgang des 
Zählers 3 steht.
An diese Taktflanke passiert dann folgendes :
- Der Zähler geht von 3 auf 4
- Der Ausgang starts geht von 0 auf 1

von Frieder S. (frieders)


Lesenswert?

Kurze auflösung des Problems...

Ausgangspin wurde direkt von einem anderen Gatter auf Masse gezogen und 
wurde somit durch ein Kurzschluss zerstört...

Neuer CPLD eingelötet und Kurzschluss entfernt --> Funktioniert.

Danke an alle die geholfen haben.

Frieder

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.