Какой тип памяти позволяет выполнять большинство параллельных операций чтения/записи за такт в FPGA?

Если вы представляете базовое обнаружение движения, в котором у вас есть два кадра, хранящихся в памяти: предыдущий кадр 640x480 и текущий кадр 640x480, какой тип памяти (SRAM, DRAM, SDRAM, DDR SDRAM и т. д.) позволит выполнять наиболее параллельное чтение/ запись операций за такт ? Например, идеальным решением было бы одновременное считывание двух кадров (307 200 x 2 пикселя) за один такт. Какая память лучше для этого, SRAM, встроенная в FPGA, или внешняя микросхема, такая как DDR SDRAM? (В более широком смысле я бы искал плату разработки FPGA, которая имеет наименьшую стоимость и размер с самой большой способностью параллельного чтения/записи.)

Действительно? Если вы предполагаете 24-битный цвет, для этого потребуется 14,74 Мбит на такт, поэтому даже если вы используете DDR, для этого потребуется 7 миллионов контактов! Зачем вам такие скорости?
Благодаря FPGA высокого класса и 64-битной памяти DDR3, работающей на тактовой частоте 800 МГц, вы сможете передавать данные со скоростью примерно 100 Гбит/с. Таким образом, для копирования двух кадров потребуется примерно 150 мкс.
Virtex-7 X1140T имеет 1880 блоков ОЗУ каждый с 72-битным интерфейсом -> 135,360 бит за цикл. Вернемся к обычным устройствам... Обычно можно оценить, сколько МБ/с требуется для определенного алгоритма...
Virtex-7 или DDR3 800MHz fpga не являются «самыми маленькими по стоимости и размеру». @ user2514676, я думаю, вы неправильно подходите к проблеме. Большинство видеоприложений (никогда не занимавшихся обнаружением движения, но я уверен, что это не «особое») считывают каждый пиксель кадра один раз за проход, сохраняя его в регистре/блочной ОЗУ до тех пор, пока это требуется для алгоритма, что обычно представляет собой ограниченное количество линия. Таким образом, ваше требование состоит в том, чтобы иметь возможность записывать 1 пиксель и считывать 2 пикселя за каждый цикл, что для 640x480@60fps будет достижимо для любой технологии памяти за последние 15 лет.
Вы идете об этом неправильно. Если ваши кадры получены с камеры с нормальной скоростью, у вас есть ~ 30 кадров в секунду и, например, 600 000 000 тактовых циклов в секунду. Поэтому вы не обрабатываете кадр за один такт, а затем бездействуете оставшиеся миллионы тактов до следующего кадра. Вы делаете это попиксельно или регион за раз.

Ответы (1)

Практически невозможно превзойти ОЗУ с двумя портами и ОЗУ LUT, поскольку они находятся на кристалле FPGA, и доступ к ним не требует использования каких-либо контактов ввода-вывода. Если у вас не хватает объема в блочной ОЗУ, то можно закинуть на проблему внешнюю память. QDR SRAM является двухпортовой и поэтому имеет вдвое большую пропускную способность, чем SDRAM, это может быть полезно для некоторых приложений, хотя и очень дорого. DDR3 SDRAM, вероятно, является самым дешевым вариантом, но даже это относительно медленно по сравнению с тем, что вы можете сделать с LUT RAM и блочной RAM.

Я думаю, что вы идете о своем дизайне неправильно. Кроме того, если вам нужно выполнить какую-либо реальную обработку такого количества входных данных, одна только логика займет абсолютно гигантское количество места и может не поместиться на самых больших FPGA, доступных сегодня. В чем FPGA преуспевают, так это в очень высокоскоростных конвейерных операциях обработки. Что вам нужно сделать, так это выяснить, сколько пикселей в секунду вам нужно обработать (640x480xfps), а затем выяснить, как реализовать алгоритм обработки изображений, чтобы получить такой уровень производительности. Как правило, идея состоит в том, чтобы считывать небольшое количество пикселей за такт, а затем обрабатывать их упорядоченным образом.