Xilinx ISE XST Probleme

Gast #802525
Lesenswert?

Liebe Forumsnutzer,

ich habe ein Problem. Ich benutze das Xilinx ISE Webpack 9.2i mit dem 
Service Pack 4 auf Windows XP. Mit Hilfe dieser Software habe ich ein 
VHDL-Design erstellt. Ist ein Datencodierer. wenn ich aber die Synthese 
XST anschmeise synthetisiert der sich tot. Auch 24 Stunden reichen hier 
nicht aus. Irgendjemand in der Lage mir zu sagen, wie ich das Xilinx 
Synthese-Tool beschleinigen kann? Ich brauche dringend Hilfe.

MfG Sebastian
Gast #802600
Lesenswert?

Gibt es eine Testbench dazu? Dann könnte man das ganze erstmal durch den 
Simulator schicken.

Ich denke, xst verschluckt sich an den verschachtelten if-Abfragen. 
Versuch das mal in case umzuwandeln. Siehe dazu die Beispiele im xst 
user guide.

Außerdem: Verwende möglichst ieee.numeric_std.all;
Dann kannst Du Deine Abfragen lesbar gestalten.
1
if AC_in(11 downto 8) = "0000" then

Für AC_in(11 downto 8) würde ich einen lesbaren alias anlegen und den in 
unsigned oder integer wandeln:
1
if AC_alias = 0 then

Rick
Gast #802610
Lesenswert?

Vielen Dank erstmal für eure Mühen.

Ja, eine Testbench gibt es dazu, aber da müsste ich hier noch jede Menge 
andere Designs rein stellen. Das Design ist nur Teil eines größeren 
Designs wofür ich eine TB geschrieben habe. Aber die Funktionalität ist 
nicht das Problem. Die Simulation zeigt, dass alles funktioniert, wie es 
sollte.

Das ganze ist sehr komisch. Im Prozess Register_write muss der Hemmschuh 
liegen. Denn wenn ich den ganzen Prozess kommentiere´, dann ist die 
Synthesezeit extrem kurz.

Mein zweiter Schritt war dann nur den Teil mit "elsif AC_rdy = '1' then 
..." im Prozess Register_write auszudokumentieren. Das ging auch ohne 
lange Synthesezeit. Sobald ich jedoch die If/Elesif bzw. Case-Abfragen 
reindokumentiere braucht der ewig.
Gast #802628
Lesenswert?

Das verstehe ich nicht so ganz?

Ich wandele das Intgersignal ACC_ADD_Code in ein STD_LOGIC_VECTOR der 
Länge 5 um. Diesen Vektor schreibe ich dann das spätere Ausgaberegister 
out_reg_a/b. Die Indexsignale index_a/b werden doch jeweils weiter 
gezählt.
#802646
Lesenswert?

Im günstigsten Falle wäre das ein 5Bit 1-zu-81 Demultiplexer. Im 
ungünstigsten Falle einer mit 1-zu-4 Milliarden - dann nämlich, wenn xst 
nicht den begrenzten möglichen Zahlenraum für index_a erkennt. Auch im 
ersten Fall erzeugt das einen ganzen Haufen sehr langsame Logik (>300 
LUTs).

Durch die Vielzahl an cases in denen dieser Multiplexer, zumal auch noch 
mit unterschiedlichsten Wortbreiten, auftritt, potenziert sich das dann 
natuerlich noch!
Gast #802841
Lesenswert?

Jo sieht ganz so aus als würdest du viel zu viel kombinatorische 
Schritte in einem Taktzyklus erledigen wollen. Das führt dann zu einem 
riesigen Datenpfad. Das kriegst du niemals in einem FPGA unter, und die 
erlaubte Taktrate wäre winzig. Besser, du führst die Operationen nicht 
alle parallel aus, sondern nacheinander (Steuerung des ganzen über eine 
State-Machine).

Und als ob das noch nicht reicht, hast du eine Menge Anweisungen da 
stehen, die das XST erst umständlich vereinfachen muss, um die Logik 
dahinter zu erkennen. Beispiel:
1
... DC_in < "000010000" ...
Kannst du umwandeln in
1
-- vereinfacht: DC_in < "000010000"
2
... DC_IN (8 downto 4) = "00000" ...
dann hat das XST weniger zu tun und du kriegst einen besseren Überblick 
darüber wieviel kombinatorische Logik du da hinschreibst. (Wenn das XST 
wirklich Größenvegleicher daraus bauen würde würde es in keinen FPGA 
passen).

Ob du z.B. die < Operatoren in einfachere Logik umwandelst oder einen 
einzigen Größenvergleicher mehrfach in verschiedenen Takten benutzt 
bleibt dir überlassen, da musst du halt rausfinden was besser 
funktioniert. Das kommt vor allem drauf an ob es eine einfache 
Ersatzlogik gibt (wie oben) oder nicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren