Forum: FPGA, VHDL & Co. Zuweisung von signal Initialwert auch relevant für Impl?


von Martin K. (mkohler)


Lesenswert?

Hallo,

Ich habe gerade auf comp.lang.vhdl gesehen, dass man Signalen einen
Initialwert mitgeben kann.
Was passiert aber mit einer Signal Initialwertzuweisung in der
Synthese/Implementation?

Beispiel:
  -- Register Inhalt Signale
  signal control_reg : STD_LOGIC_VECTOR(7 downto 0) = X"00";

Ist dieser Vektor control_reg in der Hardware beim Start zuverlässig
auf 0, resp. kann ich mir so einen Reset ersparen?

Das control_reg soll später synchron gelesen und geschrieben werden
können, muss aber zu Beginn einen definierten Startwert haben.

Gilt diese Initialwert-Zuweisung auch für die Implementation in HW oder
nur für die (ModelSIM) Simulation?

Gruss, Martin

von FPGAküchle (Gast)


Lesenswert?

Eine Antwort für alle möglichen Implementierungtools gibt es nicht.

Generell galt: der initwert ist nur für die Simu, aber seit ca. 2
Jahren soll bei Xilinx der initwert gleich dem PowerUp wert der FF
sein.

Er wird also durch synthese/Implementierung durchgereicht. Damit würde
dann ein xtra PowerUp-Reset unnötig.

Falls dir das zu unsicher ist (z.B weil du ein anderes/älteres
Synthesetool verwendest), es gibt neben VHDL andere Möglichkeiten das
design zu beeinflußen z.B. constraints. Bei xilinx gibt es extra
constraints um den Init/PowerUp-wert eines FF zu setzten. Diese
constraints werden erst nach der Synthese eingelesen, das synthesetool
kann also nix kaputt machen.

von Martin K. (mkohler)


Lesenswert?

Wo finde ich diese constraints?

Angegeben werden die wohl im .ucf File, aber wie ist die Syntax?
Kann ich da direkt auf einen Signalnamen im VHDL Design referenzieren?

von FPGAküchle (Gast)


Lesenswert?

Schau mal in der Doku "constraint guide", das constraint heisst INIT:

INST “instance_name” INIT={value | 1 | 0 | S | R};

Allerdings habe ich auf die schnelle dieses constraints nur in der IDE
6.3 und nicht in den aktuellen (8.1|8.2) :-(

von FPGAküchle (Gast)


Lesenswert?


von Martin K. (mkohler)


Lesenswert?

Gemäss den Xilinx Angaben scheint der Register Zustand beim PowerUp
default = 0 zu sein.

Demnach müsste ich gar nichts tun, um die Register beim PowerUp
definiert mit 0 zu starten (da ja default).

Ist auf diese default Angabe Verlass?

von Jürgen Schuhmacher (Gast)


Lesenswert?

Die Initilawerte sind Bestandteil des FPGA-Images. Da beim Power-Up der
FPGA (vom Flash) geladen werden muss, wandern diese automatisch als
Initialwerte in die Register. Dasselbe gilt auch für ausdrücklich
parametrisierte MEM-Initialsierungsfiles. Das Problem, daß der FPGA
einen Reset-zustand braucht, behebt dies nicht, denn in jeder
vernüftigen Applikation wird ein Baustein mal soft-resettet werden
müssen, um einen definierten Zustand zu erreichen. Das geht aber nur
über programmierte Werte.

von Klaus F. (kfalser)


Lesenswert?

Es gibt von Xilinx sogar Empfehlungen, auf den Reset zu verzichten und
nur mit PowerUp-Werten zu arbeiten.
Verwendet man beides, muß man ein bischen aufpassen, da der Power-Up
Wert muß nicht gleich dem Wert nach dem Reset sein muß.

von FPGAküchle (Gast)


Lesenswert?

> Ist auf diese default Angabe Verlass?

Ich würde mich in diesen Fall nie auf defaults verlassen! und ich habe
meine Zweifel, ob Signale ohne Initwerte wirklich immer zu einem FF mit
'0' als Erstzustand ungesetzt werden (vorrausgesetzt sie werden zu
FF).

-Xilinx ändert ab und zu defaultwerte, in zukünftigen versionen könnte
dann ein '1' verwendet werden.

-Keinen Wert setzen heisst oft "ist mir egal" soll den Tools draus
machen was sie wollen. Dann kann genau das passieren.

-Aus dem Code ist nicht erkennbar, das dort eine Null zu stehen hat. Da
freut sich ein anderer Entwickler der damit arbeiten muss.


-Die 8.2 meckert gelegentlich das meine Initwerte ungünstig wären und
wünscht einen anderen Wert. Das ist für mich ein deutlicher Hinweis das
man sich auf den defaultwert nicht verlassen kann.

von Klaus F. (kfalser)


Lesenswert?

Nach meiner Erfahrung kann man sich auf die Defaultwerte schon
verlassen.
Probleme könnte man eventuell bekommen, wenn die Tools ein Signal so
optimieren, daß elektrisch der invertierte Wert verwendet wird, aber
ich weiss gar nicht, ob dies überhaupt geschieht.

Da die neusten ISE/Webpack-Versionen aber die Initialisierung explizit
erlauben, sollte man sie bei wichtigen Signalen auch verwenden. Dann
erübrigen sich alle Zweifel, und die Simulation stimmt garantiert mit
der Implementierung überein.

Das Meckern der ISE bezüglich der Initwerte erfolgt meiner Erfahrung
nach eben genau in dem von mir erwähnten Fall, daß Initwert und
Resetwert nicht übereinstimmen, z.B. wenn das FF mit '0' aufwacht,
aber beim Reset dann auf '1' gesetzt wird.

von FPGAküchle (Gast)


Lesenswert?

Folgend die erwähnten Meckereien:

WARNING:Xst:1426 - The value init of the FF/Latch dbg_sim_delay_0
hinder the constant cleaning in the block g.
   You should achieve better results by setting this init to 0.
WARNING:Xst:1426 - The value init of the FF/Latch
header_mark_frame_incompl_oq hinder the constant cleaning in the block
g.
   You should achieve better results by setting this init to 1.

Einen systemweiten reset gibt's nicht, die benannten FF werden im
Betrieb gesetzt| gelöscht oder im toggle mode betrieben, also RS-TFF.
Hm, wenn ich mir recht überlege, werden einige FF gesetzt oder
getoggelt, andere gelöscht oder getoggelt. Vielleicht kommt die Warning
das Lösch-FF einen Init '1' haben (aber das habe ich doch
ausgeschlossen?).
Naja jedenfalls weiss ich nicht was an "hinder the constant
cleaning"
nachteilig ist, also lass ich erst mal so. aber IMHO beweist die
Warning das die synthese einen (Optimalen) Initwert zuweist und der ist
nicht immer '0';

von Klaus F. (kfalser)


Lesenswert?

Du hast recht.
Ein kurzes Stöbern bei Xilinx hat ergeben, daß (wenigstens bei der
alten Spartan Familie, ich denke es gilt für alle) bei den FPGAs für
jedes FF die Wirkkung des SR Eingang gemeinsam mit dem GSR Eingang
gilt.
Das heißt, wenn man ein FF für (a)synchrones preset konfiguriert
(SRHIGH), wird auch der GSR ein Preset Eingang.
Da beim PowerUp das GSR Signal (intern) gepulst wird, wacht das FF in
diesem Fall mit '1' auf.

Deine Meldung müßte dann kommen, wenn Du aufgrund des Init-Wertes dem
(G)SR Signal eine SET oder RESET Funktion vorgegeben hast, aber der
synchrone oder asynchrone (Re)Set umgekehrt einfacher zu realisieren
wäre.

Grüße
Klaus

von Martin K. (mkohler)


Lesenswert?

Vielen Dank für die bisherige Diskussion.

Ich werde wohl den Reset drin lassen.

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.