Hey Leute,
welche Größe im Datenblatt für ein Fpga (Spartan 6) muss ich mir
anschauen, um zu wissen wie viele Register und Wires (Verilog) ich
insgesamt haben kann. Bzw. Wie viel Speicher mein Fpga hat und wie viel
Speicher ein Register im Vergleich zum Gesamtspeicher verbrauchen würde.
Detlef schrieb:> um zu wissen wie viele Register und Wires (Verilog) ich insgesamt> haben kann.
Die Wires sind sowieso nur eine rein logische Ressource, die nicht in
einem Datenblatt abgebildet werden kann. Du kannst z.B. eine Schaltung
mit 6 Eingängen und 1 Ausgang und vielen Wires und aller Logik einfach
in 1 einzige 6er-LUT abbilden.
Den Registerverbrauch kannst du bestenfalls überschlägig ermitteln, denn
die Toolchain kann da auch ohne Weiteres Register verdoppeln oder
zusammenfassen oder wegoptimieren. Oder sie packt ein einfaches 64 Bit
Fifo Schieberegister, das ja 64 Flipflops hat, einfach in eine LUT. Oder
sie packt einen Zustandsautomaten in einen RAM-Block, oder, oder...
> Wie viel Speicher mein Fpga hat und wie viel Speicher ein Register im> Vergleich zum Gesamtspeicher verbrauchen würde.
Dir fehlt ganz offensichtlich der Überblick, was in einem FPGA wo
hinkommt und was du womit machen kannst. Dort musst du dringend
ansetzen.
Für deine Schaltungsbeschreibung bestehend aus Logik hast du
grundsätzlich LUTs und Flipflops und die Verdrahtung dazwischen zur
Verfügung. Damit lassen sich auch Werte speichern. Im Besonderen können
die LUTs als kleine Speicherblöcke verwendet werden.
Wenn die Datenmengen groß werden, dann gibt es RAM-Blöcke, die meist als
Dual-Port-RAM ausgeführt sind.
> welche Größe im Datenblatt für ein Fpga (Spartan 6) muss ich mir> anschauen
Ich schaue mir die erste(n) Seite(n) an, dort wo die jeweiligen
FPGA-Ressourcen aufgelistet sind: LUT, Flipflops, CLB, RAM, Taktnetze,
Taktmanager, IO...
So, und jetzt wieder zu deiner Frage: was ist denn dein eigentliches
Problem? Warum fragst du da nach Vergleichswerten und Äquivalenzen?
Lothar M. schrieb:> So, und jetzt wieder zu deiner Frage: was ist denn dein eigentliches> Problem? Warum fragst du da nach Vergleichswerten und Äquivalenzen?
Erst mal vielen Dank für dein Antwort.
Ich habe einen Fifo Buffer in meinem Code und ich frage mich eben wie
gross der maximal sein darf.
Hast du vielleicht eine gute Quelle, wo ich mich vielleicht nochmal
besser reinlesen kann bzgl FPGAs und der richtigen Dimensionierung von
FPGAs.
RAM-Resourcen sind ein wenig weich, weil die sich teilweise die HW mit
anderen resourcen teilen und auch RAMs dazu herangezogen werden (können)
um Logik unterzubringen.
Vor allem kann ein Teil des RAM-Bedarfs besser in Zellen verfrachtet
werden.
Die Sache beim Spartan 6 besonders tricky, weil der einige
RAM-INIT-Defizite hat, welche je nach Anwendung mit Zellen ergänzt oder
ersetzt werden müssen. Von daher ist das mit Vorsicht zu genießen und
auf Sicherheit zu designen.
Und: Spartan 6 ist ein wenig ein toter Chip, weil die Software dafür
schon 5 Jahre nicht mehr weiterentwickelt wurde.
Detlef schrieb:> Hast du vielleicht eine gute Quelle, wo ich mich vielleicht nochmal> besser reinlesen kann bzgl FPGAs und der richtigen Dimensionierung von> FPGAs.
Die einzig vernünftige Quelle ist so oder so das Synthese-Werkzeug.
Installiere es, lass' die Synthese laufen und guck', was dabei
rauskommt.
Es nutzt dir nachher gar nix, wenn dein Design theoretisch in den
Käfer passen würde, wenn's das Synthesetool aus irgendwelchen Gründen
nicht hinkriegt.
Markus F. schrieb:> Es nutzt dir nachher gar nix, wenn dein Design theoretisch in den> Käfer passen würde, wenn's das Synthesetool aus irgendwelchen Gründen> nicht hinkriegt.
Doch, die Info was der Chip nach Datenblatt kann nützt ne ganze Menge,
beispielsweise kann er die Entscheidung nach dem passenden Synthesetool
und Entwurfsmedologie erleichtern.
Grad bei Speicherblöcken decken die verilog/VHDL
Hochsprachen-beschreibungsmöglichkeiten nur einen Teil des
realisierbaren an. Beispielsweise dataports mit unterschiedlicher
Breite. Wenns halt das synthesetool nicht mit array-Beschreibung
gebacken kriegt - dann instanziiert man halt die Blockram-Blöcke
händisch. Oder man nutzt den Coregenerator, der dann auch für das
Synthesetool passenden wrapper mitbastelt.
Jürgen S. schrieb:> Die Sache beim Spartan 6 besonders tricky, weil der einige> RAM-INIT-Defizite hat, welche je nach Anwendung mit Zellen ergänzt oder> ersetzt werden müssen. Von daher ist das mit Vorsicht zu genießen und> auf Sicherheit zu designen.>
Naja, würde mal sagen: It's not a bug, it's a feature.
Tut jetzt nicht so weh, ein ROM als RAMB16 zu implementieren.
> Und: Spartan 6 ist ein wenig ein toter Chip, weil die Software dafür> schon 5 Jahre nicht mehr weiterentwickelt wurde.
Das würde in dem Kontext als positiv sehen. Betr. Software heisst das
bei Xilinx nämlich: Man kann endlich mit den Bugs leben. Der Chip ist
deswegen noch lange nicht tot, eher gut bewährt, und es wird ihn darum
auch noch lange geben.
Aufgrund der massiven Bugs am BRAM und der vielen Beschränkungen z.B.
beim Clocking ist der S6 echt übel. Wenn man damit leben kann, OK. Aber
für neue Designs setzen wir den nicht mehr ein. Die Artixe sind da viel
besser.
Xilinx hat zwar inzwischen eine Spartan 6 only ISE Variante für Windows
10 rausgebracht, aber auch das ist halt nur halbgar.
Christian R. schrieb:> Aufgrund der massiven Bugs am BRAM und der vielen Beschränkungen z.B.> beim Clocking ist der S6 echt übel.
Echt? Also ich fand der S6 macht egenüber seinen Vorgängern S3 und S2
vieles besser.BUFGMUX sharing und Quadrantenbegrenzungen beim Clocking
gehörten auch der Vergangenheit an etc.. Hardcore-Speichercontroller,
mittel granulare IO-delays, das macht einem das Leben schon deutlich
einfacher. U
Und das die Entwicklungssoftware nicht ständig geupdatet qwerden muss
sehe ich eher als Vor- statt als Nachteil. Ebenso das die tools auif
Windows 7 und Linux laufen und man den bitteren Kelch "Kachel 0.8" und
andere Mühsal an sich vorüber ziehen lassen kann.
Christian R. schrieb:> Aufgrund der massiven Bugs am BRAM und der vielen Beschränkungen z.B.> beim Clocking ist der S6 echt übel. Wenn man damit leben kann, OK.
Mir sind diese Dinge bis jetzt auch noch nicht auf die Füße gefallen....
Duke
Duke Scarring schrieb:> Mir sind diese Dinge bis jetzt auch noch nicht auf die Füße gefallen....
weil die Firma mit dem grossen X sie geschickt kaschiert. Das Resultat
der ominösen Adressleitungsgeschichte ist z.B. dass man kein
zusammenhängendes großes RAM vernünftig betreiben kann, weil weite Teile
des Decoders ausgelagert werden müssen, was die Geschichte enorm
verlangsamt bis hin zur Nichtnutzbarkeit.
Ich hatte beim Spartan 6 folgendes "Phänomen" während eines Projekts:
Ein FIFO mit dem Fifo-IP-Core erzeugt und ins Prjekt eingebaut zur
Synchronisierung zw. zwei Taktdomänen und ggf. Datenpufferung. wr_clk
und rd_clk waren zwei unabhängige Takte mit unterschiedlicher Frequenz.
Es wurde gelesen, solange Daten im Fifo vorhanden waren, also empty auf
'0' war. Wenn das Fifo leer war, und wieder etwas reingeschrieben wurde,
ist das empty auf '1' gegangen, nur waren die reingeschriebenen Daten
noch nicht am DOUT angekommen. Wenn also auf steigende Flanke der rd_clk
empty "NICHT LEER" angezeigt hat, war noch nicht das neue Datenwort am
DOUT, sondern das alte/vorhergehende... Simulation hat dieses Verhalten
(diesen Fehler imho) selbstverständlich nicht abgebildet... Hat recht
lange gedauert, bis wir rausgefunden haben, wo die falschen Daten
herkamen und wie das zu beheben war (Lösung war letztendlich, nicht auf
empty, sondern auf almost_empty zu hören. Dies ging aber auch nur, weil
es sich um einen Datenstrom handelte und der eine Takt bzw. wenige Takte
Verzögerung nicht die Funktionalität einschränkten). Interessanterweise
schien dieser Bug nur bei ganz bestimmten Frequenzen und
Frequenzverhältnissen von wr_clk zu rd_clk aufzutreten. Die Frequenzen
waren auch nicht besonders hoch, sondern im humanen Bereich von um die
100-150 MHz.
@Detlef: Die Aussagen über die verfügbaren Ressourcen im FPGA sind
meiner Meinung nach eher theoretischer Natur. Sobald man mit seinem
Design über 90%-95% einer bestimmten Ressource verbraucht, wird es für
die Place&Route Werkzeuge sehr schwierig die Schaltung in die Ressourcen
des FPGA unterzubringen und dabei noch das geforderte Timing zu
erreichen. Ich will gar nicht davon anfangen, dass die Durchlaufzeiten
für Synthese, Place&Route "plötzlich" explodieren. Ich hatte mal
getestet, was passiert, wenn ich im einem vorhandenen Design mehr BRAMs
verwende. Ich kam dann auf 93% Ausnutzung der BRAMs, nur wurden dann
plötzlich 2 Timing Constraints nicht mehr eereicht. Nachdem ich die
Constraints versuchsweise entschärft habe so dass sie erreicht werden
konnten, ist die Zeit für Synthese+Implementierung von 5-6Min auf etwas
über eine Stunde angestiegen.
Hier mal ein paar Zahlen aus dem letzten Synthesereport:
[pre}
...
---- Other Options
infer_ramb8 : No
...
INFO:Xst:3226 - The RAM <Mram_ram> will be implemented as a BLOCK RAM,
absorbing the following register(s): <memARead> <memBRead>
-----------------------------------------------------------------------
| ram_type | Block |
|
-----------------------------------------------------------------------
| Port A
|
| aspect ratio | 65536-word x 32-bit |
|
| mode | write-first |
|
| clkA | connected to signal <clk> | rise
|
| weA | connected to signal <memAWriteEnbl> | high
|
| addrA | connected to signal <memAAddr> |
|
| diA | connected to signal <memAWrite> |
|
| doA | connected to signal <memARead> |
|
-----------------------------------------------------------------------
| optimization | speed |
|
-----------------------------------------------------------------------
| Port B
|
| aspect ratio | 65536-word x 32-bit |
|
| mode | write-first |
|
| clkB | connected to signal <clk> | rise
|
| weB | connected to signal <GND> | high
|
| addrB | connected to signal <GND> |
|
| diB | connected to signal <GND> |
|
| doB | connected to signal <memBRead> |
|
-----------------------------------------------------------------------
| optimization | speed |
|
-----------------------------------------------------------------------
...
Number of RAMB16BWERs: 235 out of 268 87%
Number of RAMB8BWERs: 0 out of 536 0%
[/pre]
Wo finde ich jetzt, wie groß der Decoder ist?
Und von welchen Geschwindigkeiten reden wir hier?
Obiges Design läuft bei 50 MHz, die Serdes an den IOs mit 200 MHz und
Ethernet mit 125 MHz.
Duke
Duke Scarring schrieb:> Wo finde ich jetzt, wie groß der Decoder ist?
Bei der gesteigerten Nutzung von Slices, bzw der reduzierten
Möglichkeit, diese mit der Ansteuerlogik, die vor der Adresslogik sitzt,
zusammenzufassen. Ein Xilinx FAE hat da mal in einem Forum was zu
rausgegeben. Der Artikel ist dann aber von ihm selber später wieder
wegmodiert worden. War wohl zu heiss, die Info! Die eierlegende
Wollmilchsau Spartan 6, besonders die 45er-Version, sollte wohl weiter
als all-inclusive Superchip gehandelt werden.
> Und von welchen Geschwindigkeiten reden wir hier?
Spartan 6 Designs habe Ich mit 300MHz partiell verwendet. Die RAMs
können angeblich noch schneller. Angeblich. Wenn nix angeschlossen ist,
wahrscheinlich. Man kennt ja die Thematik
> Obiges Design läuft bei 50 MHz,
Also im SPAR(tan) Modus. Da wundert es mich nicht, daß Du keine
Einschränkungen bemerkst.
Ach ja: Übrigens soll es so sein (ungesichterte Info) dass in späteren
Chargen einige der Bugs behoben worden sein sollten und die SW da
weniger drumherum baut. Wie die SW es merkt, welcher Chip angesprochen
wird, blieb in der Diskussion offen.
freduardo schrieb:> Wenn das Fifo leer war, und wieder etwas reingeschrieben wurde,> ist das empty auf '1' gegangen, nur waren die reingeschriebenen Daten> noch nicht am DOUT angekommen.
Wenn empty auf 1 gegangen ist, dann ist das FIFO doch offiziell "leer".
Warum möchtest Du dann etwas daraus lesen können?
Weltbester FPGA-Pongo schrieb im Beitrag #5335969:
> Wie die SW es merkt, welcher Chip angesprochen wird, blieb in der> Diskussion offen.
Die Chip Revision kann/muss man im ucf angeben.
Uns ist der blöde Bug mit der nicht korrekten Initialisierung der BRAMs
auf die Füße gefallen. Das war zu der Zeit als Xilinx das noch nicht so
richtig zugegeben hatte.
Mit dem Clocking hatten wir einige Probleme beim Ansteuern der SERDES,
das stand zwar zumindest im UG, ist aber stellenweise sehr
einschränkend.
Zum Glück gab es dann endlich die 7er, die sind einfach besser designed.
Der Spartan 6 ist ja nur ein extrem abgespeckter Virtex 5. Sollte für
alles herhalten, aber wie das mit eierlegenden Willmilchschweinen halt
so ist.
Klar, besser als der S3 war er schon, aber das sollte man ja schon
erwarten.
Übrigens läuft Vivado mittlerweile sehr gut und keiner zwingt einem
Kachel Windows zu nutzen, das gibts ja auch für 7 und Linux. Ich bin
froh, dass unsere IT endlich auf W10 umgestellt hat, endlich Linux
Subsystem, funktionierendes USB 3.0 unabhängig vom Host Controller
Hersteller und und und.
Mit etwas Gefummel geht das allermeiste von ISE auch unter Windows 10.
Weltbester FPGA-Pongo schrieb im Beitrag #5335994:
> freduardo schrieb:>> Wenn das Fifo leer war, und wieder etwas reingeschrieben wurde,>> ist das empty auf '1' gegangen, nur waren die reingeschriebenen Daten>> noch nicht am DOUT angekommen.>> Wenn empty auf 1 gegangen ist, dann ist das FIFO doch offiziell "leer".> Warum möchtest Du dann etwas daraus lesen können?
Sorry, war ein Zahlendreher... Ich wollte natürlich lesen, wenn das FIFO
nicht leer war, also empty auf '0'
Das mit der Revision finde ich gerade nicht, aber den blöden Würgaround
zum BRAM init hab ich noch gefunden:
https://www.xilinx.com/support/answers/39999.html
Eventuell erinnere ich mich auch falsch, und die Chip Rev Angabe war
beim Spartan 3e oder Virtex 4.
Edit: Bei nem alten Virtex 4 Design hab ich gefunden:
CONFIG STEPPING = 2;
Ob das auch beim Spartan 6 klappt, bin ich mir jetzt nicht mehr sicher,
wir haben den aufgrund der Bugs dann direkt durch den Artix ersetzt
sobald der verfügbar war.
Christian R. schrieb:> Das mit der Revision finde ich gerade nicht, aber den blöden Würgaround> zum BRAM init hab ich noch gefunden:> https://www.xilinx.com/support/answers/39999.html> Eventuell erinnere ich mich auch falsch, und die Chip Rev Angabe war> beim Spartan 3e oder Virtex 4.>> Edit: Bei nem alten Virtex 4 Design hab ich gefunden:> CONFIG STEPPING = 2;> Ob das auch beim Spartan 6 klappt, bin ich mir jetzt nicht mehr sicher,> wir haben den aufgrund der Bugs dann direkt durch den Artix ersetzt> sobald der verfügbar war.
Danke Dir!
Mal fix probiert mit einem S6, aber leider sagt ISE...
"WARNING:Pack:1375 - STEPPING Levels are not supported for this device."
Einen Versuch war es wert. ;)
freduardo schrieb:> Ich hatte beim Spartan 6 folgendes "Phänomen" während eines Projekts:
Bei FIFOs in divergenten Domänen ist der Zeitpunkt der Flanke und des
Resets interessant. Da gibt es ganz grundsätzlich das Problem, dass sich
Takte zwischen Reset, Schreib- und Leseprozeduren, die scheinbar voll
sequenziell laufen, überholen können und damit gleich instanziierte
FIFOs nach lokalem Signalzustand mit unterschiedlichen Zuständen gesetzt
werden können.
Daher sind bei asynchronen, nicht deterministischen Domänen immer +/-1
Takte zusätzlich in Betracht zu ziehen.
Was die interpretation der Signale angeht, muss genau geschaut werden,
in welche Domäne die jeweils synchron sind. Jedes der Signale - auch das
"empty" - kann nur nur einer domain vollkommen synchron und korrekt
sein.