AFON // радиотехник affonya@mail.ru
← Проекты на VHDL

Проект 27. Генератор псевдослучайной последовательности

Регистр сдвига с несколькими отводами через сумматор по модулю два выдаёт последовательность, неотличимую от случайной. Применяется в тестах, шифровании и расширении спектра.

Задача

Сформировать псевдослучайную последовательность максимального периода.

Тип схемы: Синхронная схема: сдвиговый регистр и логика обратной связи.
Модуль: lfsr. Среда: Quartus, Vivado, ISE или свободный GHDL для моделирования. Теорию по языку смотрите в статье VHDL — язык описания аппаратуры, по самим микросхемам — на странице ПЛИС.

Алгоритм

  1. Объявить регистр с ненулевым начальным состоянием.
  2. Сложить по модулю два несколько разрядов — это сигнал обратной связи.
  3. Сдвигать регистр, вдвигая результат обратной связи.
  4. Снимать выход последовательно или всем словом сразу.

Код на VHDL

Код проверен компилятором GHDL: проходит анализ и элаборацию без ошибок и предупреждений. Скачать: v27.vhd

--=====================================================
-- Проект 27. Генератор псевдослучайной последовательности
-- Регистр сдвига с линейной обратной связью (LFSR):
-- максимальная длина периода при верных отводах.
--=====================================================
library ieee;
use ieee.std_logic_1164.all;

entity lfsr is
    port (
        clk     : in  std_logic;
        rst     : in  std_logic;
        en      : in  std_logic;
        rnd     : out std_logic_vector(15 downto 0);
        bit_out : out std_logic                         -- последовательный выход
    );
end entity lfsr;

architecture rtl of lfsr is
    -- начальное состояние не может быть нулевым, иначе регистр «залипнет»
    signal reg : std_logic_vector(15 downto 0) := x"ACE1";
    signal fb  : std_logic;
begin
    -- отводы 16, 14, 13, 11 дают период 65535
    fb <= reg(15) xor reg(13) xor reg(12) xor reg(10);

    process (clk, rst)
    begin
        if rst = '1' then
            reg <= x"ACE1";
        elsif rising_edge(clk) then
            if en = '1' then
                reg <= reg(14 downto 0) & fb;
            end if;
        end if;
    end process;

    rnd     <= reg;
    bit_out <= reg(15);
end architecture rtl;

Пояснения

  • Нулевое состояние для LFSR запрещено: обратная связь даст ноль, и регистр останется в нём навсегда.
  • Правильный выбор отводов даёт максимальный период: для шестнадцати разрядов это 65535 состояний.
  • Последовательность полностью детерминирована и повторяема при том же начальном значении — это удобно для тестов, но непригодно для криптографии без доработок.

Что дальше

Следующие проекты — в разделе проекты на VHDL. Сравнить подход с языком Verilog можно в статье Verilog, а разобраться в устройстве самих кристаллов — в статье ПЛИС: FPGA и CPLD.