Подключение USB мыши к DE2-115: делаем счётчик кликов

    Реализация счётчика нажатий левой и правой кнопок мыши на плате DE2-115 - классическая лабораторная задача, которая помогает разобраться с работой USB HID-устройств и взаимодействием с ПЛИС. В этой статье мы разберём, как подключить USB мышь к отладочной плате Altera DE2-115 и написать модуль на Verilog или VHDL, который будет увеличивать или уменьшать значение счётчика при каждом клике.

    Подготовка оборудования и инструментов

    Для работы потребуется:

    • Плата DE2-115 с разъёмом USB Host (обычно используется чип ISP1362).
    • Стандартная USB мышь (поддерживающая HID Boot Protocol).
    • Среда Quartus II (или Quartus Prime) для синтеза проекта.
    • Готовый IP-ядро или RTL-модуль для работы с USB Host (например, от Terasic или написанный самостоятельно).

    Принцип работы USB HID мыши

    Мышь в режиме Boot Protocol отправляет четырёхбайтовый пакет: байт состояния кнопок (бит 0 - ЛКМ, бит 1 - ПКМ, бит 2 - СКМ), затем относительные перемещения по X, Y и колёсико. Нам достаточно анализировать только первый байт. При нажатии ЛКМ (0x01) увеличиваем счётчик, при нажатии ПКМ (0x02) - уменьшаем. Важно обрабатывать только фронт нажатия, чтобы одно нажатие не вызывало множественных изменений.

    Структура проекта на ПЛИС

    Основные блоки:

    • USB Host Controller - инициализация шины, обнаружение устройства, получение дескрипторов и запуск передачи данных.
    • Декодер HID-пакета - выделение байта состояния кнопок из входящего потока.
    • Детектор фронта - определяет момент нажатия (переход из 0 в 1 для каждого бита).
    • Счётчик - 8- или 16-битный реверсивный счётчик, значение которого выводится на семисегментные индикаторы или светодиоды.

    Реализация счётчика на VHDL

    Пример фрагмента кода для обработки кнопок:

    process(clk, reset)
    begin
      if reset = '1' then
        counter <= (others => '0');
        prev_buttons <= (others => '0');
      elsif rising_edge(clk) then
        prev_buttons <= buttons;
        -- ЛКМ: фронт 0->1 по биту 0
        if buttons(0) = '1' and prev_buttons(0) = '0' then
          counter <= counter + 1;
        end if;
        -- ПКМ: фронт 0->1 по биту 1
        if buttons(1) = '1' and prev_buttons(1) = '0' then
          counter <= counter - 1;
        end if;
      end if;
    end process;

    Сигнал buttons получается из декодированного HID-пакета. Значение счётчика можно вывести на семисегментные индикаторы через мультиплексор и BCD-преобразователь.

    Отладка и возможные проблемы

    Наиболее частые трудности:

    • Мышь не определяется - проверьте, поддерживает ли она Boot Protocol (большинство современных мышей работают в режиме Report, а не Boot). В этом случае потребуется более сложный парсер.
    • Дребезг контактов - хотя USB-пакеты приходят уже стабильными, иногда могут дублироваться; используйте детектор фронта с гистерезисом или временной фильтр.
    • Сброс счётчика - добавьте кнопку сброса на плате для обнуления значения.

    Заключение

    Подключение USB мыши к DE2-115 - вполне решаемая задача, если разбить её на этапы: инициализация USB Host, приём HID-пакетов, декодирование кнопок и управление счётчиком. Предложенный подход позволяет реализовать счётчик с приращением и уменьшением по кликам ЛКМ и ПКМ, а также выводить результат на индикаторы платы.

    Часто задаваемые вопросы