Muss ich mein FPGA-Design nach dem Start zurücksetzen?


7

Normalerweise initialisiere ich Statusregister meiner FSMs durch Angabe eines Anfangswertes in meinem VHDL-Code, sodass ich nach dem Start des konfigurierten FPGA keinen Rücksetzimpuls benötige. Das folgende Beispiel zeigt dies durch einen "Ringzähler", der nur alle Zustandsregister zusammenführt:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity counter_init is
  port (
    clock : in  std_logic;
    msb   : out std_logic);
end entity counter_init;

architecture rtl of counter_init is
  -- large counter to detect excessive skew on Global Write Enable (GWE)
  signal counter : unsigned(255 downto 0) :=
    x"55555555_55555555_55555555_55555555_55555555_55555555_55555555_55555555";
begin  -- architecture rtl

  counter <= counter(0) & counter(counter'left downto 1) when rising_edge(clock);

  -- The counter value will be observed by an on-chip logic analyzer.
  -- Output most-significant bit to prevent synthesizing away the above logic.
  msb <= counter(counter'left); 

end architecture rtl;

Diese Technik hat in meinen Entwürfen für Altera- oder Xilinx-FPGAs bisher funktioniert. Ich habe es explizit mit dem herstellerspezifischen On-Chip-Logikanalysator und einem Startauslöser überprüft. Hier ist ein Screenshot von ChipScope, ok, ein Zyklus wird anscheinend verpasst:

ChipScope-Screenshot

Aber nachdem ich die Dokumente gelesen habe, frage ich mich, wie es funktioniert: Wie beginnen alle Flip-Flops (die mit demselben Taktsignal verbunden sind) gleichzeitig umzuschalten?

Die Startsequenz für ein Xilinx-FPGA ist beispielsweise im 7 Series FPGAs Configuration User Guide (UG470) beschrieben . Nach der Konfiguration des FPGA wird eine Startsequenz ausgeführt, die eine "Global Write Enable (GWE)" bestätigt. Tabelle 5-12 :

Wenn aktiviert, aktiviert GWE die CLB- und IOB-Flipflops sowie andere synchrone Elemente auf dem FPGA.

und in der Fußnote:

GWE wird synchron zur Konfigurationsuhr (CCLK) aktiviert und weist einen signifikanten Versatz über das Teil auf. Daher werden sequentielle Elemente nicht synchron zur Systemuhr des Benutzers freigegeben, und beim Start können Zeitverletzungen auftreten. Es wird empfohlen, das Design nach dem Start zurückzusetzen und / oder eine andere Synchronisationstechnik anzuwenden.

Das bedeutet also tatsächlich: Wenn die Uhr an den Flip-Flops bereits umschaltet, können alle Flip-Flops zu unterschiedlichen Zeiten / Taktflanken umschalten. Vorausgesetzt, der Taktoszillator auf der FPGA-Karte läuft bereits und ich verwende einen globalen Taktpuffer ohne Freigabeeingang ( BUFG): Schaltet der Takteingang an den Flip-Flops bereits um, bevor GWE aktiviert wird?

Ich habe in UG470 keine Informationen darüber gefunden, ob und wie Taktpuffer aktiviert sind. Im Handbuch für alle programmierbaren SoC-Bibliotheken der Xilinx 7-Serie für FPGA und Zynq-7000 für HDL-Designs (UG768) heißt es nur, dass der Taktfreigabeeingang von a BUFGCTRLsynchron aktiviert werden muss. Dies ist jedoch tatsächlich eine benutzergesteuerte Eingabe.

Für das Altera Cyclone III FPGA, das ich ebenfalls verwende, habe ich im Cyclone III-Gerätehandbuch keine relevanten Informationen gefunden .

Um es zu wiederholen: Ich habe bisher keine fehlgeschlagene Initialisierung beobachtet, aber dies scheint in den Dokumenten nicht angegeben zu sein.


2
Eine allgemeine Regel - rechnen Sie nicht mit Dingen, die Sie nicht kontrollieren. Wenn Ihr Startstatus wichtig ist, stellen Sie einen externen Reset bereit, der nach Abschluss der Konfiguration freigegeben wird.
WhatRoughBeast

1
Austin Lesea ist der Typ von Xilinx, der darauf antwortet. Ich denke, ich erinnere mich, dass ich eine App-Notiz gelesen habe, die er entweder geschrieben oder empfohlen hat, um dies zu erklären - ah ja, hier ist die folgende: xilinx.com/support/documentation/white_papers/wp272.pdf
Krunal Desai

@KrunalDesai Das Whitepaper besagt tatsächlich, dass kein benutzerdefiniertes Zurücksetzen erforderlich ist, da Flip-Flops usw. während der Konfiguration auf den Anfangswert zurückgesetzt werden. Dies widerspricht jedoch der in meiner Frage zitierten Fußnote: Es wird empfohlen, das Design nach dem Start zurückzusetzen und / oder eine andere Synchronisationstechnik anzuwenden.
Martin Zabel

Antworten:


4

Sie sollten davon ausgehen, dass der Takteingang Ihrer Flip-Flops umschaltet, sofern Sie nichts anderes beweisen können (durch eine garantierte Einschalt- oder Nachkonfigurationsverzögerung). Es ist nicht garantiert, dass alle Flip-Flops in einer bestimmten Taktdomäne auf derselben Taktflanke basierend auf GWE oder GSR starten. Beide wirken wie ein asynchroner Reset und verursachen potenzielle Probleme für einige Logikfunktionen (Zähler, One-Hot-State-Maschinen usw.).

Insbesondere eine One-Hot-State-Machine, die unmittelbar nach der Konfiguration übergeht, wird (eventuell) fehlschlagen (Übergang in einen ungültigen Zustand). Die Häufigkeit des Ausfalls hängt von der Taktperiode im Vergleich zum gerätespezifischen (und orts- und routenspezifischen) Versatz für Ihr Design ab.

Ein weiteres einfaches Experiment, um zu sehen, wie dieses Verhalten einen relativ schnellen Countdown-Zähler mit 10000000 initialisiert und sein Verhalten unmittelbar nach der Konfiguration überprüft. Einige Bits machen den Übergang zu 01111111 und einige Bits verpassen diesen ersten Übergang, aber die nachfolgende Zählsequenz ist korrekt.

Das Weißbuch erwähnt von Krunal Desai spricht über dieses Problem und ist eine große Referenz. Jedes SRAM-basierte FPGA hat höchstwahrscheinlich ein ähnliches Problem.

Es ist nicht erforderlich, die Register zurückzusetzen, um einen bekannten Wert zu erhalten. Wenn Sie eine Logik haben, die für alle empfindlich ist, die mit derselben Taktflanke beginnen, muss eine Synchronisationslogik hinzugefügt werden (dies kann aus einem synchron deaktivierten Reset oder einer anderen synchronen Logik bestehen). Xilinx AR44174 spricht etwas mehr über das Problem. Ich würde eine dritte Methode zur Schadensbegrenzung hinzufügen, die sicherstellen soll, dass sich die getaktete Logik während der ersten paar Taktzyklen nach dem Start nicht ändert / übergeht.


Ich werde morgen Ihr Gegenbeispiel überprüfen. Das Whitepaper besagt tatsächlich, dass kein benutzerdefiniertes Zurücksetzen erforderlich ist, da Flip-Flops usw. während der Konfiguration auf den Anfangswert zurückgesetzt werden. Dies widerspricht jedoch der in meiner Frage zitierten Fußnote: Es wird empfohlen, das Design nach dem Start zurückzusetzen und / oder eine andere Synchronisationstechnik anzuwenden. Ist Ihr Rat also, das (relevante Teile des) FPGA-Designs nach dem Start zurückzusetzen?
Martin Zabel

Sie implementieren ein Schieberegister, keinen Zähler, richtig? Ich glaube, dies sollte auch das Pannenverhalten zeigen. Welche Taktrate laufen Sie? Wenn die Rate nicht schnell genug ist, besteht eine geringe Wahrscheinlichkeit, dass der Versatz der GWE über einen Taktzyklus hinweg überbrückt wird. Ich würde die Uhr so ​​schnell wie möglich laufen lassen. Wenn das Tool die Register (oder Spiegelreflexkameras) dicht beieinander platzieren würde, würde dies auch den GWE-Versatz minimieren.
David

Es war zuerst ein Aufwärtszähler, aber dann wurde mir klar, dass ich einen Ringzähler / Shifter brauche, damit alle Bits bei der ersten Taktflanke umschalten. Übrigens läuft der On-Chip-Logikanalysator mit demselben Takt und die einzige Beobachtung ist, dass der erste Taktzyklus in der Spur deterministisch übersprungen wird. Ich werde mir den AR von Xilinx ansehen.
Martin Zabel

5

Für Xilinx-FPGAs bestätigt der Antwortdatensatz AR # 44174 Folgendes :

  • Timing-Verstöße können bei Flip-Flops und SRLs auftreten, da GWE synchrone Elemente in Bezug auf die Konfigurationsuhr anstelle der Systemuhr des Benutzers freigibt.

  • Die Ausbreitung des GWE-Signals bedeutet, dass SRLs und Flip-Flops zu leicht unterschiedlichen Zeiten freigesetzt werden können, was dazu führt, dass einige Teile des Designs vor anderen gestartet werden.

Wir haben also zwei Möglichkeiten:

  1. Stoppen Sie die Systemuhr des Benutzers, bis der Start abgeschlossen ist.
  2. Wenden Sie automatisch einen Rücksetzimpuls an, nachdem GWE oder ähnliches aktiviert wurde.

Wenn im Design kein externer Reset- Eingang erforderlich ist, ist Lösung 1 im Antwortdatensatz für Xilinx-FPGAs hilfreich.

  • Nach dem Start sollte die Uhr zunächst gestoppt werden.
  • Sobald das EOS-Signal vom STARTUP-Grundelement bestätigt wird, kann die Uhr synchron zur Systemuhr des Benutzers neu gestartet werden.
  • Die beste Möglichkeit, dies zu steuern, ist die Verwendung von BUFGCE, BUFR Reset oder BUFHCE.

Ich habe diese Lösung ausprobiert, aber Chipscope hat festgestellt, dass nicht alle Flip-Flops gleichzeitig umschalten. Es scheint, dass die synchrone Aktivierung CEdes Clock-Enable-Pins des BUFGCEnicht so einfach ist.

Ich empfehle stattdessen die zweite (folgende) Technik. Anstelle eines externen Resets ( reset_pinunten) muss nur eine '0' Null (kein Reset) in den Reset-Synchronisierer eingespeist werden.


Wenn es ohnehin zu einem externen Reset kommt , kann der Reset-Synchronisierer so initialisiert werden, dass ein Reset aktiviert wird, nachdem GWE oder ähnliches während der Startsequenz aktiviert wurde. Der Reset-Synchronisierer startet die Freigabesequenz nicht (dh Flip-Flops, die in Richtung '0' umschalten), bis GWE aktiviert ist. Die Dauer der Freigabesequenz muss länger sein als der Versatz auf der GWE. Diese Lösung funktioniert auf Xilinx- und Altera-FPGAs.

Erklärungen:

signal reset_sync : std_logic_vector(1 downto 0) := (others => '1');
signal reset : std_logic;

Architekturkörper (Registerkette):

reset_sync <= reset_sync(reset_sync'high-1 downto 0) & reset_pin when rising_edge(clock);
reset <= reset_sync(reset_sync'high); -- active-high

Natürlich muss die Zählerlogik jetzt zurückgesetzt werden:

  process(clock)
  begin
    if rising_edge(clock) then
      if reset = '1' then
        counter <= x"55555555_55555555_55555555_55555555_55555555_55555555_55555555_55555555";
      else
        counter <= counter(0) & counter(counter'left downto 1);
      end if;
    end if;
  end process;

Der Screenshot unten zeigt Fehler aufgrund der asynchronen Zusicherung von GWE. Um diese zu provozieren, habe ich die Signalinitialisierung weggelassen, so dass alle Zähler-Flip-Flops während der Konfiguration auf '0' initialisiert wurden. Wie resetvon Anfang an behauptet, würde man erwarten, dass sich alle Flip-Flops mit der ersten ansteigenden Taktflanke auf den angeforderten Rücksetzwert ändern, nachdem GWE aktiviert wurde. Zum Zeitpunkt 0 (T-Marker) ist der Zählerwert jedoch keine Folge von x "5". Aufgrund der Rücksetzkette wird der erwartete Rücksetzwert wiederhergestellt. Der Reset wird in Zyklus 2 (X-Marker) freigegeben, so dass alle Flip-Flops in nachfolgenden Zyklen umschalten. Die Taktfrequenz beträgt hier 200 MHz.

ChipScope-Screenshot mit fehlgeschlagener Initialisierung

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.