реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как правильно синхронизировать SGDMA?
smersh
сообщение Mar 8 2016, 14:33
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 33
Регистрация: 19-06-04
Пользователь №: 64



Здравствуйте, коллеги!
Вот такая связка:

АЦП-----ОБРАБОТКА-----FIFO-----SGDMA----NIOSII

Вопрос не по реализации, с ней все нормально, а по алгоритму. Дело в том, что здесь АЦП производит 256 измерений последовательно от 256 разных каналов и т.д. по кругу. Важен порядковый номер каждого байта, принятого в буфер ДМА.

Если по каким-то причинам пропускаетcя байт от АЦП, буфер теряет синхронность, нулевой байт уже не соответствует нулевому каналу и возникает “кольцевой” сдвиг. Причем этот сдвиг остается и при следующем трансфере.

Как с этим бороться? Нужно придумать механизм самосинхронизации.

Дополнительно нумеровать байты очень не хочется (например, можно добавить один бит и выставлять его только для нулевого канала). Сбрасывать фифо не получается, т.к. оно заполняется непрерывно; в прерывании, возникающем по окончании ДМА трансфера этого делать нельзя, потому что фифа уже начала заполняться новыми данными.

На самом деле такой потери синхронизации в железе не наблюдается, если только ее не вызвать намеренно, например прервав и запустив программу в дебагере. Но все, что может произойти, как известно, произойдет...

Спасибо!
NJ
Go to the top of the page
 
+Quote Post
des00
сообщение Mar 8 2016, 14:41
Сообщение #2


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Заменить фифо на рам.


--------------------
Go to the top of the page
 
+Quote Post
smersh
сообщение Mar 8 2016, 15:31
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 33
Регистрация: 19-06-04
Пользователь №: 64



QUOTE (des00 @ Mar 8 2016, 18:41) *
Заменить фифо на рам.


Вах!!! Спасибо. (Почему я не догадался sm.gif )
Go to the top of the page
 
+Quote Post
sprutkmv
сообщение Mar 9 2016, 07:02
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 17-09-08
Пользователь №: 40 284



Цитата(smersh @ Mar 8 2016, 18:33) *
Здравствуйте, коллеги!
Вот такая связка:

АЦП-----ОБРАБОТКА-----FIFO-----SGDMA----NIOSII

Вопрос не по реализации, с ней все нормально, а по алгоритму. Дело в том, что здесь АЦП производит 256 измерений последовательно от 256 разных каналов и т.д. по кругу. Важен порядковый номер каждого байта, принятого в буфер ДМА.

Если по каким-то причинам пропускаетcя байт от АЦП, буфер теряет синхронность, нулевой байт уже не соответствует нулевому каналу и возникает “кольцевой” сдвиг. Причем этот сдвиг остается и при следующем трансфере.

Как с этим бороться? Нужно придумать механизм самосинхронизации.

Дополнительно нумеровать байты очень не хочется (например, можно добавить один бит и выставлять его только для нулевого канала). Сбрасывать фифо не получается, т.к. оно заполняется непрерывно; в прерывании, возникающем по окончании ДМА трансфера этого делать нельзя, потому что фифа уже начала заполняться новыми данными.

На самом деле такой потери синхронизации в железе не наблюдается, если только ее не вызвать намеренно, например прервав и запустив программу в дебагере. Но все, что может произойти, как известно, произойдет...

Спасибо!
NJ



АЦП пишет в промежуточный буфер, далее проверяем количество записей. Если количество соответствует, переписываем их в кольцевой буфер. Придется добавить еще один буфер и еще один ДМА.
И еще вопрос, по каким причинам АЦП может не выдать байт?
можно сделать проверку, что если какой то канал не выдал данные тогда принудительно выставить какое то значение.
Go to the top of the page
 
+Quote Post
Timmy
сообщение Mar 9 2016, 09:29
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Цитата(smersh @ Mar 8 2016, 17:33) *
Если по каким-то причинам пропускаетcя байт от АЦП, буфер теряет синхронность, нулевой байт уже не соответствует нулевому каналу и возникает “кольцевой” сдвиг. Причем этот сдвиг остается и при следующем трансфере.

Как с этим бороться? Нужно придумать механизм самосинхронизации.

Можно использовать разбивку на пакеты(добавить, соответственно, пару сигналов к Avalon-stream). SGDMA вроде как умеет принимать по одному пакету на дескриптор, если в дескрипторе указана нулевая длина(потенциальная дыра в безопасности доступа к памяти, хм).
Go to the top of the page
 
+Quote Post
des00
сообщение Mar 9 2016, 09:42
Сообщение #6


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(sprutkmv @ Mar 9 2016, 15:02) *
АЦП пишет в промежуточный буфер, далее проверяем количество записей. Если количество соответствует, переписываем их в кольцевой буфер. Придется добавить еще один буфер и еще один ДМА.

О времена.... банальный 2D буфер (5 минут работы) решит все проблемы, без кучи всякой обвески


--------------------
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Mar 9 2016, 11:50
Сообщение #7


отэц
*****

Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684



Цитата(des00 @ Mar 9 2016, 13:42) *
О времена.... банальный 2D буфер (5 минут работы) решит все проблемы, без кучи всякой обвески

..а что такое - 2D буфер ?


--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0
SHA-256
Go to the top of the page
 
+Quote Post
des00
сообщение Mar 9 2016, 14:58
Сообщение #8


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Lmx2315 @ Mar 9 2016, 18:50) *
..а что такое - 2D буфер ?

http://electronix.ru/forum/index.php?act=A...st&id=23544


--------------------
Go to the top of the page
 
+Quote Post
Bad0512
сообщение Mar 10 2016, 04:32
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Цитата(des00 @ Mar 9 2016, 20:58) *

2007 год, VHDL... 9 лет прошло...
Go to the top of the page
 
+Quote Post
smersh
сообщение Mar 10 2016, 12:29
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 33
Регистрация: 19-06-04
Пользователь №: 64



QUOTE (des00 @ Mar 9 2016, 13:42) *
О времена.... банальный 2D буфер (5 минут работы) решит все проблемы, без кучи всякой обвески

Еще раз спасибо за идею. Я использовал Onchip Memory в режиме Dual-port access. Второй порт выведен из ниоса, в него пишутся данные и по окончанию цикла генерируется прерывание.

Все получилось в разы компактнее и проще, чем с ДМА. Конечно, такое пройдет только с Ниосом, куда возможно встроить блок.

NJ

QUOTE (sprutkmv @ Mar 9 2016, 11:02) *
И еще вопрос, по каким причинам АЦП может не выдать байт?
можно сделать проверку, что если какой то канал не выдал данные тогда принудительно выставить какое то значение.


АЦП не может не выдать. Может случиться, что его не заберет ДМА и ФИФО не опустошится. Тогда лишние байты в ФИФО останутся навсегда, если не принять никаких мер. (Или заберет не все байты, т.к. ДМА каждый цикл надо перезапускать из софта. Сделать режим Ping-Pong без управления ДМА из прерывания у меня не получилось)

NJ
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 06:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.02648 секунд с 7
ELECTRONIX ©2004-2016