CPLD Problem; Ausgang hat rückwirkungen auf die programmierte Logik

OP #1652796
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
OP #1653022
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
Gast #1653896
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
OP #1653978
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
Gast #1653998
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?
Gast #1654046
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 :-)
Gast #1654056
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.
OP #1654087
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
Gast #1654137
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)
#1655112
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.
#1655170
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.
Gast #1655412
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.
#1655440
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
Gast #1655459
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
OP #1656031
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?
#1656401
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren