Hallo,
ich habe ein Design, welches einmal einen RAM benoetigt mit 65635
Adressen und einer Datentiefe von 32 Bit und einen RAM mit 65635
Adressen und einer Datentiefe von 64 Bit.
Da ich ein ZEDboard verwende, steht mir mit dem BRAM nur eine Datentiefe
von 32 Bit zur verfügung, soweit ich das verstanden habe.
Nun dachte ich, fuer die 64 Bit koennte ich Distributed RAM verwenden,
da mein Desgin eh nicht so viele LUTs benoetigt und ich dadurch noch
diese massenweise ueber habe.... (Nach der Synthesierung ohne
distributed RAM habe ich gerade mal 911/13300 Slices verbraucht und
1993/53200 LUTs verbraucht.
Mein erster Versuch, um das zu realisieren war, das ich erstemal nur
einen RAM gewählt habe (den RAM mit einer Datentiefe von 32 Bit). Hier
ich den Lesezugriff im Block RAM getakatet (Soweit ich das von lothar
millers seite verstanden habe, sei das die Vorgehensweise, wie man
zwischen den beiden RAM Arten wählen kann). Zusätzlich hatte ich bei den
Eigenschaften der Synthese 'Auto' eingestellt.
Jedoch egal, ob ich den RAM getaktet oder nicht getaktet hatte,
beidesmal hatte er mir den RAM als Blockram eingestellt.
Erst nach dem ich bei den Syntheseeigenschaften expliziet 'Distributed'
verwendet hatte, hatte er mir versucht, den RAM als distributed RAM zu
realsieren, JEDOCH bekomme ich nun die Fehlermeldung, das nun mein
Design 6272 SLICEMs fuer den LUTRAM benoetige, wobei mein FPGA nur 4350
SLICEM sites haette....
Aber wie schon oben erwähnt, habe ich aus den Datenblättern ersichtet,
das ich 13300 Slices eigentlich zur verügung haette...
Wie kann ich Xilinx denn nun verklickern, das ich sehr wohl noch
genuegend Sliches uebrig habe?
Und wenn ich das geschafft habe, ist es ueberhaupt dann moeglich,
Distributed RAM und Block RAM gleichzeit in einem Design zu verwenden?
Danke im voraus.
NewHere84 schrieb:> Da ich ein ZEDboard verwende, steht mir mit dem BRAM nur eine Datentiefe> von 32 Bit zur verfügung, soweit ich das verstanden habe.
Das hast du falsch verstanden. Natürlich kann ein einzelnes BlockRAM nur
32Bit, aber für 64 Bit schaltet der Synthesizer einfach 2 davon
parallel.
> Jedoch egal, ob ich den RAM getaktet oder nicht getaktet hatte,> beidesmal hatte er mir den RAM als Blockram eingestellt.
Wenn du das RAM nicht getaktet hast (und auch keine der Datenleitungen
vorher und nachher), dann KANN er gar kein BlockRAM nehmen. Das BRAUCHT
unbedingt einen Takt.
> Hier ich den Lesezugriff im Block RAM getakatet (Soweit ich das von> lothar millers seite verstanden habe, sei das die Vorgehensweise, wie> man zwischen den beiden RAM Arten wählen kann).
Das kann sich auch mal ändern. Näheres dazu im Handbuch des
Synthesizers: XST Users Guide Coding Styles.
> Und wenn ich das geschafft habe, ist es ueberhaupt dann moeglich,> Distributed RAM und Block RAM gleichzeit in einem Design zu verwenden?
Klar doch. Das sind ja komplett unabhängige Komponenten...
> JEDOCH bekomme ich nun die Fehlermeldung
Zeig doch mal den ganzen Synthesereport.
Hi,
SLICE != SLICEM
Ich empfehle das UG474. Darin wird beschrieben, dass es 2 Typen von
SLICES für den Artix 7 gibt (Spartan6 hat sogar 3 Typen). Das Verhältnis
ist etwa 2:1. Daher wird Xilinx recht haben, wenn nicht genügend
(richtige) SLICES da sind.
grüße
Lothar M. schrieb:> Zeig doch mal den ganzen Synthesereport.
Das ist die Zusammenfassung, wenn ich Block Ram verwende:
Device Utilization Summary:
1
Number of BSCANs 1 out of 4 25%
2
Number of BUFGs 2 out of 32 6%
3
Number of DSP48E1s 4 out of 220 1%
4
Number of External IOBs 5 out of 200 2%
5
Number of LOCed IOBs 5 out of 5 100%
6
7
Number of External IOB33s 18 out of 200 9%
8
Number of LOCed IOB33s 18 out of 18 100%
9
10
Number of RAMB18E1s 1 out of 280 1%
11
Number of RAMB36E1s 131 out of 140 93%
12
Number of Slices 911 out of 13300 6%
13
Number of Slice Registers 2251 out of 106400 2%
14
Number used as Flip Flops 2221
15
Number used as Latches 30
16
Number used as LatchThrus 0
17
18
Number of Slice LUTS 1993 out of 53200 3%
19
Number of Slice LUT-Flip Flop pairs 2794 out of 53200 5%
Drum dachte ich, zum Versuch werde ich diesen RAM nun als Distributed
RAM mal verwenden...
Jedoch wenn ich das mache, bekomme ich diesen Fehler:
1
ERROR:Pack:2413 - The number of logical LUTRAM blocks exceeds the capacity for the target device.
2
ERROR:Pack:2744 - This design requires at least 6272 SLICEMs for LUTRAMs. The target device has only 4350 SLICEM sites. Please modify the
3
logical design source to reduce the number of LUTRAMs.
4
As an alternative, please select a device with more SLICEM sites.
5
ERROR:Map:237 - The design is too large to fit the device. Please check the Design Summary section to see which resource requirement for
6
your design exceeds the resources available in the device. Note that the number of slices reported may not be reflected accurately as
7
their packing might not have been completed.
Noch eine Frage.. Woher kommt die Zahl "140" bei RAMB36E1? - Was sagt
sie aus? Aus dem Datenblatt kann ich rauslesen:
Extensible Block RAM (#36 Kb Blocks): XC7Z020: 560 KB (140)
NewHere84 schrieb:> Jedoch wenn ich das mache, bekomme ich diesen Fehler:
Du sprengst einfach den Rahmen Deines Devices. 2^16 mal 64 Bit ist ein
Riesen-Memory.
Normalerweise benutze ich distributed RAM, wenn ich Speicher benötige,
welcher schlecht in BRAM abbildbar ist.
Ein 256-Bit breites FIFO mit maximal 4 Einträgen wäre ein Beispiel dafür
(das würde glatt 8 BRAM Block belegen wegen der Breite, die Tiefe nützt
mir nichts, und mit distributed RAM ist es mit 1024 Memory-Bits
erschlagen).
P. K. schrieb:> Du sprengst einfach den Rahmen Deines Devices. 2^16 mal 64 Bit ist ein> Riesen-Memory.
Verstehe ich noch nicht...
Das Datenblatt sagt:
True 6-input LUTs
Memory LUTs are configurable as 64x1 or 32x2 bit RAM
Free number of Slice LUTS: 1993 / 53200
Von dieser Ausgangslage aus:
1
# RAMs : 3
2
2048x8-bit single-port distributed Read Only RAM : 1
3
4096x8-bit dual-port distributed RAM : 1
4
65536x32-bit dual-port distributed RAM : 1
Ich kann also ein 6-input LUT als ein 16x1 RAM ansehen...
Wenn ich nun mir ueberlege wie viel LUTs fuer diese Groesse von RAM
gebraucht werden, komme ich zu dieser Rechnung:
Moegliche Addressen pro LUT = 2^6 = 64 Addressen
Wenn also mein RAM nur ein Bit tiefe haben muesste wuerde folgende
Rechnung gelten:
Benoetigte LUTS = (# von benoetigten Addressen) / (# der benoetigten
Input of LUTs) = (65536 + 4096 + 2048) / 2^6 = 71680 / 64 = 1120 LUTs
Nun brauche ich aber 32 Bit anstatt nur ein Bit... Also braeuchte ich:
1120 LUTs * 32 = 35840 LUTs
Ergebnis: Ich braeuchte doch nur 35840 LUTs oder? Zur Verfuegung habe
ich noch 51207... Also habe ich doch, selbst bei dieser RAM groesse noch
15367 LUTs uebrig.. Oder habe ich irgendwas missverstanden?
@NewHere84 (Gast)
>> Du sprengst einfach den Rahmen Deines Devices. 2^16 mal 64 Bit ist ein>> Riesen-Memory.>Verstehe ich noch nicht...
Kannst du lesen, was dein Synthesizer dir sagt?
"This design requires at least 6272 SLICEMs for LUTRAMs. The target
device has only 4350 SLICEM sites. Please modify the
logical design source to reduce the number of LUTRAMs.
As an alternative, please select a device with more SLICEM sites."
>Das Datenblatt sagt:>True 6-input LUTs>Memory LUTs are configurable as 64x1 or 32x2 bit RAM>Free number of Slice LUTS: 1993 / 53200
Aber nicht alle SLICE sind SLICEM! Nur die Hälfte kann ALLES, auch
Distributed RAM darstellen. Die andere Häflte kann das nicht, aus
Spargründen.
>Ich kann also ein 6-input LUT als ein 16x1 RAM ansehen...
64x1
>Wenn also mein RAM nur ein Bit tiefe haben muesste wuerde folgende
Du hat einen sehr eigenen Begriff von "Tiefe". Der Rest der Welt nennt
das Bitbreite. Mit Tiefe beschreibt man die Anzahl der Speicherelemente
zu je n Bit!
>Ergebnis: Ich braeuchte doch nur 35840 LUTs oder? Zur Verfuegung habe>ich noch 51207... Also habe ich doch, selbst bei dieser RAM groesse noch>15367 LUTs uebrig.. Oder habe ich irgendwas missverstanden?
Du hast nur halbs soviele LUTs, die RAM darstellen können!
Ja. U.a. dass man derartig große Speicher nicht sinnvoll mit distributed
RAM erstellt. Der verschwendet haufenweise Slices und ist deutlich
langsamer als BRAM.
64kiB x 32 und erst recht 64KiB x 64 macht man bestenfalls mit BRAMs,
wobei das fast schon ein Fall für externen Speicher (SRAM, SDRAM) ist.
Und zur Ausgangsfrage. Man kann BRAM und distributed RAM problemlos in
einem FPGA-Design gemeinsam verwenden. Allerdings nicht in einer per
CoreGen erzeugten RAM-Komponente. Das ist zwar prinzipiell und per Hand
möglich, praktisch aber wenig sinnvoll. Das wäre so, als ob man ein
Motorrad an ein Auto seitlich anschweißt, damit man mehr Leute
transportieren kann.
Falk B. schrieb:> Das wäre so, als ob man ein Motorrad an ein Auto seitlich anschweißt,> damit man mehr Leute transportieren kann.
Der TO versucht hier alle Motorraeder und Autos die er in die Fingee
bekommt zusammenzuschweissen, checkt aber nicht dass das was er
eigentlich will ein Zug ist...
Guest schrieb:> Der TO versucht hier alle Motorraeder und Autos die er in die Fingee> bekommt zusammenzuschweissen, checkt aber nicht dass das was er> eigentlich will ein Zug ist...
Das Nette ist, dass je nach Syntheseoption der so erzeugte
Auto-Mischmasch mitunter wieder transformiert und ins BRAM gepackt wird
:-)
Jürgen S. schrieb:> Guest schrieb:>> Der TO versucht hier alle Motorraeder und Autos die er in die Fingee>> bekommt zusammenzuschweissen, checkt aber nicht dass das was er>> eigentlich will ein Zug ist...>> Das Nette ist, dass je nach Syntheseoption der so erzeugte> Auto-Mischmasch mitunter wieder transformiert und ins BRAM gepackt wird> :-)
Also das hier:
http://www.miniworlds.de/Vorbild2/zug_br152_004_1.jpg
(wenn BRAM der Zug wäre ;-) )