Hello world на FPGA

January 1, 2020, 12:27 pm FPGA ALTERA HARDWARE ПЛИС
blog-header-image

Разобравшись с устройством программы можно попробовать написать что ни будь простенькое вроде мигания диодом. Но для начала я предлагаю разобраться с тем что можно добавлять в проект (после нажатия Ctrl+n ).

1) Block Diagram/ Schematics File - Это лист с Принципиальной схемой. Логичнее всего поставить в самый верх иерархии, для наглядного соединения разработанных модулей на hdl с портами ПЛИС.

2) AHDL (Altera HDL) - Язык описывающий то как должны быть устроены схемы. Хорошее описание можно найти в этой статье и этой презентации а так же я возможно сделаю статью конспект. Это язык компании Altera, поэтому в нем есть конструкции описывающие элементы ПЛИС именно этой фирмы, например D-триггер. Главное что знак = значит не равенство или присвоение а физическое соединение выводов.

3) Verilog HDL file - Язык описывающий то что должна делать аппаратура. Более высокоуровневый по сравнению с AHDL. Про него можно узнать в книге "Цифровая схемотехника и архитектура компьютера" ее электронная версия бесплатна.

4) System Verilog HDL file - Язык описывающий то что должна делать аппаратура. Развитие языка Verilog. В 2009 был объединен со стандартом языка Verilog. Это будет основным языком разработки.

5) VHDL file - Почти тоже самое что и System Verilog но более многословный и не похож на С. Так что его обойдём стороной.

Для начала предлагаю в общем виде представить из чего может состоять схема мигания диодом, на ум приходит что-то вроде такого:

![schematic]()

Далее необходимо посмотреть какие периферийные блоки на отладочной плате помогут нам это реализовать. Это тактовый генератор и диод.

clock_gen

Генератор 50MHz - Это значит, что для мигания с частотой 1 Hz счетчик должен досчитывать до 50000000, а потом сбрасываться. 50 миллионов это 2 FA F0 80 в HEX, а значит нужен 26-битный счетчик.

LED

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

time_diogram

Для того чтобы у нас была возможность сбросить счетчик по любому значению необходимо всы выходы со счетчика соединить элементом И или ИЛИ, выход которого отправить на сброс счетчика. Таким образом добавляя элемент НЕ на входы И или ИЛИ можно выставить любое число для сброса, главное чтобы оно было не меньше чем разрядность счетчика, т.к. в этом случае старший бит никогда не станет единицей.

Быстрее всего данный модуль будет реализовать с помощью ahdl, а соединить модуль с физическими выводами можно уже на схеме. Возьмем проект из прошлой статьи там как там уже создан Schematics файл. Открыв проект создадим лист ahdl (комбинация ctrl+n).

Далее предлагаю минимально ознакомится с AHDL. Модуль AHDL состоит из следующих блоков:

  1. Блок объявления входов/выходов
  2. Блок объявления внутренних элементов схемы
  3. Блок логического описания

Как можно догадаться в первой секции нужно прописать пины (CLK - тактирующий вход и Q - выход для диода) и название модуля (Count):

subdesign Count (
    CLK:input;
    Q:output;
)

Во втором блоке нужно объявить элементы входящие в схему, у нас это 2 буфера: cnt[25..00] - массив из 25 D-триггеров (DFF) для реализации 26-битного счетчика и один один T-триггер (TFF) buf.

variable
    cnt[25..0] : DFF;
    buf : TFF;

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

begin
    cnt[].clk = CLK;        --тактирование массива триггеров от генератора
    Q = buf.q;              --Выход схемы - выход Т-триггера
    buf.clk = cnt[25];      --Т-триггер выставляется старшим битом массива
    buf = vcc;              --Так надо, из-за особенности реализации Т-триггера 

    if cnt[] == 50000000 then --считаем до 5 млн
        cnt[] = 0;
    else
        cnt[] = cnt[] + 1;
    end if;

end;

Эта статья не ставит целью объяснить работу с AHDL, а лишь поазывает процесс работы со средой Quartus, поэтому приведён срезу готовый код с комментариями.

Далее из полученного кода необходимо создать символ для схемы.

Create_symbol

Далее вернемся к схеме полученной в прошлой статье, удалим соединение и поставим созданный нами блок между компонентами. Для Этого на схеме нужно выбрать insert -> Symbol..., а далее выбрать его.

add

Потом удаляем вход с кнопки и ставим вместо него вход с тактового генератора, чтобы получилось следующее:

shem

Теперь можно компилировать и запускать на fpga, диод должен начать мигать.

Далее если выбрать Tools->Netlist Viewers->RTL Viewer то можно увидеть то что сгенерила программа.

output

Это очень похоже на нашу начальную схему.

Замечания

  • Чтобы подключить ModelSim-Altera нужно в Tools->Options...->General->EDA Tool Option->ModelSim добавить /intelFPGA_lite/<version>/modelsim_ase/win32aloem (Lite)

Previous Post

Profile picture

Zen, эмбеддет разработчик и просто хороший человек.