LogNotes

2025-08-11 15:48:24
FPGA VHDL MIMO

Назначение: Этот код реализует процессор MIMO для системы 2x2 (два входа, два выхода). Он принимает два входных сигнала (in_signal1, in_signal2) и матрицу канала (h11, h12, h21, h22), выполняет матричное умножение для разделения сигналов и выдает два выходных сигнала (out_signal1, out_signal2).
Входы и выходы:

clk: Тактовый сигнал для синхронизации.
rst: Сигнал сброса.
in_signal1, in_signal2: 16-битные входные сигналы (например, оцифрованные данные с оптоволокна).
h11, h12, h21, h22: 16-битные коэффициенты канала, представляющие матрицу передачи H.
out_signal1, out_signal2: Обработанные 16-битные выходные сигналы.


Логика работы:

Входные сигналы и коэффициенты преобразуются в формат SIGNED для арифметических операций.
На каждом такте выполняется матричное умножение: y1 = s1*h11 + s2*h12, y2 = s1*h21 + s2*h22.
Результаты обрезаются до 16 бит с защитой от переполнения.
--------------------------------


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity mimo_processor is
    Port (
        clk : in STD_LOGIC;                     -- Входной тактовый сигнал
        rst : in STD_LOGIC;                     -- Сброс
        in_signal1 : in STD_LOGIC_VECTOR(15 downto 0); -- Входной сигнал 1 (16 бит)
        in_signal2 : in STD_LOGIC_VECTOR(15 downto 0); -- Входной сигнал 2 (16 бит)
        h11, h12, h21, h22 : in STD_LOGIC_VECTOR(15 downto 0); -- Коэффициенты канала (матрица H)
        out_signal1 : out STD_LOGIC_VECTOR(15 downto 0); -- Выходной сигнал 1
        out_signal2 : out STD_LOGIC_VECTOR(15 downto 0)  -- Выходной сигнал 2
    );
end mimo_processor;

architecture Behavioral of mimo_processor is
    signal s1, s2 : SIGNED(15 downto 0); -- Временные сигналы для вычислений
    signal h11_s, h12_s, h21_s, h22_s : SIGNED(15 downto 0); -- Коэффициенты в формате SIGNED
    signal prod1, prod2, prod3, prod4 : SIGNED(31 downto 0); -- Промежуточные произведения
    signal sum1, sum2 : SIGNED(31 downto 0); -- Суммы для выходных сигналов
begin
    -- Преобразование входных сигналов и коэффициентов в SIGNED
    s1 <= SIGNED(in_signal1);
    s2 <= SIGNED(in_signal2);
    h11_s <= SIGNED(h11);
    h12_s <= SIGNED(h12);
    h21_s <= SIGNED(h21);
    h22_s <= SIGNED(h22);

    -- Процесс обработки сигналов
    process(clk, rst)
    begin
        if rst = '1' then
            out_signal1 <= (others => '0');
            out_signal2 <= (others => '0');
        elsif rising_edge(clk) then
            -- Вычисление произведений для матричного умножения
            prod1 <= s1 * h11_s; -- s1 * h11
            prod2 <= s2 * h12_s; -- s2 * h12
            prod3 <= s1 * h21_s; -- s1 * h21
            prod4 <= s2 * h22_s; -- s2 * h22

            -- Суммирование для получения выходных сигналов
            sum1 <= prod1 + prod2; -- y1 = s1*h11 + s2*h12
            sum2 <= prod3 + prod4; -- y2 = s1*h21 + s2*h22

            -- Ограничение результата до 16 бит с учетом переполнения
            if sum1 > 32767 then
                out_signal1 <= STD_LOGIC_VECTOR(to_signed(32767, 16));
            elsif sum1 < -32768 then
                out_signal1 <= STD_LOGIC_VECTOR(to_signed(-32768, 16));
            else
                out_signal1 <= STD_LOGIC_VECTOR(sum1(15 downto 0));
            end if;

            if sum2 > 32767 then
                out_signal2 <= STD_LOGIC_VECTOR(to_signed(32767, 16));
            elsif sum2 < -32768 then
                out_signal2 <= STD_LOGIC_VECTOR(to_signed(-32768, 16));
            else
                out_signal2 <= STD_LOGIC_VECTOR(sum2(15 downto 0));
            end if;
        end if;
    end process;

end Behavioral;
← Previous Next →
Back to list