www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Zufallszahlen mit VHDL erzeugen


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Hat jemand eine Idee, wie man mit VHDL zufallszahlen erzeugen kann? Ich 
bräuchte etwas, um in ein Register Werte zwischen 0 und dem maximalwert 
des Registers zu schreiben. Dabei sollen die Werte möglichst zufällig 
sein. Hat jemand beispielcode?

Danke!!!

Autor: Kest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier hast Du so ein Beispiel:



use ieee.numeric_std.all;
use ieee.math_real.all;


  process
    variable seed1, seed2 : positive;
    variable rand         : real;
    variable int_rand     : integer;
    variable stim         : std_logic_vector(11 downto 0);
  begin
    loop
      UNIFORM(seed1, seed2, rand);
      int_rand := integer(TRUNC(rand*4096.0));
      stim     := std_logic_vector(to_unsigned(int_rand, stim'length));
      wait for 10 ns;
    end loop;
  end process;


Grüße,

Kest

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es synthetisierbar sein soll, dann kannst Du ein LFSR 
implementieren. Google mal danach...

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LFSR geht gut und braucht wenig Hardware, aber Vorsicht: Die Doku im 
Netz ist mehr als bescheiden. Vor allem fehlende oder widersprüchliche 
Angaben darüber von welcher seite aus die Taps abgezählt sind, oder ob 
sie mit XOR oder XNOR kombiniert werden...

Wenn du da was falsch machst kann es schnell passieren, dass du eine 
nicht-optimale Folge bekommst oder das LFSR sich sogar aufhängt.

Autor: spartanne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie zufällig muss es denn sein?
Die Folgen bei einem LFSR sind deterministisch.
Wenn du ein LFSR auf einem FPGA implementierst und mit dem FPGA-Clock 
tacktest, so wirst du nach dem Startup wenn du z.B. immer nach 10us, 
nach 20us, .. auf das Register schaust, immer die gleichen Werte 
erhalten, da der Initalwert auch immer der selbe sein wird. Ist halt 
alles synchron getaktet.
Bei einem rein digitalen Design braucht man eigentlich immer einen 
analogen Effekt um es richtig zufällig zu machen (true random noise), 
z.B. Jitter, Resetzeiten, RTC o.ä., welche dann den Startwert des LFSR 
beeinflussen.
Oder (bei einer Steuerung mit Eingabe) nimmt man den Bediener als 
Zufall.

Es gibt noch dreckigere Möglichkeiten um einen Zufall zu erzeugen, wie 
z.B. metastabile FF auf dem FPGA erzeugen.. geschmackssache. Ich hätte 
da Probleme mit ob das bei jeder Temperatur funktioniert...
Oder die Zeit bis zum Einrasten einer PLL (falls auf FPGA vorhanden)..

Wenn man (wie Morin richtig erwähnt) die Rückkopplungen des LFSR richtig 
wählt, so durchläuft das LFSR auch alle möglichen Zustände. Wenn das 
ausreicht, dann ab dafür.

Gruß

Autor: spartanne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab grad mal noch schnell ISE von Xilinx angeschmissen, hier die Makros 
für LFSR 8Bit, 16Bit, 32Bit:

8Bit:
process(<clock>)
begin
   if ( <clock>'event and <clock> ='1') then
      if (<reset> = '1') then
         <reg_name> <= (others => '0');
      elsif <clock_enable>='1' then
         <reg_name>(7 downto 1) <= <reg_name>(6 downto 0) ;
         <reg_name>(0) <= not(<reg_name>(7) XOR <reg_name>(6) XOR 
<reg_name>(4));
      end if;
   end if;
end process;


16Bit:
process(<clock>)
begin
   if ( <clock>'event and <clock> ='1') then
      if (<reset> = '1') then
         <reg_name> <= (others => '0');
      elsif <clock_enable>='1' then
         <reg_name>(15 downto 1) <= <reg_name>(14 downto 0) ;
         <reg_name>(0) <= not(<reg_name>(15) XOR <reg_name>(14) XOR 
<reg_name>(13) XOR <reg_name>(4));
      end if;
   end if;
end process;


32Bit:
process(<clock>)
begin
   if ( <clock>'event and <clock> ='1') then
      if (<reset> = '1') then
         <reg_name> <= (others => '0');
      elsif <clock_enable>='1' then
         <reg_name>(31 downto 1) <= <reg_name>(30 downto 0) ;
         <reg_name>(0) <= not(<reg_name>(31) XOR <reg_name>(22) XOR 
<reg_name>(2) XOR <reg_name>(1));
      end if;
   end if;
end process;


Diese sollten alle Zustände durchlaufen.
Man kann ein LFSR auch als ein Zähler mit nachgeschaltetem Decoder (z.B. 
ROM) betrachten. Der Zähler inkrementiert mit jedem Takt und adressiert 
das ROM, welches die Ausgangscodierung vornimmt.

Autor: FPGA-Pongo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Offene Leitung von out=1 auf tristate schalten und den Verfall der 
Ladung messen.

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Internet findet man eine Menge von VHDL-Algorithmen, z.B.

1.  http://en.wikipedia.org/wiki/LFSR

2.  http://www.ht-lab.com/freecores/mt32/mersenne.html

Beide erzeugen gleichverteilte Zufallsfolgen. Der zweite ist bzgl.
Periodendauer sogar sehr gut, ca 10^8000 ist die Periodendauer,
selbst bei 1 GHz: die Erde ist jünger. Zur Simulation hast Du den
Vorteil, das Du immer den selben Startwert wählen kannst, im Betrieb
kann der Startwert entweder als Schlüssel oder aber über einen
asynchron laufenden Quarz bestimmt werden.

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie zufällig muss es denn sein?

Das ist allerdings eine Wichtige Frage. Ich hab damals ein LFSR 
gebraucht, um Rauschen auf einem Lautsprecher auszugeben. Da ist es 
Wurst wenn sich die Folge nach 1 sec wiederholt.

Am anderen Ende hast du Krypto-Anwendungen, die werden gleich kriminell 
unsicher wenn du nicht weißt was du tust.

> Wenn du ein LFSR auf einem FPGA implementierst und mit dem FPGA-Clock
> tacktest, so wirst du nach dem Startup wenn du z.B. immer nach 10us,
> nach 20us, .. auf das Register schaust, immer die gleichen Werte
> erhalten, da der Initalwert auch immer der selbe sein wird. Ist halt
> alles synchron getaktet.

Wenn du nicht jeden Takt einen Zufallswert brauchst, kannst du per 
Clock-Enable das ganze in die Länge ziehen. Ansonsten gilt: Mehr Bits = 
länger, und da man mit den richtigen Taps auf "volle Länge" (*) kommt, 
eine Beispielrechnung: 200 MHz Takt = 5 ns Taktperiode, 32-Bit LFSR: ca. 
2^32 Zustände -> nach 20 Sekunden kommt die Wiederholung. Mit einem 
64-Bit LFSR bist du dann schon gleich bei mehreren tausen Jahren.

(*) <klugscheißermodus>Der Nullzustand wird nie erreicht -> es sind nur 
2^32-1 Zustände</klugscheißermodus>

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ein Nachtrag: Bei den Vorschlägen "Metastabiles FF", "Zeit zum 
Einrasten einer PLL" oder "Verfall der Ladung auf einer 
Tristate-Leitung" würde ich gerne mal den Nachweis einer 
gleichverteilten Zufallsfolge sehen...

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Morin wrote:
> Noch ein Nachtrag: Bei den Vorschlägen "Metastabiles FF", "Zeit zum
> Einrasten einer PLL" oder "Verfall der Ladung auf einer
> Tristate-Leitung" würde ich gerne mal den Nachweis einer
> gleichverteilten Zufallsfolge sehen...

Das ist einfach... Diese Werte nimmt man nur zum Seeden eines PRNG, also 
bleiben die Eigenschaften des PRNG erhalten.
(Solang man's nicht wie die Debian-OpenSSL macht, und nur 2^16 
verschiedene Seeds erzeugt...)

Autor: spartanne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Morin
Das Problem der Wiederholung tritt doch für halbwegs praktische 
Anwendungen nicht auf. Wie du richtig sagst, man nimmt halt 64Bit oder 
mehr und dann kann man ein paar Jahre warten.
Hängt halt alles von der Anwendung ab. Wäre gut wenn sich Sebastian dazu 
äußern würde...
Gerade bei Kryptografie kann man sich ordentlich austoben. Sonst ist ein 
LFSR allein sicher ausreichend.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.