Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> VHDL

Как создать ШИМ-контроллер на VHDL

Широтно-импульсная модуляция (ШИМ) — это эффективный способ управления аналоговой электроникой с чисто цифровых выводов ПЛИС. Вместо того, чтобы пытаться регулировать аналоговое напряжение, ШИМ быстро включает и выключает ток питания аналогового устройства на полной мощности. Этот метод дает нам точный контроль над скользящим средним значением энергии, подаваемой на потребительское устройство.

Примерами вариантов использования, которые являются хорошими кандидатами для ШИМ, являются модуляция звука (динамики), управление интенсивностью света (лампы или светодиоды) и асинхронные двигатели. К последним относятся серводвигатели, компьютерные вентиляторы, насосы, бесколлекторные двигатели постоянного тока для электромобилей, и этот список можно продолжить.

См. также:
RC сервоконтроллер, использующий ШИМ от контакта ПЛИС

Как работает ШИМ

Включая и выключая подачу питания на устройство с высокой частотой, мы можем точно контролировать средний ток, протекающий через него. На приведенном ниже рисунке показаны основы работы ШИМ. Выход ШИМ управляет двоичным переключателем, который может установить мощность на 100% или 0%. При быстром переключении между двумя крайними значениями среднее значение скользящего окна будет зависеть от времени, проведенного в каждом из состояний.

Рабочий цикл

Рабочий цикл является ключом к управлению мощностью, подаваемой на аналоговое устройство в ШИМ. Термин рабочий цикл означает, сколько времени выход ШИМ находится во включенном состоянии. Обычно рабочий цикл описывается в процентах, как показано на рисунке ниже. Однако в моем примере VHDL я буду использовать двоичное число без знака позже в этой статье. Для нас имеет больше смысла использовать двоичное число, которое может представлять полное разрешение рабочего цикла в нашей реализации VHDL.

При рабочем цикле 0 выход ШИМ будет постоянно оставаться в положении ВЫКЛ, а при 100% он будет постоянно находиться в положении ВКЛ. Степень точности, которую ШИМ-контроллер может оказывать на эффект полезной нагрузки, напрямую связана с длиной счетчика ШИМ. Мы увидим, как это работает в коде VHDL, когда будем реализовывать ШИМ-контроллер позже в этой статье.

Формула для преобразования двоичного представления рабочего цикла в проценты показана ниже.

\mathit{duty\_cycle\_percentage} =\frac{\mathit{commanded\_duty\_cycle} * 100}{2^\mathit{pwm\_bits} - 1}

Частота ШИМ

Говоря о частоте переключения ШИМ, мы имеем в виду, как часто выход ШИМ чередуется между состояниями ВКЛ и ВЫКЛ, сколько времени требуется счетчику ШИМ, чтобы свернуть. Как всегда, частота обратно пропорциональна полному периоду ШИМ:

\mathit{ШИМ\_freq} =\frac{1}{\mathit{ШИМ\_период}}

Идеальная частота ШИМ зависит от того, какое устройство вы контролируете. Любое число, превышающее несколько сотен герц, невооруженным глазом будет выглядеть как стабильный источник света, если потребителем является светодиод. Для бесщеточного двигателя постоянного тока оптимальная частота лежит в диапазоне десятков килогерц. Установите слишком низкую частоту, и вы можете испытывать физические вибрации. При слишком быстрых колебаниях вы тратите энергию впустую.

Следует иметь в виду, что аналоговая силовая электроника не так быстра, как цифровой вывод FPGA. Типичная схема ШИМ использует силовые МОП-транзисторы в качестве переключателей для управления током, протекающим через аналоговое устройство.

Рассмотрим схему, показанную на изображении. Это часть схемы драйвера светодиода, используемой в моем продвинутом курсе Dot Matrix VHDL. Вывод FPGA управляет затвором полевого МОП-транзистора, действуя как автоматический выключатель для последовательно включенного светодиода. При более высокой частоте переключения транзистор больше времени не будет ни полностью открытым, ни полностью закрытым. Это приводит к потере мощности и избыточному выделению тепла в MOSFET.

Модуль генератора ШИМ

Давайте создадим стандартную универсальную реализацию ШИМ-контроллера на VHDL. Что я имею в виду под стандартом заключается в том, что это близко к тому, что создали бы самые опытные разработчики VHDL, если бы вы попросили их написать контроллер PWM на VHDL. Это общее в том смысле, что частота ШИМ настраивается для большинства приложений.

Чтобы протестировать наш ШИМ-генератор на реальной ПЛИС, нам понадобится еще несколько модулей в дополнение к ШИМ-контроллеру. Я представлю их позже при использовании модуля ШИМ для управления подсветкой светодиода на макетной плате Lattice iCEstick FPGA. Но сначала поговорим о модуле генератора ШИМ.

Объект модуля ШИМ

Чтобы сделать модуль настраиваемым, я добавил универсальный порт, который позволяет указать две константы во время создания экземпляра.

Первый с именем pwm_bits , определяет длину внутреннего счетчика ШИМ. Эта константа устанавливает битовую длину, а не максимальное значение счетчика. Вы не сможете указать частоту ШИМ как определенное количество тактовых периодов. Но обычно нам не нужно задавать частоту ШИМ со 100% точностью. Идеальная частота ШИМ — это диапазон, который хорошо работает, а не одно точное число.

Другая общая константа называется clk_cnt_len. . Он определяет длину секундного счетчика, который эффективно снижает частоту ШИМ. Он действует как делитель тактового сигнала, но фактически не создает производный тактовый сигнал. Обратите внимание, что ему присвоено значение по умолчанию 1. Установка этой константы в 1 отключает делитель часов, а также избавляется от дополнительной логики, которая его обрабатывает.

Я объясню это и представлю формулу для расчета точной частоты ШИМ позже в статье.

entity pwm is
  generic (
    pwm_bits : integer;
    clk_cnt_len : positive := 1
  );
  port (
    clk : in std_logic;
    rst : in std_logic;
    duty_cycle : in unsigned(pwm_bits - 1 downto 0);
    pwm_out : out std_logic
  );
end pwm;

Поскольку это полностью синхронный модуль, первые два сигнала — это часы и сигнал сброса.

Третьим входом в списке объявлений порта является рабочий цикл. Как видно из приведенного выше кода VHDL, длина duty_cycle сигнал следует за pwm_bits общая константа. Это означает, что pwm_bits константа определяет, насколько точно вы можете регулировать питание аналогового устройства.

Окончательный сигнал объекта — pwm_out. . Это ШИМ-модулированный управляющий сигнал, который вы направляете на вывод FPGA и подключаете к затвору вашего MOSFET.

Внутренние сигналы модуля ШИМ

Модуль ШИМ содержит только два внутренних сигнала. Первый — это счетчик ШИМ, который идентичен duty_cycle. вход. Как и последний, pwm_bits константа также определяет длину этого сигнала.

signal pwm_cnt : unsigned(pwm_bits - 1 downto 0);
signal clk_cnt : integer range 0 to clk_cnt_len - 1;

Второй внутренний сигнал называется clk_cnt. , и, как следует из названия, для подсчета тактов. Он имеет целочисленный тип, и если вы установите clk_cnt_len равным 1, диапазон подсчета будет оцениваться как (от 0 до 0) — просто цифра 0.

Процесс счетчика тактов PWM

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

CLK_CNT_PROC : process(clk)
begin
  if rising_edge(clk) then
    if rst = '1' then
      clk_cnt <= 0;
      
    else
      if clk_cnt < clk_cnt_len - 1 then
        clk_cnt <= clk_cnt + 1;
      else
        clk_cnt <= 0;
      end if;
      
    end if;
  end if;
end process;

Обратите внимание, что если вы использовали значение по умолчанию 1 для clk_cnt_len общий, этот процесс должен испаряться во время синтеза. Внутренний оператор if всегда будет ложным, потому что 0 < 1 - 1 является ложным. Значение clk_cnt тогда всегда 0. Большинство инструментов синтеза распознают это и оптимизируют весь процесс.

Процесс вывода ШИМ

Процесс, который устанавливает выходной сигнал ШИМ, также управляет счетчиком ШИМ. Он увеличивает счетчик ШИМ, когда счетчик тактов равен 0. Так работает механизм ограничения частоты ШИМ.

Изначально я собирался написать только if clk_cnt = 0 then в строке 9, но я обнаружил, что инструмент синтеза не удалил всю логику, связанную со счетчиком часов, когда я использовал clk_cnt_len по умолчанию значение 1. Однако включая clk_cnt_len в операторе if сделал свое дело. Это не должно отрицательно сказываться на синтезе, потому что clk_cnt_len является константой. Инструмент синтеза может определить его значение во время компиляции, а затем решить, является ли содержимое процесса избыточным или нет.

PWM_PROC : process(clk)
begin
  if rising_edge(clk) then
    if rst = '1' then
      pwm_cnt <= (others => '0');
      pwm_out <= '0';

    else
      if clk_cnt_len = 1 or clk_cnt = 0 then

        pwm_cnt <= pwm_cnt + 1;
        pwm_out <= '0';

        if pwm_cnt = unsigned(to_signed(-2, pwm_cnt'length)) then
          pwm_cnt <= (others => '0');
        end if;

        if pwm_cnt < duty_cycle then
          pwm_out <= '1';
        end if;

      end if;
    end if;
  end if;
end process;

Когда clk_cnt_len больше 1, pwm_cnt сигнал ведет себя как автономный счетчик, увеличиваясь, когда clk_cnt равно 0. Это беззнаковый тип, который автоматически возвращается к 0 при переполнении. Но мы должны убедиться, что оно пропускает самое высокое значение перед обнулением.

В строке 14 приведенного выше кода я проверяю, находится ли счетчик на втором по величине значении. Если это так, мы устанавливаем его на 0 в этот момент. Я использую трюк, который будет работать независимо от того, как долго pwm_cnt сигнал есть. С помощью to_signed функции, я создаю новую константу со знаком той же длины, что и pwm_cnt , но со значением -2.

Число со знаком -2 в VHDL и компьютерах в целом всегда будет последовательностью единиц и 0 в самой правой позиции. Это из-за того, как работает расширение знака. Подробнее об этом читайте в моем предыдущем уроке:

Как использовать подписанные и неподписанные файлы в VHDL

Наконец, приведя знаковый тип к беззнаковому, мы получим второе по величине значение, которое pwm_cnt может держать.

В строке 18 мы проверяем, больше ли значение автономного ШИМ-счетчика, чем значение рабочего цикла. Если это так, мы устанавливаем выход ШИМ на «1», потому что мы находимся в периоде включения рабочего цикла.

Вот почему нам пришлось вернуть счетчик ШИМ обратно в 0 на втором по величине значении. Если бы счетчик ШИМ мог достичь максимально возможного значения, которое может иметь рабочий цикл, было бы невозможно установить рабочий цикл на 100%. pwm_cnt < duty_cycle строка всегда будет ложной, если pwm_cnt было максимальное значение.

Это имеет смысл, потому что мы должны представить полностью выключенное и включенное состояние в дополнение к промежуточным шагам рабочего цикла. Представьте, что pwm_bits установлено на 2, и выполните всю последовательность счета в качестве умственного упражнения, чтобы понять, что я имею в виду!

\mathit{pwm\_hz} =\frac{\mathit{clk\_hz}}{(2^\mathit{pwm\_bits} - 1) * \mathit{clk\_cnt\_len}}

Принимая во внимание эти факты, мы можем вывести приведенную выше формулу для расчета точной частоты ШИМ. Пока clk_hz — частота системных часов FPGA, две другие переменные — общие входные константы.

Верхний модуль

Для тестирования модуля ШИМ на реальном оборудовании я создал реализацию, которая будет регулировать свечение светодиода включения питания на Lattice iCEstick. Я использую эту доступную плату для разработки FPGA как в своем курсе для начинающих VHDL Fast-Track, так и в моем продвинутом курсе Dot Matrix FPGA.

На изображении выше показана передняя панель iCEstick с USB-подключением со светодиодным индикатором включения, обозначенным стрелкой. На iCEstick имеется пять светодиодов, расположенных в виде звезды. Светодиод включения горит зеленым, остальные излучают красный свет. На iCEstick для каждого светодиода есть выделенный вывод FPGA. Обратитесь к руководству пользователя iCEstick, чтобы узнать точные номера контактов для управления ими.

На приведенной ниже диаграмме показано, как соединены подмодули в верхнем модуле. Мы уже говорили о модуле PWM, а модули счетчика и сброса я кратко опишу далее в этой статье.

Сущность верхнего модуля

Вместо жесткого кодирования констант внутри модуля верхнего уровня я объявляю их дженериками в сущности верхнего уровня. Затем я назначаю значения по умолчанию, подходящие для iCEstick. Одним из преимуществ этого подхода является то, что вы можете переопределить эти значения в тестовом стенде, чтобы ускорить моделирование. Я ничего не присваиваю дженерикам, когда синтезирую дизайн. Таким образом, правильные значения по умолчанию окажутся в маршрутизированном проекте.

Мы перейдем к pwm_bits и clk_cnt_len к дженерикам модуля ШИМ с теми же именами. Тактовая частота генератора iCEstick составляет 12 МГц. Используя формулу, представленную ранее, мы можем подставить эти значения для расчета частоты ШИМ:

entity pwm_led is
  generic (
    pwm_bits : integer := 8;
    cnt_bits : integer := 25;
    clk_cnt_len : positive := 47
  );
  port (
    clk : in std_logic;
    rst_n : in std_logic; -- Pullup

    led_1 : out std_logic;
    led_2 : out std_logic;
    led_3 : out std_logic;
    led_4 : out std_logic;
    led_5 : out std_logic
  );
end pwm_led;

Вы могли заметить, что есть третья константа, cnt_bits. , в объявлении дженериков в приведенном выше коде. Он контролирует длину самозаворачивающегося пилообразного счетчика. Мы собираемся использовать этот дополнительный счетчик для создания постепенного освещения светодиода включения питания, чтобы мы могли наблюдать за работой модуля ШИМ в режиме реального времени.

Мы подключим старшие биты этого нового счетчика к входу рабочего цикла модуля ШИМ. Поскольку этот счетчик будет считать тактовые циклы, cnt_bits generic определяет частоту пульсации светодиода при включении питания. Формула, которая является функцией тактовой частоты и длины счетчика, показана ниже.

\ frac {2 ^ {\ mathit {cnt \ _bits}}} {\ mathit {clk \ _hz}} =\ frac {2 ^ {25}} {12e6} \ приблизительно 2,8 \ mathit {Гц}

В объявлении порта я добавил ввод сброса с постфиксом _n. , указывая на то, что внешний сброс имеет отрицательную полярность. Мы настроим Lattice FPGA для использования внутреннего подтягивающего резистора на этом выводе.

Наконец, вы можете видеть, что я перечислил все светодиоды, присутствующие на iCEstick, в объявлении порта. Мы собираемся использовать только светодиод номер 5, но нам нужно активно управлять другими светодиодами. Если их не подключить, они будут светиться слабым красным цветом.

Если вы хотите более подробно ознакомиться с кодом VHDL и файлами ограничений, введите свой адрес электронной почты в форму ниже. Вы получите Zip-файл с полным кодом проектов ModelSim и Lattice iCEcube2.

Внутренние сигналы верхнего модуля

Я предпочитаю, чтобы мои главные модули не содержали логики RTL. Это понятие называется структурный модуль. . По моему опыту, легче поддерживать структурированный проект VHDL, когда вы разделяете логику RTL и межсоединение. В приведенном ниже коде показаны объявления сигналов в верхнем модуле и параллельные назначения сигналов.

architecture str of pwm_led is

  signal rst : std_logic;
  signal cnt : unsigned(cnt_bits - 1 downto 0);
  signal pwm_out : std_logic;

  alias duty_cycle is cnt(cnt'high downto cnt'length - pwm_bits);

begin

  led_1 <= '0';
  led_2 <= '0';
  led_3 <= '0';
  led_4 <= '0';

  led_5 <= pwm_out;

Во-первых, мы объявляем сигнал сброса, который будет нашей неинвертированной синхронной версией внешнего сброса.

Второй заявленный сигнал с именем cnt , — счетчик тактовых циклов с бесконечным циклом. Это тип без знака, который будет хранить состояние пилообразной волны интенсивности светодиода в любой момент времени.

Далее идет pwm_out сигнал. Мы могли бы подключить pwm_out сигнал от модуля ШИМ напрямую на led_5 вывод, но я хотел наблюдать за pwm_out в симуляторе. Инструмент синтеза определит, что два сигнала принадлежат одной сети. Это не потребует дополнительных ресурсов.

Наконец, идет объявление duty_cycle вектор — на этот раз я использовал псевдоним ключевое слово вместо создания нового сигнала. Псевдонимы VHDL работают примерно так же, как макросы в C. Когда мы используем duty_cycle имя, компилятор заменит им старшие биты cnt вектор.

После начала ключевое слово, мы назначаем pwm_out сигнал на led_5 выход. Все остальные светодиоды жестко подключены к «0», чтобы они не светились красным цветом.

Экземпляры

Прежде чем использовать внешние сигналы внутри FPGA, мы всегда должны синхронизировать их с внутренними системными часами. В противном случае мы можем столкнуться с проблемами метастабильности, которые трудно отладить.

RESET : entity work.reset(rtl)
  port map (
    clk => clk,
    rst_n => rst_n,
    rst => rst
  );

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

Следующим экземпляром является модуль ШИМ, как показано во фрагменте кода ниже. В экземпляре модуля PWM мы используем duty_cycle псевдоним для назначения старших битов cnt вектор в duty_cycle вход. Это приведет к увеличению яркости светодиода до тех пор, пока счетчик не достигнет своего максимального значения. Когда cnt возвращается к нулю, светодиод ненадолго гаснет, и цикл повторяется.

PWM : entity work.pwm(rtl)
  generic map (
    pwm_bits => pwm_bits,
    clk_cnt_len => clk_cnt_len
  )
  port map (
    clk => clk,
    rst => rst,
    duty_cycle => duty_cycle,
    pwm_out => pwm_out
  );

Третьим и последним экземпляром в верхнем модуле является счетчик тактов, как показано ниже. Чтобы сделать этот модуль более универсальным, я включил параметр count_enable. сигнал. Но в этом проекте мы установим константу «1», потому что мы хотим подсчитывать каждый тактовый цикл.

COUNTER : entity work.counter(rtl)
  generic map (
    counter_bits => cnt'length
  )
  port map (
    clk => clk,
    rst => rst,
    count_enable => '1',
    counter => cnt
  );

Оставьте свой адрес электронной почты в форме ниже, если вам нужен полный код VHDL для этого проекта.

Имитация пульсации светодиода ШИМ

Существенным преимуществом настройки длин счетчиков с помощью универсальных шаблонов является то, что это позволяет ускорить симуляцию. Большую часть времени мы заинтересованы в тестировании переходов и событий в нашей логике. Мы не очень заинтересованы в том, чтобы прогонять сверхдлинный счетчик, пока в дизайне больше ничего не происходит.

С помощью дженериков мы можем изменить эти вещи неинвазивным способом из тестового стенда. В приведенном ниже коде показаны значения, которые я присвоил общей карте при создании экземпляра модуля ШИМ в тестовом стенде.

DUT : entity work.pwm_led(str)
  generic map (
    pwm_bits => 8,
    cnt_bits => 16,
    clk_cnt_len => 1
  )

При моделировании с использованием этих констант в ModelSim достаточно проработать 1400 микросекунд на частоте 100 МГц, чтобы выявить два полных цикла ШИМ. Если бы мы использовали реальные значения, нам пришлось бы имитировать около 6 секунд. Это 32 миллиона тактов почти ничего, кроме счета. В ModelSim это заняло бы целую вечность.

На изображении ниже показана форма волны моделирования ШИМ в ModelSim. Я изменил формат duty_cycle сигнал от типа номера по умолчанию к представлению аналоговой волны. Вы можете сделать это в ModelSim, щелкнув правой кнопкой мыши сигнал в осциллограмме и выбрав Формат->Аналоговый (пользовательский)… , а также установите высоту пикселя и диапазон данных в соответствии с минимальным и максимальным значениями вашего сигнала.

В форме волны мы можем видеть, почему он называется пилообразным сигналом. Свободно вращающийся счетчик напоминает зубья пилы.

Обратите внимание, как продолжительность высоких периодов выхода ШИМ (led_5 ) увеличивается по мере увеличения рабочего цикла. Мы также видим, что led_5 представляет собой непрерывную «1» на очень короткое время на кончике зубца пилы. Это когда рабочий цикл составляет 255, максимальное значение.

Если бы мы не добавили дополнительный оператор if в модуль PWM, тот, который обертывает pwm_cnt сигнала обратно к нулю при его втором по величине значении, мы бы этого не увидели. Мы никогда не сможем достичь максимальной выходной мощности. Это распространенная ошибка при реализации ШИМ-генераторов. Я тоже делал это один или два раза.

Реализация ПЛИС

Я реализовал дизайн на Lattice iCEstick, используя iCEcube2, программное обеспечение для дизайна от Lattice. В приведенном ниже списке показано использование ресурсов после места и маршрута. Несмотря на то, что iCE40 FPGA крошечный, ШИМ и вспомогательные модули используют только 5% доступных LUT.

Resource Usage Report for pwm_led 

Mapping to part: ice40hx1ktq144
Cell usage:
GND             3 uses
SB_CARRY        31 uses
SB_DFF          5 uses
SB_DFFSR        39 uses
SB_GB           1 use
VCC             3 uses
SB_LUT4         64 uses

I/O ports: 7
I/O primitives: 7
SB_GB_IO       1 use
SB_IO          6 uses

I/O Register bits:                  0
Register bits not including I/Os:   44 (3%)
Total load per clock:
   pwm_led|clk: 1

@S |Mapping Summary:
Total  LUTs: 64 (5%)

После создания потока программных битов в iCEcube2 я использовал автономный программатор Lattice Diamond для настройки FPGA через USB.

На приведенной ниже Gif-анимации показано, как сигнал рабочего цикла пилообразной волны влияет на поведение светодиода включения питания на iCEstick. Он загорается с нарастающей интенсивностью до тех пор, пока cnt встречные обертывания. Затем рабочий цикл становится равным нулю, и светодиод ненадолго гаснет. После этого цикл повторяется бесконечно.

iCEstick — это недорогая и универсальная плата для разработки FPGA. Это хорошо для начинающих, но также подходит для продвинутых встроенных проектов. Кроме того, программное обеспечение Lattice несложное и простое в использовании. Вот почему я использую iCEstick как в своем начальном курсе VHDL, так и в продвинутом курсе FPGA.

Если у вас уже есть iCEstick, вы можете использовать форму ниже, чтобы загрузить проект iCEcube2.

Синусоида рабочего цикла для эффекта дыхания светодиодов

Теперь вы знаете, как управлять подсветкой светодиода с помощью ШИМ.

Светодиод, пульсирующий в виде пилообразной волны, возможно, холоднее, чем простое мигание ВКЛ/ВЫКЛ. Это типичное первое задание для студентов, изучающих VHDL, и я уверен, что в какой-то момент вы хоть раз моргали светодиодом.

Однако мигание светодиода становится еще более впечатляющим, если вы используете синусоиду для управления рабочим циклом. На приведенной ниже Gif-анимации показано, как наш ШИМ-модуль пульсирует светодиодом с синусоидальным изменением интенсивности с течением времени.

Я уверен, что вы уже видели подобный «дышащий» эффект на светодиодах. Вот как ведет себя светодиод уведомлений на моем мобильном телефоне, и я думаю, что это выглядит естественно, потому что нет резких изменений интенсивности света.

В моем следующем сообщении в блоге я покажу вам, как создать генератор синусоидального сигнала с использованием блочной оперативной памяти в ПЛИС. И мы изменим pwm_led модуль для пульсации светодиода на iCEstick с синусоидальной интенсивностью.

Нажмите здесь, чтобы перейти к следующему сообщению в блоге:
Как создать эффект дышащего светодиода, используя синусоиду, хранящуюся в блочной оперативной памяти

См. также:
RC сервоконтроллер, использующий ШИМ от контакта ПЛИС


VHDL

  1. Контроллер мощности ШИМ
  2. Как создать список строк в VHDL
  3. Как создать управляемый Tcl тестовый стенд для модуля кодовой блокировки VHDL
  4. Как остановить симуляцию в тестовом стенде VHDL
  5. Как генерировать случайные числа в VHDL
  6. Как создать кольцевой буфер FIFO в VHDL
  7. Как создать самопроверяющийся тестовый стенд
  8. Как создать связанный список в VHDL
  9. Как использовать процедуру в процессе в VHDL
  10. Как зарядить конденсатор?