www.mikrocontroller.net

Reset für FPGA/CPLD

Wie jede digitale Schaltung mit FF benötigt auch ein FPGA-Design einen definierten Anfangszustand, den Resetzustand. Nach Art, Verteilung und Auslöser kann der Reset unterschieden werden zu:

  • synchroner, asynchroner Reset (FF mit synchronen oder asynchronen Set/Reset Eingängen)
  • High oder Low-aktiver Reset (Der Resetzustand wird mit einer '1' oder '0' eingeleitet. Der Reset ist nie Flankengesteuert (?).
  • Reset nach PowerUp, Abschluss FPGA-Laden, stabiles Taktsignal, externer Resetquelle oder Nutzer (Software) Auslösung.
  • Verteilt über allgemeine Routing-Ressourcen oder globales Set/Reset-Netzwerk

Inhaltsverzeichnis

[bearbeiten] Implementierung von FlipFlops/Registern mit verschiedenen Resetmöglichkeiten

[bearbeiten] Kein Reset

Nach dem Laden befindet sich der FPGA immer in einem definierten Zustand, alle Speicherelemente (FF, Schiebeketten, RAM) sind fest geladen. Es bedarf also keiner zusätzlichen Resetschaltung. Die Resetwerte bei Xilinx (VHDL, XST) werden durch den Initwert bei der Signal-Deklaration festgelegt.

signal is_0_after_FPGA_config: std_logic := '0';
signal is_1_after_FPGA_config: std_logic := '1';

Manche Logikelemente (bei Xilinx: shift register SR16E) sind nicht mit einem Reset einsetzbar, die Synthese muss also mehr Aufwand betreiben (siehe Beitrag im Forum).

Der Resetwert für Speicher kann in VHDL, im ucf oder durch Konfigurationsfiles (Coregen, EDK) definiert werden.

[bearbeiten] Asynchroner Reset

Traditionell am meisten eingesetzt wird der asynchrone Reset:

process(clk, reset)
begin
  if reset = '1' then
    -- Initialisierung der Register
  elsif rising_edge(clk) then
    -- Kombinatorik
  end if;
end process;

Beim Chipdesign ist er i.d.R. unverzichtbar, bei FPGAs wird er nicht unbedingt benötigt. Er kann sogar zu Problemen führen, wenn die fallenden Flanke des Resetsignals zu einem ungünstigen Zeitpunkt kommt (Siehe Artikel bei Xilinx). Je nach Logikdesign und der dadurch bedingten Auswirkung der Resetrücknahme, ist damit u.U. eine Verlängerung des Resetsignales so durchzuführen, daß das Löschen des Signals in jedem Falle ausserhalb des Bereiches möglicher Flankenwechsel des Systemtaktes erfolgen. Generell ist darauf zu achten, daß das asynchrone Resetsignal eine genügend lange Periode besitzt, um erfasst zu werden.

Für FPGAs und PLDs ist es daher oftmas sinnvoller, einen synchronen Reset zu benutzen:

[bearbeiten] Synchroner Reset

process(clk, reset)
begin
  if rising_edge(clk) then
    if reset = '1' then
      -- Initialisierung der Register
    else
      -- Kombinatorik
    end if;
  end if;
end process;


Die Nutzung eines synchronen Resets, erfordert das Eintakten / Einsynchronisieren des externen Resetsignals, sodaß sichergestellt ist, daß der Resetimpuls in der verarbeitenden clock domain gleichzeitg anliegt und die richtige Länge hat. Wird dies unterlassen, so kann ein mehrfach in das FPGA hineingeführter Takt im ungünstigsten Fall eines Flankenwechsels von einem FF gerade erkannt und von einem weiter entfernten FF gerade verpasst werden, sodaß der Reset in zwei verschiedenen Taktperioden der Zieldomain verarbeitet wird und die Schaltung so "auseinanderläuft".

[bearbeiten] Resetgenerierung

Folgend ein Beispiel einer internen Resetschaltung (auch wenn dergleichen heute im FPGA-Bereich kaum noch nötig ist), die einen 16 Takte langen Reset-Impuls erzeugt:

--xilinx spartan3
--reset  using a 16bit shift register
 
gen_dcm_srl : SRL16E
 
 GENERIC MAP (INIT => X"FFFF")   -- a  16 clk long '1' -pulse
 PORT MAP (
 Q => rst_dcm_geseco,    --the reset signal for the rest of the design        
 A0 => '1',              --determines length Shiftreg (15+1 bit)  
 A1 => '1',
 A2 => '1',
 A3 => '1',
 CE => Locked_DCM_MBSYS, --release reset pulse (here when clock is stable) 
 CLK => CLK96,           --its a synchronous reset   
 D => '0');              -- non-reset is '0' (high active reset) 

[bearbeiten] Logische Resets

Neben dem physikalischen Reset, der meist alle FFs gleichzeitig in einen Startzustand versetzt, benötigen viele Applikationen einen logisch neutralen Zustand mit z.B. inaktiven Ausgängen, wodurch teilweise weitere Resetzustände definiert werden müssen. Meist wird hier eine Art Warmstart-Zustand definiert. Auch ist es oft wünschenswert, dass nur Schaltungsteile neu gestartet werden, wenn Fehlfunktionen detektiert wurden, oder die Schaltung in Bereitschaft gesetzt werden soll, während andere essenzielle Funktionen aufrechterhalten werden sollen. Pipelines, algorithmische Rechenblöcke und untergeordnete state machines sind z.B. solche Schaltungsteile.

[bearbeiten] Siehe auch

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net