mirror of
https://github.com/antonblanchard/microwatt.git
synced 2026-05-01 06:09:15 +00:00
Merge pull request #235 from paulusmack/master
More instructions and a random number generator
This commit is contained in:
53
fpga/fpga-random.vhdl
Normal file
53
fpga/fpga-random.vhdl
Normal file
@@ -0,0 +1,53 @@
|
||||
-- Random number generator for Microwatt
|
||||
-- Based on https://pdfs.semanticscholar.org/83ac/9e9c1bb3dad5180654984604c8d5d8137412.pdf
|
||||
-- "High Speed True Random Number Generators in Xilinx FPGAs"
|
||||
-- by Catalin Baetoniu, Xilinx Inc.
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.numeric_std.all;
|
||||
|
||||
library work;
|
||||
|
||||
entity random is
|
||||
port (
|
||||
clk : in std_ulogic;
|
||||
data : out std_ulogic_vector(63 downto 0);
|
||||
raw : out std_ulogic_vector(63 downto 0);
|
||||
err : out std_ulogic
|
||||
);
|
||||
end entity random;
|
||||
|
||||
architecture behaviour of random is
|
||||
signal ringosc : std_ulogic_vector(63 downto 0);
|
||||
signal ro_reg : std_ulogic_vector(63 downto 0);
|
||||
signal lhca : std_ulogic_vector(63 downto 0);
|
||||
|
||||
constant lhca_diag : std_ulogic_vector(63 downto 0) := x"fffffffffffffffb";
|
||||
|
||||
begin
|
||||
random_osc : process(all)
|
||||
begin
|
||||
-- chaotic set of ring oscillators
|
||||
ringosc(0) <= ringosc(63) xor ringosc(0) xor ringosc(1);
|
||||
for i in 1 to 62 loop
|
||||
ringosc(i) <= ringosc(i-1) xor ringosc(i) xor ringosc(i+1);
|
||||
end loop;
|
||||
ringosc(63) <= not (ringosc(62) xor ringosc(63) xor ringosc(0));
|
||||
end process;
|
||||
|
||||
lhca_update : process(clk)
|
||||
begin
|
||||
if rising_edge(clk) then
|
||||
ro_reg <= ringosc;
|
||||
raw <= ro_reg;
|
||||
-- linear hybrid cellular automaton
|
||||
-- used to even out the statistics of the ring oscillators
|
||||
lhca <= ('0' & lhca(63 downto 1)) xor (lhca and lhca_diag) xor
|
||||
(lhca(62 downto 0) & '0') xor ro_reg;
|
||||
end if;
|
||||
end process;
|
||||
|
||||
data <= lhca;
|
||||
err <= '0';
|
||||
end behaviour;
|
||||
3
fpga/fpga-random.xdc
Normal file
3
fpga/fpga-random.xdc
Normal file
@@ -0,0 +1,3 @@
|
||||
set_property ALLOW_COMBINATORIAL_LOOPS TRUE [get_nets soc0/processor/execute1_0/random_0/ro_reg*]
|
||||
set_property ALLOW_COMBINATORIAL_LOOPS TRUE [get_nets soc0/processor/execute1_0/random_0/p_*]
|
||||
set_property ALLOW_COMBINATORIAL_LOOPS TRUE [get_nets soc0/processor/execute1_0/random_0/D*]
|
||||
Reference in New Issue
Block a user