Forum: FPGA, VHDL & Co. Aktionen bei steigender und fallender Flanke durchführen


von Tilo (Gast)


Lesenswert?

Guten morgen

Ich bin immer noch dabei mich in VHDL einzugewöhnen (Xilinx, Spartan 3). 
Im Moment bin ich dabei, einen Übertrager für SPI zu schreiben. Damit 
der SPI Takt unabhängig vom Systemtakt verwendet werden kann und weil 
ich auch ganz gerne einen lokalen Puffer hätte, habe ich für MISO und 
MOSI FIFOs eingesetzt.

Jetzt habe ich das Problem, dass die Daten des MOSI FIFOs bei fallender 
Flanke gelesen werden sollen, das MISO FIFO allerings bei steigender 
Flanke neue Daten haben will, da es selbst bei fallender Flanke 
einliest.

Bekanntlich gibt es keine DDR FFs. Den SPI Takt erzeuge ich per DCM. 
Meine Idee war nun, von der DCM den selben Takt 180° phasenverschoben 
erzeugen zu lassen und dieses Signal als Takt für das MISO FIFO zu 
verwenden. Somit sieht das MISO FIFO ein neues Signal immer zur 
steigenden Flanke. In der Simulation funktioniert das wunderbar.

Ist eine solche Lösung ein gängiger Weg oder gibt es dafür bessere 
Lösungen?

VG Tilo

von abc (Gast)


Lesenswert?

SPI ist nicht viel mehr als ein Schieberegister, sehe keinen Grund wofür 
man dort bei steigender und fallender Flanke operieren will.

Tilo Lutz schrieb:
> Jetzt habe ich das Problem, dass die Daten des MOSI FIFOs bei fallender
> Flanke gelesen werden sollen, das MISO FIFO allerings bei steigender
> Flanke neue Daten haben will, da es selbst bei fallender Flanke
> einliest.

Da steige ich grad nicht durch. Denknst du das wäre die Anforderung oder 
hast du dir selbst diese Anforderung gesetzt?

In jedem Fall denkt du höchstwarscheinlich viel zu kompliziert.

Zeig doch mal deinen Code.

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


Lesenswert?

Tilo Lutz schrieb:
> Jetzt habe ich das Problem, dass die Daten des MOSI FIFOs bei fallender
> Flanke gelesen werden sollen, das MISO FIFO allerings bei steigender
> Flanke neue Daten haben will, da es selbst bei fallender Flanke
> einliest.
Du mußt Ursache und Wirkung kennen, dann wird alles ganz einfach:
http://www.lothar-miller.de/s9y/categories/17-SPI
Mit einem Takt an jedem einzelnen SPI-FF wird einfach die Kette um eins 
weitergeschoben. Das muß nicht zwingend erst bei der nächsten Taktflanke 
sein.

> Bekanntlich gibt es keine DDR FFs. Den SPI Takt erzeuge ich per DCM.
Du MUSST nicht alles verwenden, was du auf dem FPGA findest. SPI sind 
wie erwähnt nur gekoppelte Schieberegister, und ein SPI-Master ist 
unglaublich einfach zu Implementieren.
http://www.lothar-miller.de/s9y/categories/45-SPI-Master
http://www.lothar-miller.de/s9y/categories/26-SPI-Slave

von Tilo (Gast)


Lesenswert?

SPI ist klar. Das ist auch kein Thema, da brauche ich so etwas nicht.

Mir geht es um die FIFOs, die ich verwende um den Seriellen Datenstrom 
Byteweise in FIFOs zu packen. Wenn ich mir die Timingdiagramme anschaue, 
sehe ich, dass die FIFOs mit fallender Flanke gelesen und mit steigender 
Flanke beschrieben werden müssen.

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


Lesenswert?

Tilo Lutz schrieb:
> Mir geht es um die FIFOs, die ich verwende um den Seriellen Datenstrom
> Byteweise in FIFOs zu packen. Wenn ich mir die Timingdiagramme anschaue,
Welche Timingdiagramme?
> sehe ich, dass die FIFOs mit fallender Flanke gelesen und mit steigender
> Flanke beschrieben werden müssen.
Welche FIFOs? Was beschreiben, was lesen?

von Tilo (Gast)


Lesenswert?

Die FIFOs, die ich mit dem IP generator von ISE 13.1 für den Spartan 3 
erzeugen kann. Die Timingdiagramme sind in der fifo_generator_ug175.pdf 
vin Xilinx unter "FIFO Usage and Control" -> (Write | Read) Operation

Ich verwende zwei unaabhänige FIFOs als Eingangs- bzw. Ausgangspuffer.
Wenn ich z.B. 32 Bytes übertragen will, werden diese in den FIFO gelegt 
und dan per SPI nacheinander gesendet.

Sorry, dachte das ist aus dem Kontext klar.

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


Lesenswert?

Tilo Lutz schrieb:
> Die Timingdiagramme sind in der fifo_generator_ug175.pdf
> vin Xilinx unter "FIFO Usage and Control" -> (Write | Read) Operation
Ich sehe da kein Diagramm, wo irgendwas als Reaktion auf eine fallende 
Flanke passiert...
Verlink doch mal dein Dokument und schreib die Seitenzahl und die 
bildnummer dazu. Oder wirst du selber aus denen Informationen, die du 
hier gepostet hast, schlau, ohne vorher dein Problem gekannt zu haben?

> Ich verwende zwei unaabhänige FIFOs als Eingangs- bzw. Ausgangspuffer.
> Wenn ich z.B. 32 Bytes übertragen will, werden diese in den FIFO gelegt
> und dan per SPI nacheinander gesendet.
Weil du sowieso auf dem "schnarchlangsamen" SPI unterwegs bist, der pro 
Byte mindestens 8 Takte braucht, kann dir egal sein, zu welchem 
Zeitpunkt der Fifo die Daten rausrückt. Die müssen ja nur zur nächsten 
Bytegrenze stabil sein...

Aber das gibt mir noch sehr zu denken:
Tilo Lutz schrieb:
> Damit der SPI Takt unabhängig vom Systemtakt verwendet werden kann
Welchen Systemtakt hast du da? Welchen SPI-Takt? Und warum erzeugst du 
nicht einfach den SPI-Takt aus dem Systemtakt?

von Tilo (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Eigentlich werde ich daraus schon schlau. Mir ging es von Anfang an um 
die FIFOs und Antworten habe ich zu SPI bekommen. Ich habe SPI nur 
erwähnt, um das Problem vollständig zu beschreiben.
FIFO 1 gibt die Daten bei steigender Flanke aus, somit sind die Daten 
bei fallender Flanke stabil. FIFO 2 liest die Daten mit fallender Flanke 
ein, somit müssen die Daten mit steigender Flanke angelegt werden, damit 
sie stabil sind.

Da meine Steuerlogik auf fallende Flanke reagiert, kann sie schlecht 
Daten bei steigender Flanke ausgeben. Daher meine Frage, ob es eine 
bessere Lösung gibt, als das 2. FIFO mit einem invertiertem Takt zu 
betreiben.

Ich habe die Diagramme aus dem oben genannten Dokument angehängt.

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


Lesenswert?

Tilo Lutz schrieb:
> FIFO 1 gibt die Daten bei steigender Flanke aus,
Korrekt.
> somit sind die Daten bei fallender Flanke stabil.
Wie kommst du darauf? Woraus schließt du das? Nur aus der Zeichnung?
Das einzige, was dir der FIFO garantiert, ist, dass die Daten vor der 
nächsten steigenden Flanke stabil sind.

> Ich habe die Diagramme aus dem oben genannten Dokument angehängt.
Dort siehst du, dass komplett ALLES in diesen FIFOs auf eine steigende 
Flanke reagiert. Die fallende Flanke ist nur exemplarisch vorhanden. Es 
wird keinerlei Zeitbezug (gestrichelte Linie) zu ihr hergestellt.

> Da meine Steuerlogik auf fallende Flanke reagiert, kann sie schlecht
> Daten bei steigender Flanke ausgeben. Daher meine Frage, ob es eine
> bessere Lösung gibt, als das 2. FIFO mit einem invertiertem Takt zu
> betreiben.
Sicher.
Gib doch bitte mal ein paar Zahlen:
Was hast du für einen Takt?
Wie schnell läuft dein SPI?

> Da meine Steuerlogik auf fallende Flanke reagiert
Warum?
Hier nochmal meine Postulate:
1
Ein Design (insbesondere ein Anfängerdesign) hat genau 1 Takt, 
2
der immer auf dieselbe Flanke aktiv ist. 
3
Es gibt keinen (und schon gar keinen asynchronen) Reset.
4
Externe Signale werden über 2 Flipflops einsynchronisiert.
5
Jede Abweichung von diesen Regeln muß fundiert begründet werden können.
Warum schaffe ich es, in meinen Designs diese Postulate meist 
einzuhalten? Und, falls ich eine Regel verletze, immer einen guten Grund 
dafür habe?

von abc (Gast)


Lesenswert?

Tilo Lutz schrieb:
> FIFO 1 gibt die Daten bei steigender Flanke aus, somit sind die Daten
> bei fallender Flanke stabil. FIFO 2 liest die Daten mit fallender Flanke
> ein, somit müssen die Daten mit steigender Flanke angelegt werden, damit
> sie stabil sind.
>
> Da meine Steuerlogik auf fallende Flanke reagiert, kann sie schlecht
> Daten bei steigender Flanke ausgeben. Daher meine Frage, ob es eine
> bessere Lösung gibt, als das 2. FIFO mit einem invertiertem Takt zu
> betreiben.

Wie schon vermutet, viel zu kompliziert gedacht.

Richtig würde es heißen:

Fifo 1 gibt nimmt das read enable bei steigende Flanke an, somit sind 
die Daten aus DOUT bei der nächsten steigenden Flanke stabil.

FIFO 2 liest die Daten mit steigender Flanke ein, wenn write enable 
aktiv ist. Das write enable sowie DIN Register muss demnach zur 
gleichen, steigenden Flanke gesetzt werden.

Deine Steuerlogik sollte deshalb auch auf die steigende Flanke reagieren 
und die Daten, welche geschrieben werden sollen, eine steigende Flanke 
vorher anlegen.

(geht auch alles kombinatorisch, aber hier überflüssig)

von Tilo (Gast)


Lesenswert?

@Lothar:
Wenn die Daten vor der nächsten stiegendn Flanke stabil sind, müssten 
sie es doch auch bei der vorangegangenden fallenden Flanke sein? Würde 
ich das FIFO mit der steigenden Flanke auslesen, könnte es doch sein, 
dass der Lesevorgang genau in den Datumswechsel fällt?

Du hast recht, dass genau alles auf steigende Flanken reagiert und genau 
deswegen will ich bei der fallenden Flanke auslesen, weil dort nichts 
passiert, also auch kein Datumswechsel stattfinden kann.

Ich denke genau das ist der Knackpunkt.

Im Moment arbeitet die Steuerlogik mit 8MHz, SPI von 4MHz. Eventuell 
will ich bis 32MHz/16MHz hoch.

@abc:
Ich habe die kurze Pause zwischen steigender Flanke und Datumswechsel 
als Laufzeit betrachtet, welche ich nicht als fest definiert betrachtet 
habe und deshalb nicht darauf vertrauen wollte.
Kann ich immer darauf vertrauen, dass der Datumswechsel lang genug 
verzögert ist, dass bei steigender Flanke gelesen werden kann?
Wie kommt die Verzögerung zu stande?

von abc (Gast)


Lesenswert?

Ein FF, genauso wie das FIFO reagiert in diesem Fall immer nur genau zu 
dem Zeitpunkt der steigenden Flanke, ohne Verzögerung.

Bis zur nächsten steigenden Flanke müssen die Daten stabil anliegen 
sonst ist unklar was passiert.

Das diese Daten jedoch stabil sind bis dahin(Laufzeit durch Gatter) 
garantiert dir die Timinganalyse.


Ich sehe ehrlich gesagt das Problem nicht und vermute du denkst dir mit 
der Laufzeit und den Timingdiagrammen dort nen Knoten ins Hirn der in 
der Realität überflüssig ist.

Was zwischen zwei steigenden Flanken passiert interessiert bei 
synchronen Designs niemanden.


Du schreibst ja:

>> In der Simulation funktioniert das wunderbar.

dann zeig doch mal anhand eines waveforms wo dein Problem ist wenn du 
rein synchron, ausschließlich mit steigenden Flanken arbeitest. Ich 
wette da gibt es keins.

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


Lesenswert?

Tilo Lutz schrieb:
> müssten sie es doch auch bei der vorangegangenden fallenden Flanke sein?
Warum?
Wenn du eine Taktfrequenz von 100MHz hast (= 5ns high, 5ns low), und die 
Daten stehen erst 6ns nach der steigenden flanke bereit, dann reicht das 
locker für die nächste steigende Flanke, es ist aber für die fallende 
Flanke zu spät.

> Kann ich immer darauf vertrauen, dass der Datumswechsel lang genug
> verzögert ist, dass bei steigender Flanke gelesen werden kann?
Nur so funktioniert ein FPGA.
Aber: der Datumswechsel ist aber nicht solange verzögert, sondern er 
kommt ja WEGEN der steigenden Flanke zustande. Dann haben die Daten eine 
Beruhigungszeit bis zur nächsten steigenden Flanke.

> Wie kommt die Verzögerung zu stande?
Laufzeiten, Verzögerungszeiten im Flipflop...

> Im Moment arbeitet die Steuerlogik mit 8MHz, SPI von 4MHz. Eventuell
> will ich bis 32MHz/16MHz hoch.
Als Tipp: lass dein FPGA prinzipiell mit einem Takt von 32MHz (oder 50 
oder 60 oder sonstwas sehr viel größeres als der SPI-Takt) laufen, dann 
hast du locker Zeit zur Fifo-Verwaltung...

von Lattice User (Gast)


Lesenswert?

Lothar Miller schrieb:
>> Im Moment arbeitet die Steuerlogik mit 8MHz, SPI von 4MHz. Eventuell
>> will ich bis 32MHz/16MHz hoch.
> Als Tipp: lass dein FPGA prinzipiell mit einem Takt von 32MHz (oder 50
> oder 60 oder sonstwas sehr viel größeres als der SPI-Takt) laufen, dann
> hast du locker Zeit zur Fifo-Verwaltung...

Und betrachte den SPI Takt als normales Signal, erzeugt im Rahmen einer 
SPI Statemachine. Dann ist IMO vieles trivial.

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


Lesenswert?

Lattice User schrieb:
> Und betrachte den SPI Takt als normales Signal
Korrekt. Das kam offenbar nicht so richtig rüber: Signale, die aussen am 
FGPA anliegen, sind keine Takte, auch wenn sie SCL, SCLK, Takt, Clock 
oder sonstwie artverwandt heißen.
Im einfachsten Fall hast du nur 1 recht schnellen Quarz-Takt und viele 
Signale, die mit diesem Takt bearbeitet werden.
Da kann es schon mal vorkommen, das so ein SPI-Takt sich als 
vermeintliche Taktquelle aufdrängt (oder auch ein PS2-Takt, oder ein 
AD-Wandler-Takt...). Dieser "Takt" ist aber einfach ein Signal, dessen 
Pegelwechsel irgendwas anzeigt (hier: sieh dir mal die 
MOSI/MISO-Leitungen genauer an).

von Tilo (Gast)


Lesenswert?

Danke für eure Tips.

Wie schon geschrieben, es lief alles, allerdings kam es mir gepfuscht 
vor. Ich habe die Logik jetzt mit steigender Flanke am laufen und es 
funktioniert. Wer hätte das gedacht ;)

Den SPI Takt hatte ich schon in der State Machine. Ich habe sehr schnell 
gemerkt, dass ich mir unnötig das Leben schwer mache, wenn ich versuche 
einen Systemtakt zu verwenden.

Nach dem ich das Datenblatt von meinem SPI Slave nochmals durchgelesen 
habe und nach dem letzten Byte 8xSPI_CLK warte, bevor CS wieder high 
wird, kann ich sogar Daten lesen.

Vielen Danke den geduldigen Helfern,

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.