mikrocontroller.net

Forum: FPGA, VHDL & Co. Xilinx synthetisiert nicht


Autor: Benjamin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
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)

Autor: Benjamin (Gast)
Datum:

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

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/34...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In Quartus wird dir der Fitter abrauchen

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Duke Scarring (Gast)
Datum:

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

Duke

Autor: Mirko Kontroller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: T. M. (xgcfx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benjamin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt heraus gefunden das es an diesen Zeilen liegt:
FOR k IN 0 TO 63 LOOP
           IF z>0 THEN
              base_index(63 downto 1):= base_index(62 downto 0);
              base_index(0):='0';
              nenner_int(63 downto 1):= nenner_int(62 downto 0);
              nenner_int(0):='0';
              z:=z-1;
           END IF;
           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!

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Von Xilinx gibt es einen kostenlosen Divider-Core:

http://www.xilinx.com/support/documentation/ip_doc...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.