Forum: FPGA, VHDL & Co. Verständnisproblem mit "Eintakten von fremden Takt"


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Michael (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich versuche ein ASIC (relativ überschaubare Digitalschaltung) durch ein 
FPGA zu ersetzen.

Das ASIC nutzt einen internen Oszillator mit 1 MHz, damit die Ausgänge 
PWM usw. wieder stimmen, will ich das FPGA ebenfalls mit 1 MHz 
einsetzen.

Jetzt ist es aber so, dass das ASIC über eine serielle Schnittstelle 
(ähnlich SPI mit Chip Select, Takt, Daten) mit 50 ns Takt high/low 
"gefüttert" wird.

Wie kann ich das am besten im FPGA realisieren? Das übliche Vorgehen, 
den "Takt von außen einzutakten" klappt ja nicht, wenn mein interner 
Takt nur 1 MHz beträgt.

Und das FPGA mit solch hohem Takt zu betreiben, dass dieser mindestens 
das doppelte des externen Takts beträgt, ist doch völlig verrückt.

Ideen? Wie würdet ihr hier vorgehen?


Viele Grüße,

Michael

von Andreas H. (ahz)


Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Ideen? Wie würdet ihr hier vorgehen?

Genau so wie im ASIC ;)

Du benutzt den Takt der seriellen Schnittstelle als "Takt" in einer 
eigenen Clockdomain, unabhängig von der Mainclock.

Nach der Seriell->Parallelwandlung hast Du die Daten mit einer 
niedrigeren Frequenz (z.B. 50ns seriell, aka 20MHz -> 32Bit parallel, 
also 32*50ns=1.6us =625KHz) und kannst die Daten in die Maindomain 
bringen, weil sie jetzt in der Maindomain eingetastet werden können.

Oft kann man aber schon in der SerialDomain viel erledigen, z.B. prüfen 
ob die Daten ok waren und einen evtl. benötigten Status zurückliefern.
Oder man muss nur einen Teil der Daten an die Maindomain übergeben. 
Reduziert auch den Durchsatz (lies Abtastrate).

Mit den Details wirst du da viel Spass haben ;)

Grüße
Andreas

von Michael (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Andreas H. schrieb:
> Du benutzt den Takt der seriellen Schnittstelle als "Takt" in einer
> eigenen Clockdomain, unabhängig von der Mainclock.

Also ganz brutal im process: if rising_edge(serial_clk) ... ?

Hätte ich mich jetzt nicht direkt getraut.

Andreas H. schrieb:
> Oft kann man aber schon in der SerialDomain viel erledigen, z.B. prüfen
> ob die Daten ok waren und einen evtl. benötigten Status zurückliefern.
> Oder man muss nur einen Teil der Daten an die Maindomain übergeben.
> Reduziert auch den Durchsatz (lies Abtastrate).

Ja, das Prüfen wollte ich dort sowieso schon machen. Status zurück gibt 
es nicht und der Datendurchsatz ist auch überschaubar: Alle 2, 3 ms 
kommt so ein Datenpaket mit 16 Bits - es ist halt nur sehr schnell.

Andreas H. schrieb:
> Mit den Details wirst du da viel Spass haben ;)

Genau das hatte ich ja schon befürchtet. Ich wollte die empfangenen 
Daten, sofern sie gültig sind, in ein Register übernehmen und die 
einzelnen Bits parallel als Signale für den Rest der Schaltung verfügbar 
machen (die läuft dann aber mit dem System-Clock des FPGA) und hier habe 
ich irgendwie "Bauchschmerzen".

Ist das was dran? Oder mache ich mir gerade unnötige Sorgen, weil ich so 
etwas noch nicht gemacht habe?

(Ich entwickele seit über zwanzig Jahren Low-Level-Embedded-Software, 
aber mit dem VHDL und FPGA tue ich mich zugegebenermaßen noch etwas 
schwer - oder ich bin übervorsichtig.)

Viele Grüße,

Michael

von Andreas H. (ahz)


Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Alle 2, 3 ms kommt so ein Datenpaket mit 16 Bits - es ist halt nur sehr schnell.
>
Das ist aber egal, solange der FPGA die absolute Frequuenz handhaben 
kann (was bei 50ns gehen sollte).

> Ich wollte die empfangenen Daten, sofern sie gültig sind, in ein Register 
übernehmen und die einzelnen Bits parallel als Signale für den Rest der Schaltung 
verfügbar machen (die läuft dann aber mit dem System-Clock des FPGA) und hier habe 
ich irgendwie "Bauchschmerzen".

Nein, genau so musst Du das machen.

Beachte aber unbedingt, dass Du einen Domainübergang hast. Das heisst, 
Du musst (!!!) die Daten in die Maindomain einsynchronisieren.
Wenn Du allerdings ein Validsignal für die Daten hast (und sich die 
Datenbits  DEFINITIV nicht ändern während VALID aktiv ist) reicht es 
auch, das VALID einzusynchronisieren.

>
> Ist das was dran? Oder mache ich mir gerade unnötige Sorgen, weil ich so
> etwas noch nicht gemacht habe?
>
Letzters denke ich. Du musst halt aufpassen was Du da machst. Da lassen 
Dich nämlich auch die Simulatoren meist im Regen stehen (ein Problem 
gibts ja nur bei bestimmten Clockabständen. Dann aber richtig).

Zeichne Dir das Ganze einfach mal hin und schiebe die Serial clock (im 
Verhältniss zur Mainclock) hin- und her. Dann siehst Du irgendwann, dass 
die Setup/Holdzeiten nicht mehr eingehalten werden. DAS ist das Problem 
(was Du hier durch einsynchronisieren lösen kannst).

> (Ich entwickele seit über zwanzig Jahren Low-Level-Embedded-Software,
> aber mit dem VHDL und FPGA tue ich mich zugegebenermaßen noch etwas
> schwer - oder ich bin übervorsichtig.)
Dann stells Dir einfach wie eine Multiprocessor RT-Application vor. Das 
"Drama" mit dem Zugriff auf shared Resourcen ist ja nicht unähnlich.

Das kriegst Du schon hin ;)

Grüße
Andreas

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Jetzt ist es aber so, dass das ASIC über eine serielle Schnittstelle
> (ähnlich SPI mit Chip Select, Takt, Daten) mit 50 ns Takt high/low
> "gefüttert" wird.
Du gehst her und nimmst ein Schieberegister für diesen Datenstrom. Und 
der wird dann über das "langsame" CS validiert.
Ggfs. müssen die eingeschobenen Daten durch die abschließende CS Flanke 
erst in ein Schattenregister und von dort dann in die 1MHz Domäne 
übernommen werden.

Wie viele Datenbits hast du da? Mehr als 20? Denn sonst könnten ja 2 
Datenworte pro 1MHz Takt übertragen werden.

Muss der ASIC auch "antworten", z.B. über ein taktsynchrones Dout?

Michael schrieb:
> Wie würdet ihr hier vorgehen?
Ich würde zusätzlich zur obigen "asynchronen" taktgesteuerten 
Datenübertragung dem FPGA einen deutlich höheren Systemtakt gönnen und 
dann das ganze restliche Handling im ASIC, das sicher auch irgendwie 
asynchron abäuft, völlig synchron zu diesem Systemtakt nachbauen. Wenn 
der z.B. 16MHz oder 32MHz ist, dann ergibt sich ein glatter und 
einfacher Binärteiler für das gewünschte 1 MHz.

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.

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