Forum: FPGA, VHDL & Co. Spartan6 als Peripherie Erweiterung über FMC Bus


von Peter (Gast)


Lesenswert?

Hallo,

ich nutze einen Spartan6 LX9, welcher 5 identische Instanzen beinhaltet 
und über LUTs / FlipFlops die Daten vom Controller (STM32L4) abgerufen 
werden / geschrieben werden.

Die Frage ist nun, ob es eine bessere Lösung gibt die Daten 
auszutauschen?
Jede Instanz benötigt 32 Adressen und ist mit 8 Bit Daten an den Bus 
angebunden.
1
if we = '1' then
2
  case address is
3
    when "0" & x"0" =>
4
        Bit0    <= datain(0);
5
        Bit1    <= datain(1);
6
        Bit2    <= datain(2);
7
    when "0" & x"2" => Val1 <= datain;
8
    when "1" & x"2" => Val2 <= datain;
9
    ....

Meine Überlegung war nun, ob es Sinnvoller ist die Daten in dem Internen 
Block Ram zu packen (als Dual Port) und dann in der Instanz auszulesen 
bzw direkt vom FMC Bus aus darauf zuzugreifen.

Peter

von Duke Scarring (Gast)


Lesenswert?

Peter schrieb:
> Die Frage ist nun, ob es eine bessere Lösung gibt die Daten
> auszutauschen?
Was gefällt Dir denn an Deiner Lösung nicht?

Duke

von Peter (Gast)


Lesenswert?

Das für diese Variante einige Ressourcen genutzt werden, welche für 
andere Dinge nicht mehr zur Verfügung stehen.

Viele der Signale werden in der Ziel Instanz eh zwischen gespeichert und 
können nach einem Durchlauf in den RAM geschoben werden.

Im Moment nutze ich den LX9 und würde gerne den LX4 einsetzen, da dieser 
einiges günstiger ist.

Peter

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Wenn die Signale, oder deren Zustand identisch ist, erkennt das die 
Synthese und optimiert es weg.

Das dürfte bei Dir aber nicht so sein.

Wenn anders herum, das ein Ram ergibt, das sich zu implementieren lohnt, 
wird die Synthese das auch erkennen.

von Peter (Gast)


Lesenswert?

Im Grunde ist es ein Modul, welches 5 mal instanziert wird und jedes das 
gleiche macht (5 Kanäle). Jede Instanz wird mit 100kHz aufgerufen und 
durchläuft einmal.
Da wenn der Kanal eingeschaltet wird die vorgegebenen Werte über den Bus 
gespeichert werden, da die meisten nicht zur Laufzeit verändert werden 
sollen sind die doppelt vorhanden. Aus dem Grund war mein Gedanke diese 
in den RAM auszulagern.
Des weiteren bin ich am überlegen die Daten aus dem RAM auf die Signale 
zu legen und die einzelnen Daten sequenziell über eine Instanz 
abzuarbeiten auch wenn die Daten jeweils gleichzeitig ankommen. Vom 
Timing her sollte es klappen, da der FPGA mit 75 MHz getaktet ist (nach 
oben wäre auch noch Luft) derzeit hätte ich 150 Takte pro Durchlauf 
Zeit.

von J. S. (engineer) Benutzerseite


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #4934706:
> Wenn die Signale, oder deren Zustand identisch ist, erkennt das die
> Synthese und optimiert es weg.

Nur, wenn auch das Zeitverhalten wirklich identisch ist oder infolge der
Optimierung etwas derartiges rauskommt. Wenn man das ungeschickt
ansteuert, haben Signale mitunter dieselben Werte, können aber nur über
die time domain hinweg wegoptimiert werden. Das hat man regelmäßig bei
pipelines mit Zählerständen unterschiedlicher Module: Man kann dann
sehen, dass das Hinzufügen von irgendwelchen verzögerten Signalen nicht
zu einem Mehr an Flächenverbrauch führt, weil diese Signale in der
Zeitebene schon existieren.

> Wenn anders herum, das ein Ram ergibt, das sich zu implementieren lohnt,
> wird die Synthese das auch erkennen.
Das kommt aber auch ein wenig auf die Beschreibung an. Man kann das
ungeschickt beschreiben, sodass es die Synthese nicht kapiert.

Es gibt aber noch einen Rettungsanker:

Auch die Kombinatorik, die nach der Synthese als normale LUT über
bleibt, kann per "Dekret" mit dem Mapper ins BRAM verfrachtet werden.
Heisst so ähnlich wie "Move slice logic into unsused block rams" oder
so.


Peter schrieb:
> Im Grunde ist es ein Modul, welches 5 mal instanziert wird und jedes das
> gleiche macht (5 Kanäle). Jede Instanz wird mit 100kHz aufgerufen und
> durchläuft einmal.

Sowas kann man als state machine schreiben, die mit gemultiplexten Daten
arbeitet. Das kann man sehr einfach lösen, indem man die fsm kapselt.
Man kann es auch so machen, dass die fsm ausgerollt wird und parallel
mehrere fsm state unabhängig abarbeiten kann. Das ist aber sehr
aufwändig und nur nötig, um die maximale Bandbreite zu generieren.

von Peter (Gast)


Lesenswert?

Jürgen S. schrieb:
> Sowas kann man als state machine schreiben, die mit gemultiplexten Daten
> arbeitet. Das kann man sehr einfach lösen, indem man die fsm kapselt.
> Man kann es auch so machen, dass die fsm ausgerollt wird und parallel
> mehrere fsm state unabhängig abarbeiten kann. Das ist aber sehr
> aufwändig und nur nötig, um die maximale Bandbreite zu generieren.

Ja, an die Variante habe ich auch gedacht nur sind es schon einige 
Signale, welche ich dann durch die ganze Instanz schieben muss.

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.