Evgeny_CD, Архитектор (12.01.2012 11:11, просмотров: 205) ответил =AlexD= на С записью сделать так-же как и с чтением, т.е. ФПГА дёргает пин ИО для того, что-бы прочитать данные с ИО, а проц по ДМА засылает данные В ИО. Фреймовую синхронизацию так-же можно сделать по инициативе ФПГА.
koyodza тоже предложил изящное решение - таймер генерит строб для FPGA и одновременно запрос для DMA. Но тут есть вот какая штука. Хотя на структурке LPC12xx нарисован шинный коммутатор, нужно еще понять - сколько транзакций одновременно он тянет. ОЗУ однобанковое, с одним портом на шину. DMA, вероятно, не зря micro называется. Хотя каналов там дофига, в каждый момент времени работает только один. В итоге на шине и в ОЗУ может получиться пролная толкотня, которая приведет к непредсказуемым задержкам.
+ DMA не умеет ресайзить данные. Какой шрины прочитало, такой и запишет.
Т.е. если таймер ставить на высокую частоту - то может и не успеть. А если на низкую - латентность будет приличной.
С запросом от FPGA почти как с таймером. Т.е. дернула она пин. Через какое-то время DMA соизволило записать в порт нужное значение. Но при самой записи строба нет. Еслим новое значение отличается от старого - ок, FPGA вкурит, что новое пришло. А ну как значения совпадут? Т.е. придется надеяться на то, что вот такой-то задержки гаранатированно хватит.
Но это ОЧЕНЬ опасное предположение. И потом будет очень трудно найти, от чего оно раз в час падает....
В обсчем, реально напрашиваются 2 бита "расширения" слов, которые передаются в FPGA. Один бит - генератор строба, второй бит - признак фреймовой синхронизации.
Большой + IO структуры LPC12xx (может и других LPC - я пока в такие дебри не лез)- наличие порта инверсии выходного значение.
Это значит, что за счет атоммарной записи можно гарантированного сгенерить строб - фронт. В FPGA обнаружитель произвольного фронта сделать не сложно.
Был бы еще регистр - "обнаружение изменений на IO порту" - ваще была бы красота! Прочитал атоммарно, наложил маску - и знаешь, есть у тебя сигнал или нет.
Хотя прочитать порт, наложить маску и сравнить со значением в ОЗУ тоже много тактов не займет. Но вот отсуствие атомманости раздражает. Вдруг тебя прервали, и FPGA успела несколько раз сигнал выставить. А ты считаешь только один.