Forum: FPGA, VHDL & Co. flexibler Pseudozufallszahlengenerator! was mache ich falsch?


von Olli R. (downunderthunder42)



Lesenswert?

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!

von Olli R. (downunderthunder42)


Lesenswert?

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!

von Floh (Gast)


Lesenswert?

Und was ist jetzt dein Problem?

von Olli R. (downunderthunder42)


Angehängte Dateien:

Lesenswert?

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

von Olli R. (downunderthunder42)


Angehängte Dateien:

Lesenswert?

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?

von LongClock (Gast)


Lesenswert?

Beim schnellen Überfliegen deines Generators ist mir nichts
aufgefallen, wohl aber bei deinem Testbench:

>  CLK <= not CLK after 500000 ns;

ein bischen sehr lang?

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


Lesenswert?

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...

von Olli R. (downunderthunder42)


Angehängte Dateien:

Lesenswert?

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!

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


Lesenswert?

> 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...

von ZufallsLFSR (Gast)


Lesenswert?

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.

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


Lesenswert?

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...

von Purzel H. (hacky)


Lesenswert?

Mir scheint die Struktur falsch zu sein. Die Gezeigte ist nicht 
aequivalent zu dieser hier : 
http://www.ibrtses.com/simulations/lfsr.html

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


Lesenswert?

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.

von ZufallsLFSR (Gast)


Lesenswert?

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.

von John (Gast)


Lesenswert?

>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

von Purzel H. (hacky)


Lesenswert?

>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.

von John (Gast)


Lesenswert?

>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

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


Lesenswert?

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
Noch kein Account? Hier anmelden.