реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Интерфейс между ARM и FPGA, Что выбрать для обмена данными с ПЛИС?
Ya_Mike
сообщение Mar 30 2012, 11:32
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 18-05-10
Из: Ярославль
Пользователь №: 57 355



Всем доброго времени суток,

Возник вопрос в выборе интерфеса для передачи данных от ПЛИС(Spartan6) к АРМу(arm926ej-s).
На арме - линукс с ядром 3.х.х. Плис будет постоянно обмениваться данными с армом небольшими порциями (пока не определился, какого размера их сделать), поток - оринтировочно 128 кБит/с туда и столько же обратно (*3). При этом АРМ должен будет при старте загрузить прошивку в неё(*2), а при работе - считывать некоторые статистические данные помимо этого основного потока (*1). Итого, получается три "потока" данных.
Есть идея выделить под:
*3 - по EBI интерфейсу,
*2 + *1 - по SPI, (либо всё-таки по отдельным интерфейсам передавать?)
В наличии ещё gpio есть, но думал их использовать для сигналлинга в случае SPI (когда slave что-то хочет сказать master-у).
Так как такая задача возникла впервые, то есть сомнения в правильности выбора интерфейсов. Ко всему, хочется как можно меньше нагружать систему. Буду благодарен, если кто-нибудь сможет посоветовать, где при таком выборе интерфейсов разложены грабли и какие проблемы могут возникнуть.
Go to the top of the page
 
+Quote Post
faa
сообщение Mar 30 2012, 13:18
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 726
Регистрация: 14-09-06
Из: Москва
Пользователь №: 20 394



Цитата(Ya_Mike @ Mar 30 2012, 15:32) *
Всем доброго времени суток,

Возник вопрос в выборе интерфеса для передачи данных от ПЛИС(Spartan6) к АРМу(arm926ej-s).
На арме - линукс с ядром 3.х.х. Плис будет постоянно обмениваться данными с армом небольшими порциями (пока не определился, какого размера их сделать), поток - оринтировочно 128 кБит/с туда и столько же обратно (*3). При этом АРМ должен будет при старте загрузить прошивку в неё(*2), а при работе - считывать некоторые статистические данные помимо этого основного потока (*1). Итого, получается три "потока" данных.
Есть идея выделить под:
*3 - по EBI интерфейсу,
*2 + *1 - по SPI, (либо всё-таки по отдельным интерфейсам передавать?)
В наличии ещё gpio есть, но думал их использовать для сигналлинга в случае SPI (когда slave что-то хочет сказать master-у).
Так как такая задача возникла впервые, то есть сомнения в правильности выбора интерфейсов. Ко всему, хочется как можно меньше нагружать систему. Буду благодарен, если кто-нибудь сможет посоветовать, где при таком выборе интерфейсов разложены грабли и какие проблемы могут возникнуть.

ИМХО, вешать FPGA на EBI и все делать через этот интерфейс. Для программирования написать драйверочек - там нужны будут еще -две-три (или четыре) ноги gpio с ARM (для PROG, INIT, DONE и т.п.).
После программирования можно через /dev/mem обмениваться (или через драйвер). Ну и при желании можно прерывания попользовать.
Примеры есть в инете. Если не найдете - помогу ссылками.

Сообщение отредактировал faa - Mar 30 2012, 13:19
Go to the top of the page
 
+Quote Post
litv
сообщение Mar 30 2012, 13:23
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 6-10-04
Из: Воронеж
Пользователь №: 806



А как же AXI - плис в арм ? ( http://www.xilinx.com/support/documentatio...rence_guide.pdf )
Go to the top of the page
 
+Quote Post
faa
сообщение Mar 30 2012, 13:30
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 726
Регистрация: 14-09-06
Из: Москва
Пользователь №: 20 394



Цитата(litv @ Mar 30 2012, 17:23) *
А как же AXI - плис в арм ? ( http://www.xilinx.com/support/documentatio...rence_guide.pdf )

Если в Spartane AXI еще изобразить можно и вытащить наружу, то в ARM-е (судя по краткому описанию от ТС) до нее достучаться вряд ли получится (да ее там еще и нет, скорее всего).
Go to the top of the page
 
+Quote Post
Ya_Mike
сообщение Apr 1 2012, 07:43
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 18-05-10
Из: Ярославль
Пользователь №: 57 355



faa, спасибо за отлик!

Цитата(faa @ Mar 30 2012, 17:18) *
ИМХО, вешать FPGA на EBI и все делать через этот интерфейс. Для программирования написать драйверочек - там нужны будут еще -две-три (или четыре) ноги gpio с ARM (для PROG, INIT, DONE и т.п.).
После программирования можно через /dev/mem обмениваться (или через драйвер). Ну и при желании можно прерывания попользовать.

Т.е. я правильно понимаю, что работа через EBI - это, по сути, обмен через определенный участок памяти?
Наверное, лучше будет через драйвер все делать, так как прерывания будут нужны наверняка. А ног gpio заведено с запасом, поэтому хватит на всё.

Цитата(faa @ Mar 30 2012, 17:18) *
Примеры есть в инете. Если не найдете - помогу ссылками.

Нашёл на kernel.org пример драйвера carma-fpga. Пока что его изучаю, но если есть на примете более удачные (покороче) примеры - буду рад.

Цитата(litv @ Mar 30 2012, 17:23) *
А как же AXI - плис в арм ? ( http://www.xilinx.com/support/documentatio...rence_guide.pdf )

В arm926ej-s есть поддержка только второй версии AMBA (AHB), а AXI появился в третьей версии.
Не могли бы вы сказать, в чем преимущества использования AXI по сравнению с использованием EBI?
Go to the top of the page
 
+Quote Post
faa
сообщение Apr 1 2012, 10:20
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 726
Регистрация: 14-09-06
Из: Москва
Пользователь №: 20 394



Цитата(Ya_Mike @ Apr 1 2012, 11:43) *
Т.е. я правильно понимаю, что работа через EBI - это, по сути, обмен через определенный участок памяти?
Наверное, лучше будет через драйвер все делать, так как прерывания будут нужны наверняка. А ног gpio заведено с запасом, поэтому хватит на всё.

Правильно.
Я пристегивал Xilinx (Spartan-3, Virtex-5) к EP93хх (ARM от Cirrus Logic) (и не только к ним) к системной шине (статической)
с выделением двух чипселектов (CS1 и CS7). Младшие разряды данных (0-7) строго на ножки данных для Select Map Slave,
старшие как лягут (только в "правильный" нужный банк их надо). Шину данных и 16 и 32 разряда делал.
Для программирования надо три сигнала с GPIO - два в fpga (INIT, PROG), один (DONE) обратно.
M0-M2 можно запаять на постоянку для select map slave или вытащить на джамперы (у меня на тестовых можно еще через jtag зашить).
Драйвер для программирования есть - лежит на ftp.
Там же костылик для заливки прошивки в fpga.
INIT потом можно еще попользовать для общего сброса модулей в fpga.
После прошивки можно работать через /dev/mem.
Что-то типа такого:
CODE

fpgaDesc = open("/dev/mem", O_RDWR | O_SYNC);
if ( fpgaDesc == -1) goto fpga_error;

mapped_size = getpagesize();
page_size = getpagesize();
offset_in_page = ((unsigned int)FPGA_ADDR) & (page_size - 1);

if ( offset_in_page + 20 > page_size)
mapped_size *= 2;

fpga_base = mmap(NULL, mapped_size, PROT_READ | PROT_WRITE, MAP_SHARED, fpgaDesc, ((off_t)FPGA_ADDR)&~(off_t)(page_size-1) );


Если нужна работа с fpga по прерываниям - драйвер придется ваять, без него с прерываниями нормально никак.

Есть еще камни Spear600 и Spear13хх от STM. Там у них есть возможность через мост достучаться прямо до матрицы AHB.
Но назначение ножек и полная дока только под NDA - видимо свои косяки скрывают wink.gif
Ну и Zynq от Xilinx- там все в одном флаконе: и fpga, и Cortex-A9 (два ядра), и мосты master и slave для общения напрямую.

Сообщение отредактировал faa - Apr 1 2012, 10:22
Go to the top of the page
 
+Quote Post
Ya_Mike
сообщение Apr 15 2012, 20:57
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 18-05-10
Из: Ярославль
Пользователь №: 57 355



faa, доброго времени суток вам,

Цитата(faa @ Apr 1 2012, 14:20) *
Драйвер для программирования есть - лежит на ftp.

В драйвере, что на фтп, обнаружил одну маленькую проблемку на 150 строке: while (fpga_done_read == 0) {..} - этот цикл не выполнится ни разу, а пользователь может не узнать, что возникла проблема.

Вообще большое спасибо за ваш пост, очень помог!

Go to the top of the page
 
+Quote Post
BLAZER
сообщение Apr 24 2012, 05:39
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 30-04-10
Из: Ярославль
Пользователь №: 57 005



Всем доброго времени суток!

Уважаемый faa, а если использовать для загрузки конфигурационной последовательности из ARM в FPGA последовательный интерфейс?
( Для Spartan6, с которым я работаю сейчас, это UG380, страница 26([url="http://www.xilinx.com/support/documentation/user_guides/ug380.pdf"]
Тогда для загрузки конфигурационного файла требуется 5 gpio pin ARM( два- для побитовой передачи файла в FPGA, соответственно данные и такт, и еще три для контроля ПЛИС, PROGRAM_B -сброс FPGA, DONE - конфигурация выполнена,INIT_B - загрузка прошивки в FPGA без ошибок).
Вы не пробовали подобный способ загрузки?
Go to the top of the page
 
+Quote Post
faa
сообщение Apr 26 2012, 03:35
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 726
Регистрация: 14-09-06
Из: Москва
Пользователь №: 20 394



Цитата(BLAZER @ Apr 24 2012, 09:39) *
Всем доброго времени суток!

Уважаемый faa, а если использовать для загрузки конфигурационной последовательности из ARM в FPGA последовательный интерфейс?
( Для Spartan6, с которым я работаю сейчас, это UG380, страница 26([url="http://www.xilinx.com/support/documentation/user_guides/ug380.pdf"]
Тогда для загрузки конфигурационного файла требуется 5 gpio pin ARM( два- для побитовой передачи файла в FPGA, соответственно данные и такт, и еще три для контроля ПЛИС, PROGRAM_B -сброс FPGA, DONE - конфигурация выполнена,INIT_B - загрузка прошивки в FPGA без ошибок).
Вы не пробовали подобный способ загрузки?

Там еще (если мне склероз не изменяет) и CSI_B нужен будет.
Вариант просматривался, а так же и вариант с JTAG (тут только 4 GPIO потребовалось бы).
Но если FPGA будет взаимодействовать с ARM по параллельной шине, то зачем громоздить еще один интерфейс?
Я сделал при программировании так (режим selectMAP):
CSI_B - CS соответствующего банка ARM от static memory controller
СCLK - напрямую сигнал WR с ARM
DATA0-DATA7 - младший байт шины.
(согласование уровней по управляющем сигналам резисторами - есть соответсвующий UG и XAPP)
RDWR_B - не использовал (не было необходимости читать обратно прошивку) - всегда запись
При этом FPGA при загрузке работает в интересном режиме - смесь "SelectMAP Non-Continuous Data Loading with Controlled CSI_B" и
"Non-Continuous SelectMAP Data Loading with Controlled CCLK", что напрямую из DS не следует, но функционирует.
Вот схемка для vrtex5. JTAG тоже присутствует, он ChipScope используется и параллельно заведен на ARM (на всякий случай wink.gif)

Прикрепленное изображение


Цитата(Ya_Mike @ Apr 16 2012, 00:57) *
В драйвере, что на фтп, обнаружил одну маленькую проблемку на 150 строке: while (fpga_done_read == 0) {..} - этот цикл не выполнится ни разу, а пользователь может не узнать, что возникла проблема.

Спасибо, посмотрю, поправим.

Сообщение отредактировал faa - Apr 26 2012, 03:45
Go to the top of the page
 
+Quote Post
hlebn
сообщение Apr 27 2012, 19:26
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 22-10-04
Пользователь №: 963



Вариант через JTAG - самое то (требует только 4 пина от микроконтроллера. желательно SPI)
без проблем пристегивал Xilinx (Spartan-3, Virtex-2, Virtex-5) к ( EP93хх, AT91SAM9xxx, STM32F103 )
Go to the top of the page
 
+Quote Post
AVR
сообщение Jul 1 2012, 22:12
Сообщение #11


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Обладаю устройством SK-AT91SAM9G45-XC6SLX - в качестве примера можно взять её, и заодно посмотреть как там сделан SPI "зашивалка" в ПЛИС на базе GPIO.

Как раз недавно делал обмен между ПЛИС и ARM - там для этого есть шина EBI (SMC контроллер). У меня получилось выжать 140 мегабит, но это не предел, там еще есть возможность выжать наверное все 500, просто я тайминги медленные задал.

А работал как раз через /dev/mem - вполне неплохо. Но конечно для прерываний нужно писать драйвер.

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

P.S.
Если всего 128 кбит/c - имеет ли смысл вообще городить через шину памяти? Я бы просто взял SPI... Или даже I2C если он быстрый достаточно в конкретном проце.


--------------------
Go to the top of the page
 
+Quote Post
BLAZER
сообщение Jul 19 2012, 09:37
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 30-04-10
Из: Ярославль
Пользователь №: 57 005



Доброго дня!

Уважаемым faa и hlebn огромное спасибо за данные советы)))

Уважаемый AVR, как раз эта плата была взята за основу, с нее я взял подключение процессора и плис.
Насчет синхронизации, в исходном варианте плис тактуется от процессора, но в моем случае тактование раздельное, а для передачи данных по SPI достаточно только тактового сигнала на этом интерфейсе, ведь он асинхронный.

Что касается шины EBI, то пока ее реализация отложена, возможно она и не пригодится( к началу разраобтки проекта просто не было достаточного опыта, и поэтому сделал с максимальным запасом, в том числе по скорости интерфейсов.

Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 02:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.0146 секунд с 7
ELECTRONIX ©2004-2016