Forum: FPGA, VHDL & Co. Block Memory mit coe-Datei neu erzeugen via Command Line


von egon (Gast)


Lesenswert?

Hallo,

Ich verwende Xilinx ISE Webpack 13.3 auf Windows.

In meinem Projekt habe ich mit dem IP Core Gen ein Block Memory inkl. 
einem Init File (.coe) erstellt. Das funktioniert auch einwandfrei.

Ich hätte gern eine Bat-Datei wo ich einen Release automatisch erstellen 
kann d.h. der Block Memory soll mit dem neuen Inhalt der Coe-Datei 
erstellt werden.
Das tut es aber nicht. Ich bekomme immer den Inhalt aus dem letzten IP 
Core Gen -> Regenerate (Under Current Project Settings)

Zurzeit mache ich folgendes in der Bat-Datei:

----------------
cd <projekt ordner>
call C:\Xilinx\13.3\ISE_DS\settings64.bat

/. coe datei erstellen ./

cd <block memory name>\implement
call implement.bat
----------------

Das implement.bat läuft durch aber der Inhalt ist nicht aktuell. 
Anscheinend reicht ein Aufrufen von implement.bat nicht.

Hat jemand eine Idee was ich noch tun muss?

Viele Grüße
egon

von egon (Gast)


Lesenswert?

Habs gefunden.

Wenn jemand das mal versucht. Das direkte Aufrufen von implement.bat ist 
nicht der richtige Weg.

Der Core Gen kann im Batch Mode aufgerufen werden:

<xilinx pfad>\ISE_DS\settings64.bat <xilinx 
pfad>\ISE_DS\ISE\bin\nt64\coregen.exe -b coregen.cmd -p 
<coregenproject>.cgc

coregen.cmd Inhalt
-----------
EXECUTE <corename>.xco
END
-------

Das klappte bei mir ;)

Viele Grüße
egon

von Duke Scarring (Gast)


Lesenswert?

Wenn ich sowas brauche, habe ich ein C/Python-Programm, was mir eine 
synthesefähige VHDL-Beschreibung eines RAMs erzeugt. Da muß man dann 
auch im Simulator keine Umstände machen, oder beim Wechsel des 
FPGA-Herstellers.

Selbst srec_cat kann VHDL generieren (ungetestet):
http://srecord.sourceforge.net/man/man1/srec_cat.html

Duke

von egon (Gast)


Lesenswert?

Gute Idee schau ich mir mal an.

Danke

von Ingenieur (Gast)


Lesenswert?

Duke Scarring schrieb:
> Wenn ich sowas brauche, habe ich ein C/Python-Programm, was mir eine
> synthesefähige VHDL-Beschreibung eines RAMs erzeugt.

Was wäre denn diesbezüglich der Vorteil eines solchen generischen RAMs?
Was ich sehe, kann man mit den Tools doch sehr einfach ein block-Ram 
bauen lassen und das Init-File beifügen. So machen es die designer hier 
jedenfalls. Man baut eins für den Xilnx, eins für den Lattice und eines 
für den Altera und checkt sie ein.

Wie werden eigentlich die Init-Werte bei anderen Herstellern 
verarbeitet, wenn der FPGA-Typ das nicht unterstützt?

Und wo stecken die eigentlich und wie kommen die ins RAM? Das Block-Ram 
hat meines Wissens keine Option vorgeladen zu werden. Passiert das beim 
Beladen des FPGAs? Es muss ja irgendeine Routine geben, die aus dem 
Flash die Daten zieht und die internen Strukturen setzt und danach dann 
sich aus einem Flash die RAM-Inits holt und in die BRAMs schiebt. ???

von Stephan N. (someone_like_you)


Lesenswert?

> Wenn ich sowas brauche, habe ich ein C/Python-Programm, was mir eine 
synthesefähige VHDL-Beschreibung eines RAMs erzeugt.

Noch bequemer finde ich es, wenn das Programm/Skript eine Datei nur 
mit dem Speicherinhalt erzeugt, die dann vom eigentlichen Speicher quasi 
"inkludiert" wird. Unter VHDL kann man das mit einem extra Package 
machen, in dem der Speicherinalt als Konstante definiert ist. Beim 
Definieren des eigentlichen Signals des Speichers (in einer andren 
Datei) kann man dieses dann mit einer kleinen Funktionen mit dem Inhalt 
aus dem Package initialisieren.

Hier ein Beispiel dazu:

Der eigentliche Speicher: 
[https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_imem.vhd]

Der dazugehöroge Speicherinhalt: 
[https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_application_image.vhd]

Funktioniert sowohl für RAMs als auch für ROMs und ist unabhängig von 
der Plattform.

von Stephan N. (someone_like_you)


Lesenswert?

> Wie werden eigentlich die Init-Werte bei anderen Herstellern verarbeitet, wenn 
der FPGA-Typ das nicht unterstützt?

Ich würde mal vermuten, dass die Tools dann versuchen das RAM aus LUTs 
und FFs, welche initilisiert - und ich meine nicht über den Reset - 
werden können, zu bauen.

> Und wo stecken die eigentlich und wie kommen die ins RAM? Das Block-Ram hat 
meines Wissens keine Option vorgeladen zu werden. Passiert das beim Beladen des 
FPGAs? Es muss ja irgendeine Routine geben, die aus dem Flash die Daten zieht und 
die internen Strukturen setzt und danach dann sich aus einem Flash die RAM-Inits 
holt und in die BRAMs schiebt. ???

Hängt halt vom FPGA ab. Block-RAM kann meistens mit dem Bitstream 
initialisiert werden. Bei den Lattice iCE40 Ultra Plus gibt es aber z.B. 
auch (sehr große) "Block RAMs" die damit eben nicht initialisiert werden 
können. Dann muss man sich den Speicherinhalt irgendwie von außen aus 
einem EEPROM oder so holen.

von Martin S. (strubi)


Lesenswert?

Mal abgesehen von der ganzen komplexen Inference-Thematik betr. BRAMS 
(damit laesst sich ein Buch fuellen): Xilinx hat auch ein praktisches 
Tool 'data2mem', mittels eines BMM-Files (Mapping-Beschrieb auf die 
Primitiven) tauscht sich damit ein Binary-Blob (generiert aus Hex, oder 
einem ELF-Executable) direkt im Bitfile aus.
Damit baut man mal binnen weniger Sekunden eine neue Firmware, ohne die 
ganzen VHDL-Sourcen neu generieren/synthetisieren zu muessen.

von Duke Scarring (Gast)


Lesenswert?

Ingenieur schrieb:
> Was wäre denn diesbezüglich der Vorteil eines solchen generischen RAMs?
> Was ich sehe, kann man mit den Tools doch sehr einfach ein block-Ram
> bauen lassen und das Init-File beifügen.
Meist ist dafür rumgeklicke nötig. Wer das mag, ok. Ich mag es, wenn ich 
alle Tools, die ich irgendwie häufig brauche, verskripten kann.

> So machen es die designer hier
> jedenfalls. Man baut eins für den Xilnx, eins für den Lattice und eines
> für den Altera und checkt sie ein.
Ich erzeuge ein generisches VHDL-File und verwende das in Modelsim, 
GHDL, Xilinx/ISE, Altera/Qaurtus und Lattice/LSE. Eingecheckt wird der 
C-Quelltext, nicht das generierte File.
Jeder wie er mag.

> Wie werden eigentlich die Init-Werte bei anderen Herstellern
> verarbeitet, wenn der FPGA-Typ das nicht unterstützt?
Welche FPGA-Typen sind das? Ich kenne nur die Ultra-RAM bei Xilinx. 
Lattice ice40 wurde noch erwähnt, aber bei den MachXO2 mit EBRs 
funktioniert es.

Stephan N. schrieb:
> Noch bequemer finde ich es, wenn das Programm/Skript eine Datei nur
> mit dem Speicherinhalt erzeugt, die dann vom eigentlichen Speicher quasi
> "inkludiert" wird.
Irgendwo auf meiner Platte geistert eine VHDL-Funktion rum, die 
Intel-Hex-Dateien direkt einlesen kann. Das funktioniert(e) leider nicht 
mit allen Synthesetools, aber bei Xilinx/ISE ging es.

Martin S. schrieb:
> Damit baut man mal binnen weniger Sekunden eine neue Firmware, ohne die
> ganzen VHDL-Sourcen neu generieren/synthetisieren zu muessen.
Yupp, das hätte ich für Altera und Lattice auch gern.
(Wobei bei Lattice die Synthesezeiten noch erträglich sind, weil ich da 
eher kleinere FPGAs nehme.)

Duke

von Martin S. (strubi)


Lesenswert?

Duke Scarring schrieb:
> Yupp, das hätte ich für Altera und Lattice auch gern.

Fuer ECP5 geht das auch, aber momentan noch experimentell/nichttrivial 
und nur via  nextpnr-Toolchain. In der ISPlever-Toolchain gab's, wenn 
ich mich recht entsinne, ein entsprechendes Tool auch fuer andere 
Architekturen.

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.