Caruso 0 1 октября, 2022 Опубликовано 1 октября, 2022 (изменено) · Жалоба Всем привет. Начну из далека. Нами была разработана электронная плата для ЦОС. На плате установлены ПЛИС серии Kintex7, DAC с полосой 250MГц/32бит, ADC с полосой 250МГц/32бит, 1 слот SODIMM для установки DDR3 1GB. На плате, кроме того, выведен порт PCI (4 линии Gen2) для подключения к материнской плате с ОС Linux. Глобально необходимо реализовать 2 задачи. Первая задача - запись потока с ADC в host. При этом необходимая длительность записи не более 1 секунды. При полосе сигнала 250МГц и ширине 32 бита получается поток поступающий в PCI 1GB/s. Для этого в ПЛИС применяем ядро XDMA, которое имеет вход AXI Stream c2h. К этому входу мы и подключили поток с ADC, конечно через FIFO. Исходили из того предположения, что скорость PCI значительно выше нашего потока и поставленное нами FIFO компенсирует различие скоростей. Вроде бы все заработало и мы можем читать данные больших размеров. Достоверность данных пока не проверяли. Вторая задача все тоже самое но наоборот. Запись с host в DAC. Объемы данных те же. Пытались реализовать это тем же способом, т.е. через FIFO. И вот тут-то выяснилось, что PCI по своей инициативе периодически приостанавливает передачу данных на довольно длительное время (иногда тысячи тактов при частоте 125М), убирая сигнал TVALID с линии. Никакое FIFO не сможет компенсировать такие паузы. Вероятно та же самая проблема возникает и в первой задаче, просто мы не проверяли данные на достоверность. Я понимаю, что напрашивается решение применять DDR3, как промежуточный буфер для чтения и записи. Но перед этим хотелось бы уточнить, есть ли какие - либо способы убрать эти гигантские паузы со стороны hosta, прежде чем ввязываться в эту войну с DDR? Изменено 1 октября, 2022 пользователем Caruso Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 1 2 октября, 2022 Опубликовано 2 октября, 2022 · Жалоба Offtop, но 18 hours ago, Caruso said: ... DAC с полосой 250MГц/32бит, ADC с полосой 250МГц/32бит ... Нифига себе! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 2 октября, 2022 Опубликовано 2 октября, 2022 · Жалоба 37 minutes ago, nice_vladi said: Нифига себе! А что тут удивительного? 2 канала по 16 бит 250 Msps. рядовые ADC/DAC на текущий момент. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dmitry-tomsk 0 2 октября, 2022 Опубликовано 2 октября, 2022 · Жалоба 19 hours ago, Caruso said: Всем привет. Начну из далека. Нами была разработана электронная плата для ЦОС. На плате установлены ПЛИС серии Kintex7, DAC с полосой 250MГц/32бит, ADC с полосой 250МГц/32бит, 1 слот SODIMM для установки DDR3 1GB. На плате, кроме того, выведен порт PCI (4 линии Gen2) для подключения к материнской плате с ОС Linux. Глобально необходимо реализовать 2 задачи. Первая задача - запись потока с ADC в host. При этом необходимая длительность записи не более 1 секунды. При полосе сигнала 250МГц и ширине 32 бита получается поток поступающий в PCI 1GB/s. Для этого в ПЛИС применяем ядро XDMA, которое имеет вход AXI Stream c2h. К этому входу мы и подключили поток с ADC, конечно через FIFO. Исходили из того предположения, что скорость PCI значительно выше нашего потока и поставленное нами FIFO компенсирует различие скоростей. Вроде бы все заработало и мы можем читать данные больших размеров. Достоверность данных пока не проверяли. Вторая задача все тоже самое но наоборот. Запись с host в DAC. Объемы данных те же. Пытались реализовать это тем же способом, т.е. через FIFO. И вот тут-то выяснилось, что PCI по своей инициативе периодически приостанавливает передачу данных на довольно длительное время (иногда тысячи тактов при частоте 125М), убирая сигнал TVALID с линии. Никакое FIFO не сможет компенсировать такие паузы. Вероятно та же самая проблема возникает и в первой задаче, просто мы не проверяли данные на достоверность. Я понимаю, что напрашивается решение применять DDR3, как промежуточный буфер для чтения и записи. Но перед этим хотелось бы уточнить, есть ли какие - либо способы убрать эти гигантские паузы со стороны hosta, прежде чем ввязываться в эту войну с DDR? В pcie есть flow control, можно в теории к нему подключитсья и посмотреть число свободнах буферов для разных типов tlp. Не в курсе, можно ли это сделать для xdma. Если буферы свободные есть, значит виною кривая архитектура драйвера-xdma. Под windows он на приём вообще скорость на порядок губит. Я в своё время пробовал его ставить, плюнул, отложил до лучших времён. alinx с kintex только приехала, как дойдут руки сделаю свою корку и отпишусь. У меня задача выжать максимум на приём, так как нужно 16 плат ацп на 400 мбайт в секунду подключить к пк. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 1 2 октября, 2022 Опубликовано 2 октября, 2022 · Жалоба 3 hours ago, RobFPGA said: А что тут удивительного? 2 канала по 16 бит 250 Msps. рядовые ADC/DAC на текущий момент. Да я, почему-то, подумал про один канал 32 бита 250 MSPS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Caruso 0 2 октября, 2022 Опубликовано 2 октября, 2022 · Жалоба 32 Бита это квадратуры IQ по 16 бит каждая, выходят с фильтра Гилберта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 3 октября, 2022 Опубликовано 3 октября, 2022 (изменено) · Жалоба On 10/2/2022 at 7:43 PM, nice_vladi said: я, почему-то, подумал про один канал 32 бита 250 MSPS а я вначале подумал Quote с полосой 250MГц про полосу аналогового сигнала, т.е. частота отсчетов в 2 раза выше (как минимум)... Изменено 3 октября, 2022 пользователем Yuri124 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 5 3 октября, 2022 Опубликовано 3 октября, 2022 · Жалоба Используйте ДДР для буферизации, драйвер XDMA очень плохо написан. Переделать его не просто. Особенно для работы с ST. Если брать ММ, то есть читать блок фиксированного размера, а потом сколько угодно долго возиться с передачей блока памяти от кернеля юзеру, то результаты скорости передачи неплохие, а непрерывно если читать или писать, то возникают длинные паузы. Я намерял 80мкс паузы, но это мамка и проц хорошие, а говорят за 100 легко. Вариант переписать драйвер так, чтобы железо скатер -гезер дма работало без софта (что теоретически возможно) , но это не каждому под силу, и опенсорсной версии я не нашел. Как оно могло бы работать - посмотрите в утилите performance, там через ioctl вызывается функция, которая данные никуда не отдает, а просто вычитывает через pcie. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться