ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 июля
298430
Evgeny_CD, Архитектор (11.01.2012 18:25, просмотров: 14552)
Эмуляция параллельной шины посредством IO LPC12xx. Вопросы. Пусть у меня есть FPGA. Простенькая. Мне надо считать из нее блок 32 байта, сделать простую обработку, и отправить назад 4 байта. Если все в памяти, то обработка занимает, скажем, 1 или 2 мкс. Обработка простая, но в FPGA она не будет. Например потому, что у нее нет ресурсов (основа - табличное преобразование), обработка плохо распараллеливается, и потому, что в процессе участвует PC. Из принятого блока я отбираю биты для статистики (идет в PC отдельным фоновым процессом), и, кроме того, по команде от PC я переключаю обработку. В LPC12xx SPI, как я понял, можно разогнать на 15 Мбит (30 МГц/2, без тактов ожидания FLASH, предпочтительно), или даже на 22 Мбит (45/2). Но все равно, при 15 Мбит свои 32 байта я буду сосать из FPGA я буду сосать 17 мкс, что не канает. С чтением все, как мне представляется, неплохо. Заводим один из каналов DMA на запрос от порта IO. FPGA выставляет данные параллельно, дергает за IO, DMA читает и кладет куда надо. С записью чуток сложнее. Если делать процессором, то можно записать значение в выходной регистр и бит в регистр инверсии отдельного IO (любой фронт - строб для FPGA). Две записи от процессора (но поскольку записи у меня гораздо меньше, чем чтения - то терпимо). При записи DMA строб автоматом не сформировать (как я понял). Далее надо либо вводить запись слова ширины большей, чем надо (и кодировать прогораммно в излишних битах стробы), либо сам выходной сигнал кодировать так, чтобы в каждом следующем слове обязательно отличался хотя бы один бит. Вопрос - насколько быстро удается програмно сгенерить меандр на IO LPC12xx? Есть ли у кого опыт? Отдельный вопрос - кадровая синхронизация передваемых блоков данных. Я вот что думаю. Из FPGA данные идут словами большей ширины. Младшая часть - данные, старшие биты - квалификатор. Типа начало пакета, конец и пр. DMA имеет 2 дескриптора и крутится по кольцу. Буфер - это массив юнионов. U32, и структура из младшей и старшей U16. При поиске пакета в буфере начинаем щелкать индексом массива структур из двух половинок, и ищем нужное поле в старшей U16 (физически из FPGA может вообще 17 бит идти, условно). Далее работаем с тем же массивом структур, но уже с младшими половинками. Для проверки ищем, что признак конца идет через нужное число элементов в буфере. Вопрос - на С все эти юнионы и структуры опишутся нормально, как это лучше сделать? Может, какой другой способ удобнее есть? Чтобы младшие U16 "сращивались" в единый массив без пропусков сами, чтобы в этой "срощенном" массиве с U32 можно было работать... Блок данных имеет произвольный набор данных, байт стаффинг нарушит всю обработку и нафиг не нужен. ВОт почему эти пеньки не сделали паралельную шину хоть какую-нибудь для LPC12xx? Хоть как в микрочипах - и то хлеб.