Sarez 0 27 апреля, 2007 Опубликовано 27 апреля, 2007 · Жалоба Доброго всем дня! Подскажите пожалуйста в следующем вопросе. Имеется стек протоколов на базе чипа Wiznet 3150, он связан с процессором LPC2214 в режиме Direct посредством использования интерфейса внешней шины с использованием 8 разрядной шины данных. Так же в системе имеется ПЛИС ( CoolRunerXPLA3 на 512 макроячеек) -она реализует протокол обмена с остальными устройствами в системе и имеет подключения к шине данных ПРОЦЕССОР - СТЕК. Общая идея такова - данные из компьютера гонятся в стек, реализующий функции сетевого интерфейса, по двум каналам - один управляющий - для процессора, предназначен для приема команд, отдаваемых хостом непосредственно LPC2214 и управляющих процессом приема\передачи данных по второму каналу, второй канал - данные, которые должны загонятся в ПЛИС, и которые ПЛИС гонит дальше по протоколу, который она реализует . Требуется данные загонять в ПЛИС с как можно большей скоростью. Поэтому вопрос следующий - каким образом можно связать стек и ПЛИС, чтобы добится максимального быстродействия? У меня следующие варианты : 1) Возможно ли организовать обмен так , чтобы плис ловила посылки данных , передаваемые от стека к процессору? Поцессор начинал бы прием данных с выставления флага на одном из выводов , плис по этому флагу ловила бы посылки от стека. В функции процессора входило бы управление стеком и обработка флагов от плис (. Вопрос в том, как засинхронизировать работу плис и контроллера со стеком, чтобы плис ловила требуемые посылки....Либо задержки считать, либо по числу тактов... Как в таком случае можно посчитать количество тактов, необходимое для определенного куска кода....( работаю в IAR 4.40, есть ли там , как KEIL счетчик тактов? ) 2) Буферизовать данные со стека в памяти процессора , а затем передавать их из процессора в плис. Во первых , получается большая временная задержка : считывание из стека - запись в ОЗУ процессора - считывание из ОЗУ процессора - ПЛИС. Плюс постоянное переключение между стеком и плис. Во вторых, не хотелось бы тратить ОЗУ процессора на реализацию больших буферов. В третьих - придется тратить ресурсы ПЛИС на реализацию интерфейся памяти, чтобы обмениваться данными с процессором. 3) Вариант №1 , но буферизировать данные не в памяти процессора, а во внешней ОЗУ... Здесь есть ряд вопросов - возможно ли перекопировать данные из памяти стека в память внешнего ОЗУ напрямую ? Например используя memcpy : void *memcpy(void *s1, const void *s2, size_t n) { char *su1 = (char *)s1; // адрес памяти стека const char *su2 = (const char *)s2; // адрес памяти внешнего ОЗУ for (; 0 < n; ++su1, ++su2, --n) { *su1 = *su2; } return (s1); } Заранее спасибо за ответы!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chan 0 28 апреля, 2007 Опубликовано 28 апреля, 2007 · Жалоба Варианты 2 и 3 не очень согласуются с поставленной задачей. Буферизация в данном случае сильно ограничит пропускную способность и при наличии внутренней памяти визнета бессмысленна. В варианте 1 можно перевести ПЛИС в режим подслушки - проц будет задатчиком обмена (чтения данных в никуда) а ПЛИС будет эти данные синхронно перехватывать. В ПЛИС пойдет сигнал разрешения перехвата. Реализация работы с указателями будет в проце потому как в 3150 придется делать честный циклический буфер, в 3100 была возможность сбрасывать указатели. Но в этом случае ПЛИС должна брабатывать данные быстрее чтения их процом - или придется вводить такты ожидания. Можно еще реализовать подобие ДМА - проц передает в ПЛИС начало буфера и размер а дальше ждет сигнала завершения обмена - но в отладке этот способ сложнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться