Могу ли я читать/записывать из того же буфера, используя при этом тройной буфер кадров?

Мне нужно построить видео с прямым доступом к памяти (VDMA), который читает и записывает видео с разрешением 4k в DDR3 и обратно. Я хочу использовать тройную буферизацию кадров (спецификации клиента), но я также хочу иметь возможность считывать данные из того же буфера, когда они записываются (с определенной задержкой из-за разных частот чтения/записи). Насколько я понимаю, тройной буфер кадров на большинстве стандартных IP-адресов (например, Xilinx AXI Vdma Core IP) «блокирует» каждый буфер для одной конкретной функции и использует третий резервный буфер для переключения функций в случае, если они не синхронизированы. Но как я могу «разблокировать» это, чтобы иметь возможность читать тот же буфер, что и пишется?


person Ioakoutsiouk    schedule 15.07.2015    source источник


Ответы (1)


Вы должны посмотреть на параметры генлока ядра VDMA, это позволит вам делать именно то, что вы хотите. Однако это очень плохая идея.

Во-первых, даже если вы читаете тот же записанный кадр, вы, скорее всего, прочитаете недопустимые пиксели, если ваше чтение будет быстрее, чем видео (что и должно быть). Невозможно остановить чтение VDMA, чтобы оно не догнало запись, синхронизация выполняется по кадрам, синхронизации внутри кадра нет. Обратите внимание, что поведение AXI по умолчанию заключается в предоставлении более высокого приоритета доступу для чтения.

Во-вторых, вам это действительно не нужно. Просто сохраните входное видео в FIFO, чтобы синхронизировать домены, в то же время, когда вы отправляете его в фреймбуфер VDMA. Пока ваша функция чтения работает достаточно быстро и FIFO имеет достаточный размер, вы сэкономите драгоценную пропускную способность/мощность памяти.

Не забывайте, что поток 4k 30 кадров в секунду с дискретизацией 4:2:2 требует пропускной способности памяти 4 Гбит/с. Если вы пишете его один раз и читаете дважды, как вы предлагаете, вам потребуется эффективная пропускная способность памяти 12 Гбит/с, что уже становится много. Если ваш 4k-поток использует 4:4:4 или 60 кадров в секунду, вам потребуется гораздо большая пропускная способность памяти.

Вы действительно должны попытаться предотвратить запись/чтение памяти. Если вам нужно прочитать входящий видеопоток (с другой частотой), когда вы записываете его в буфер кадра, сделайте все возможное, чтобы предотвратить другое чтение памяти и вместо этого используйте FIFO.

person Jonathan Drolet    schedule 15.07.2015
comment
Спасибо за информацию. Я должен использовать поток 4K. У меня нет проблем с пропускной способностью, мое требование № 1 — максимальное качество потока и минимальная задержка. У меня есть вход Ethernet 4x10 ГБ. Чтение в два раза быстрее (120 Гц против 60 Гц), но оно будет считываться из двух функций записи. Не могли бы вы подробнее рассказать об использовании FIFO? Что вы подразумеваете под доменами кросс-часов? Вы предлагаете записывать как в DDR, так и в FIFO, а функция чтения использует FIFO, а не память? Кроме того, мне, вероятно, придется спроектировать ядро ​​самостоятельно, поскольку стандартные IP-адреса не могут помочь мне с обрезкой кадров, что также является обязательным требованием. - person Ioakoutsiouk; 16.07.2015