|
Интерфейс между ARM и FPGA, Что выбрать для обмена данными с ПЛИС? |
|
|
|
Mar 30 2012, 11:32
|
Участник

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

|
Всем доброго времени суток,
Возник вопрос в выборе интерфеса для передачи данных от ПЛИС(Spartan6) к АРМу(arm926ej-s). На арме - линукс с ядром 3.х.х. Плис будет постоянно обмениваться данными с армом небольшими порциями (пока не определился, какого размера их сделать), поток - оринтировочно 128 кБит/с туда и столько же обратно (*3). При этом АРМ должен будет при старте загрузить прошивку в неё(*2), а при работе - считывать некоторые статистические данные помимо этого основного потока (*1). Итого, получается три "потока" данных. Есть идея выделить под: *3 - по EBI интерфейсу, *2 + *1 - по SPI, (либо всё-таки по отдельным интерфейсам передавать?) В наличии ещё gpio есть, но думал их использовать для сигналлинга в случае SPI (когда slave что-то хочет сказать master-у). Так как такая задача возникла впервые, то есть сомнения в правильности выбора интерфейсов. Ко всему, хочется как можно меньше нагружать систему. Буду благодарен, если кто-нибудь сможет посоветовать, где при таком выборе интерфейсов разложены грабли и какие проблемы могут возникнуть.
|
|
|
|
|
 |
Ответов
(1 - 11)
|
Mar 30 2012, 13:18
|
Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
Apr 1 2012, 07:43
|
Участник

Группа: Участник
Сообщений: 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)  В arm926ej-s есть поддержка только второй версии AMBA (AHB), а AXI появился в третьей версии. Не могли бы вы сказать, в чем преимущества использования AXI по сравнению с использованием EBI?
|
|
|
|
|
Apr 1 2012, 10:20
|
Знающий
   
Группа: Свой
Сообщений: 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 - видимо свои косяки скрывают  Ну и Zynq от Xilinx- там все в одном флаконе: и fpga, и Cortex-A9 (два ядра), и мосты master и slave для общения напрямую.
Сообщение отредактировал faa - Apr 1 2012, 10:22
|
|
|
|
|
Apr 15 2012, 20:57
|
Участник

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

|
faa, доброго времени суток вам, Цитата(faa @ Apr 1 2012, 14:20)  Драйвер для программирования есть - лежит на ftp. В драйвере, что на фтп, обнаружил одну маленькую проблемку на 150 строке: while (fpga_done_read == 0) {..} - этот цикл не выполнится ни разу, а пользователь может не узнать, что возникла проблема. Вообще большое спасибо за ваш пост, очень помог!
|
|
|
|
|
Apr 24 2012, 05:39
|
Участник

Группа: Участник
Сообщений: 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 без ошибок). Вы не пробовали подобный способ загрузки?
|
|
|
|
|
Apr 26 2012, 03:35
|
Знающий
   
Группа: Свой
Сообщений: 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 (на всякий случай  )
Цитата(Ya_Mike @ Apr 16 2012, 00:57)  В драйвере, что на фтп, обнаружил одну маленькую проблемку на 150 строке: while (fpga_done_read == 0) {..} - этот цикл не выполнится ни разу, а пользователь может не узнать, что возникла проблема. Спасибо, посмотрю, поправим.
Сообщение отредактировал faa - Apr 26 2012, 03:45
|
|
|
|
|
Jul 1 2012, 22:12
|

фанат 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 если он быстрый достаточно в конкретном проце.
--------------------
|
|
|
|
|
Jul 19 2012, 09:37
|
Участник

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

|
Доброго дня!
Уважаемым faa и hlebn огромное спасибо за данные советы)))
Уважаемый AVR, как раз эта плата была взята за основу, с нее я взял подключение процессора и плис. Насчет синхронизации, в исходном варианте плис тактуется от процессора, но в моем случае тактование раздельное, а для передачи данных по SPI достаточно только тактового сигнала на этом интерфейсе, ведь он асинхронный.
Что касается шины EBI, то пока ее реализация отложена, возможно она и не пригодится( к началу разраобтки проекта просто не было достаточного опыта, и поэтому сделал с максимальным запасом, в том числе по скорости интерфейсов.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|