Programmierbare Logik FPGA-Entwicklung: Schnittstellen zu externen SPI-Bausteinen

Von Eugen Krassin* 7 min Lesedauer

Anbieter zum Thema

Das Serial Peripheral Interface ist in der Elektronik so etwas wie die Brot- und Butter-Schnittstelle zum Anbinden externer Komponenten an einen Logikbaustein. Was beim Realisieren eines SPIs in einem Field Programmable Gate Array oder kurz FPGA zu beachten ist, zeigt dieser Beitrag.

Beim FPGA-Schaltungsdesign geht es darum, die richtigen Puzzleteile wohldurchdacht zusammenzufügen, um eine optimale Funktion, Performance und Platzausnutzung zu erreichen. PLC2 bietet eine kostenlose Grundlagen-Webinar-Reihe für FPGA-Entwickler an.(Bild:  frei lizenziert /  Pixabay)
Beim FPGA-Schaltungsdesign geht es darum, die richtigen Puzzleteile wohldurchdacht zusammenzufügen, um eine optimale Funktion, Performance und Platzausnutzung zu erreichen. PLC2 bietet eine kostenlose Grundlagen-Webinar-Reihe für FPGA-Entwickler an.
(Bild: frei lizenziert / Pixabay)

Eine SPI-Schnittstelle lässt sich im FPGA mit unterschiedlichen Ansätzen realisieren – zum Beispiel mit einer oder zwei Taktdomänen. Wie das geht, zeigt dieser Beitrag. Zudem verdeutlicht er unterschiedliche Vorgehensweisen bei der Entwicklung sowie der Definition der Timing Constraints.

Bei der Implementierung der SPI-Schnittstelle wurden zwei grundsätzlich verschiedene Ansätze zur Implementierung verwendet. Der erste Ansatz beschreibt ein Konzept mit zwei Taktdomänen (Two Clock Domain). Der zweite Ansatz implementiert die Schaltung mit nur einer Taktdomäne (Single Clock Domain).

Implementierung mit zwei Takt-Domänen

Als typischer Vertreter einer SPI-Schnittstelle dient hier der Baustein DAC AD7303 von Analog Devices. Bild 1 zeigt das Timing Diagramm der Schnittstelle sowie die Timing Parameter. In diesem Beispiel wird die SCLK-Frequenz mit 30 MHz gewählt. Die Timing Parameter t4, t5 und t6 müssen bei der Definition der Timing-Anforderungen (Timing Constraints) besonders beachtet werden.

Bild 1: AD7303 Timing-Diagramm und Timing-Anforderungen.(Bild:  PLC2 GmbH)
Bild 1: AD7303 Timing-Diagramm und Timing-Anforderungen.
(Bild: PLC2 GmbH)

Bei der Implementierung mit zwei Takt Domänen werden zwei, nicht notwendigerweise synchrone, Takte verwendet. Im vorliegenden Fall sind die Takte 120 MHz und 30 MHz. Die Ablaufsteuerung wird mit 120 MHz getaktet, während die eigentliche SPI FSM mit 30 MHz gesteuert wird.

Wie aus Bild 2 ersichtlich ist daher eine Synchronisationsstufe zwischen den beiden Taktdomänen notwendig (sollten die beiden Taktdomänen zueinander synchron sein, kann die Synchronisationsstufe entfallen). Die Implementierung der SPI-Schnittstelle mit zwei Clock Domains ist in Bild 2 gezeigt.

Bild 2: SPI-Interface-Implementierung mit zwei Clock-Domänen.(Bild:  PLC2 GmbH)
Bild 2: SPI-Interface-Implementierung mit zwei Clock-Domänen.
(Bild: PLC2 GmbH)

Verwendete Parameter:

  • Eingangstakt: 100 MHz
  • Interner Takt CLK_120: 120 MHz
  • Interner Takt CLK_30: 30 MHz
  • Generierter Takt dac_sck: 30 MHz

Die PLL_120_30: Die PLL erzeugt aus dem externen Takt CLK (100 MHz) zwei interne, phasensynchrone Takte CLK_120 und CLK_30.

Modul dac_sample_gen: Das Modul dac_sample_gen erzeugt das sample Signal (convert) für die dac_fsm. Das sample Signal initiiert die Übertragung der digitalen Daten zum DAC. Die Einstellung der sample Rate erfolgt über sample_select [1:0] und ist in der dargestellten Tabelle gegeben. Das Block Diagramm von dac_sample_gen ist in Bild 3 gezeigt.

Tabelle 1: Die Einstellung der sample Rate erfolgt über sample_select [1:0].(Bild:  PLC2 GmbH)
Tabelle 1: Die Einstellung der sample Rate erfolgt über sample_select [1:0].
(Bild: PLC2 GmbH)

Bild 3: Block Diagramm dac_sample_gen.(Bild:  PLC2 GmbH)
Bild 3: Block Diagramm dac_sample_gen.
(Bild: PLC2 GmbH)

Steuersignal mode_select: Das Steuersignal mode_select erzeugt entweder ein Rechtecksignal oder ein dreieckförmiges Signal als Eingangsdaten für den DAC.

Modul sync_stage: Das Modul dac_sample_gen arbeitet mit CLK_120. Die Steuereinheit dac_fsm ist Teil der CLK_30 Domäne. Das Modul sync_stage transportiert das convert Signal von der CLK_120 Domäne in die CLK_30 Domäne. Entsprechende Signale von der dac_fsm werden von der CLK_30 Domäne in die CLK_120 übertragen. Das Block Diagramm von sync_stage ist in Bild 4 gezeigt.

Bild 4: Block Diagramm sync_stage.(Bild:  PLC2 GmbH)
Bild 4: Block Diagramm sync_stage.
(Bild: PLC2 GmbH)

Modul dac_fsm: Das Modul dac_fsm steuert die Erzeugung der Steuer/Data Signale zum DAC. Um die in Bild 1 gegebenen Werte von t4, t5 und t6 einzuhalten arbeitet dac_fsm auf der fallenden Flanke von CLK_30. dac_fsm ist wie in Bild 5 gezeigt als eine State Machine implementiert.

Bild 5: Ablaufschema der dac_fsm State Machine.(Bild:  PLC2 GmbH)
Bild 5: Ablaufschema der dac_fsm State Machine.
(Bild: PLC2 GmbH)


Timing Constraints

1. Constraints für den CLK

create_clock -name {clk} -period 10 [get_ports clk]

2. Taktsignale CLK_120 und CLK_30

Die Taktsignale CLK_120 und CLK_30 müssen nicht explizit spezifiziert werden, da diese automatisch von der Designsoftware definiert werden. Diese beiden Takte werden auch als „automatically generated clock“ bezeichnet

clk 10.000 {0.000 5.000} P dac_sclk 33.333 {0.000 16.667} P,G clk_out1_pll_120_30 8.333 {0.000 4.167} P,G,A clk_out2_pll_120_30 33.333 {0.000 16.667} P,G,A clkfbout_pll_120_30 50.000 {0.000 25.000} P,G,A

3. Taktsignal dac_clk

Das am Port dac_sck angeschlossene Signal ist eine Kopie des internen Taktes CLK_30. Dieses Signal wird vom externen DAC als ein Takt interpretiert. Daher muss dieses Signal auch als ein Takt definiert werden um die Zeitanforderungen t4, t5 und t6 korrekt zu beschreiben. Dieser Takt ist ein sogenannter „manually generated clock“.

create_generated_clock -name {dac_sclk} -source [get_pins instance_dac_fsm/instance_dac_sclk/SCLK] -divide_by 1 -multiply_by 1 [get_pins instance_dac_fsm/instance_dac_sclk/Q]

4. Constraints für DAC Inputs/FPGA Outputs

Die Zeiten t4, t5 und t6 beschreiben die Setup- / Hold-Anforderungen an den externen Baustein. Diese Anforderungen werden mit dem set_output_delay Constraint beschrieben.

set_output_delay -clock [get_clocks dac_sclk] -max 5 [get_ports {dac_sdata dac_sync}]set_output_delay -clock [get_clocks dac_sclk] -min -4.5 [get_ports {dac_sdata dac_sync}]

Timing Analyse

Die Timing Analyse bestätigt die ordnungsgemäße Implementierung des Designs.

Die Timing-Analyse bestätigt die ordnungsgemäße Implementierung des Designs.(Bild:  PLC2 GmbH)
Die Timing-Analyse bestätigt die ordnungsgemäße Implementierung des Designs.
(Bild: PLC2 GmbH)

Event-Tipp: FPGA Conference Europe

Guidance to Accelerate your Programmable Solution

FPGA Conference

Einsatzgebiete für programmierbare Logikschaltung sind so vielfältig wie die verfügbaren Lösungen, mit denen sie sich entwickeln lassen. Ob FPGA, GPU oder Adaptive-Computing-SoC: Jede Technologie hat ihre Berechtigung – ist aber auch erklärungsbedürftig.

Die FPGA Conference Europe - als europaweit wichtigste Plattform für hersteller- und technologieunabhängigen und applikationsübergreifenden Austausch zwischen Experten und Entwicklern - gibt Embedded-Entwicklern Orientierung und praktische Hilfestellungen.

Implementierung mit einer Takt-Domäne

Die Implementierung der Single-Clock-SPI-Schnittstelle ist in Bild 6 gezeigt.

Bild 6: Die Implementierung der Single-Clock-SPI-Schnittstelle.(Bild:  PLC2 GmbH)
Bild 6: Die Implementierung der Single-Clock-SPI-Schnittstelle.
(Bild: PLC2 GmbH)

Das Konzept der SPI-Implementierung mit einer einzigen Taktdomäne ist der Implementierung mit zwei Taktdomänen ähnlich. Zur Veranschaulichung wird die PLL nicht verwendet. Auch das Modul sync_stage wird nicht benötigt. Wegen des einzelnen Takts wird das Modul clock_generator benötigt, um die fallende Flanke des dac_sck zu signalisieren, die als Triggerbedingung für die Zustandsmaschine dac_fsm verwendet wird.

Jetzt Newsletter abonnieren

Verpassen Sie nicht unsere besten Inhalte

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung. Die Einwilligungserklärung bezieht sich u. a. auf die Zusendung von redaktionellen Newslettern per E-Mail und auf den Datenabgleich zu Marketingzwecken mit ausgewählten Werbepartnern (z. B. LinkedIn, Google, Meta).

Aufklappen für Details zu Ihrer Einwilligung

Modul clock_generator: Das in Bild 7 gezeigte Modul clock_generator erzeugt das Taktsignal dac_clk sowie die Anzeige der fallenden Flanke von dac_sck. Bild 8 zeigt die Beziehung zwischen dac_sclk und edge_low.

Bild 7: Block Diagramm des Moduls clock_generator.(Bild:  PLC2 GmbH)
Bild 7: Block Diagramm des Moduls clock_generator.
(Bild: PLC2 GmbH)

Bild 8: Zeitbeziehung zwischen dac_sclk und edge_low.(Bild:  PLC2 GmbH)
Bild 8: Zeitbeziehung zwischen dac_sclk und edge_low.
(Bild: PLC2 GmbH)

Modul dac_fsm für die Single-Clock-Implementierung: Das Modul dac_fsm steuert die Erzeugung der Steuer-/Datensignale an den DAC. Um die in Bild 1 angegebenen Werte von t4, t5 und t6 einzuhalten, arbeitet dac_fsm immer an der steigenden Flanke von CLK_120, aber nur dann, wenn das Signal edge_low aktiv. Dac_fsm ist als eine Zustandsmaschine implementiert.

Die Zustandsmaschine dac_fsm hat die gleiche Struktur wie die Zustandsmaschine bei der Implementierung der Lösung mit zwei Takt Domänen. Der einzige Unterschied ist die Auswertung der fallenden Flanke von dac_sck anstatt der Verwendung des Takts clk_30.

Bild 9: Struktur der dac_fsm Zustandsmaschine.(Bild:  PLC2 GmbH)
Bild 9: Struktur der dac_fsm Zustandsmaschine.
(Bild: PLC2 GmbH)

Nachdem das Umwandlungssignal erkannt wurde, wird der Zähler bit_count mit dem Wert 15 geladen. Die seriellen Daten werden auf der Leitung dac_sdata mit der steigenden Flanke des Taktsignals CLK_120 immer dann ausgegeben, wenn edge_low aktiv ist. Nachdem 16 Datenbits übertragen wurden, signalisiert dac_fsm wieder die Bereitschaft und wartet auf das nächste Konvertierungssignal.


Timing Constraints für die Single-Clock-Domain-Implementierung

1. Takt CLK 120

create clock -name CLK -period 8.333 [get_ports clk]

2. Takt dac_clk

Das an den Port dac_sck angeschlossene Taktsignal wird vom clock_generator erzeugt. Die Beziehung zwischen CLK_120 und dac_sck ist geteilt durch 4 (vergleiche dazu Bild 7).

create_generated_clock -name {dac_sck} -source [get_ports clk_120] -divide_by 4 -multiply_by 1 [get_pins clock_gen_inst/toggle_reg/Q]

3. Constraints für DAC Inputs/FPGA Outputs

Die Zeitangaben t4, t5 und t6 beschreiben die Setup- / Hold-Anforderungen für den externen DAC AD7303. Diese Anforderungen werden mit dem Constraint set_output_delay beschrieben. Wegen der Single Clock Domain ist zusätzlich ein Multicycle Constraint notwendig.

set_multicycle_path -from [get_pins instance_dac_fsm/dac_sync_reg/Q] -to [get_ports dac_sync] -start 2set_multicycle_path -from [get_pins instance_dac_fsm/dac_sync_reg/Q] -to [get_ports dac_sync] -start -hold 3set_multicycle_path -from [get_pins { instance_dac_fsm/spi_sdata_i_reg/Q }] -to [get_ports dac_sdata] -start 2set_multicycle_path -from [get_pins { instance_dac_fsm/spi_sdata_i_reg/Q}] -to [get_ports dac_sdata] -start -hold 3set_output_delay -clock [get_clocks dac_sck] -max 5 [get_ports {dac_sdata dac_sync}]set_output_delay -clock [get_clocks dac_sck] -min -4.5 [get_ports {dac_sdata dac_sync}]

Bild 10: Wegen der Single Clock Domain ist zusätzlich ein Multicycle Constraint notwendig.(Bild:  PLC2 GmbH)
Bild 10: Wegen der Single Clock Domain ist zusätzlich ein Multicycle Constraint notwendig.
(Bild: PLC2 GmbH)


Timing Analyse

Die Timing Analyse des Designs mit einer Takt Domäne zeigt die gleichen Ergebnisse wie das Design mit zwei Takt Domänen.

Die Timing-Analyse bestätigt die ordnungsgemäße Implementierung des Designs.(Bild:  PLC2 GmbH)
Die Timing-Analyse bestätigt die ordnungsgemäße Implementierung des Designs.
(Bild: PLC2 GmbH)

Zusammenfassung

Beide Konzepte können verwendet werden, um SPI-Schnittstellen mit niedriger Geschwindigkeit zu implementieren. Die Zweitaktdomäne hat jedoch einen Vorteil beim Stromverbrauch, da ein Teil des Designs mit geringerer Geschwindigkeit läuft. Auch die Timing Constraints sind leichter zu spezifizieren. Das Konzept einer Taktdomäne verwendet ein einzelnes Taktverteilungsnetzwerk, was ein Vorteil ist, da keine Synchronisier-Stufen benötigt werden. Beide Musterprojekte sind auf Anfrage unter info@plc2.de erhältlich. (me)

Kostenlose Webinar-Reihe zur FPGA-Entwicklung

Schaltungstechnik, Timing Constraints und Co.

Dank der Fortschritte in der Fertigungstechnologie können moderne FPGAs Millionen von Logikzellen beinhalten. Häufig sind zudem weitere IP-Blöcke wie Prozessor-Kerne, KI-Beschleuniger, Speicherblöcke mit mehreren MBits integriert. Um eine nahtlose Designmethodik zu definieren, erfordert diese Komplexität einen gut strukturierten und skalierbaren Designablauf.

Das Hauptziel jeder FPGA-Entwicklung ist der Entwurf sicherer und zuverlässiger Schaltkreise. Dementsprechend sind die wichtigsten Schritte die Einhaltung von Design Richtlinien und die Definition der geltenden Timing-Anforderungen. Viele komplexe Designs scheitern bei der Implementierung genau daran.

Design Richtlinien sind für viele Teilbereiche der FPGA-Entwicklung definiert worden, u.a.
– VHDL / Verilog Design Richtlinien
– Richtlinien für zur Reduzierung der Leistungsaufnahme
– Richtlinien für zur Reduzierung der Fläche
– Clock Design
– Reset Design
– Synchronisation und CDC

Die neue, kostenlose Webinar-Reihe von PLC2 GmbH adressiert die wichtigsten, oben genannten Aspekte der FPGA-Entwicklung. Erfahrene Experten präsentieren in regelmäßigen Abständen ausgesuchte Themen aus diesen Bereichen. Weiterführende Themen werden zusätzlich auf der diesjährigen FPGA Conference Europe präsentiert.

Alle Infos zur kostenlosen Webinar-Reihe von PLC2

* Eugen Krassin ist Gründer und Trainer des Schulungszentrums PLC2 GmbH – und ein Urgestein der Programmable-Logic-Branche.

(ID:49877118)