Перейти к содержанию
    

Построение упаковщика данных

Доброго времени суток!

Коротко о насущном.

Имеется плата с установленными 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).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какой интерфейс передачи данных из FPGA в DSP и скольки разрядное АЦП? Если используете что-то типа EMIF, XINTF или что-то, что DSP может "понимать" как внешнюю память, то выбор нужных каналов проще реализовать на DSP.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Какая религия мешает Вам производить опрос "буферных регистров" последовательно и записывать в FIFO те из них, в которых есть нужные данные?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть пожелание передавать данные блоками "максимальной длины" (для программиста это значение в десятки кБ, я ограничен ресурсами ПЛИС и максимум смог бы согласиться на 8кБ). В реалии договорились на блок из 256 Б (попробуем, а дальше примем решение - потянем или нет).

В протоколе управления, заложена возможность ввода "используемых АЦП". Из беседы (пока краткой) понял что в ПЛИС передается один байт, в котором каждый бит указывает будут ли включаться данные с АЦП в протокол или нет.

 

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

Я бы поменял протокол, передавал бы фиксированное количество точек с каждого канала, а длина пакета зависела бы от количества выбранных каналов и фиксированного числа точек. DSP задаёт Вам какие каналы выбрать, т.е. при фиксированном количестве точек с каждого канала, он может определить длину пакета. В Вашем случае, для каких-то каналов передаётся одно число точек, для других другое, потом надо думать, как это всё склеить, сложнее получается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

DSP должен всем рулить! а альтера обычный дешифратор нужной разрядности = разрядности АЦП.

3-мя ногами DSP адресуем АЦП и транслируем выбранную шину АЦП прям на шину данных DSP, DSP делает строб считывания и забирает данные с АЦП.

МАХ2 с нужным числом портов справится на ура.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какая религия мешает Вам производить опрос "буферных регистров" последовательно и записывать в FIFO те из них, в которых есть нужные данные?

Этот хитрый узел, как раз и должен последовательно брать данные из нужных регистров и подавать на вход внутренней памяти. А уж как она представлена в виде двухпортовки или FIFO - мне кажется это не принципиально.

В любом случае, необходимо формировать разные последовательности управления мультиплексором. И тут появился вопрос из первого поста - как обойти рутину? Делать влоб - таблица на 65024 состояния, из которых 2^8 это функция от адреса и чуть меньше - функция от регистра "разрешенных" АЦП.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В любом случае, необходимо формировать разные последовательности управления мультиплексором. И тут появился вопрос из первого поста - как обойти рутину? Делать влоб - таблица на 65024 состояния, из которых 2^8 это функция от адреса и чуть меньше - функция от регистра "разрешенных" АЦП.

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

 

Если есть запас тактовой, то все еще примитивнее. Регистр масок взвели и сдвигаем по 1 биту анализируя нужно ли передавать канал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А зачем вообще нужны режимы с частью непередаваемых данных?

Может это и не спортивно, но как вариант:

Превратить хитроумный узел в тупое устройство. DSP всегда считывает с ПЛИС одну и ту же последовательность А1 - А8/А1 - А8... А использует те данные, которые ему нужны.

Изменено пользователем olegras

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Этот хитрый узел, как раз и должен последовательно брать данные из нужных регистров и подавать на вход внутренней памяти. А уж как она представлена в виде двухпортовки или FIFO - мне кажется это не принципиально.

В любом случае, необходимо формировать разные последовательности управления мультиплексором. И тут появился вопрос из первого поста - как обойти рутину? Делать влоб - таблица на 65024 состояния, из которых 2^8 это функция от адреса и чуть меньше - функция от регистра "разрешенных" АЦП.

Ну как бы есть такие последовательные конструкции как if ... else if ... else if... :1111493779:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может это и не спортивно, но как вариант:

Превратить хитроумный узел в тупое устройство. DSP всегда считывает с ПЛИС одну и ту же последовательность А1 - А8/А1 - А8... А использует те данные, которые ему нужны.

Общался с идейными вдохновителями, и как раз такой вариант предложил. Собственно на нем и ставим точку.

Ну как бы есть такие последовательные конструкции как if ... else if ... else if...

Кэп, конструкции if...else и есть тот самый case в первом посте, 4-я строка снизу. Только case почти в три раза короче :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кэп, конструкции if...else и есть тот самый case в первом посте, 4-я строка снизу. Только case почти в три раза короче :rolleyes:

Если что, я не про 65000 строк писал, а про восемь. Но если это для Вас слишком просто - дело Ваше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...