Создаём RS триггер кодом в VHDL. Первые шаги на ПЛИС

Как и обещал теперь только код.

Синтаксис языка VHDL сильно похож на паскаль, как бы сильно я на него не плевался (как заядлый сишник), язык потрясающий. Уже через пару часов начинаешь помнить об end в конце каждой секции кода…

Итак. Создайте файл *.vhd в вашей среде разработки (думаю вы используете Quartus, а я буду Active HDL).

При создании любого проекта на VHDL вы скорее всего будете использовать библиотеки. Нельзя сказать, что язык беден конструкциями, но некоторые типы намного удобнее встроенных.

Импорт библиотек происходит при помощи ключевых слов library и use. Делается это вот так:

library IEEE;
use IEEE.STD_LOGIC_1164.all;

Эту библиотеку мы подключили, чтобы использовать тип std_logic.

Теперь немного сведений для раздумья. VHDL — язык проектирования цифровой аппаратуры, а не обычный язык программирования. Как следствие из этого следует помнить, что каждый элемент имеет описание и архитектуру. Описание формируется при помощи секции entity, архитектура — architecture.

В описательной части описываем входы и выходы «микросхемы» (не той которую будем прошивать, а нашей, той которую мы описываем. Названия сугубо ваше творчество).

Итак описание нашего триггера:

entity my_ff_code is
     port(
         R : in STD_LOGIC;
         S : in STD_LOGIC;
         Q : out STD_LOGIC
         );
end my_ff_code;

my_ff_code это название секции entity. Для этого описания, теперь можно создать несколько архитектурных реализаций. Внутри entity используем port, он позволяет указать входы\выходы.

Теперь реализация триггера.

Тут ещё один момент который следует запомнить про VHDL. Есть параллельные операторы и последовательные. Причём внутри архитектуры должны быть только параллельные, если вы хотите использовать последовательные их нужно засунуть внутрь процесса (process).

И ещё. В VHDL есть не только переменные, а и сигналы. И должен отметить, что сигналы встречаются чаще.

Так вот, оператор присваивания для сигналов принимает вид <= тогда как для переменных :=

Архитектура нашего триггера:

architecture my_ff_code_arch of my_ff_code is
begin
    Q <= '1' when S='1' else
         '0' when R='1' and S='0';
end my_ff_code_arch;

Тут думаю всё понятно. Если на входе S (set) триггера единица, то на выход Q посылаем (присваиваем) 1. Если же вход R установлен в 1, то на выход выводим 0.

После ключевого слова architecture идёт её название my_ff_code_arch, а затем после слова of указывается название entitymy_ff_code.

После компиляции проверим смоделировав работу.

Создаём RS триггер кодом в VHDL. Первые шаги на ПЛИС

Предыдущая статья: Первый проект в VHDL (Active HDL). Моделируем логическую схему

ps как видите у нашего триггера нет начального состояния, это легко исправить, но я оставлю это на вашу совесть.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий

  1. Rising_edge

    Подскажите, как добавить начальное состояние к триггеру в статье?

    Ответить
    1. lamazavr

      можно добавить else ‘0’ например.

      Ответить