Первый проект на ПЛИС

Я продолжаю свое знакомство с ПЛИС Altera при помощи описанной ранее платы OSH Black & Gold.

Первым проектом на Altera Cyclone IV стал 4-разрядный двоичный счетчик.
Пошаговая процедура его создания лежит под катом.

Итак, первым делом создадим папку, где будет лежать проект. У меня это папка «Counter».
Запускаем Altera Quartus II и создаем проект: File -> New -> New Quartus II Project




На вкладке «Introduction» устанавливаем флаг «Don't show me this introduction again», чтобы впредь Quartus не умничал.



Затем указываем путь к папке проекта и его название.



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



Следующая вкладка рекомендует выбрать используемую ПЛИС. Сделаем это…
Выбираем семейство Cyclone IV E, снимаем флаг «Show advanced devices» и выбираем из списка нашу ПЛИС EP4CE15F17C8.



Четвертую и пятую страницы оставляем без изменений, после чего нажимаем «Finish».




Заготовка проекта создана.

Теперь нужно создать файл верхнего уровня проекта. У меня это будет файл схемы — так будет удобнее представить структуру проекта.
Итак, File -> New -> Block Diagram / Schematic File



Теперь определимся с портами ввода и вывода, которые нам понадобятся и нарисуем их:



Итого, нам нужны следующие сигналы: CLK — тактовый сигнал, RSTn — сброс и четыре сигнала управления светодиодами LED_Out [3:0], объединенные в 4-проводную шину. То, что получилось, я сохранил в файле Counter.bdf



Теперь предстоит создать сам счетчик. Можно, конечно его нарисовать или взять компонент из стандартной библиотеки, но это не наш метод: ведь что за работа с ПЛИС без Verilog HDL?
Создаем новый Verilog-файл: FIle -> New -> Verilog HDL File и сохраняем его как Counter.v



Дальше напишем сам счетчик на Verilog…
module Count   (
             input wire CLK,
	     input wire RSTn,
	     output wire [3:0] LED_Out
	     );
					 

reg [27:0] count; // Counter for clock divider
 
always@(posedge CLK or negedge RSTn)
begin
      if (!RSTn)
      count <= 0;
      else
      count <= count + 1;
end

assign LED_Out = count [27:24]; // Connecting 4 last digits of counter to LEDs

endmodule


Как это работает?
Весь код представляет собой один модуль, заключенный между словами module и endmodule.
После первого из них описываются входы и выходы.
Далее определим 28-разрядный регистр-счетчик count.
После always идет кусок кода, представляющий собой собственно сам инкрементный счетчик, срабатывающий по переднему фронту тактового сигнала CLK и сбрасываемый в ноль по заднему фронту сигнала сброса RSTn. Для того, чтобы поделить тактовую частоту 50МГц, выводим на светодиоды только 4 старших разряда регистра-счетчика.

Дальше из полученного модуля нам нужно сделать схемный компонент. Для этого в «Project Navigator», во вкладке «Files» щелкаем правой кнопкой на файле Counter.v и из контекстного меню выбираем «Create Symbol Files for Current File».



Затем переходим в схемный файл Counter.bdf и вставляем в схему получившийся символ.




Подключаем нарисованные пины к выводам блока



После этого сохраняемся и нажимаем кнопку компиляции проекта



На компиляцию уйдет какое-то время. Если все до этого момента было сделано правильно, то ошибок быть не должно: будет только несколько предупреждений. На последние можем не обращать внимание.
Теперь нужно наши, созданные внутри ПЛИС, пины вывести на реальные внешние ножки. Для этого запускаем Pin Planner



Как видно из появившегося окна, во время компиляции проекта Quartus зарезервировал наши пины под выводы ПЛИС.



Теперь остается только указать, кого на какую ножку выводить. Для моей отладочной платы OSH Black & Gold ножки должны быть расположены следующим образом:



Еще раз компилируем проект и запускаем программатор




Нажимаем кнопку «Start», дожидаемся окончания программирования и радуемся правильному миганию светодиодов на плате.

14 comments

avatar
Статья дополнена пошаговой видео-инструкцией.
avatar
Спасибо. Хотел повторить на имеющемся у меня cyclone 4 серии ep4ce6e22c8n на плате zr tech v 2.00, долго мучился пока нашел схему платы среди китайских каляк, но так и не смог прописать логику т.к. в qurtus 15 не оказалось устройства этой серии (ep4ce6e22c8n). Ближайшее что есть это ep4ce6e22c8 и ep4ce6e22c8l. Может кто подскажет как справится с этой проблемой.
avatar
Последняя буква маркировки указывает следующее:
N: Lead-free packaging
ES: Engineering sample
L: Low-voltage device
Т.о. в Вашем случае вполне подойдет ep4ce6e22c8.
avatar
О! Спасибо за полезную/приятную инфу! Остается вопрос почему же программатор не пишет?! Ладно, раз в принципе проблемы нет, тогда можно еще поковырятюся. Еще раз благодарю.
avatar
А что «говорит» программатор?
avatar
Что-то тривиальное типа: «Failed». Сейчас заново сделаю проект и напишу дословно.
avatar
Можете скрин-сейв приложить.
avatar
Failure

Вот так скучно выглядит ошибка. Когда я выбрал .sof фаил девайс сам прописался, так что думаю предъидущий пост не очень релевантен.
avatar
Скорее всего, проблема с драйвером программатора.
avatar
Так и было! Оставлю здесь ссылку для пользователей Убунту с дополнительными инструкциями по настройке jtagd:
www.fpga-dev.com/altera-usb-blaster-with-ubuntu/
Лед замигал, спасибо за помощь!
avatar
Пожалуйста! В ближайшее время планирую снять что-то подобное о ПЛИС фирмы Xilinx. Присоединяйтесь к экспериментам! ;)
avatar
Еще одна настараживающая особенность это что в окне программатора нажимая кнопку Add Device, я не получаю опцию ep4ce6e22c8, ближайшее это ep4ce6e22.
avatar

Последние три знака в маркировке для программатора роли не играют.
avatar
Вобщем то я понял причину проблемы — я на линуксе, нужны дополнительные настройки jtagd. Отпишусь когда сделаю.
Only registered users can comment.