Hallo, Ich bin gerad dabei einen flexiblen Pseudozufallszahlengenerator zu entwickeln. Ich wollte dabei flexibel die Anzahl der Schieberegister in den Stufen 2,3,4,5,8 und 16 umschalten (mit externen Schaltern) können. Außerdem sollte jedes XOR-Glied mittels Schalter aktiviert bzw. deaktiviert werden können? Die angefügte png-Grafik gibt einen Überblick! Ich habe dazu auch schon meinen vhdl-code + vorläufiger testbench geschrieben und angefügt!
Ach was ich noch vergessen hab. es geht darum, später zu analysieren nach wie viel Zyklen sich die "zufällige" Periode wieder holt (bezogen auf die Länge und der Position der XOR-GLieder). dazu gibt es dort schon den Binärzähler B_COUNT bzw. B_COUNT_OUT!
Floh schrieb: > Und was ist jetzt dein Problem? Ich bekomme mit Modelsim die Simulation gar nicht zum laufen Starte es über folgende Kommandos: vcom pseuzufgen3.vhd vcom pseuzufgen_tb.vhd vsim work.rand_lfsr add wave sim:/rand_lfsr/CLK add wave sim:/rand_lfsr/RESET add wave sim:/rand_lfsr/XOR_EN add wave sim:/rand_lfsr/REG_LENGTH add wave sim:/rand_lfsr/Q add wave sim:/rand_lfsr/B_COUNT_OUT run 500000 ms es wird nicht einmal der CLK angezeigt... alle Signale bleiben bei 0 und B_COUNT_OUT hat immer den Wert "U" Dann habe es mal mit isim, das beim ISE mit dabei ist, probiert und dort ähnliche Problem gehabt --> B_COUNT_OUT hat zumindest zu Anfang immer den Wer "U" etc. siehe angefügtes Bild
So ich habe jetzt mal einen etwas anderen Ansatz verfolgt: siehe Anhang leider gibt er bei der Synthese noch zwei Fehlermeldungen aus, die ich hier schon gepostet habe! ERROR:HDLParsers:3236 - "F:/VHDL/VHDL_Codes/neues/pseuzufgen.vhd" Line 114. Can not determine the "others" values in aggregate. (LRM 7.3.2.2) ERROR:HDLParsers:3236 - "F:/VHDL/VHDL_Codes/neues/pseuzufgen.vhd" Line 58. Can not determine the "others" values in aggregate. (LRM 7.3.2.2) zu if QINT(NUMBER_OF_REGS downto 0) = (others => '0') then und if QINT(NUMBER_OF_REGS downto 0) = (others => '1') then ich wollte dort eigentlich nur fragen, ob denn alle Elemente der aktuellen Länge 0 bzw. 1 sind? wie würde das denn gehen?
Beim schnellen Überfliegen deines Generators ist mir nichts
aufgefallen, wohl aber bei deinem Testbench:
> CLK <= not CLK after 500000 ns;
ein bischen sehr lang?
LongClock schrieb: >> CLK <= not CLK after 500000 ns; > ein bischen sehr lang? Passt schon zusammen mit diesen Zeiten:
1 | RESET <= '0', '1' after 500 ms, '1' after 440000 ms, '0' after 450000 ms; -- Der Reset basiert auf "negativer Logik" |
Nur hätte ich da nicht in ms gerechnet, sondern in s oder min... >> CLK <= not CLK after 500000 ns; > ein bischen sehr lang? Ich hätte das dann wenigstens mit 500us geschrieben...
Meine Lösung sieht nun wie im angefügten VHDL-Code aus? ICh hab da etwas viel mit Copy&Paste gearbeitet aber zumindest macht es genau das was ich will --> flexible Pseudozufallszahlengenerator!
> use IEEE.NUMERIC_STD.ALL; > use IEEE.STD_LOGIC_ARITH.ALL; > use IEEE.STD_LOGIC_UNSIGNED.ALL; Warum denn immer? :-/ Seis drum... Warum machst du so einen unnötigen Aufwand? Ich würde da einfach ein 64-Bit LFSR machen, dann hätte ich immmer brauchbare Zufallszahlen, die sich nicht andauernd wiederholen. Denn genau das macht z.B. ein 8 Bit LFSR: die Zahlen 1..255 (weil ja 0 nicht auftreten kann) wiederholen sich laufend. Das ist also nur ein etwas wirrer 8 Bit (minus 1) Zähler... :-o Sieh dir das an: http://www.lothar-miller.de/s9y/categories/38-LFSR Das 8-Bit-SR wiederholt sich zweieinhalb mal... :-( Und noch weniger Bits dürften schlicht sinnlos sein...
Eigentlich ist die Idee mit den flexiblen LFSRs nicht schlecht (und alt). Bei LFSRs nimmt man aber als Zufallswert nicht den inneren Zustand (d.h. die einzelnen Bits als Vektor), sondern die ausgeworfenen Bits. Die haben ja nach Länge des LFSR und des char. Polynoms eine Länge nahe bei 2^n. Mehrere Bits als Vektor hintereinandergefasst bilden also fur n>>8 eine Gleichverteilung 0..255 (bei 8-Bit Zufallszahlen). Für n>=24 hab ich's selber mal für 8Bit-Zufallswerte ausprobiert, ein Histogramm nähert sich über die Zeit einer Gleichverteilung. Die ausgeworfenen Bits mehrerer verschiedener LFSRs kann man auch zu Zufallszahlen zusammenfassen (dann sind die einzelnen Bits nicht "so" korreliert.
Es geht nicht darum, dass das Ergebnis nicht gleichverteilt wäre. Es wiederholt sich bei kurzen Wortlängen nur wesentlich zu früh, als dass es sinnvoll einsetzbar wäre... > Die ausgeworfenen Bits mehrerer verschiedener LFSRs kann man > auch zu Zufallszahlen zusammenfassen (dann sind die einzelnen > Bits nicht "so" korreliert. Das ist doch nichts anderes, als wenn du die Wortlänge vergrößerst...
Mir scheint die Struktur falsch zu sein. Die Gezeigte ist nicht aequivalent zu dieser hier : http://www.ibrtses.com/simulations/lfsr.html
Hex Oschi schrieb: > Die Gezeigte ist nicht aequivalent zu dieser hier Allerdings ist eine Aussage auf dieser Seite auch falsch:
1 | Noteworthy properties of the LFSR with the length N bits are |
2 | : |
3 | - the maximum number of identical subsequent bits (0 or 1) is N |
4 | : |
Diese Aussage stimmt nur für die 1-en. Von den 0-en können maximal N-1 hintereinander auftauchen, weil niemals alle Bits im Schieberegister 0 sein können.
Hex Oschi schrieb: >Mir scheint die Struktur falsch zu sein. Die Gezeigte ist nicht >aequivalent zu dieser hier : >.. wie mittels LFSRs Zufallszahlen generiert werden, ist ja niergends einheitlich definiert. Auf Wikipedia z.B. sind verschiedene Rückkopplungen aufgezeigt. Lothar Miller schrieb: >Es geht nicht darum, dass das Ergebnis nicht gleichverteilt wäre. Es >wiederholt sich bei kurzen Wortlängen nur wesentlich zu früh, als dass >es sinnvoll einsetzbar wäre... wenn die Zufallszahl ein Teil der Bitsequenz des LFSRs ist, dann ist iA die Folge nicht gleichverteilt: Es fehlt immer die 0 und je nach char. Polynom fehlen noch andere Werte (z.B. wenn das Polynom Grad < n hat oder reduzible ist oder...). Ausserdem werden so Bits in die Zufallszahl übernommen, die per LFSR nochmal in den inneren Zustand einfliessen (d.h. evtl. die Korrelation zwischen Bits vergrössern). Auf Uralt-Computer wurde so aus einem nochbrauchbaren ein schlechter Zufallsalgorithmus erzeugt. Kombiniert man aber die Bits mehrerer LFSRs mit unterschiedlichen char. Polynomen, dann erhält man idR wesentlich unkorreliertere Bitfolgen. Und bei n>=24 erhält man z.B. für 8Bit-Zufallswerte => VGA ein "optisch gutes" Rauschen (bei 800x600 erkenne ich kein Muster mehr). Richtig guten Zufall kann ein LFSR-Zufallgenerator aber nicht erzeugen. Da ist mein Favorit MersennePrimer.
>es geht darum, später zu analysieren >nach wie viel Zyklen sich die "zufällige" Periode wieder holt Wie analysierst du das eigentlich in der Simulation ? Gruß, John
>Wie analysierst du das eigentlich in der Simulation ?
Fuer kleine N durchlaufen lassen. Es fehlt nur die Null, sonst nichts.
Nur das ist ein LFSR. Die Zahlen im Register sind gleichverteilt.
>Fuer kleine N durchlaufen lassen. Es fehlt nur die Null, sonst nichts.
Ja klar, ab wie stellst du bei größeren Schieberegister-Varianten fest,
ob die Rückkopplungen so gewählt wurden, dass der ganze Adressbereich
genutzt wird?
Gruß, John
John schrieb: > Ja klar, ab wie stellst du bei größeren Schieberegister-Varianten fest, > ob die Rückkopplungen so gewählt wurden, dass der ganze Adressbereich > genutzt wird? Du rechnest das vorher aus... Die Mathematik dafür existiert schon, und es gibt dann ein paar Werte, die sicher funktionieren. Was willst du mehr?
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.