воскресенье, 7 февраля 2010 г.

Descrambler, scrambler, скремблер, дешифратор

Понадобилось мне тут создать descrambler на VHDL. Поиск в интернете дал первую ссылку на Википедию.
Scrambler, скремблер(англ.- шифратор) - из Википедии: "это программная или аппаратная реализация алгоритма, позволяющего шифровать побитно непрерывные потоки информации.
Сам скремблер представляет из себя набор бит, изменяющихся на каждом шаге по определенному алгоритму. После выполнения каждого очередного шага на его выходе появляется шифрующий бит — либо 0, либо 1, который накладывается на текущий бит информационного потока операцией XOR.

Суть скремблирования заключается в побитном изменении проходящего через систему потока данных. Практически единственной операцией, используемой в скремблерах является XOR — «побитное исключающее ИЛИ». Параллельно прохождению информационного потока в скремблере по определенному правилу генерируется поток бит — кодирующий поток. Как прямое, так и обратное шифрование осуществляется наложением по XOR кодирующей последовательности на исходную. Генерация кодирующей последовательности бит производится циклически из небольшого начального объема информации — ключа по следующему алгоритму. Из текущего набора бит выбираются значения определенных разрядов и складываются по XOR между собой. Все разряды сдвигаются на 1 бит, а только что полученное значение («0» или «1») помещается в освободившийся самый младший разряд (то есть используется так называемый регистр сдвига с линейной обратной связью)."

Мне необходимо реализовать дешифратор и для этого провести преобразование NRZI-to-NRZ по полиному G1(X)=X+1 и затем по полиному G2(X)=X^9+X^4+1. Это шифрование используется в стандарте передачи цифрового видео через последовательную связь "SMPTE 259M-1997 serial digital interface (SDI)".
Существуют два способа дешифрации преобразующие из последовательного и параллельного потока данных соответственно. В первом случае дешифратор работает на частоте входного потока и занимает меньше ресурсов и имеет ограничение в скорости потока. Во втором случае дешифратор работает на частоте данных после преобразования последовательного потока в параллельный, поэтоту может работать на больших входных скоростях, но занимает больше ресурсов FPGA.

Фрагмент VHDL кода для последовательного дешифратора:

clk: in std_ulogic; -- входная частота
rst: in std_ulogic; -- асинхронный сброс
data_in: in std_ulogic; -- входной последовательный битовый поток данных
data_out: out std_ulogic -- выходной последовательный битовый поток данных

-- Внутренние сигналы:
signal shift_reg: std_ulogic_vector(9 downto 0); -- регистр сдвига с линейной обратной
--связью
LFSR
signal des_out: std_ulogic; -- выход с дешифратора
signal nrz_out: std_ulogic; -- выход nrzi-to-nrz

begin
process(clk, rst)
begin
if (rst = '1') then shift_reg <= (others => '0');
elsif (clk'event and clk = '1')
then shift_reg <= data_in & nrz_out & shift_reg(8 downto 1);

end if;
end process;
--
-- Следующая логика производит сигналы nrz_out и des_out - сигналы обратной связи
-- для регистра сдвига.
--
des_out <= nrz_out xor shift_reg(4) xor shift_reg(0);
nrz_out <= data_in xor shift_reg(9);
--
-- data_out: выходной регистр
--
process(clk, rst)
begin
if (rst = '1') then data_out <= '0';
elsif (clk'event and clk = '1')
then data_out <= des_out;
end if;
end process;
end synth;

Фрагмент VHDL кода для параллельного дешифратора:

clk: in std_ulogic; -- входная частота
rst: in std_ulogic; -- сигнал сброса
load_en: in std_ulogic; -- разрешение загрузки
data_in: in std_ulogic_vector(9 downto 0); -- входная шина данных
data_out: out std_ulogic_vector(9 downto 0) -- выходная шина данных );

-- Внутренние сигналы
signal prev_data9: std_ulogic; -- предыдущий бит входных данных
data_in[9]signal desc_in_reg: std_ulogic_vector(8 downto 0); -- входной регистр для дешифратора
signal desc_wide: std_ulogic_vector(18 downto 0); -- объединение двух входных слов
signal nrz: std_ulogic_vector(9 downto 0); -- выход для NRZ-to-NRZI

begin
--
-- prev_data9
--
-- Этот регистр удерживает MSB входа data_in предыдущего периода так что
-- одиннадцатый бит входного вектора доступен для преобразования NRZI-to-NRZ.
--
process(clk, rst, load_en)
begin
if (rst = '1') then prev_data9 <= '0';
elsif (clk'event and clk = '1')
then if (load_en = '1') then prev_data9 <= data_in(9);
end if;
end if;
end process;
--
-- преобразователь NRZI-to-NRZ
--
nrz <= data_in xor (data_in(8 downto 0) & prev_data9);
--
--
desc_in_reg: входной регитр для SDI дешифратора
--
process(clk, rst, load_en)
begin
if (rst = '1') then desc_in_reg <= (others => '0');
elsif (clk'event and clk = '1') then
if (load_en = '1') then desc_in_reg <= nrz(9 downto 1);

end if;
end if;
end process;
desc_wide <= nrz & desc_in_reg;
--
-- Descrambler
--
process(clk, rst, load_en)
begin
if (rst = '1') then data_out <= (others => '0');
elsif (clk'event and clk = '1') then
if (load_en = '1')
then
for i in 0 to 9 loop
data_out(i) <= desc_wide(i) xor desc_wide(i + 4) xor desc_wide(i + 9);

end loop;
end if;
end if;
end process;

end synth;

Комментариев нет:

Отправить комментарий