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

Проект 03. Дешифратор 3 в 8

Трёхразрядный код превращается в единицу на одном из восьми выходов. Проект вводит процесс — блок с последовательным описанием внутри параллельной архитектуры.

Задача

Активировать один из восьми выходов по трёхразрядному адресу.

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

Алгоритм

  1. Объявить трёхразрядный адрес, вход разрешения и восьмиразрядный выход.
  2. Описать процесс, перечислив в списке чувствительности адрес и разрешение.
  3. Внутри процесса оператором case задать выход для каждого кода.
  4. При запрещающем уровне обнулить все выходы агрегатом (others => '0').

Код на VHDL

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

--=====================================================
-- Проект 03. Дешифратор 3 в 8
-- Процесс с оператором case: последовательное описание
-- внутри параллельного блока.
--=====================================================
library ieee;
use ieee.std_logic_1164.all;

entity decoder38 is
    port (
        addr    : in  std_logic_vector(2 downto 0);     -- адрес
        en      : in  std_logic;                        -- разрешение
        y       : out std_logic_vector(7 downto 0)      -- выходы
    );
end entity decoder38;

architecture rtl of decoder38 is
begin
    -- список чувствительности: процесс запускается при
    -- изменении любого перечисленного сигнала
    process (addr, en)
    begin
        if en = '0' then
            y <= (others => '0');                       -- все выходы погашены
        else
            case addr is
                when "000"  => y <= "00000001";
                when "001"  => y <= "00000010";
                when "010"  => y <= "00000100";
                when "011"  => y <= "00001000";
                when "100"  => y <= "00010000";
                when "101"  => y <= "00100000";
                when "110"  => y <= "01000000";
                when "111"  => y <= "10000000";
                when others => y <= (others => '0');
            end case;
        end if;
    end process;
end architecture rtl;

Пояснения

  • Список чувствительности определяет, когда процесс пересчитывается. Для комбинационной логики в нём должны быть все читаемые сигналы, иначе синтезатор построит незапланированную защёлку.
  • Агрегат (others => '0') присваивает нули всему вектору независимо от его разрядности — удобно при параметризации.
  • Процесс выглядит как последовательная программа, но исполняется он мгновенно, а результат — обычная комбинационная схема.

Что дальше

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