Jump to content

    
Balmer

Zynq 7000 управлять ножкой ПЛИС используя Verilog

Recommended Posts

Добрый день.

Совсем я новичок в Xilinx устройствах (до этого только Cyclone IV использовал).

Решил попробовать Zynq 7000. Купил отладку - стандартные сэмплы на ней запускаются отлично (Blink LED, Ethernet, Mem test).

Но вот застопорился на совсем простой вещи - управлении ножкой FPGA из PL части.

 

Что я делаю.

Взял работающий сэмпл который мигает светодиодом из кода для ARM .

В led.xdc файл добавил строчки.

set_property IOSTANDARD LVCMOS33 [get_ports GPIO_led]
set_property PACKAGE_PIN L17 [get_ports GPIO_led]
 

В top entry добавил соовсем простой код и вывел GPIO_led как output wire в этом модуле.

OBUF led_buf( .I(1'b1), .O(GPIO_led));

После синтеза в Schematic этот элемент выглядит тоже логично.

led_buf.png.3f0d3c3a1423ef916ef367fe2c58db99.png

 

Единственная проблема - на ножке всё время логический ноль.

Соответственно вопрос - что я делаю не так?

PS: Использую Vivado 2019.1 и той-же версии SDK.

Share this post


Link to post
Share on other sites

Точно 0. Я свой диод с резистором подключил. Причем правильно.

У ножки, которая корректно работает тоже LVCMOS33 выставлено.

set_property IOSTANDARD LVCMOS33 [get_ports {GPIO_0_0_tri_io[0]}]
set_property PACKAGE_PIN D19 [get_ports {GPIO_0_0_tri_io[0]}]
 

Причем, если точнее на этой ножке  GPIO_led - Hi-Z . Т.е. она ни к чему не подключена получается. Но обрыва на схеме точно нет. Когда схема без программы залитой - светодиод слабо-слабо светится. Видимо Weak Pull-Up работает. В этом состоянии на ножке 3.3 вольта можно намерять.

 

D19 и L17 относятся к одному банку 35.

Edited by Balmer

Share this post


Link to post
Share on other sites

Если Вы новичёк, тогда советую не колупать руками xdc и создать в Block design схему подключения того самого светодиода через GPIO IP, всё это дело коннектится через AXI в PL, где командами можно засветить диод. Там есть ещё нюансы в карте адресов и правильных функциях вывода наружу. На крайний случай попробуйте взять пробный проект от Arty Z7, помнится там есть всё нужное с вводом-выводом.

Ну и проект скиньте, так тяжело угадывать где загвоздка.

З.Ы. Не бойтесь интерфейсных частей Xilinx, по моему опыту для начального понимания они намного лучше и удобнее Квартусовских. Хотя и тупят безбожно иногда

Share this post


Link to post
Share on other sites
32 minutes ago, Nick_K said:

Ну и проект скиньте, так тяжело угадывать где загвоздка.

Вот ссылка на проект. Использую вот такую плату отладочную xc7z010.

Мои изменения в конце файлов design_1_wrapper.v и led.xdc

Да, если ничего не получится, то буду пробовать "AXI в PL" - но для меня как для новичка это сложновато. Там сразу несколько "черных ящиков" добавляется.

Впрочем, проект кривой скинул. Изменения в design_1_wrapper.v исчезли. Видимо нельзя внутрь этого файла код писать.

Share this post


Link to post
Share on other sites

Вот результат синтеза Вашего проекта. Или где-то косяк в синтезе или в коде ибо подтяжка в '1' никогда не будет мигать.

image.thumb.png.2780916fd39ce4b5f398ee89fd79d772.png

Плюс накручено сложного очень уйма. И ненужного. Как Ethernet модуль, ещё один GPIO модуль...

image.thumb.png.67dcd3506f3d399894fcf04d7ad263c0.png

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

 

З.Ы. Этот код не является "мигалкой", а делает простую подтяжку в 1:

always @(posedge clk)
  begin
    led_out_reg <= 1'd1;
  end

Такое чувство, что вы новичёк не только в Xilinx, но и вообще в ПЛИС...

Share this post


Link to post
Share on other sites

Ну немножко в ПЛИС я понимаю, вот пример моего кода.

Накручено много - потому как это стандартный пример. Там сначала добавляется вся аппаратура, а потом уже пишется какой-то код. Ethernet не используется, UART используется только для логов в Си коде.

И да, совершенно верно подмечено, этот код не является мигалкой, просто устанавливает единицу на ножку. Только она туда не устанавливается.

Share this post


Link to post
Share on other sites

Окей, значит чувство ошибочно.

Но тут есть ещё нюансы, к примеру светодиод может драйвится нулем. Из всех виденных мной плат - это вполне себе распространённое явление для Xilinx. Соответственно, чтобы светилось, нужно подать 0.

Второе. Архитектура Zynq построена таким образом, что к PS GPIO имеет доступ только ядро. Если Вы пытаетесь подключить туда PL, Вас ждёт фиаско. По крайней мере у меня так не получилось. К какой именно ноге Вы пытаетесь подключится - я не знаю.

Третье. Всё же советую начать с чистого листа. Взять xdc от Вашей платы и прикрутить к пустому проекту. Далее в BD создать всего 2 компонента

image.thumb.png.5ae36e41b2f3166e30aa0d51b29421a8.png

Run connection automation подключит все нужные порты, останется только в I/O интерфейсе настроить пины, предварительно создав враппер для BD проекта. По сути это всё что нужно для имплементации.

Во вкладке Address Editor указаны адреса, по которым нужно стучаться через Xil_In32() функцию в main.c

Кстати, если для борды есть board files это очень облегчит работу.

Share this post


Link to post
Share on other sites

Светодиод светится при логической единице. Я его сам подключал к 2.54 мм pin header и точно не ошибся. Более того - проверял напряжение на ножке вольтметром.

Подключаю к ножке L17 которая не является PS_MIO (это корпус на 400 выводов).

axi_gpio не является простым элементом, но вечером попробую. Кроме того, непонятен такой момент - вот получится у меня управлять ножкой, используя axi_gpio, что дальше делать? Как мне перейти к написанию своего драйвера, который будет полностью в PL части? Хочется всё таки axi изучать отдельно от ногодрыга.

 

Share this post


Link to post
Share on other sites
Just now, Balmer said:

Подключаю к ножке L17 которая не является PS_MIO (это корпус на 400 выводов).

Значит не будет работать. Ранее я говорил: PS-ные пины напрямую включены в ядро и подлезть к ним через ПЛИСовую часть невозможно. Посему то, что Вы пытаетесь задать в Верилоге не будет подключено.

2 minutes ago, Balmer said:

axi_gpio не является простым элементом, но вечером попробую

Для тестов этого достаточно. Далее если придётся работать можно или разобраться как работает AXI протокол и использовать его впроекте (а это лучший вариант и наиболее удобный), либо заказывать платы с нужными подключениями MIO (в дев бордах они обычно не играють большого значения и законнекчены как попало).

9 minutes ago, Balmer said:

Кроме того, непонятен такой момент - вот получится у меня управлять ножкой, используя axi_gpio, что дальше делать?

Тут тоже 2 варианта: либо учить AXI, что является наиболее правильным вариантом для средних и больших проектов, либо использовать тот же GPIO IP как транслятор между PL и Вашей логикой (там на выходе обычный вектор, который можно подключать куда и как хочется). Честно я второй вариант не проверял но думаю реально пользоваться им.

Для первого варианта есть очень удобная функция Custom User IP, которая позволяет создать "враппер" в регистр (AXI-Lite) или в память (AXI) через AXI интерфейс (см. тут и тут). Сие чудо можно колупать как душе угодно и впиливать туда кучу всего нужного. В результате у Вас будет свой модуль, подключённые к PS по проприетарной AXI шине. По ходу во враппере можно разобраться как работает протокол, что для начала не обязательно, так как оно будет работать "из коробки".

Share this post


Link to post
Share on other sites
16 minutes ago, Nick_K said:

Значит не будет работать. Ранее я говорил: PS-ные пины

Точно не пропустили НЕ в предложении "Подключаю к ножке L17 которая не является PS_MIO" ??

Если не к L17 подключать, то к какому пину? Вот картинка доступных.

headers.thumb.png.5f2ef962ac817e54a395b2a3a3dc525d.png

 

Edited by Balmer

Share this post


Link to post
Share on other sites
1 hour ago, Balmer said:

Точно не пропустили НЕ в предложении "Подключаю к ножке L17 которая не является PS_MIO" ??

Сори, действительно недосмотрел. Вечером это было, мог уже и не настолько внимательным быть.

1 hour ago, Balmer said:

Если не к L17 подключать, то к какому пину? Вот картинка доступных.

Да в общем-то к любому из 34-35 банки. Все эти пины для юзера. Хотя лучше глянуть плату, что куда идёт.

Для перепроверки засинтезите проект, откройте его и вызовите менеджер Package, там будут разрисованы все доступные пины (обведено оранжевым). Можно проверить что пин не переназначен.

image.thumb.png.39f7958d3436e66213c7a1369d95118a.png

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.