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)
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
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...
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
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.
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?
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
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.
Ich habe jetzt heraus gefunden das es an diesen Zeilen liegt:
1
FORkIN0TO63LOOP
2
IFz>0THEN
3
base_index(63downto1):=base_index(62downto0);
4
base_index(0):='0';
5
nenner_int(63downto1):=nenner_int(62downto0);
6
nenner_int(0):='0';
7
z:=z-1;
8
ENDIF;
9
ENDLOOP;
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!
Eine eigene Frage?
Dieser Thread ist über 15 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.