Forum: FPGA, VHDL & Co. VHDL Zustandsbestimmung nach Startup


von Stefan (Gast)


Lesenswert?

Grüßt Euch zusammen,
nachdem ich immer wieder erneut auf dieses Thema zurückkomme und bisher 
immer noch keine 100%-ige Antwort trotz lesen von Whitepapern + 
sonstigen Beiträgen gefunden habe, würde ich gerne folgende Frage in die 
Runde stellen.

Es geht mir dabei vorrangig um die Spartan 3 + 6 sowie CoolRunner Xilinx 
Sparte in Verbindung mit dem kostenlosen Xilinx Webpack.

Selber habe ich des Öfteren eine Applikation welche keinen externen 
Reset benötigt. Sowohl mein "Top-Prozess" als auch die Unter-Instanzen 
anderer Komponenten haben somit weder einen asynchronen noch synchrones 
Reset-Signal. Bisher dachte ich, dass wenn ich alle "internen Signalen" 
welche weitere Teile des Gesamtdesigns treiben mit einem Wert 
initialisiere, diese auch nach dem Startup den zugewiesenen Zustand 
annehmen (Also alle gleichzeitig, synchron mit dem gleichen CLK nach dem 
Startup). Somit entfällt der einmal nötige Reset doch meines Erachtens 
vollkommen?
Diese Deklaration und gleichzeitige Initialisierung betrifft dabei 
sowohl einfache Datentypen wie auch eigens Definierte (z.B. für 
State-Maschinen-Zustände). Jetzt die Frage, liegt ich hier komplett 
falsch oder gibt es vielleicht noch einen Haken, welchen ich nicht 
bedacht habe der es dennoch nötig macht ein paar FF's im CLB mit dem 
Reset zu versehen?

P.S. Ich habe hier keinesfalls vor eine große Runde einzuläuten, um über 
die verschiedenen Reset-Möglichkeiten als auch 
Einsynchronisierungsmöglichkeiten in FPGA’s zu diskutieren. Das sollte 
soweit klar sein.

Danke für Eure Hilfe im Voraus!
Grüße
Stefan

von berndl (Gast)


Lesenswert?

du kannst problemlos ohne einen Reset auskommen. Ueberleg mal, wie so 
ein FPGA 'hochkommt': Es wird ein HW-Reset durchgefuehrt, dann wird ein 
Bitstream von einem Konfigurationsport (meistens der Flashbaustein, kann 
aber auch z.B. ein Microcontroller sein) oder via JTAG geladen. Dieser 
Bitstream enthaelt den Wert jedes Flipflops des Bausteins (wird alles 
seriell via Shift-Kette durchgeschoben). Daraus folgt: Dein FPGA/CPLD 
steht nach der Konfiguration richtig da.

Wenn du in deiner VHDL oder Verilog Beschreibung nun einem FF einen Wert 
ungleich 0 zuweist, dann bauen die Tools das in den Bitstream ein. Also 
steht dieser Wert dann nach der Konfiguration auch in deinem FF. Gibst 
du nichts an, dann wird halt eine Null angenommen und reingeschrieben...

Etwas anderes ist dann der Simulator. Der weiss nix von einem Bitstream 
und generiert dir dann halt 'X' und 'U' fuer FFs die du nicht in deiner 
Beschreibung spezifizierst hast.

Eine spezielle Sache bzgl. Reset gibt es: Wenn du mit on-chip PLLs 
arbeitest, und diese PLL jemals den Lock verliert, dann kannst du mit 
einem Reset (der eben den PLL-Lock mit enthaelt), deinen Design wieder 
sauber resetten. Aber eigentlich brauchst du sonst keinen Reset.

von Stefan (Gast)


Lesenswert?

Spitze!
Dann kann ich beruhigt weiter ausschließlich wie gehabt mit der 
Initialisierung von internen Signalen in meiner 'architecture' arbeiten.

Vielen lieben Dank auch für den Hinweis bzgl. der PLL-Recovery.

Super Forum!
DANKE,

Gruß Stefan

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


Lesenswert?

Stefan schrieb:
> Dann kann ich beruhigt weiter ausschließlich wie gehabt mit der
> Initialisierung von internen Signalen in meiner 'architecture' arbeiten.
Was aber nur Sinn macht, wenn das tatsächlich speichernde Signale 
(=Flipflops) sind. Denn eine simple Verbindung (=Routing) kann natürlich 
nur in der Simulation mit einem Wert initialisiert werden...  :-o

Stefan schrieb:
> P.S. Ich habe hier keinesfalls vor eine große Runde einzuläuten, um über
> die verschiedenen Reset-Möglichkeiten als auch
> Einsynchronisierungsmöglichkeiten in FPGA’s zu diskutieren. Das sollte
> soweit klar sein.
Die Runde wurde schon mal eingeläutet im uralten 
Beitrag "Xilinx und die Resets"

Was bzgl. Initialisierung und Reset geht und was nicht, steht im 
entsprechenden Handbuch zum Synthesizer, bei Xilinx der XST Users 
Guide...

> FPGA’s
Das hier unnötigerweise verwendete Satzzeichen nennt man volkstümlich 
"Deppenapostroph".
Siehe: http://de.wikipedia.org/wiki/Apostrophitis
Und: http://www.stupidedia.org/stupi/Deppenapostroph

von Daniel M. (daniel__m)


Lesenswert?

berndl schrieb:
> Gibst
> du nichts an, dann wird halt eine Null angenommen und reingeschrieben...

hu, die Aussage ist gewagt und hängt von der Synthese ab.
Wenn kein Init-Wert angegeben wird, gilt 'U' für das speichernde Element 
(FF, SRL, BRAM, etc). Die Synthese verfolgt das Signal und entscheidet 
sich später für '1' oder '0', je nachdem welcher Startwert sinnvoller 
ist z. B. für Optimierungen oder gar möglich ist (Spartan: Init-Wert = 
Reset-Wert).

Beispiel:
a) nicht initialisiertes FF (also 'U')
b) in einem getaktetem Process wird dem FF konstant '1' zugewiesen
c) die Synthese nimmt als Init-Wert '1' und optimiert das FF weg.


Thema Startwerte:
es stimmt, dass zu Beginn alle speichernde Elemente einen definierten 
Wert haben (auch BRAMs, DSPs, SRLs), der bei jedem Start gleich ist 
(anders als bei ASICs).
JEDOCH ist das Freigabesignal (Global Write Enable) nach der 
Konfiguration des FPGAs asynchron. Dieses Signal wird durch den 
internen CCLK bestimmt (Configuration Sequence, Step 8). Dieser CCLK hat 
keinen Bezug zu dem eigentlichen Systemtakt (oder gar Takte), so dass es 
passieren kann, dass einige FF das GWE einen Takt eher erkennen als 
andere FFs. Das ist z. B. ungünstig bei Zählern, die sofort los laufen.

Ohne genau Prüfung des Verhaltens in den ersten Takte wäre es also 
sträflich einfach den Reset durch einen Init-Wert zu ersetzen.

gruß

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

Daniel M. schrieb:
> berndl schrieb:
>> Gibst
>> du nichts an, dann wird halt eine Null angenommen und reingeschrieben...
>
> hu, die Aussage ist gewagt und hängt von der Synthese ab.
Die Aussage ist nicht gewagt. Hier mal der Auszug aus dem XST User Guide 
(UG687, Chapter 3, page 60). Dort sind die Unterschiede zwischen 
IEEE-Standard und XST aufgeführt.
Bei Altera, Lattice und Microsemi wird es ähnliche Definitionen geben.

Duke

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Hallo,

meine Erfahrungen mit den Signalinitialisierungen bei Xilinx FPGAs sind 
durch wachsen. Ein Design mit Signalinitialisierungen läuft immer 
richtig an, wenn der FPGA gerade eingeschaltet wurde, egal ob per JTAG 
geladen wurde oder aus einem PROM. Es gibt gelegentlich Probleme, wenn 
man ein Bitfile in einen in Betrieb-befindlichen FPGA lädt.


Tom

von Daniel M. (daniel__m)


Lesenswert?

Duke Scarring schrieb:
> Hier mal der Auszug aus dem XST User Guide
> (UG687, Chapter 3, page 60).

Da scheint wohl mal wieder die viel gelobte Doku-Qualität von Xilinx 
hervor zu kommem ;)

einfach mal ausprobieren:
1
entity top is
2
    Port ( i_clk  : in  STD_LOGIC;
3
           o_data : out  STD_LOGIC);
4
end top;
5
6
architecture Behavioral of top is
7
  signal s_ff : std_logic;
8
begin
9
10
11
process(i_clk)
12
begin
13
  if rising_edge(i_clk) then
14
    s_ff <= '1';
15
  end if;
16
end process;
17
18
o_data <= s_ff;
19
20
end Behavioral;

Resultat bei mir (sogar für einen Virtex6): kein FF vorhanden, '1' wird 
hard-codiert.

schreibt man
1
signal s_ff : std_logic := '0';
was gemäß der Doku das gleiche ist, erhält man etwas völlig anderes. FF 
ist vorhanden und XST schlägt einen anderen Init-Wert vor, um besser 
Optimieren zu können.

Gruß

von Stefan (Gast)


Lesenswert?

In der Initialisierung versuche ich generell alle Werte vorzugeben, egal 
ob '0' oder '1'. Wenn das Synthesetool mir dann was modifiziert bzw. 
rausschmeißt sollte es zumindest eine Meldung geben, der ich 
anschließend nachgehen kann.

In der ISE Design View nach Auswahl meines zugehörigen Design Files habe 
ich die Möglichkeit gefunden für die unter "Generate Programming File" > 
"Process Properties" in den "Startup Options" GWE_cycles Property einen 
Wert zu vergeben. Default ist 6. Ich denke das sollten die sechste 
einstellbare Phase sein in welcher der interne GWE 'enabled' wird, 
richtig? Muss ich jetzt davon ausgehen, dass das GWE Signal während 
dieser Phase immer noch "asynchron" kommt (irgendwann während der 
8-phasen sequenziellen Statemaschine), oder soll das hiermit unterbunden 
werden, quasi anstelle einer art FF-Einsynchronisierung erstmal warten 
bis der Takt sicher überall ansteht?

Siehe hierzu auch die Doku im Netz: "... that asserts the internal write 
enable to flip-flops, LUT RAMs, and shift registers..." unter diesem 
Link 
[[http://www.xilinx.com/support/documentation/sw_manuals/xilinx11/pp_db_startup_options.htm]]

In der Spartan 6 Device Library als auch im Configuration Guide 
existiert ein Startup Block "STARTUP_SPARTAN6. Sofern ich einen 
"globalen" Reset in meinem Design verwenden müsste, wäre es doch 
angebracht hier das "EOS" Signal abzugreifen, richtig?


Zu guter letzt habe ich noch eine kleine Fußnote im UG380 von Xilinx auf 
Seite 83 gefunden: 
http://www.xilinx.com/support/documentation/user_guides/ug380.pdf
(3) "GWE is asserted synchronously to the configuration clock (CCLK) and 
has a significant skew across the part. Therefore, sequential
elements might not be released synchronously to the system clock and 
timing violations can occur during startup. It is
recommended to reset the design after startup and/or apply some other 
synchronization technique"

Das bestätigt auch die super Info von Daniel M. für mich:
==> Zumindest ist für mich klar, dass eine Kontrolle des Verhaltens nach 
den ersten Takten angebracht ist!

DANKE!

Gruß Stefan

von Christian R. (supachris)


Lesenswert?

Ich denke, wenn man das EOS bei den neueren Chips mit dem verwendeten 
System-Takt einsynchronisiert und dann als synchrones Reset verwendet, 
ist man auf der sicheren Seite. Man kann das Startup ja auch verzögern, 
bis alle verwendeten DCMs fertig sind, dann hat man auf jeden Fall einen 
Takt.
Ob die eigentlich mittlerweile das Signal mal im Simulationsmodell drin 
haben? Bei mir lieferte das in der Simu unter 14.3 zumindest immer nur 
ein 'U', weil das File quasi leer ist.

von daniel__m (Gast)


Lesenswert?

Christian R. schrieb:
> Ich denke, wenn man das EOS bei den neueren Chips mit dem verwendeten
> System-Takt einsynchronisiert und dann als synchrones Reset verwendet,
> ist man auf der sicheren Seite.

Dann hat man wieder einen Startup-Reset :(

Eine aus meiner Sicht andere, elegante Möglichkeit wäre, den Systemtakt 
erst nach dem GWE zuzuschalten, also z.B. einen BUFGCE nehmen. Dessen 
CE-Signal wird dann z.B. aus dem EOS-Signal gewonnen (und/oder aus dem 
Locked-Signal der DCM, wenn vorhanden).

von Christian R. (supachris)


Lesenswert?

Na wenn man schon den DCM nimmt, kann man das aber dann doch sein 
lassen, oder? Denn der DCM "lockt" auf jeden Fall erst nach dem EOS, 
also wenn alle FF bereits ihren Wert bekommen haben. Man kann so 
höchstens die paar Takt-Zyklen am Ausgang des DCM vor dem Lock 
verhindern. Da kommt immer eine kleine Weile unregelmäßiger Mist raus.

von Klaus (Gast)


Lesenswert?

Christian R. schrieb:
> Da kommt immer eine kleine Weile unregelmäßiger Mist raus.

Richtig. Und der kann einem im Ernstfall die schön initialisieren FFs 
durcheinander bringen. Wirklich auf der sicheren Seite ist man da nur, 
wenn man entweder nen Reset verwendet, der die FFs solange noch 
festhält, oder die Clocks erst nach dem Lock sauber enabled.

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.