Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Программируемые логические схемы и их применение»

генерация случайных чисел слишком важна, чтобы оставлять её на волю случая (с) Кавью

Отправлено shtirlits 23 января 2009 г. 02:30
В ответ на: Куда копнуть что-бы Random Number Generator сделать в железе? Почитать как делать или взять готовое? (+) отправлено пользователем Sergei_Ilchenko 22 января 2009 г. 20:25

Если вам нужно не для хитрых вычислений, а для целей вроде снижения электромагнитных помех, то может быть подойдет следующее решение:

В 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;



Ну, можно и короче все записать, без всяких функций :)



Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 12:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru