Gast
#993082
Hallo zusammen, in Programmiersprachen wie z.B. C/C++ werden Zufallsfunktionen idR. per lineare Kongruenz erzeugt. Dies in VHDL zu implementieren ist wegen der notwendigen Modulo-Operation iA. nicht ganz trivial. Braucht man nur zufällige Bitfolgen, dann können wesentlich einfachere Ansätze verwandt werden. Ein aus der Algebra bekannter Ansatz ist der über Polynome über Z2 (oder auch Modulo 2), in der Signalverarbeitung als "Linear Feedback Shift Register" (LFSR) implementiert. Der im VHDL-Code verwendete Algorithmus benutzt nur eine XOR-Operation und erzeugt je Takt maximal ein Bit. Durch Modifikation können aber auch mehrere Bits je Takt erzeugt werden. Die generischen Werte der Komponente sind in der Tabelle im Code angegeben (es sind natürlich noch viele andere Polynome möglich). Ein kleiner <width>-Wert hat dann eine geringe, ein grosser eine sehr grosse Periodizität zur Folge (Laufzeit bei 100MHz und <width>=32 etwa 100 Sekunden, <width>=64 praktisch unendlich). Als Startwert (Seed) sind alle Werte ungleich Null erlaubt, der Seed-Wert wird beim Reseten angenommen (siehe Code). Ich habe den Zufallsgenerator für meine VGA-Ausgabe (640x480) verwendet, indem ich jedes Pixel mit einem neuen Zufalls-Bit gefüllt habe. Schon ab <width> = 20 ist kein Muster mehr zu erkennen. Die Zufallsbits können auch zu Vektoren und diese dann als Zufallszahlen interpretiert werden. Die Qualität dieser Zahlen ist allerdings sehr schlecht!! Viel Spass, Jörg