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

Проект 40. Генератор и проверка чётности

Простейший способ обнаружить одиночную ошибку передачи: посчитать чётность бит и сравнить её на приёме. Модуль и формирует бит для отправки, и проверяет принятый.

Задача

Сформировать бит чётности для передачи и проверить его на приёме.

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

Алгоритм

  1. Описать функцию, сворачивающую вектор операцией XOR в цикле.
  2. Применить её к передаваемому байту — результат и есть бит чётности.
  3. Применить ту же функцию к принятому байту.
  4. Сравнить результат с принятым битом чётности и сообщить о расхождении.

Код на VHDL

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

--=====================================================
-- Проект 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;

Пояснения

  • Функция в VHDL — обычный синтезируемый блок: цикл for по разрядам вектора разворачивается синтезатором в дерево из вентилей XOR.
  • Контроль чётности ловит только нечётное число ошибочных бит; две одновременные ошибки останутся незамеченными.
  • Одна и та же функция используется дважды — для формирования и для проверки, что исключает рассинхронизацию логики между этими двумя местами.

Что дальше

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