beles 0 30 июля, 2008 Опубликовано 30 июля, 2008 · Жалоба При реализации проекта интенсивно используются DSP блоки, при этом в модули они вставляются ручками, потому что алгоритм их работы не получается создать в коргене. После завершения проекта на Virtex4 необходимо его перенести на Spartan-3AD. Блоки DSP48 в этих плисинах разные и придется подгонять новые блоки (DSP48A) вручную. Может есть способ точного описания DSP с помощью VHDL. Пробовал следующие примеры: out <= a + b*c; -- синтезируется нормально, с использование одного DSP out <= out + b*c; -- тоже все в порядке а вот такую конструкцию он синтезирует с применением дополнительной логики if var = '1' then out <= a + b*c; else out <= out + b*c; end if; хотя если описывать DSP блок руками, то эта конструкция умещается в один DSP без дополнительной логики, просто сигнал var задает правильный opmode. В настройка синтезатора принудительно ставил использование DSP побывал использовать атрибут attribute use_dsp48: string, тоже не повлияло на результат Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 31 июля, 2008 Опубликовано 31 июля, 2008 · Жалоба попробуйте так: Пример VHDL описания процесса, порождающего в синтезируемой схеме два сумматора на входе мультиплексора Signal sum : std_logic_vector(7 downto 0) If (select = ‘1’) then sum <= a + b; Else sum <= c + d; End if; Оптимизированное описание, порождающего два мультиплексора и один сумматор variable tmp1, tmp2 : std_logic_vector(7 downto 0) If (select = ‘1’) then tmp1:= a; tmp2:= b; Else tmp1:= c; tmp2:= d; End if; sum <= tmp1 + tmp2; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beles 0 31 июля, 2008 Опубликовано 31 июля, 2008 · Жалоба Немножко не понял к чему этот ответ. Приведенные вами примеры вообще не реализуемы на ОДНОМ DSP блоке. (может я и не прав). Мне нужно узнать как не используя вставки примитивов, можно описать эти примитивы на VHDL, а потом уже синтезатор сам заменил их на нужные, в зависимости от типа плисины. Для пояснение приведу три примера, первые два синтезатор заменяет DSP без доп.логики, а с третьим этого делать не хочет, обязательно вставляет дополнительные slices, хотя по картинке видно что это можно реализовать и без них. out <= a + b*c; out <= out + b*c; if var = '1' then out <= a + b*c; else out <= out + b*c; end if; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 1 августа, 2008 Опубликовано 1 августа, 2008 · Жалоба а может посмотреть на это с другой стороны ? заверните ваши дсп слайсы в обертки (wrappers/bb) с понятным названием и в них сделайте реализацию для виртекса и спартана. а потом просто переключайте макросы синтеза (для ВХДЛ конфигурации или параметры генерейта) Удачи!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
atlantic 0 1 августа, 2008 Опубликовано 1 августа, 2008 · Жалоба а может попробывать явно сделать для операнда мультиплексор, который потом включить в выражение, напр. так: if var ='1' then muxed_a <= a; else muxed_a <= out; end if out <= muxed_a + b*c; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beles 0 1 августа, 2008 Опубликовано 1 августа, 2008 · Жалоба to atlantic попробовал приведенный вами пример, ничего не изменилось, сумматор и умножитель синтезируются на одном DSP, а мультиплексор на Lut. to des00 интересный вариант, но не очень универсальный, придется создать какую нить библиотеку или пакет, в которых разместить эти компоненты, и эту библиотеку необходимо будет подцеплять к новым проектам. К тому же структура DSP блоков отличается, так на DSP48A можно реализовать out <= c + a*(b+d), (в нем 2 сумматора и 1 умножитель), а вот на одном DSP48 такое реализовать не получиться (1 сумматор и 1 умножитель). Думаю, что кодом полностью описать возможности DSP нереально, например, если создавать умножитель 16х16: if rising_edge(clk) then p <= a*b; end if; то синтезатор заменит его одним DSP, но при этом задержка от входа до выхода (latency) будет 1 такт, если же использовать DSP в явном виде, то эту задержку можно выставить равной 2 или 3, при этом тактовая частота проекта значительно возрастет. Внутри DSP сигнал проходит через сумматор(торы) умножитель и мультиплексор(соры), и желательно эти внутренние блоки отделить друг от друга триггерами. Думаю самый практичный вариант использовать все же коргеновские блоки + внешнюю логику, во-первых, удобно переносится, а во-вторых, проекты, в которых используются все 100% Slices, редко встречаются, и практически всегда есть свободное место. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться