Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:2
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » Отладочные платы » SK-AT91SAM9G45(M10)-XC6SLX
как получать/передовать данные от/к ПЛИС в линуксе ?
sasamy
Добавлено 12.10.2011 11:57 Редактировалось 12.10.2011 12:01 Сообщение: 11
sasamy
4.70

Пункты: 77241
Регистрация: 14.08.2009
Цитата

Главное чтобы Вы так уже сделали с данным китом, а не выдавали своё предположение за истину.


Главное - чтобы у Вас все получилось, а для этого начните с изучения примера и чтения даташитов.
Цитата

unsigned short *my_map(unsigned int piobase)
{
int fd;
void *base;

// AT91S_PIO *pio;
unsigned short *pio;

off_t addr = piobase;

if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) {
fprintf(stderr, "Cannot open /dev/mem.\n");
exit(EXIT_FAILURE);
}
...
base =
mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd,
addr & ~MAP_MASK);
...
// тут настраивается SMC - см. 21.15 Static Memory Controller (SMC) User Interface

SMC0_Reg = my_map(0xFFFFe800); // cs0
SMC0_Reg->SETUP = 0x05050505;
SMC0_Reg->PULSE = 0x05050505;
SMC0_Reg->CYCLE = 0x000A000A;
SMC0_Reg->MODE = 0x3 | 1<<12;

SMC1_Reg = my_map(0xFFFFe810); //cs1
SMC1_Reg->SETUP = 0x05050505;
SMC1_Reg->PULSE = 0x05050505;
SMC1_Reg->CYCLE = 0x000A000A;
SMC1_Reg->MODE = 0x3 | 1<<12;
....

printf(" ARM address bus test ... ");
// эти адреса уже знаете надеюсь где смотреть
CS0_ptr = my_map(0x10000000); // первый банк
CS1_ptr = my_map(0x20000000); // второй банк
Спуститься к концу Подняться к началу
Персональная информация
NPCMolniya
Добавлено 12.10.2011 14:52 Сообщение: 12
NPCMolniya
0

Пункты: 943
Регистрация: 11.10.2011
Ясно. Спасибо.
Никто не мерил какую скорость можно выжить при передачи данных от ПЛИС через ARM в Ethernet и насколько сильно этот обмен на полной скорости грузит процессор ?
Спуститься к концу Подняться к началу
Персональная информация
Lampus
Добавлено 13.10.2011 14:32 Сообщение: 13
Lampus
5

Пункты: 3552
Регистрация: 26.04.2011
Производительность сетевого интерфейса в Linux-е можно померить с помощью iperf. Для моей железки на AT91SAM9260 с частотой 200 МГц это 55 МБит/сек.
Спуститься к концу Подняться к началу
Персональная информация
fpga
Добавлено 12.06.2012 05:10 Редактировалось 12.06.2012 05:40 Сообщение: 14
fpga
5

Пункты: 1118
Регистрация: 03.06.2009
Не понимаю почему если всё, кроме резета и то опционально, работает синхронно, то почему работает пример поставляемый с платкой... Сдается мне что запись и чтение все же происходит по ARM_WE... Запутался...

вот ссылка на текст моего примера и программы тестирования

если сделать побайтовое заполнение, а не при помощи mempcy, то процент ошибок возрастает до 48%, что-то с таймингами

Вопрос:
Код
Block_memory InsideMemory (
.clka(CLC),
.ena(~ARM_CS0),
.wea(~ARM_WE), // Bus [0 : 0]
.addra(ARM_Addr[12:1]), // Bus [11 : 0]
.dina(ARM_Data), // Bus [15 : 0]
.douta(ARM_Data_BRAM)); // Bus [15 : 0]

а ведь CLC это 50 МГц, по даташиту на BRAM я вижу что во всех примерах-таймингах все операции чтения и записи происходят именно в момент срабатывания тактов... вот я и думаю что такое дикое количество ошибок у меня возникает как раз по этой причине, хотя вижу что пример который идет с платкой как раз тестирует всю BRAMмину и успешно

Я сейчас бьюсь с чтением данных от ПЛИСины, честно тянул до последнего прежде чем написать пост...
Вот что делаю и какие проблемы:

1) прежде всего написал специальный класс (библиотека Qt), который более удобным мне способом реализует функционал той программы что идет с платкой, и без лишних строк

2) написал простой проект для ПЛИСины, который просто передает значения первых 16-ти бит адреса на шину данных - мой класс успешно прочитал это и я увидел счетчик - т.е. нормально, а ранее просто выставил на шину данных константу в ПЛИСине - тоже успешно

3) далее, подцепил пока что однопортовую BRAMину - и вот тут проблема: простой тест, где я записываю случайные данные из программы в ПЛИСовую BRAMину и затем вычитываю и сверяю - так вот на небольших несколько десятков байт - процент ошибок около 5%, а когда блоки еще больше - то процент до 75%

на самом деле происходит запись и чтение из BRAMины

ЗЫ
Потом планирую сделать эту BRAMину двух портовой чтобы записывать в нее свои данные, а уже потом считывать.
Сделаю несколько управляющих/статусных регистров по второму CS1...
Спуститься к концу Подняться к началу
Персональная информация
Pavel Ivanchenko
Добавлено 12.06.2012 11:21 Редактировалось 12.06.2012 11:21 Сообщение: 15
Pavel Ivanchenko
Admin
4.39

Пункты: 91424
Регистрация: 24.03.2009
Пол: Мужчина
Цитата
...работает синхронно, то почему работает пример поставляемый с платкой...
Интересная формулировка ...

Есть такое страшное явление под названием - метастабильность, которое является причиной кошмарных снов начинающих FPGA дизайнеров, с чем Вы и столкнулись ...
В идеале, для синхронизации шин разных клоковых доменов (WE как раз попадает под это определение), нужно использовать двухпортовую память, но это влечет за собой усложнение автомата (да и памяти, как всегда, не хватает).
То как подключена блочная память в демонстрационном проекте к ARM, не совсем правильный вариант подключения, но отсутствия ошибок мне было вполне достаточно, кстати, цена этому - увеличение длительности стробов.
В свое время, приходилось доходить до такого - данные записываются в двойной сдвиговый регистр (по основному клоку с управлением записью по WE) на всю щину, а на вход автоматов идет значение, если оно равно в обоих словах регистров.
Спуститься к концу Подняться к началу
Персональная информация
fpga
Добавлено 12.06.2012 18:53 Сообщение: 16
fpga
5

Пункты: 1118
Регистрация: 03.06.2009
Цитата
Есть такое страшное явление под названием - метастабильность, которое является причиной кошмарных снов начинающих FPGA дизайнеров, с чем Вы и столкнулись ...
кхекхе, начинающий...
Ну так и вижу что-то не так, клок-домены разные и это очевидно, не понятно почему работает.

У меня вопрос, на какой частоте работает SMC (static memory controller если не ошибаюсь)? В руководстве пользователя написано лишь про частоту процессора, а какая именно частота работы шины ARM-FPGA?

"увеличение длительности стробов" - как это сделать, как настроить? Вроде перенес все настройки регистров. Вижу что у меня во время ошибки считываются часто значения которые были предыдущими на шине.

Или решение - повысить тактовую на clka раза в три, до 150 МГц, там вроде BRAMины быстродействующие.

Цитата
В идеале, для синхронизации шин разных клоковых доменов (WE как раз попадает под это определение), нужно использовать двухпортовую память, но это влечет за собой усложнение автомата (да и памяти, как всегда, не хватает).
BRAMины они изначально двухпортовые в современных спартанах (если не ошибаюсь), именно в таком режиме я и планирую их использовать.
Спуститься к концу Подняться к началу
Персональная информация
Pavel Ivanchenko
Добавлено 12.06.2012 19:19 Сообщение: 17
Pavel Ivanchenko
Admin
4.39

Пункты: 91424
Регистрация: 24.03.2009
Пол: Мужчина
Цитата
У меня вопрос, на какой частоте работает SMC (static memory controller если не ошибаюсь)? В руководстве пользователя написано лишь про частоту процессора, а какая именно частота работы шины ARM-FPGA?

Я не озадачивался этим вопросом, если правильно помню - 133МГц, ищите настройки в ядре.
Спуститься к концу Подняться к началу
Персональная информация
fpga
Добавлено 12.06.2012 19:42 Сообщение: 18
fpga
5

Пункты: 1118
Регистрация: 03.06.2009
Цитата
Я не озадачивался этим вопросом, если правильно помню - 133МГц, ищите настройки в ядре.
ок, ясно

т.е. речь именно про ARM-FPGA, на 133 МГц меняются там данные на шинах ARM_Data и ARM_Addr?

очень большая скорость... я вот думаю, как же извлечь такты для clka у брамины

посмотрю тайминги в доках на SAM9G45, может эти все сигналы появляются там каждое слово на шине данных и возможно из этого можно будет извлечь такты и подать на clka

ЗЫ
а как залить на этот форум приложение к посту? я хочу приложить свой пример работы ARM-FPGA когда его доделаю
Спуститься к концу Подняться к началу
Персональная информация
fpga
Добавлено 15.06.2012 02:38 Сообщение: 19
fpga
5

Пункты: 1118
Регистрация: 03.06.2009
очень жаль что нет вывода MCK из процессора на эту шину EBI1 и чтоб прямо в ПЛИС, кажется это возможно (давно когда-то на ARM7 еще баловался, не сложно было вывести тактовую MCK на ножку)... это крайне усложняет работу как со встроенными BRAM ввиду их чисто синхронной архитектуры, так и для организации своих как-бы регистров внутри - тоже собственно отсутствие внятных тактов усложняет жизнь, мозг взрывается

P.S.
отлаживал с помощью ChipScope Pro, почему-то вижу будто импульсы MCK какие-то неравномерные, это сложно объяснить стробоскопическим эффектом, ибо я сэмплировал на частоте 200 МГц, а еще увидел что посылки как бы кучкуются по 16 слов (будь то 8 или 16-ти битный режим)

в общем, удалось добиться работы с такими настройками, причем NCS раньше был одновременно c NWR или NRD, но путем изучения документации не сложно было найти как сделать так же как в их красивых таймингах в доках на SAM9G45

Код
SMC_reg = (AT91_SMC_Regs*) map(0xFFFFe800);

// NCS_RD_SETUP / NRD_SETUP / NCS_WR_SETUP / NWE_SETUP
SMC_reg->SETUP = 0x01020102; // default 0x01010101

// NCS_RD_PULSE / NRD_PULSE / NCS_WR_PULSE / NWE_PULSE
SMC_reg->PULSE = 0x04020402; // default 0x01010101

// NRD_CYCLE / NWE_CYCLE
SMC_reg->CYCLE = 0x00060006; // default 0x00030003

SMC_reg->MODE = 0x3 | 1<<12; // R/W 16-bit
// SMC_reg->MODE = 0x3; // R/W 8-bit


всего 6 тактов MCK на весь цикл, получилось 140 мегабит/с туда-сюда
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Отладочные платы » SK-AT91SAM9G45(M10)-XC6SLX