Forum: FPGA, VHDL & Co. Verwendung von Block UND Distributed RAM im selben design?


von NewHere84 (Gast)


Lesenswert?

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.

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


Lesenswert?

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.

von daniel__m (Gast)


Lesenswert?

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

von NewHere84 (Gast)


Lesenswert?

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)

von P. K. (pek)


Lesenswert?

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).

: Bearbeitet durch User
von NewHere84 (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@ P. K. (pek)

>Du sprengst einfach den Rahmen Deines Devices. 2^16 mal 64 Bit ist ein
>Riesen-Memory.

Warum kein Giant-Seicher?

von Falk B. (falk)


Lesenswert?

@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.

von Falk B. (falk)


Lesenswert?

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.

von Guest (Gast)


Lesenswert?

Dein Design ist nicht umsetzbar, dein Chip hat bei weitem nicht genug 
Speicher. Weder BRAM noch DRAM noch zusammen...

von NewHere84 (Gast)


Lesenswert?

Okay.. Mein Fehler.. sorry.. Habe Das mit Slice M und Sliche L 
ueberlesen...


Danke fuer eure Geduld!

von Guest (Gast)


Lesenswert?

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...

von J. S. (engineer) Benutzerseite


Lesenswert?

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 
:-)

von britzl (Gast)


Lesenswert?

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 ;-) )

von J. S. (engineer) Benutzerseite


Lesenswert?

So ungefähr :D  Es lohnt durchaus, die BRAMs für RAM und LUT-Ersatz zu 
nehmen, wenn es vom Timing her geht, weil sie Strom sparen.

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.