Forum: FPGA, VHDL & Co. Xilinx ISE XST Probleme


von Sebastian (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Da müsste man schon den Code sehen.

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

Hier der Code, ich hab auch mal versucht die if-schleifen durch 
Case-Anweisungen zu ersetzen, aber hat nichts gebracht.

von Rick Dangerus (Gast)


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

von Sebastian (Gast)


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.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

1
signal index_a, index_b : integer := 0;
2
...
3
out_reg_a((84 - index_a) downto (80 - index_a)) <= conv_std_logic_vector(AC_ADD_Code, 5);

Wie stellst du dir vor dass das synthetisiert wird? Da kann nur etwas 
monströses herauskommen, mich wundert dass XST das überhaupt annimmt.

von Sebastian (Gast)


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.

von Jan M. (mueschel)


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!

von Morin (Gast)


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.

von Morin (Gast)


Lesenswert?

Achja und wie schon gesagt wurde: Den "integer"-Typ ohne Range-Angabe 
kannst du für die Synthese vergessen.

von Sebastian (Gast)


Lesenswert?

Ich danke Jungs,

eure Tipps haben gefruchtet. Ich hab das Design umgeschrieben und jetzt 
synthetisiert es sich. Echt super dieses Forum.

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.