--=====================================================
-- Проект 40. Генератор и проверка чётности
-- Формирует бит паритета для передачи и проверяет
-- целостность принятого байта с этим битом.
--=====================================================
library ieee;
use ieee.std_logic_1164.all;

entity parity_check is
    port (
        data_tx   : in  std_logic_vector(7 downto 0);    -- байт на передачу
        parity_tx : out std_logic;                        -- бит чётности для него

        data_rx   : in  std_logic_vector(7 downto 0);     -- принятый байт
        parity_rx : in  std_logic;                         -- принятый бит чётности
        error     : out std_logic                          -- обнаружено расхождение
    );
end entity parity_check;

architecture rtl of parity_check is
    function calc_parity(v : std_logic_vector) return std_logic is
        variable p : std_logic := '0';
    begin
        for i in v'range loop
            p := p xor v(i);                              -- чётность через XOR всех бит
        end loop;
        return p;
    end function;
begin
    parity_tx <= calc_parity(data_tx);
    error     <= '1' when calc_parity(data_rx) /= parity_rx else '0';
end architecture rtl;
