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
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.
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.
10k = 10kBit Also, ca. 1250 Stück 74HC595 in Reihe. Wobei nur 10 Ausgänge auf der ganzen Strecke gebraucht werden.
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).
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.
Problem ist allerdings, dass Du die SLR nicht resetten kannst. Die musst Du dann mit Nullen durchspülen, wenn das erforderlich ist
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?
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.
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
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.
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.
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; |
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.
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.
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
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
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.
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.
_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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.