Add README.txt.
This commit is contained in:
parent
8cf9ca1673
commit
46046beac2
|
@ -0,0 +1,126 @@
|
||||||
|
|
||||||
|
Pseudo-Random Number Generators in VHDL
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
This library contains a number of pseudo-random number generators (PRNG)
|
||||||
|
in synthesizable VHDL code.
|
||||||
|
|
||||||
|
The PRNGs in this library are useful to generate noise in digital signal
|
||||||
|
processing and to generate random numbers for monte-carlo simulations or
|
||||||
|
for games.
|
||||||
|
|
||||||
|
The VHDL code is portable and should run on any FPGA/synthesis platform,
|
||||||
|
but the designs are somewhat optimized for Xilinx FPGAs.
|
||||||
|
|
||||||
|
These PRNGs are a good alternative to linear feedback shift registers (LFSR).
|
||||||
|
Although LFSRs are commonly used, their output exhibits strong correlations.
|
||||||
|
Furthermore, correctly generating multi-bit random words with LFSRs is tricky.
|
||||||
|
|
||||||
|
NOTE: None of the RNGs in this package are cryptographic random number
|
||||||
|
generators. These generators are not suitable for cryptography.
|
||||||
|
|
||||||
|
|
||||||
|
Xoroshiro128+ RNG
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Xoroshiro128+ is an RNG algorithm developed in 2016 by David Blackman
|
||||||
|
and Sebastiano Vigna. It is a further development of the Xorshift algorithm
|
||||||
|
invented by George Marsaglia
|
||||||
|
|
||||||
|
See also http://xoroshiro.di.unimi.it/
|
||||||
|
|
||||||
|
This RNG passes many statistical tests. Its period, 2**128 - 1, is long
|
||||||
|
compared to a typical LFSR, but much shorter than the Mersenne Twister.
|
||||||
|
The output is 1-dimensionally equidistributed.
|
||||||
|
|
||||||
|
The VHDL implementation produces 64 new random bits on every (enabled)
|
||||||
|
clock cycle. It is quite efficient in terms of FPGA resources, but it
|
||||||
|
does require a 64-bit adder.
|
||||||
|
|
||||||
|
Output word length: 64 bits
|
||||||
|
Seed length: 128 bits
|
||||||
|
Period: 2**128 - 1
|
||||||
|
|
||||||
|
FPGA resources: general logic and 64-bit adder
|
||||||
|
Sythesis results: 194 LUTs, 192 registers on Spartan-6
|
||||||
|
Timing results: 333 MHz on Spartan-6 LX45-3
|
||||||
|
|
||||||
|
|
||||||
|
Mersenne Twister RNG
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
The Mersenne Twister is an RNG algorithm developed in 1997 by
|
||||||
|
Makoto Matsumoto and Takuji Nishimura. This library implements
|
||||||
|
the most common variant of the algorithm, MT19937.
|
||||||
|
|
||||||
|
See also M. Matsumoto, T. Nishimura, "Mersenne Twister: a 623-dimensionally
|
||||||
|
equidistributed uniform pseudorandom number generator", ACM TOMACS, vol. 8,
|
||||||
|
no. 1, 1998.
|
||||||
|
|
||||||
|
This RNG is very popular in software applications because it is relatively
|
||||||
|
fast while the output passes many statistical tests.
|
||||||
|
|
||||||
|
The VHDL implementation produces 32 new random bits on every (enabled)
|
||||||
|
clock cycle. It uses a RAM block, 32 bits wide, 1024 elements deep,
|
||||||
|
to store the RNG state.
|
||||||
|
|
||||||
|
The most demanding part of the implementation is the seeding procedure.
|
||||||
|
Seeding involves repeated multiplication by a 32-bit constant. This
|
||||||
|
multiplication is implemented as a hand-coded series of shifts and adds
|
||||||
|
when force_const_mul = true; the multiplication is left to the synthesizer
|
||||||
|
when force_const_mul = false. The hand-coded variant is much more efficient
|
||||||
|
on Xilinx Spartan-6, so the recommended setting is force_const_mul = true.
|
||||||
|
|
||||||
|
After reset and after each reseeding, the RNG needs 2496 clock cycles
|
||||||
|
to initialize its state. The RNG can not provide random data during this time.
|
||||||
|
|
||||||
|
Output word length: 32 bits
|
||||||
|
Seed length: 32 bits
|
||||||
|
Period: 2**19937 - 1
|
||||||
|
|
||||||
|
FPGA resources: RAM block, 32 bits x 1024 elements
|
||||||
|
Sythesis results: 279 LUTs, 297 registers, 2x RAMB16 on Spartan-6
|
||||||
|
Timing results: 300 MHz on Spartan-6 LX45-3
|
||||||
|
|
||||||
|
|
||||||
|
Code organization
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
rtl/ Synthesizable VHDL code
|
||||||
|
rtl/rng_xoroshiro128plus.vhdl Implementation of Xoroshiro128+ RNG
|
||||||
|
rtl/rng_mt19937.vhdl Implementation of Mersenne Twister RNG
|
||||||
|
|
||||||
|
sim/ Test benches
|
||||||
|
sim/Makefile Makefile for building test benches with GHDL
|
||||||
|
sim/tb_xoroshiro128plus.vhdl Test bench for Xoroshiro128+ RNG
|
||||||
|
sim/tb_mt19937.vhdl Test bench for Mersenne Twister RNG
|
||||||
|
|
||||||
|
refimpl/ Reference software implementations of RNGs
|
||||||
|
|
||||||
|
synth/ Top-level wrappers for synthesis testruns
|
||||||
|
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
Copyright (C) 2016 Joris van Rantwijk
|
||||||
|
|
||||||
|
This VHDL library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License
|
||||||
|
s published by the Free Software Foundation; either version 2.1
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, see
|
||||||
|
<https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html>
|
||||||
|
|
||||||
|
This package contains a few support files which are distributed
|
||||||
|
under Creative Commons CC0. This is explicitly and clearly marked
|
||||||
|
in the files to which it applies.
|
||||||
|
|
||||||
|
--
|
Loading…
Reference in New Issue