2017-02-07 4 views
0

Im работает над проектом, для которого мне нужно выполнить вычисления с векторами (ортогонализация матрицы с использованием грамм-метода schmidt). Длина этих векторов теперь неизвестна, программа должна иметь возможность адаптироваться к разным длинам. Одним из таких вычислений является вычисление нового вектора (C), который является результатом добавления A и B. Каждый элемент векторов представляет собой число в фиксированной точке.Сделайте ранее неизвестное количество параллельных операций. В VHDL

Я хочу, чтобы C (i) = A (i) + B (i). Для всех элементов вектора (для i = 0 до N, где N - длина вектора).

можно найти 2 решения для этого, но и представить некоторые проблемы:

1- я могу объявить в сущности, векторы, длина которых изменяется в соответствии с общим, а затем просто создать цикл, который проходит через все вектор.

for I in 0 to N loop 
    C(I)<=A(I)+B(I); 
end loop; 

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

2- Я могу объявить векторы длиной до максимально возможной длины для фактических данных и заполнить их нулями. Тогда я мог бы просто назначить:

C(0)<=A(0)+B(0); 
C(1)<=A(1)+B(1); 
C(2)<=A(2)+B(2); 
... 
C(Nmax)<=A(Nmax)+B(Nmax); 

Это не элегантное решение, и в этом приложении N может быть между 3 и 300, следовательно, это может быть полный отходов и утомительным для программы.

3- Я хочу найти третье решение, которое могло бы создать число (обозначенное общим) комбинационных вычислений после шаблона, такого как C (i) = A (i) + B (i). Есть ли такое решение? Он фактически создает цикл, который не будет выполняться последовательно, а вместо этого все одновременно.

Я знаю, что подобные вещи могут быть сделаны с использованием CUDA, но этот проект на самом деле представляет собой сравнение между графическими процессорами и FPGA, поэтому изменение платформы также не является подходящим решением.

Спасибо заранее

Edit: я учил другого неудовлетворительного решения, но я хочу поделиться им в случае, если это полезно для кого-то проверить это в будущем. Учитывая, что числа A и B имеют одинаковую длину, вы можете записать их в 1-D формате, а именно: A (нормальный) = [1001,1100,0011], A (1-D) = 100111000011. То же самое было бы с B.

Если вы знаете заранее, что сумма любых двух возможных чисел может быть выражена с таким же количеством бит, проблем не будет. Итак, с четырьмя неподписанными битами вы должны убедиться, что в любом возможном случае числа в A или B равны!> 0111 (не выше 0111). Вы можете просто написать C (1-D) = A (1-D) + B (1-D), а затем просто asign C (0) = C (1-D) (3 до 0), C (1) = C (1-D) (7 до 4) и т. Д.

Если вы не можете убедиться, что цифры не превышают 0111 (в случае с 4-мя битами), это не сработает.

+3

Петли разворачиваются в синтезе и для каждой итерации последовательности операторов, внутри которых переменная цикла рассматривается как константа. Это полностью параллельна, когда у целей назначения есть разные индексированные имена (индексированные мной здесь). Это не гарантирует больших значений N, операций, потребляющих определенные ресурсы, или большей сложности последовательности операторов в цикле вы не исчерпаете ресурсы FPGA. Могут также быть ограничения на N на основе элементов массива целевых объектов, которые достаточно велики, чтобы требовать, чтобы RAM и N не соответствовали ширине слова. Показать объявления. – user1155120

+0

Ваше решение 3 звучит как цикл генерации. – user1155120

+0

Понял тогда, что это: для I в 0 до 3 цикла C (I) <= A (I) + B (I); контур конца; так же быстро, как C (0) <= A (0) + B (0); С (1) <= А (1) + В (1); С (2) <= А (2) + В (2); С (3) <= А (3) + В (3) ;? Это было бы очень полезно, спасибо, я обязательно проверю это. –

ответ

0

Возможно, вы можете использовать атрибут length для создания цикла в зависимости от размера вашего вектора.

https://www.csee.umbc.edu/portal/help/VHDL/attribute.html

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