Например TDA7294

РадиоКот >Статьи >

Теги статьи: ПЛИС(FPGA)Xilinx Добавить тег

Руководство по быстрому старту с платой QMTECH Xilinx SPARTAN-6.

Автор: ITPS, nickolays_rwc@mail.ru
Опубликовано 31.05.2019.
Создано при помощи КотоРед.

 

              Часть1. Руководство по быстрому старту с платой QMTECH Xilinx SPARTAN-6.
Данное руководство не претендует на новизну или оригинальность – хочу помочь начинающим быстрее разобраться с платой. Может где-то и повторяюсь, но, думаю, информации по быстрым стартам, особенно для новичков много не бывает.
Для начала можно приобрести данную плату (я например заказал с Алиэкспресс):
Внешний вид отладочной платы:

…имеет на борту
1) разъём питания (я подаю 9В)
2) стабилизатор
3) 3 кнопки (2 пользовательские и 1 системная – загрузка конфигурации из FLASH в ПЛИС)
4) 4 светодиода (2 пользовательские, индикатор загрузки и питания)
5) Разъем для подключения программатора по JTAG (Platform Cable USB)
6) SPI FLASH для хранения конфигурации
7) SDRAM 32Mb
8) Отверстия для впайки разъемов (пользовательские входы-выходы)
9) Сама ПЛИС Xilinx S-6 (на корпусе обозначение БИС и тип корпуса).

    В комплекте поставки был ещё программатор, кабели и диск ПО (релиз 13.1). Первое что необходимо сделать – установить ПО и драйвер программатора. На диске есть инструкции, процедура несложная, занимает 15 минут.
    Просьба к продавцу обеспечить файлами и мануалами очень затянулась, поэтому решил найти сам. Скачиваем файл QM_XC6SLX16_SDRAM_V02.zip с гитхаба. Он содержит примеры проектов, описания БИС и схему соединений компонентов платы. Забегу вперёд: есть два популярных языка описания схем VHDL и Verilog. Имея опыт программирования на С Verilog мне оказался более по душе и легче осваивается чем VHDL – качаем всё, что сможем найти по Verilog, ну и по VHDL, основам цифровой схемотехники конечно тоже. Мы будем фактически описывать логику работы схем, а не писать программы, как таковые.
При первом включении начинают мигать светодиоды, нажатие на кнопки изменяет режим мигания. Попробуем разобраться что же в ПЛИС зашито (и как зашивать). Для начала создадим рабочую папку, в которой будут сохраняться наши проекты. Распаковываем в неё архив (примеры работы с кнопками, диодами, памятью и менеджером тактирования).
Запускаем ISE Project Navigator. Создаём новый проект с указанием типа БИС и корпуса (есть описания, как это делать). Напрямую загрузить готовые проекты не удалось – они более поздней версии, поэтому импортируем файлы вручную из папки с распакованными примерами. Так даже лучше. Пока не будем думать об иерархии проекта, топовом модуле и т.д. Нам нужно разобраться что внутри сейчас. Импортируем .ucf файл (описание соответствия внутренних цепей с внешними портами ПЛИС):

//--------------------------------------------------------------------------------------------------------------------------------

//input clock signal
NET "sys_clk" LOC = A10 | IOSTANDARD = LVTTL;    // (ножка А10, стандарт ТТЛ например)
//reset signal
NET "sys_rst_n" LOC = R7 | IOSTANDARD = LVTTL;  // (можно и подтяжку добавить – позже разберётесь сами, это не сложно)
//led_1 signal
NET "led_1" LOC = T9 | IOSTANDARD = LVTTL;
//led_2 signal
NET "led_2" LOC = R9 | IOSTANDARD = LVTTL;
//key_1 signal
NET "key_1" LOC = T8 | IOSTANDARD = LVTTL;

//--------------------------------------------------------------------------------------------------------------------------------

Здесь мы видим соответствие цепей с электрической схемой, приведённой в описании платы. NET “…” подключается с нужному выводу ПЛИС. "led_2" как бы булева переменная (в аналогии с битом выходного регистра порта контроллера), которой можно присвоить 1 или 0, и тогда можно зажечь или погасить светодиод. "key_1" тоже, но «наоборот» - 0 или 1 «в ней» указывает на нажатую или ненажатую кнопку.
Далее импортируем файл описания топового модуля (типа main() – простите за тесную аналогию с «С») с расширением .v (Verilog):

//////////////////////////////////////////////////////////////////////////////////
module led_top(
input sys_clk,
input sys_rst_n,
output led_1,
output led_2
);

parameter DLY_CNT = 32'd50000000;
parameter HALF_DLY_CNT = 32'd25000000;

reg r_led;
reg l_led;
reg [31:0]count;

//counter control
always@(posedge sys_clk or negedge sys_rst_n)
begin
if(!sys_rst_n)
begin
count <= 32'd0;
end
else if(count == DLY_CNT)
begin
count <= 32'd0;
end
else
begin
count <= count+32'd1;
end
end

//led output register control
always@(posedge sys_clk or negedge sys_rst_n)
begin
if(!sys_rst_n)
begin
r_led <= 1'b0;
l_led <= 1'b0;
end
else if(count < HALF_DLY_CNT)
begin
r_led <= 1'b1;
l_led <= 1'b0;
end
else
begin
r_led <= 1'b0;
l_led <= 1'b1;
end
end

assign led_1 = r_led;
assign led_2 = l_led;

endmodule

Разбор...

 Первое, что бросается в глаза – у нас есть модуль со входными и выходными сигналами, соответствующими реальным ножкам ПЛИС - это уже кое-что. В модуль «входит» тактовая частота 50МГц, кнопка сброса, «выходят» 2 светодиода. Далее есть 2 константы (вот тут уже надо пооткрывать описания Верилога и параллельно читать), 2 однобитных регистра (как-бы 2 локальных переменных) и 1 32-битный регистр. 1й блок always образует счетчик-делитель тактовой частоты до 1Гц (50Мгц делятся на 50_000_000). Теперь уже операторы if-else и их содержимое не должно вызывать вопросов – логика работы ясна. Считаем до 50000000 потом сбрасываем и опять инкремент на 1. Этот блок работает «всегда» независимо от остальных – огромное отличие от процессора (как бы таймер МК, который тоже работает независимо от ядра).
Следующий блок always уже описывает логику работы диодов и связь с кнопкой – как только счетчик досчитает до половины переключаем диоды местами. Нажатие на кнопку вызывает сброс счетчика и засветку всех диодов (также параллельный процесс).
Здесь пока регистры светодиодов – локальные переменные. Оператор Assign подключает их к реальным выводам ПЛИС. Т.к нам необходимо помнить состояние светодиода (горит/негорит), эта «локальная» переменная (регистр) есть ячейка памяти – триггер. К нему и подключаем светодиоды.
Вот и разобрались – но лучшее средство изучения языка это общение на нём, поэтому начинаем экспериментировать. Жмем

«Implement Top Module» - транслируем наше описание в реальную схему. Не помню, но, вроде ошибок не было и я увидел схему устройства...

на регистровом уровне, клик по появившейся схеме уже покажет «внутренности» - очень красиво…это пока (потом начнется чертовщина, в основном из-за неправильного, но вполне транслируемого описания). Жмем

и получим файл «прошивки» ПЛИС *.bit. Запускаем утилиту iMPACT, создаём проект (убеждаемся, что программатор подключен, индикатор зелёный), подключаемся через JTAG:

Видим ПЛИС. 

Открываем файл .bit конфигурации и в принципе готово. Мы теперь можем прошить память самой ПЛИС используя наш .bit файл, но при перезагрузке или отключении питания прошивка «слетит» и ПЛИС загрузится с SPI FLASH памяти (которую мы и программатор видим подключенной к ПЛИС). Для ускорения прошивки и экспериментов нам пока достаточно грузить конфигурацию в саму ПЛИС. Программировать SPI FLASH немного сложнее и дольше, но тут уже разберётесь сами, методом проб и ошибок или, лучше, почитав мануал.

Правым кликом программируем ПЛИС менее чем за полсекунды, и получаем тот-же результат, что и до перепрограммирования – значит всё верно.

Делаем, например, константы в 2 раза меньше, компилируем, готовим файл прошивки. Схема при этом почти не изменилась.

Удаляем нашу ПЛИС «Del»ом, добавляем опять - это не совсем верный путь, но работает:

И снова программируем, получаем мигание в 2 раза быстрее...

Пример простой, но уже приоткрыта завеса тайны ПЛИС, из-за неё светит лучик тысяч моргающих светодиодов на тернистый путь к вершине горы))) . Теперь начинаем уже вдумчиво читать описание языка, стандарт на Верилог, смотрим и примеры стандартных описаний логических элементов, регистров, сумматоров и разбираем как они работают.
     Если статья понравилась, далее поделюсь опытом подключения стандартных библиотечных модулей – например буферов В/В, мультиплексоров и менеджера тактирования (на частоте в 50МГц для некоторых применений особо не разгонишься - ПЛИС в принципе и создана для больших скоростей работы многих параллельных процессов). Также нелишней будет и симуляция созданных схем – прошивать ПЛИС (её конфигурационную RAM ) можно неограниченно, но все-таки лучше сначала проверить работоспособность на симуляторе.

 

 

 

 

 

 

 


Файлы:
Фотография
Фотография


Все вопросы в Форум.




Как вам эта статья?

Заработало ли это устройство у вас?

5 5 1

Эти статьи вам тоже могут пригодиться: