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
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.
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?
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) :-(
Guckst du hier: http://www.xilinx.com/xlnx/xil_ans_display.jsp?iCountryID=1&iLanguageID=1&getPagePath=12293&BV_SessionID=@@@@0328859524.1159431393@@@@&BV_EngineID=ccciaddimfddlmfcefeceihdffhdfkf.0 (auf www.xilinx.com nach INIT ucf suchen lassen.)
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?
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.
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ß.
> 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.
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.
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';
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.