Xilinx synthetisiert nicht

Gast #2044893
Lesenswert?

Hallo,

ich habe ein Problem mit einem VHDL Projekt an dem ich seit einiger zeit 
arbeite.

Programmiert habe ich es in Modelsim SE 6.4a. Die enthaltenen 
Komponenten funktionieren in der Modelsim Simulation sowohl einzeln als 
auch in der Gesamtschaltung.

Jetzt wollte ich es in Xilinx ISE 10.1 synthetisieren und bei der 
Komponente "Dividi" kommt folgende Fehlermeldung:
1
ERROR:Portability:3 - This Xilinx application has run out of memory or has encountered a memory conflict.  Current memory usage is 2089816 kb.  You can try increasing your system's physical or virtual memory.  For technical support on this issue, please open a WebCase with this project attached at http://www.xilinx.com/support.

Auch wenn ich den Block Dividi einzeln synthetisiere kommt diese Meldung 
(zuvor hängt ISE ca. 20-30min bei: Synthesize - XST)

Laut den Xilinx Memory Recommendations 
(http://www.xilinx.com/ise/products/memory.htm) benötigt ISE für meinen 
FPGA aber nur max. 360 MB (Spartan 3E XC3S500E).

außerdem habe ich versucht folgende Lösungsvorschläge um zu setzen: 
http://www.xilinx.com/support/answers/15336.htm
hat aber auch nix geholfen.

Im Anhnag befinden sich verschiedene Versionen der Komponente Dividi 
wovon "dividi_4.vhd" mein letzter versuch ist.
Ich bin für jeden Tip dankbar!




noch zur Info: die Funktion von Dividi ist es zwei 64Bit Zahlen zu 
dividieren und das Ergebnis und den Rest aus zu geben. (Als Vorlage 
dafür diente: http://www.convict.lu/Jeunes/Math/Fast_operations2.htm)
Angehängte Dateien:
Gast #2044975
Lesenswert?

Benjamin schrieb:
> Laut den Xilinx Memory Recommendations
> (http://www.xilinx.com/ise/products/memory.htm) benötigt ISE für meinen
> FPGA aber nur max. 360 MB (Spartan 3E XC3S500E).

Ja, aber nur wenn das Design auch synthetisierbar ist. Das ist bei Dir 
offenbar nicht der Fall.

Passiert ganz schnell, indem man an einen inferierten RAM einen Reset 
anschliest, der dann nicht mehr als BRAM sondern nur noch als 
distributet RAM realisert werden kann.

Duke
Gast #2044998
Lesenswert?

Benjamin schrieb:
> Ich bin für jeden Tip dankbar!
Regelmäßig das Forum hier lesen...

Als Anfänger verwendet man keine Variablen und keine for-Schleifen.
Versuch das mal ohne hinzubekommen.

So wie Du es jetzt hast, wird das ein riesiger Klumpen Logik, der Deine 
Division in einem Takt fertig hat. Das schafft für 64 Bit kein aktueller 
FPGA.

Unter [1], letzter Absatz findest Du ein (funktionierendes) Beispiel, 
wie man die Division seriell realisieren kann.

Duke

[1] 
http://www.ecs.hs-osnabrueck.de/fileadmin/users/346/upload/Digitaltechnik/Kapitel07.pdf
Gast #2045142
Lesenswert?

Quartus läuft komplett durch:

Device: EP3C40F484C6

Total combinational functions  9,953 / 39,600 ( 25 % )
Dedicated logic registers  407 / 39,600 ( 1 % )
Total logic elements  10,016 / 39,600 ( 25 % )
Total registers  407
Total pins  260 / 332 ( 78 % )
Total virtual pins  0
Total memory bits  0 / 1,161,216 ( 0 % )
Embedded Multiplier 9-bit elements  0 / 252 ( 0 % )
Total PLLs  0 / 4 ( 0 % )


Als Quelldatei habe ich dividi_original.vhd benutzt.
Gast #2045551
Lesenswert?

Hi Benjamin,

wenn du es wirklich drauf anlegen möchtest:

64Bit-Betriebssystem + 64Bit-ISE + sehr große Auslagerungsdatei bzw. 
sehr viel RAM + viel Zeit...

Das alles nehmen, den Divider nochmals versuchen zu synthetisieren und 
abwarten.
So hab ich es vor kurzem erst bei einem Design gemacht, bei dem ich das 
gleiche Problem hatte. Das Ergebnis passte problemlos auf unser Virtex 4 
FPGA, es dauerte halt nur über einen Tag bis es das war :-)
Die Speicherauslastung lag zwischenzeitlich bei über 10 GB.

Vielleicht hast du aber auch einfach Pech, der rechnet ne Woche lang nur 
um schließlich festzustellen, dass das FPGA schlichtweg zu klein ist.
Glaub ich aber nicht.

Gruß
Mirko
#2045664
Lesenswert?

Selbst wenn das durchläuft, sind obige Designs gelinde gesagt 
suboptimal. Die vielen Variablen und mit der vollen Hand ausgestreuten 
Variablen deuten auf einen Softwareentwickler hin, der nun selbiges mit 
VHDL/FPGA versucht. Es hat schon einen Grund, warum bei den meisten 
Mikrocontrollern keine Division in einem Takt implementiert ist.
Gast #2049486
Lesenswert?

Ich habe jetzt heraus gefunden das es an diesen Zeilen liegt:
1
FOR k IN 0 TO 63 LOOP
2
           IF z>0 THEN
3
              base_index(63 downto 1):= base_index(62 downto 0);
4
              base_index(0):='0';
5
              nenner_int(63 downto 1):= nenner_int(62 downto 0);
6
              nenner_int(0):='0';
7
              z:=z-1;
8
           END IF;
9
           END LOOP;
Ist klar das das nix wird wenn man versucht sowas in einem Takt zu 
lösen. Hab es jetzt umprogrammiert auf mehrere Takte.

Duke Scarring schrieb:
> So wie Du es jetzt hast, wird das ein riesiger Klumpen Logik, der Deine
> Division in einem Takt fertig hat. Das schafft für 64 Bit kein aktueller
> FPGA.
Der Dividierer arbeitet nicht in einem Takt sondern braucht in 
Abhängigkeit vom Divisor so ca. 6 bis 70 takte. Mit der Änderung von 
oben dann noch mal 1 bis ca. 64 Takte mehr.

Ich werde jetzt aber das ganze Programm nochmal umschreiben so das ich 
nur noch einen 14bit Dividierer brauche.



Wie man merkt bin ich nicht so der VHDL Profi, uC liegen mir mehr...

Danke für eure Hilfe!

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