Forum: FPGA, VHDL & Co. zwei Schieberegister


von Mathias H. (mathias)


Lesenswert?

Hallo,

es geht um eine Abschätzung.
Es sollen zwei unabhängige Schieberegister mit einer "Länge" von je ca. 
10k realisiert werden.
Pro Schieberegister gibt es 10 Ausgänge.
Der Serielle -Clock hat eine Taktung von ca. 20MHz.
Dann noch etwas Steuerung der Schieberegister.

Kriegt man das in einen Xilinx Spartan-6 XC6SLX4-2CPG196 FPGA rein?
https://shop.trenz-electronic.de/de/25893-Cmod-S6-Breadboardable-Spartan-6-FPGA-Module

FF-generieren und hintereinander schalten oder kann man auch das RAM 
benutzen?

Von FPGAs habe ich nicht viel Ahnung.
Hardware mache ich seit vielen Jahren.

Es geht erstmal nur um die Auswahl des FPGAs bzw Boards.
Xilinx ist Vorgabe.

Danke

Gruß
Mathias

von Jan H. (janhenrik)


Lesenswert?

Mathias H. schrieb:
> 10k realisiert werden.

10k was?

von Vancouver (Gast)


Lesenswert?

Also zwei Schieberegister mit 10000 Einträgen und einer Breite von 
10Bit?

Große Schieberegstter kannst Du sehr einfach mit Blockram-basierten 
FIFOS nachbilden. Gängige Blockrams haben eine Breite von 18Bit und eine 
Tiefe von 1k oder 2k. Ich würde von den 18Bit nur 10 verwenden und den 
Rest ungenutzt lassen. Dann brauchst Du etwa 20 bzw. 10 Blockrams. Das 
sollte auch mit kleineren FPGAs gehen. Details musst Du aber im 
Datenblatt nachschauen.

von Achim S. (Gast)


Lesenswert?

Mathias H. schrieb:
> Es sollen zwei unabhängige Schieberegister mit einer "Länge" von je ca.
> 10k realisiert werden.
> Pro Schieberegister gibt es 10 Ausgänge.

Also jeweils ein serieller Datenstrom der um 10k Takte verzögergt werden 
soll, und von dem du jeweils die am längsten verzögerten 10 Bits sehen 
willst? Sollen die sichtbaren 10 Bits jeweils in 10er-Sprüngen wechseln 
oder sollen sollen die auch in jedem Takt eins durchschieben? (anders 
ausgedrückt: willst du jeweils 10Bit um 10k Takte verzögern oder willst 
du jeweils 1Bit um 10k Takte verzögern?)

Angenommen es geht um 1 Bit: dann brauchst du größenordnungmäßig 10kBit 
"Speicherbedarf". Ein BRAM-block hat 9kBit bzw. 18kBit. Vielleicht 
kannst du den nicht vollständig nutzen, weil deine Bitbreite (10) nicht 
so gut zur Bitbreite des RAMs passt. Aber in den Spartan-Speicher 
reinpassen werden die Verzögerungsleitungen auf jeden Fall.

Wenn du stattdessen gemeint hast, dass zwei mal 10 Bit umd 10k Stellen 
verzögert werden sollen, dann brauchst du in Summer 200kBit. Da wird es 
im XC6SLX4 schon langsam eng, aber es könnte noch reinpassen.

von Mathias H. (mathias)


Lesenswert?

10k = 10kBit
Also, ca. 1250 Stück 74HC595 in Reihe.
Wobei nur 10 Ausgänge auf der ganzen Strecke gebraucht werden.

von Achim S. (Gast)


Lesenswert?

Mathias H. schrieb:
> 10k = 10kBit
> Also, ca. 1250 Stück 74HC595 in Reihe.
> Wobei nur 10 Ausgänge auf der ganzen Strecke gebraucht werden.

Dann ist der Speicherbedarf nicht dein Problem.

Wenn allerdings die Ausgänge auf der ganzen Strecke verteilt sind (und 
nicht nur am Ende der Strecke liegen), macht das die Nutzung von BRAM 
wieder unelegant: am BRAM kannst du ja immer nur eine Stelle lesen, 
nicht viele Stellen gleichzeitig.

Die BRAM-Nutzung geht dann noch, wenn der Systemtakt und der Schiebetakt 
deutlich unterschiedlich sind (wenn du also pro Schiebetakt >= 10 
Systemtakte Zeit hast, um die 10 verschiedenen Stellen des BRAMs 
auszulesen).

von Vancouver (Gast)


Lesenswert?

Wie sind denn die einzlenen Abgriffe des Schieberegisters verteilt? Man 
kann natürlich auch mehrere verschieden lange BR-Fifos hintereineinander 
hängen und dazwischen abgreifen.

Eine andere Möglichkeit sind SLR-32 bzw. SLR-16. Dabei werden die 
LUT-Speicher der Logikzellen als kurze 1-Bit-Schieberegister 
konfiguriert. Für ein 10k-Regsiter brauchst Du dann 625 SLR16, das ist 
auch nicht die Welt. Die kannst Du auch so konfiguieren, dass der 
Ausgang nach einer beliebigen Stufe abgegriffen wird.

von Vancouver (Gast)


Lesenswert?

Problem ist allerdings, dass Du die SLR nicht resetten kannst. Die musst 
Du dann mit Nullen durchspülen, wenn das erforderlich ist

von Mathias H. (mathias)


Lesenswert?

Er wird immer nur ein Ausgang benutzt. Die anderen haben dann Pause.
Die Abgriffe sind bei ca. 950, 1700, 2650, usw.

Ein Reset wäre schön. Als Bedingung glaube ich im Moment nicht.

Möchte mir beide Lösungsvorschläge offen lassen, mit Blockram (BRAM) und 
den LUTs.

Gibt's vielleicht noch einen Vorschlag zum FPGA-Typ?
Wird es ein "Xilinx Spartan 6 LX4" tun, oder was kleineres oder 
größeres?

von Vancouver (Gast)


Lesenswert?

Mathias H. schrieb:

> Er wird immer nur ein Ausgang benutzt. Die anderen haben dann Pause.

Hm... was bedeutet benutzt? Letztlich musst Du alle 10 Ausgänge aus dem 
FPGA herausführen, d.h. sie müssen alle immer vorhanden sein.

> Ein Reset wäre schön. Als Bedingung glaube ich im Moment nicht.

Zumindest beim Powerup kannst Du die LUTs mit Nullen vorkonfigurieren.
Reset im Betrieb geht nicht, jedenfalls nicht ohne einen gewissen 
Aufwand.


> Gibt's vielleicht noch einen Vorschlag zum FPGA-Typ?
> Wird es ein "Xilinx Spartan 6 LX4" tun, oder was kleineres oder
> größeres?

Hängt ein bisschen davon ab, was sonst noch im FPGA laufen soll. Der LX4 
hat 300 SliceM, in jeder stecken 4 LUTs die als SLR16 oder 32 
konfiguriert werden können, also insgesamt 1200 SLR. Das könnte knapp 
passen. Dazu kommen noch 300SLICEX ohne SLR-Fähigkeit, nur für Logik.
Für BRAMs habe ich keine Abschätzung gemacht. Es wäre gut, wenn Du mal 
ein FPGA-Design durchlaufen lässt und dann schaust, ob es in den 
gewünschten FPGA reinpasst. Für die kleineren Spartans kannst Du die 
kostenlose Webpack-Version der ISE nehmen.

von Duke Scarring (Gast)


Lesenswert?

Vancouver schrieb:
> Hm... was bedeutet benutzt? Letztlich musst Du alle 10 Ausgänge aus dem
> FPGA herausführen, d.h. sie müssen alle immer vorhanden sein.
Nicht zwingend. Ich würde die auf einen MUX fürhren und nur den 
ansteuern.
Platz bracht man natürlich trotzdem immer für die längste Kette.
(Oder man konfiguriert zwischendrin das FPGA mit einem neuen Bitfile...)

Mathias H. schrieb:
> Wird es ein "Xilinx Spartan 6 LX4" tun, oder was kleineres oder
> größeres?
Wie schnell muß die Entscheidung fallen?
Ich verwende üblicherweise das größte FPGA was geht, mache aber defacto 
nur Einzelstücke. Nachher kommt immer einer und will noch was mit 
reingebaut haben...

Duke

von Mathias H. (mathias)


Lesenswert?

Ja, die Ausgänge kommen auf eine MUX.
Ist schon so ausgedacht.

@Vancouver
Der SLX4 hat nicht 300 sondern 600 Slices.
Würde das dann reichen?
Die "Steuerung", also der Rest ist nicht viel.
https://reference.digilentinc.com/_media/cmod_s6:cmods6_rm.pdf

Die Entscheidung wäre Morgen gut.
Soll gleich eine kleine Serie von bis 20 Stück werden.

Bin gerade dabei die Hardware zu machen das Modul soll Huckepack 
obendrauf.
Schaltplan, Harware und ein Kontroller ist kein Problem, da ist gute 
Erfahrung da.

von Markus F. (Gast)


Lesenswert?

Das mit den MUX und deren Abgriff sieht wieder danach aus, dass es NICHT 
mit BRAMs gehen wird.

Vielleicht malen der Herr eine Schaltung, damit das geneigte Volk 
erkennen möge, was benötigt ist.

Alternative: Schaltung in VHDL bauen und dann auf Synthese drücken. Die 
meldet sich schon, wenn der FPGA zu klein.

von Achim S. (Gast)


Lesenswert?

Mathias H. schrieb:
> Der SLX4 hat nicht 300 sondern 600 Slices.

aber nur 300 davon sind SliceM (was du für dein Schieberegister 
brauchst)

Markus F. schrieb:
> Das mit den MUX und deren Abgriff sieht wieder danach aus, dass es NICHT
> mit BRAMs gehen wird.

Na ja:
entweder ein LUT-Schieberegister und einen MUX, der eine von 10 
Positionen daraus abgreift

oder ein BRAM + eine FSM, die je 8 (oder 9) aufeinanderfolgende Bits in 
ein kleines Schieberegister schiebt und dessen Inhalt alle 8 (9) Takte 
ins BRAM schreibt + eine zweite FSM die mit dem passenden Adressoffset 
zum richtigen Zeitpunkt am zweiten Port das BRAM ausliest und den Wert 
in ein weiteres kleines Schieberegister + ein MUX, der die passende 
Bitposition aus dem zweiten SR auswählt.

Dann reicht zwar prinzipiell ein BRAM-Block für jedes der beiden 
Schieberegister. Aber zugegeben, bei der BRAM Variante hat man sehr 
viel mehr Gefrickel um jeweils den gewünschten Abgriff einzustellen. Da 
die LUTs verfügbar sind und nicht für was anderes gebraucht werden, ist 
das LUT-basierte Schieberegister wesentlich einfacher zu implementieren.

Markus F. schrieb:
> Alternative: Schaltung in VHDL bauen und dann auf Synthese drücken. Die
> meldet sich schon, wenn der FPGA zu klein.

Genau. Zumindest die LUT-Variante ist in ein paar Zeilen beschrieben 
(siehe unten). Und nach der Synthese (ok, vielleicht auch erst nach der 
Implementierung) weiß man, ob das FPGA reicht.

In diesem Fall ist die Antwort: ja, auch der kleinste Spartan6 (LX4) 
reicht, für die beiden SR ist etwa die Hälfte (52%) der SliceM-LUTs 
belegt.

Zumindest falls nicht noch weitere Anforderungen dazukommen als bisher 
beschrieben. Wenn z.B. noch jemandem einfallen sollte, dass die 10 
möglichen Abgriffpositionen nicht zur Synthesezeit feststehen sondern 
erst während des Betriebs festgelegt werden, sähe die Sache schon wieder 
gänzlich anders aus.
1
entity longsr is
2
port
3
(
4
  clk: in std_logic;
5
  bin1: in std_logic;
6
  bout1: out std_logic;
7
  bin2: in std_logic;
8
  bout2: out std_logic;
9
  sel:in std_logic_vector(3 downto 0)
10
);
11
end entity;
12
13
architecture behav of longsr is
14
15
signal longsr1,longsr2:std_logic_vector(9999 downto 0):=(others => '0'); 
16
17
begin
18
   schieben:process(clk)
19
   begin
20
      if rising_edge(clk) then
21
         longsr1<=longsr1(9998 downto 0) & bin1;
22
         case sel is
23
            when "0000" =>
24
               bout1 <= longsr1(5);  --weitere/andere Abgriffe bitte hier einfügen
25
            when "0001" =>
26
               bout1 <= longsr1(10);
27
            when others =>
28
               bout1 <= longsr1(9999);
29
         end case;
30
         longsr2<=longsr2(9998 downto 0) & bin2;
31
         case sel is
32
            when "0000" =>
33
               bout2 <= longsr2(5);
34
            when "0001" =>
35
               bout2 <= longsr2(10);
36
            when others =>
37
               bout2 <= longsr2(9999);
38
         end case;
39
      end if;
40
   end process;
41
end behav;

von Sebastian S. (amateur)


Lesenswert?

Für mich fehlt hier ein dezenter Hinweis darauf, wie eilig Du es hast!

Ein 08/15 µP mit 10000/8 = 1280 Bytes internem Speicher und 14 frei 
verfügbaren Anschlüssen (10 x Aussi (+1 x Fettig) und 1 x Eini (+1 x 
Tick)), sollten reichen.

Geht natürlich nicht mit 20 MHz Tackt. Da braucht’s 'nen FPGA.

von Vancouver (Gast)


Lesenswert?

Mathias H. schrieb:
> Ja, die Ausgänge kommen auf eine MUX.
> Ist schon so ausgedacht.

Ja, aber das Schieberegister muss immer alle Abgriffe bereitstellen. 
Oder Du musst eben jedesmal unkonfigurieren und jede Menge Bitfiles 
bereithalten.

>
> @Vancouver
> Der SLX4 hat nicht 300 sondern 600 Slices.
> Würde das dann reichen?

Es gibt verschiedene Slicetypen, 300 SLICE-M und 300 SLICE-X. Nur die 
M-Typen können als SLR konfiguriert werden. Siehe hier ab Seite 9:

http://www.xilinx.com/support/documentation/user_guides/ug384.pdf

Wenn Du SLR32 benutzt, sollte das passen, hat ja oben schon jemand 
ausgerechnet. Aber um sicher zu gehen, solltest Du das Design schreiben 
und synthetisieren, bevor Du die Hardware baust.

von Mathias H. (mathias)


Angehängte Dateien:

Lesenswert?

Danke an alle.
Wir haben uns für das Board entschieden:
https://community.numato.com/api/productdata/assets/downloads/fpga/mimas/MimasSpartan6ModuleV9.pdf

Hat einen "XC6SLX9" FPGA-Typ drauf:
http://www.xilinx.com/support/documentation/data_sheets/ds162.pdf

Bin gerade am Platine bauen zur Aufnahme des Boards.
Welche Pins sind sinnvoll für die Schieberegister?
DataIn, CLKin, DataOut. Sind rund 21MHz Clockfrequenz. Die Pins für die 
Steureung dürften nicht kritisch sein. Hoffe ich doch.
Im Anhang die Pinbelegung des Bausteines.
Wenn die Platine am Fertigen ist, habe ich Zeit mich vertiefend um den 
FPGA zu kümmern.

Danke

von Duke Scarring (Gast)


Lesenswert?

Mathias H. schrieb:
> DataIn, CLKin, DataOut. Sind rund 21MHz Clockfrequenz

CLKin würde ich an einen der *_GCLK_*-Pins anschließen.
Die anderen beiden auf einen GPIO, wo man gut rankommt.

Duke

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Probiers doch aus!
Baus in VHDL, dann simuliere es ob es auch so funzt wie gewollt.
Danach die Synthese für den ausgesuchten FPGA starten, die sagt dann 
schon wenns nicht passt.

Wenns nicht passt musst der nächst größere ran.

von _bla_ (Gast)


Lesenswert?

Das Ganze lässt sich leicht mit einem einzelnen Blockram und sehr wenig 
Logik erledigen:
Ein 18Kb Blockram lässt sich als Dual Port 16K x 1 Bit konfigurieren. 
Einen Port benutzt man zum Schreiben und für die Addresse benutzt man 
einfach einen Zähler, der jeden Takt weiter zählt. Den anderen Port des 
RAM benutzt man zum Lesen am Abgriff, dort legt man als Addresse einfach 
den Zählerstand minus der Anzahl an gewünschten Registerbits zwischen 
Anfang und Abgriff an. Das passt locker in die kleinsten FPGAs rein.

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


Lesenswert?

_bla_ schrieb:
> Den anderen Port des RAM benutzt man zum Lesen am Abgriff
Damit ist dann die Aufgabe zu 1/10 gelöst, denn die Forderung war, wie
Mathias H. schrieb:
>>>> Pro Schieberegister gibt es 10 Ausgänge.

von Achim S. (Gast)


Lesenswert?

Lothar M. schrieb:
> Damit ist dann die Aufgabe zu 1/10 gelöst, denn die Forderung war, wie
> Mathias H. schrieb:
>>>>> Pro Schieberegister gibt es 10 Ausgänge.

Und das wäre mit einem Block-RAM in der Tat schwierig - man bräuchte 
wohl eher 10 davon. Aber später hat der TO genauer spezifiziert:

Mathias H. schrieb:
> Er wird immer nur ein Ausgang benutzt. Die anderen haben dann Pause.

Und in dem Beitrag klingt es eher so, als gäbe es tatsächlich nur einen 
Ausgang, der per Select-Eingang auf eine von 10 (zur Synthesezeit) 
vordefinierten Stellen des Schieberegisters zugreifen soll.

Wenn es tatsächlich so zu verstehen ist, dann lässt sich das sowohl per 
SliceM-Schiebergister mit 10fach-MUX lösen, als auch per Block-RAM mit 
variablem Adressoffset (anders als bla wusste ich gar nicht mehr, dass 
Block-RAMs auch mit Datenbreite 1 konfiguriert werden können ;-). Und 
beide Lösungen passen für zwei solcher Schieberegister problemlos auch 
in den kleinsten Spartan 6.

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


Lesenswert?

Achim S. schrieb:
> nur einen Ausgang, der per Select-Eingang auf eine von 10 (zur
> Synthesezeit) vordefinierten Stellen des Schieberegisters zugreifen soll.
Die Lösung mit dem BRAM könnte dann sogar zur Laufzeit auf jede 
beliebige SR-Länge umgeschaltet werden.

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.