Перейти к содержанию
    

Как описань на VHDL блок DSP48 ?

При реализации проекта интенсивно используются 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, тоже не повлияло на результат

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

попробуйте так:

Пример 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Немножко не понял к чему этот ответ. Приведенные вами примеры вообще не реализуемы на ОДНОМ DSP блоке. (может я и не прав).

 

Мне нужно узнать как не используя вставки примитивов, можно описать эти примитивы на VHDL, а потом уже синтезатор сам заменил их на нужные, в зависимости от типа плисины.

 

Для пояснение приведу три примера, первые два синтезатор заменяет DSP без доп.логики, а с третьим этого делать не хочет, обязательно вставляет дополнительные slices, хотя по картинке видно что это можно реализовать и без них.

 

out <= a + b*c;

post-21187-1217484945_thumb.jpg

 

 

out <= out + b*c;

post-21187-1217484984_thumb.jpg

 

 

if var = '1' then

out <= a + b*c;

else

out <= out + b*c;

end if;

post-21187-1217485066_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а может посмотреть на это с другой стороны ?

 

заверните ваши дсп слайсы в обертки (wrappers/bb) с понятным названием и в них сделайте реализацию для виртекса и спартана. а потом просто переключайте макросы синтеза (для ВХДЛ конфигурации или параметры генерейта)

 

 

Удачи!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

напр. так:

 

if var ='1' then

muxed_a <= a;

else

muxed_a <= out;

end if

 

out <= muxed_a + b*c;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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, редко встречаются, и практически всегда есть свободное место.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...