mikrocontroller.net

Forum: FPGA, VHDL & Co. Einfacher Clockdoubler im CPLD


Autor: Der Albi (der-albi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute.

Ich brauche in einem CPLD einen Clockdoubler. Also aus jeder Flanke 
(fallend/steigend) muss ein kompletter Takt generiert werden. (also auch 
mit steigender und fallender flanke)

Ich habe einen CollRunner II CPLD und "programmiere" ihn mit der Xilinx 
- ISE. (male schaltplan - VHDL kann ich nicht)

Er erzeugte Takt muss nicht 50%low/50%High sein.. er wird nur genutzt um 
interne Zähler zu resetten...

Hat da jemand ne idee?

Bevor jemand fragt:
Der CPLD wird eingesetzt um aus einer 16bit-parallelen Schnittstele eine 
Serielle zu machen. Dabei soll WR/RD selbständig vom CLPD gesetzt 
werden. Dafür werden die Clocks gezählt und der Eingang auf die Ausgänge 
durchgeshiftet.
Das ganze soll ein Reset beinhalten - dafür verwende ich den Pin, mit 
dem die Kommunikationsart bestimmt wird (lesen || schreiben) Lesen = 
low, schrieben = high.
Bei jedem Wechsel (also einer beliebigen Flanke) sollen die internen 
counter resettet werden.
..ohne Reset befindet sich die WR-Flanke immer bei irgeneinem Takt.. und 
deswegen muss das sein.. keine Ahnung wieviele takte der CLPD beim 
einschalten empfängt.. das ist immer zufällig. => Reset.

Hülfe ;-)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Der Albi (der-albi)

>Ich brauche in einem CPLD einen Clockdoubler. Also aus jeder Flanke
>(fallend/steigend) muss ein kompletter Takt generiert werden. (also auch
>mit steigender und fallender flanke)

Gibt da die berüchtigte Trickschaltung mit XOR.

>Er erzeugte Takt muss nicht 50%low/50%High sein.. er wird nur genutzt um
>interne Zähler zu resetten...

????
Ein Zähler wird mit einem Takt zurückgesetzt? Du machst komische Sachen.

>Hat da jemand ne idee?

Das macht man anders. Nimm einen soliden Takt, taste dein WR ab, und 
nutzt es dann zum Reset.

MFG
Falk

Autor: Der Albi (der-albi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WR zum reset nutzen is keine gute Idee, da es ja grade um das reset 
geht, das das WR-Timing wiederherstellt. Es geht ja darum, dass ich 
definiert festlegen kann, dass die Shift-Register und counter resettet 
werden. WR hängt ja sozusamen von den Elementen ab, die resettet werden.

>Ein Zähler wird mit einem Takt zurückgesetzt? Du machst komische Sachen.
Der Zähler hat einen CLR-Eingang, der bei Posiviem Signal den Zähler 
resettet.
Ein Takt besteht aus Low|High|Low. Dabei entstünde also ein Reset.

Wie geht das mit den XORs? Das würde mich interessieren! Insofern der 
Impuls lange genug dauert um einen Reset für die Zähler auszulösen.

Falls das interessiert: Im schaltplan heißt das Element CB4CE (Counter) 
und SR16CE (Shifter)
"The (CLR) input, when High, overrides all other inputs and resets the 
data outputs (Q) Low"

Ich hoffe das hilft weiter, eine Lösung zu finden.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie geht das mit den XORs? Das würde mich interessieren! Insofern der
> Impuls lange genug dauert um einen Reset für die Zähler auszulösen.

Der Takt wird verzögert (durch Gatter oder R/C Tiefpass) und dann 
zusammen mit dem ursprünglichen Takt an ein XOR-Gatter verfüttert. Bei 
Taktflanken bekommt man so kurze Pulse.

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann man zum Taktverdoppeln im CPLD nicht das Feature nutzen, dass ein 
FF auf beide Taktflanken arbeiten kann? Dann einfach den Ausgang über 
einen Inverter auf den Eingang legen und schon hat man 2*f ?

Autor: Der Albi (der-albi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe leider keine Pins mehr frei. :-( Eine Verzögerung über RC-Glied 
ist zwar sinnvoll - daran hatte ich auch schon gedacht - aber es ist 
nicht möglich. Das muss alles intern passieren.

Was hilft mir ein FlipFlop, der auf beide Flanken reagiert...? Damit 
kann man   doch maximal den Taxt nachbilden, aber nicht verdoppeln, 
oder?

MFG

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt, sorry, Denkfehler. :-(

Autor: Der Albi (der-albi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Öhhm ich kann die Fragestellung auch umformulieren: wie resettet man die 
Counter, bei einem beliebigen Flankenwechsel eines Signals :-)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Der Albi (der-albi)

>Öhhm ich kann die Fragestellung auch umformulieren: wie resettet man die
>Counter, bei einem beliebigen Flankenwechsel eines Signals :-)

Gar nicht. Derartige Lösungsansätze sind nicht sonderlich brauchbar.

MfG
Falk

Autor: Der Albi (der-albi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe leider keinen Pin mehr frei, um ein Reset zu implementieren. 
Deswegen MUSS eine Leitung doppelt verwendet werden.
Mir fällt leider keine andere möglichkeit ein.. ich hab ja nichtmal ein 
ChipSelect :-(

Ich habe einen bidirektionalen Seriel-In-Out-Pin -> geht nicht
Der Clock-Pin geht auch nicht.
Nur der Pins der sagt, ob Lesen oder Schreiben dran ist, kann verwendet 
werden.

Mir geht es nur darum, nach dem Anschlaten einen Definierten Zustand zu 
haben, egal, das wie µC-Pins beim anschalten tun. Ich denke dafür ist 
der Reset ok. Bloß wie?

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich komme mit Deiner Erklärung nicht klar. Eine Freuqnzverdopplung 
erzeugt man mit zwei toggelnden FFs, die jeweils auf pos und neg 
arbeiten und am Ausgang ein XOR haben

Takt  000000111111110000000111100000011111111100000111111111
FF1:  000000011111111111111100000000001111111111111100000000
FF2:  000000000000000111111111110000000000000001111111111111

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich komme mit Deiner Erklärung nicht klar. Eine Freuqnzverdopplung
> erzeugt man mit zwei toggelnden FFs, die jeweils auf pos und neg
> arbeiten und am Ausgang ein XOR haben
>
> Takt  000000111111110000000111100000011111111100000111111111
> FF1:  000000011111111111111100000000001111111111111100000000
> FF2:  000000000000000111111111110000000000000001111111111111

Das ist nicht so besonders brauchbar. Das Ergebnis sieht dann so aus:
FF1 XOR FF2:
        000000011111111000000011110000001111111110000011111111

Ähnelt irgendwie dem Takt...

Die Variante mit den Gattern geht normalerweise so:

Takt   000000111111110000000111100000011111111100000111111111
Takt2  111000000111111110000000111100000011111111100000111111
FF1 XOR FF2:
       111000111000001110000111011100011100000011100111000000

Der zweite Takt entsteht wenn man den ersten Takt durch ein paar Gatter 
schickt. Allerdings muss man sein Synthesewerkzeug dazu überreden die 
hintereinander geschalteten Gatter nicht wegzuoptimieren.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Albi wrote:
> Öhhm ich kann die Fragestellung auch umformulieren: wie resettet man die
> Counter, bei einem beliebigen Flankenwechsel eines Signals :-)

Nun ja, 2 FlipFlops mit je einem AND-gatter mit einem invertiertem 
Eingang zur Erkennung der Flanken. Danach die beiden Impulse mit 
OR-gatter zusammen fassen.

Autor: Der Albi (der-albi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Zur Zeit habe ich es mit Invertern und And-Gattern gemacht. Siehe 
Anhang.
Leider wird dadurch kein Signal generiert.
Wie sagt man der Xilinx ISE, dass die Inverter zwecks 
Laufzeitverzögerung über den Chip verteilt werden sollen?

MFG

Autor: Joerg Wolfram (joergwolfram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht es mit freien Makrozellen aus? Eventuell könnte man 2 Zähler 
mit nachgeschaltetem Mux verwenden. Auswahl über die RD/WR Leitung, der 
nicht benutzte Zähler wird zurückgesetzt.

Gruß Jörg

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Albi wrote:
> Zur Zeit habe ich es mit Invertern und And-Gattern gemacht. Siehe
> Anhang.
> Leider wird dadurch kein Signal generiert.
> Wie sagt man der Xilinx ISE, dass die Inverter zwecks
> Laufzeitverzögerung über den Chip verteilt werden sollen?
>
> MFG

Mit "NOREDUCE = 1" als Attribut.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mench Leutz, ihr baut hier asynchrone Logik in Chips ein, die für 
synchrones Design gedacht sind. Wenn schon, dann richtig :

Zwischen (eine!)  Inverstufen FFs dazwischenschalten, um echte 
Verzögerung zu bekommen.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn nur um den Reset für Zähler geht, kann man das machen, der ist eh 
meist asynchron. Aber dann bitte mit der Flankenerkennung wie ich das 
vorgeschlagen habe. Das ist dann auch von der Optimierung und Lage der 
Gatter unabhängig. Oder man nimmt gleich die Doppel-Flanken-FlipFlops im 
CoolRunner II.

Autor: Der Albi (der-albi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Mit "NOREDUCE = 1" als Attribut.
Wo eingeben?

Das mit den Flipflops verstehe ich leider nicht richtig... wollt ihr 
damit die Inverter ersetzen, da Flipflops mehr "Durchlaufzeit" haben?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doppelklcik auf die Leitungen am Buffer, dann über New....

Mit FlipFlop bleibt halt alles synchron, ich kenne ja deine Logik nicht, 
aber ich rate dir dringend, das ganze Design so synchron wie möglich zu 
bauen. Mit FF hast du dann genau 1 takt Verzögerung.

Aber dein Problem lässt sich viel einfacher lösen: Mit der 
Doppel-Flankenerkennung mit 2 FlipFlips und 2 AND2B1-Gatter, wie ich das 
oben schon beschrieben habe.

Autor: Der Albi (der-albi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kannst du das mal skizzieren? ;-)

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee, Montag erst. Hab zu Hause keine ISE. Hast du denn einen Clock, zu 
dem alles synchron ist, oder machst du ein asynchrones Design? Aber Takt 
müsste ja da sein, weil du ja Shiftest....

Autor: Der Albi (der-albi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ich hab nen Takt zu dem ich shifte.. aber dazu is quasi nur der 
Counter und das Shift-Register syncron. Resetten will ich asyncron.
Der Takt liegt ja auch nur an, wenn ich was lesen/schreiben will. Ist 
also nicht immer da.

Das reseten bei wäre aber Asyncron.

-> Szizze auch gerne als handgemalte bmp (oder anderes Format ;-), falls 
das geht )

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vergiss den asynchronen Reset. Ist meistens eh nicht nötig.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also so ein Design würd ich nicht machen. Hast du keinen Clock, der 
immer anliegt? Wo kommt der für das Schieberegister denn her? Mach das 
mal lieber alles synchron. Ohne Takt klappt das mit der 
Flanken-Erkennung nicht.

Mit Takt gehts noch einfacher ist mir gerade eingefallen. Ein FlipFlop 
und ein XOR-Gatter. Takt muss an das FlipFlip, dein Signal, auf dass der 
Reset kommen soll an den D-Eingang, und dann fasst du den Eingang und 
den Ausgang des FF mit dem XOR zusammen. Der Ausgang des XOR ist dann 
immer kurz High, wenn das Eingangssignal den Pegel wechselt. Reicht für 
einen asynchronen Zähler-Reset.

Autor: Der Albi (der-albi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schlauer Hans: Haha. Danke trotzdem. O_o

Der Takt fürs schieberegister kommt vom SPI-Takt. Das funktioniert auch 
alles so, wies soll, nur ist der Anfangszustand undefiniert, wenn der µC 
mit den SPI-Beinchen wackelt beim PowerUp oder der anschließenden 
Inititialisierung... oder wenn der µC neu programmiert ist und vorher 
eine Übertragung im Gange war... es muss einfach ein asyncroner Reset 
her, damit definierte Zustände herrschen. Und das einzige, das sich 
abietet, sind die Flanken des Daten-Richtungs-Pins.
Mir würde es auch reichen, wenn der Reset nur auf eine Flanke reagiert.. 
das is wurst.. Hauptsache ein Reset ist drinne.

MFG

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.