neanton28
Junior Member level 1
Greetings! I am trying to find best way for random generator in specific range and was wondering what are the best practices for now.
I have array of 360 numbers each of one is +4 of previous:
And I'd like to have some function that accepts seed/code and output numbers from this array in random way. Numbers may also be not initially stored in array, but also generated in some function during execution. This will save some on-chip RAM.
For now I am still looking for proper way of such limitation pure LFSR, since it will just generate me random numbers, and not what I need. Maybe there is some graceful way to do it, to not add conditions like (if result > 1436 then generate again)
That's some example vhdl block I created for demonstration:
I have array of 360 numbers each of one is +4 of previous:
Code:
constant possible_values : t_int_array :=(4,8,12, n+4...1432,1436);
And I'd like to have some function that accepts seed/code and output numbers from this array in random way. Numbers may also be not initially stored in array, but also generated in some function during execution. This will save some on-chip RAM.
For now I am still looking for proper way of such limitation pure LFSR, since it will just generate me random numbers, and not what I need. Maybe there is some graceful way to do it, to not add conditions like (if result > 1436 then generate again)
That's some example vhdl block I created for demonstration:
Code:
library IEEE;
use IEEE.std_logic_1164.all;
entity offset_generator is
port(
clk : in STD_LOGIC;
reset : in STD_LOGIC;
seed : in STD_LOGIC_VECTOR(32 downto 0);
result : out STD_LOGIC_VECTOR(10 downto 0)
);
end offset_generator;
architecture offset_generator of offset_generator is
signal s_result : STD_LOGIC_VECTOR(10 downto 0) := (others => '0');
type t_int_array is array(natural range 0 to 360) of natural range 0 to 1436;
constant possible_values : t_int_array :=(4,8,12,16,....,1432,1436);
signal s_seed : STD_LOGIC_VECTOR(32 downto 0) := (others => '0');
function GET_RANDOM (seed : in STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
begin
return INSERT_IMPLEMENTATION_HERE;
end;
begin
result <= s_result;
process( clk )
begin
if (rising_edge(clk)) then
if (reset = '1') then
s_seed <= seed;
else
s_result <= GET_RANDOM(s_seed);
end if;
end if;
end process;
end offset_generator;