Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Построение упаковщика данных
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Александр77
Доброго времени суток!
Коротко о насущном.
Имеется плата с установленными 8-ю АЦП, формирующие синхронный "срез" группы сигналов. Управление производится ПЛИСиной (минимальный циклон2/3).
Предполагается трансляция данных на обработку в DSP.
Есть пожелание передавать данные блоками "максимальной длины" (для программиста это значение в десятки кБ, я ограничен ресурсами ПЛИС и максимум смог бы согласиться на 8кБ). В реалии договорились на блок из 256 Б (попробуем, а дальше примем решение - потянем или нет).
В протоколе управления, заложена возможность ввода "используемых АЦП". Из беседы (пока краткой) понял что в ПЛИС передается один байт, в котором каждый бит указывает будут ли включаться данные с АЦП в протокол или нет.
В качестве исходного проекта решил сделать так:
1) детектор старта;
2) узел запуска АЦП и записи в данных в буферные регистры;
3) мультиплексор для опроса регистров и выдачи данных в двухпортовое ОЗУ. Получается 3 линии выбора номера АЦП;
4) некий блок/узел показывающий записывать данные или нет;
5) счетчик адреса записываемого отсчета АЦП;
6) двухпортовое ОЗУ.
Возникли сомнения в реализации "некоего блока" из п 4.
Если рассматривать ситуацию, когда выбраны все АЦП, то этот блок как бы и не нужен, достаточно соединить младшие биты счетчика с входом управления мультиплексора и все пишется как надо в ОЗУ.
Например, А1/А2/А3/А4/А5/А6/А7/А8/А1/А2/..../А6/А7/А8/
Обратная ситуация, когда не выбран ни один АЦП не имеет смысла - ибо зачем формировать протокол в котором нет никаких данных.
Гораздо запутаннее получаются режимы с частью непередаваемых данных.
Например исключили АЦП 5, А1/А2/А3/А4/А6/А7/А8/А1/А2/А3/А4/А6/А7/А8/А1/....
Если исходить из того, что пакет должен быть фиксированной длины (256 Б), то напрашивается достаточно хитроумный формирователь адреса для мультиплексора. Количество состояний по моей оценке, чуть меньше 2^16.
Делать такой case на 65 килострок - явный путь в психушку. (даже если набирать строку за полминуты уйдет примерно дней 70).
Выполнить ПЗУ с 3-хбитным выходом на 65 килострок - тоже долго и нудно.
Что еще можно предпринять для того, что бы сформировать этот "хитрый выбор" АЦП?
ПыСы. Данные будут чуть длиннее, т.к. предполагается их обрамить признаком начала передачи и проверочным "хвостом"(контрольная сумма или CRC).
doom13
Какой интерфейс передачи данных из FPGA в DSP и скольки разрядное АЦП? Если используете что-то типа EMIF, XINTF или что-то, что DSP может "понимать" как внешнюю память, то выбор нужных каналов проще реализовать на DSP.
o_khavin
Цитата
Если исходить из того, что пакет должен быть фиксированной длины (256 Б), то напрашивается достаточно хитроумный формирователь адреса для мультиплексора. Количество состояний по моей оценке, чуть меньше 2^16.

Какая религия мешает Вам производить опрос "буферных регистров" последовательно и записывать в FIFO те из них, в которых есть нужные данные?
doom13
Цитата(Александр77 @ May 28 2014, 22:39) *
Есть пожелание передавать данные блоками "максимальной длины" (для программиста это значение в десятки кБ, я ограничен ресурсами ПЛИС и максимум смог бы согласиться на 8кБ). В реалии договорились на блок из 256 Б (попробуем, а дальше примем решение - потянем или нет).
В протоколе управления, заложена возможность ввода "используемых АЦП". Из беседы (пока краткой) понял что в ПЛИС передается один байт, в котором каждый бит указывает будут ли включаться данные с АЦП в протокол или нет.

Если исходить из того, что пакет должен быть фиксированной длины (256 Б), то напрашивается достаточно хитроумный формирователь адреса для мультиплексора. Количество состояний по моей оценке, чуть меньше 2^16.

Я бы поменял протокол, передавал бы фиксированное количество точек с каждого канала, а длина пакета зависела бы от количества выбранных каналов и фиксированного числа точек. DSP задаёт Вам какие каналы выбрать, т.е. при фиксированном количестве точек с каждого канала, он может определить длину пакета. В Вашем случае, для каких-то каналов передаётся одно число точек, для других другое, потом надо думать, как это всё склеить, сложнее получается.
vadimp61
DSP должен всем рулить! а альтера обычный дешифратор нужной разрядности = разрядности АЦП.
3-мя ногами DSP адресуем АЦП и транслируем выбранную шину АЦП прям на шину данных DSP, DSP делает строб считывания и забирает данные с АЦП.
МАХ2 с нужным числом портов справится на ура.
Александр77
Цитата(o_khavin @ May 29 2014, 01:01) *
Какая религия мешает Вам производить опрос "буферных регистров" последовательно и записывать в FIFO те из них, в которых есть нужные данные?

Этот хитрый узел, как раз и должен последовательно брать данные из нужных регистров и подавать на вход внутренней памяти. А уж как она представлена в виде двухпортовки или FIFO - мне кажется это не принципиально.
В любом случае, необходимо формировать разные последовательности управления мультиплексором. И тут появился вопрос из первого поста - как обойти рутину? Делать влоб - таблица на 65024 состояния, из которых 2^8 это функция от адреса и чуть меньше - функция от регистра "разрешенных" АЦП.
des00
Цитата(Александр77 @ May 29 2014, 09:36) *
В любом случае, необходимо формировать разные последовательности управления мультиплексором. И тут появился вопрос из первого поста - как обойти рутину? Делать влоб - таблица на 65024 состояния, из которых 2^8 это функция от адреса и чуть меньше - функция от регистра "разрешенных" АЦП.

в чем проблема то ? есть регистр масок, где ставите метку что канал нужно читать, потом делаете функцию типа get_first_idx(mask_reg) и получаете индекс канала который читаете, после прочтения его маску сбрасываете. по окончании цикла снова взводите регистр масок.

Если есть запас тактовой, то все еще примитивнее. Регистр масок взвели и сдвигаем по 1 биту анализируя нужно ли передавать канал.
olegras
А зачем вообще нужны режимы с частью непередаваемых данных?
Может это и не спортивно, но как вариант:
Превратить хитроумный узел в тупое устройство. DSP всегда считывает с ПЛИС одну и ту же последовательность А1 - А8/А1 - А8... А использует те данные, которые ему нужны.
o_khavin
Цитата(Александр77 @ May 29 2014, 06:36) *
Этот хитрый узел, как раз и должен последовательно брать данные из нужных регистров и подавать на вход внутренней памяти. А уж как она представлена в виде двухпортовки или FIFO - мне кажется это не принципиально.
В любом случае, необходимо формировать разные последовательности управления мультиплексором. И тут появился вопрос из первого поста - как обойти рутину? Делать влоб - таблица на 65024 состояния, из которых 2^8 это функция от адреса и чуть меньше - функция от регистра "разрешенных" АЦП.

Ну как бы есть такие последовательные конструкции как if ... else if ... else if... 1111493779.gif
Александр77
Цитата(olegras @ May 29 2014, 09:32) *
Может это и не спортивно, но как вариант:
Превратить хитроумный узел в тупое устройство. DSP всегда считывает с ПЛИС одну и ту же последовательность А1 - А8/А1 - А8... А использует те данные, которые ему нужны.

Общался с идейными вдохновителями, и как раз такой вариант предложил. Собственно на нем и ставим точку.
Цитата(olegras)
Ну как бы есть такие последовательные конструкции как if ... else if ... else if...

Кэп, конструкции if...else и есть тот самый case в первом посте, 4-я строка снизу. Только case почти в три раза короче rolleyes.gif
o_khavin
Цитата(Александр77 @ May 29 2014, 18:03) *
Кэп, конструкции if...else и есть тот самый case в первом посте, 4-я строка снизу. Только case почти в три раза короче rolleyes.gif

Если что, я не про 65000 строк писал, а про восемь. Но если это для Вас слишком просто - дело Ваше.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.