smersh 0 8 марта, 2016 Опубликовано 8 марта, 2016 · Жалоба Здравствуйте, коллеги! Вот такая связка: АЦП-----ОБРАБОТКА-----FIFO-----SGDMA----NIOSII Вопрос не по реализации, с ней все нормально, а по алгоритму. Дело в том, что здесь АЦП производит 256 измерений последовательно от 256 разных каналов и т.д. по кругу. Важен порядковый номер каждого байта, принятого в буфер ДМА. Если по каким-то причинам пропускаетcя байт от АЦП, буфер теряет синхронность, нулевой байт уже не соответствует нулевому каналу и возникает “кольцевой” сдвиг. Причем этот сдвиг остается и при следующем трансфере. Как с этим бороться? Нужно придумать механизм самосинхронизации. Дополнительно нумеровать байты очень не хочется (например, можно добавить один бит и выставлять его только для нулевого канала). Сбрасывать фифо не получается, т.к. оно заполняется непрерывно; в прерывании, возникающем по окончании ДМА трансфера этого делать нельзя, потому что фифа уже начала заполняться новыми данными. На самом деле такой потери синхронизации в железе не наблюдается, если только ее не вызвать намеренно, например прервав и запустив программу в дебагере. Но все, что может произойти, как известно, произойдет... Спасибо! NJ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 марта, 2016 Опубликовано 8 марта, 2016 · Жалоба Заменить фифо на рам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smersh 0 8 марта, 2016 Опубликовано 8 марта, 2016 · Жалоба Заменить фифо на рам. Вах!!! Спасибо. (Почему я не догадался :) ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sprutkmv 0 9 марта, 2016 Опубликовано 9 марта, 2016 · Жалоба Здравствуйте, коллеги! Вот такая связка: АЦП-----ОБРАБОТКА-----FIFO-----SGDMA----NIOSII Вопрос не по реализации, с ней все нормально, а по алгоритму. Дело в том, что здесь АЦП производит 256 измерений последовательно от 256 разных каналов и т.д. по кругу. Важен порядковый номер каждого байта, принятого в буфер ДМА. Если по каким-то причинам пропускаетcя байт от АЦП, буфер теряет синхронность, нулевой байт уже не соответствует нулевому каналу и возникает “кольцевой” сдвиг. Причем этот сдвиг остается и при следующем трансфере. Как с этим бороться? Нужно придумать механизм самосинхронизации. Дополнительно нумеровать байты очень не хочется (например, можно добавить один бит и выставлять его только для нулевого канала). Сбрасывать фифо не получается, т.к. оно заполняется непрерывно; в прерывании, возникающем по окончании ДМА трансфера этого делать нельзя, потому что фифа уже начала заполняться новыми данными. На самом деле такой потери синхронизации в железе не наблюдается, если только ее не вызвать намеренно, например прервав и запустив программу в дебагере. Но все, что может произойти, как известно, произойдет... Спасибо! NJ АЦП пишет в промежуточный буфер, далее проверяем количество записей. Если количество соответствует, переписываем их в кольцевой буфер. Придется добавить еще один буфер и еще один ДМА. И еще вопрос, по каким причинам АЦП может не выдать байт? можно сделать проверку, что если какой то канал не выдал данные тогда принудительно выставить какое то значение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 9 марта, 2016 Опубликовано 9 марта, 2016 · Жалоба Если по каким-то причинам пропускаетcя байт от АЦП, буфер теряет синхронность, нулевой байт уже не соответствует нулевому каналу и возникает “кольцевой” сдвиг. Причем этот сдвиг остается и при следующем трансфере. Как с этим бороться? Нужно придумать механизм самосинхронизации. Можно использовать разбивку на пакеты(добавить, соответственно, пару сигналов к Avalon-stream). SGDMA вроде как умеет принимать по одному пакету на дескриптор, если в дескрипторе указана нулевая длина(потенциальная дыра в безопасности доступа к памяти, хм). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 9 марта, 2016 Опубликовано 9 марта, 2016 · Жалоба АЦП пишет в промежуточный буфер, далее проверяем количество записей. Если количество соответствует, переписываем их в кольцевой буфер. Придется добавить еще один буфер и еще один ДМА. О времена.... банальный 2D буфер (5 минут работы) решит все проблемы, без кучи всякой обвески Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 9 марта, 2016 Опубликовано 9 марта, 2016 · Жалоба О времена.... банальный 2D буфер (5 минут работы) решит все проблемы, без кучи всякой обвески ..а что такое - 2D буфер ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 9 марта, 2016 Опубликовано 9 марта, 2016 · Жалоба ..а что такое - 2D буфер ? http://electronix.ru/forum/index.php?act=A...st&id=23544 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 10 марта, 2016 Опубликовано 10 марта, 2016 · Жалоба http://electronix.ru/forum/index.php?act=A...st&id=23544 2007 год, VHDL... 9 лет прошло... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smersh 0 10 марта, 2016 Опубликовано 10 марта, 2016 · Жалоба О времена.... банальный 2D буфер (5 минут работы) решит все проблемы, без кучи всякой обвески Еще раз спасибо за идею. Я использовал Onchip Memory в режиме Dual-port access. Второй порт выведен из ниоса, в него пишутся данные и по окончанию цикла генерируется прерывание. Все получилось в разы компактнее и проще, чем с ДМА. Конечно, такое пройдет только с Ниосом, куда возможно встроить блок. NJ И еще вопрос, по каким причинам АЦП может не выдать байт? можно сделать проверку, что если какой то канал не выдал данные тогда принудительно выставить какое то значение. АЦП не может не выдать. Может случиться, что его не заберет ДМА и ФИФО не опустошится. Тогда лишние байты в ФИФО останутся навсегда, если не принять никаких мер. (Или заберет не все байты, т.к. ДМА каждый цикл надо перезапускать из софта. Сделать режим Ping-Pong без управления ДМА из прерывания у меня не получилось) NJ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться