Forum: FPGA, VHDL & Co. Xilinx synthetisiert nicht


von Benjamin (Gast)


Angehängte Dateien:

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)

von Benjamin (Gast)


Lesenswert?

ich habe vergessen zu erwähnen das ISE vorher keine Fehler oder 
Warnungen anzeigt.

von Duke Scarring (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ich glaube nie und nimmer, dass du das synthetisiert bekommst!!
Das ist ein 64Bit Divider, der rein kombinatorisch aufgebaut ist.
So ein großes FPGA kannst du gar nicht bezahlen...

von Duke Scarring (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?


von Xenu (Gast)


Lesenswert?

Ich hab das mal gaudihalber unter Xilinx 12.3 laufen lassen. Derselbe 
Fehler.
Unter Quartus 10 (Device: Cyclone III - Auto) läuft es aber komplett 
durch.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Xenu schrieb:
> Ich hab das mal gaudihalber unter Xilinx 12.3 laufen lassen. Derselbe
> Fehler.
Bei mir auch (12.1)... :-/

> Unter Quartus 10 (Device: Cyclone III - Auto) läuft es aber komplett
> durch.
Nur die Synthese?
Oder die komplette Impementation?
Was für ein FPGA kommt raus?

von D. I. (Gast)


Lesenswert?

In Quartus wird dir der Fitter abrauchen

von Xenu (Gast)


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.

von Duke Scarring (Gast)


Lesenswert?

Hat eigentlich schon mal jemand versucht eine Netzliste von Quartus bei 
ISE einzubinden? Und andersherum?

Duke

von Mirko Kontroller (Gast)


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

von T. M. (xgcfx)


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.

von Benjamin (Gast)


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!

von Xenu (Gast)


Lesenswert?

Von Xilinx gibt es einen kostenlosen Divider-Core:

http://www.xilinx.com/support/documentation/ip_documentation/div_gen_ds530.pdf

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.