Если вам нужно не для хитрых вычислений, а для целей вроде снижения электромагнитных помех, то может быть подойдет следующее решение:
В infiniband и, наверное, в PCI-e для генерации псевдослучайной последовательности используется так называемый LFSR, а именно, LFSR 11. Это зацикленный сдвиговый регистр, который за кажый такт сдвигается на 1 бит и еще некоторые биты при этом инвертируются. Как подсчет CRC. Регистр имеет длину большую, чем требуется случайное число. В качестве случайного числа подойдут младшие разряды. Хотя, я думаю, что можно брать любые разряды и в любом порядке.
Имеет смысл погуглить про LFSR, чтобы определиться с цикличностью и
В одном из файлов у меня была определена функция для вычисления LFSR
library ieee;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
library lddl;
use lddl.crc.all;
use lddl.lddl_types.all;
use lddl.util.all;
package ib_types is
-- Idle data
subtype lfsr_t is std_logic_vector(10 downto 0);
type lfsr_vector is array (natural range <>) of lfsr_t;
function lfsr_11(i : lfsr_t) return lfsr_t;
function lfsr_11(seed : natural) return lfsr_t;
function conv_idle_data(lfsr : lfsr_t) return symbol_t;
end ib_types;
package body ib_types is
function lfsr_11(i : lfsr_t) return lfsr_t is
variable o : lfsr_t;
begin
o := i(9 downto 2) & (i(1) xor i(10)) & i(0) & i(10);
return o;
end;
function lfsr_11(seed : natural) return lfsr_t is
begin
return conv_std_logic_vector(seed, 11);
end;
function conv_idle_data(lfsr : lfsr_t) return symbol_t is
begin
return D(lfsr(10 downto 3));
end;
end ib_types;
А в другом это использовалось:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
use IEEE.std_logic_arith.all;
library ib;
use ib.ib_types.all;
use ib.components.all;
use ib.ordered_sets.all;
use ib.symbols.all;
entity tx_gen is
generic (
LANE : natural := 0; -- 0..11 index of lane
SEED : natural -- 0..2047 idle data pseudo random generator seed
-- mellanox seeds : 392, 1629, 1463, 1090
);
port (
clk : in std_logic;
reset : in std_logic;
ctrl : in tx_gen_ctrl_t;
data_1x : in symbol_t;
lp : in symbol_t;
cfg : in phy_cfg_t;
O : out symbol_tx_t
);
end tx_gen;
architecture model of tx_gen is
signal idle_data : lfsr_t;
begin
process(clk)
begin
if rising_edge(clk) then
if reset='1' then
idle_data <= lfsr_11(SEED);
O.data <= ib.symbols.COM;
else
idle_data <= lfsr_11(idle_data);
O.data <= conv_idle_data(idle_data);
end if;
end if;
end process;
Ну, можно и короче все записать, без всяких функций :)