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

sallador

Свой
  • Постов

    51
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о sallador

  • Звание
    Участник
    Участник

Контакты

  • Сайт
    Array
  • ICQ
    Array

Посетители профиля

1 311 просмотр профиля
  1. О! Тут уже давали на мой гитхаб ссылку. В общем, если коротко - у меня почти платформонезависимая корка БПФ на любую длину. Radix-2 и 2-х параллелизм. Можно заменить узлы, где делается умножение и сложение на DSP48 узлах Xilinx на то, что есть в альтере - и оно заработает (главное задержки такие же соблюсти). Или тупо переписать код влоб, типа: X_RE = A_RE * W_RE - A_IM * W_IM; X_IM = A_RE * W_IM + A_IM * W_RE; Разумеется, эти операции лучше разбить на несколько стадий. И дать синтезатору указание разводить это не на логике, а на встроенных узлах DSP. Если АЦП не очень скоростная, то двухкратный параллелизм - избыточен. В таком случае нужно делать БПФ по схеме single path delay feedback - оно проще и легче.
  2. Загляните сюда, например. Гуглится мгновенно: http://www.32x8.com/var5.html
  3. Можно поступить так: В entity этого компонента, который мапите, присвоить входным сигналам исходное значение. Например: entity bla_bla_bla is port( aa : in std_logic_vector(N-1 downto 0):=(others=>'0'); bb : in std_logic:='0'; ... ); end bla_bla_bla; Тогда не надо входным портам присваивать значения. А про выходные уже ответили: либо вообще ничего не писать, либо => open. Условная запись: signal test : std_logic_vector(3 downto 0):="0000"; Не тратит логические ресурсы и триггеры совсем, если далее в коде значение сигнала нигде не меняется. А чтобы наверняка не менять это значение - вместо signal напишите constant и мапьте к компонентам константы значений.
  4. Туда: 1ГБайт/c. Обратно: 1ГБайт/c. Потоки независимы.
  5. Интересная тема. Такое ощущение, что в какой-то команде пожалели денег на разработчика. По теме: Всё реально. Реализовали SRIO на кристаллах Xilinx: V6, K7, сейчас делаем на KU. Например, для V6 скорость: 1ГБ/c туда, 1Гб/c обратно. Тесты обмена данными следующие: FPGA <> FPGA, FPGA <> DSP, FPGA <> HOST (компьютер). В первом варианте для V6 задействован SRIO SWITCH для обмена между удаленными друг от друга устройствами (т.к. на 1 плате - 1 ПЛИС, на скорость это не влияет). Для K7 свитча нет.
  6. Есть еще составной буфер: IBUFGDS = связка IBUFDS + BUFG. Работает корректно :)
  7. А кто-нибудь сталкивался со следующей проблемой при активации Training Credits после покупки софта от Xilinx? Мы недавно приобрели лицензию на Vivado и получили 30 training credits. Сегодня я попытался их активировать на странице XPA Training Credits. Выдает следующую проблему: То есть, лицензию с моего аккаунта дали купить месяц назад, санкций никаких не было. А обменять кредиты на курсы - нельзя. Интересно...
  8. На ПЛИС можно делать практически, что угодно. Конфигурируйте как захотите, проекты делайте - какие хотите. Кто-то даже нейронные сети на FPGA пытается сделать. По большей части на вопрос тут уже ответили. Добавлю от себя немного, если позволите. Если хотите начинать осваивать ПЛИС, разумеется нужно выбрать простенькую отладочную плату с достаточным "обвесом" и попытаться наладить связь между этим обвесом. Помигать светодиодами, понажимать кнопочки, достучаться до внешней памяти, вывести данные на какой-нибудь интерфейс и т.д. Если интересно, почитайте мои статьи на хабре. Для новичков они в самый раз. К проектам на отладочной плате также есть исходники на гитхабе, можете поковыряться в них. :)
  9. Вам правильно подсказали - делайте независимый синтез каждого узла и создавайте отдельно *.ngc блоки. А на верхнем уровне их подцепляйте как black-box. Тогда перекомпилировать придется только конкретный узел. Для Implementation в PlanAhead есть удобная штука: "Promote Partitions". Суть такая: 1) закрепляем в виде p-blocks нужные узлы, которые не будут изменяться. 2) разводим проект N раз и выбираем удовлетворяющую вас разводку. 3) разводку неизменных p-block оставляем с помощью "promote". 4) делаем сколько угодно другие изменения и разводим проект заново, с учетом уже разведенных блоков. 5) ... 6) PROFIT!!! Ну и как уже верно заметили - читать нужно Hier. design rules. Что-то типа такого: первый попавшийся юзергайд.
  10. Удобная штука. Пример: в зависимости от какого-нибудь числа каналов нужно сделать 1, 2, 4, 8, 16 и т.д. сигналов валидности. signal Nchan_valid : std_logic_vector(Nchan-1 downto 0) Если канал 1 - то так и получится (0 downto 0); А про остальное - Вам уже верно ответили. Xilinx для памяти любит делать такие шины. Зачем и почему? Лезем в библиотеку unisim и unimacro, и смотрим, как у них конфигурируются какие-нибудь примитивы памяти типа BRAM_TDP_MACRO, RAMB16_S1_S1, RAMB36E1 и т.д.
  11. Unknown identifier "current_simbol". Замените на цифру - 1, 2, 3... - все работает.
  12. Конечно. Плюс я смотрю уже результат после стадии PAR, а там он уже точно делает после всех оптимизаций окончательный вариант. Вчера очень долго читал даташиты. Похоже, что нельзя инициализировать RAMB36E как ROM 72x512 таким способом. Остается вариант - либо делать через CoreGEN, либо unimacro подключать. Первое не устраивает, второе еще терпимо.
  13. Для уменьшения кода я написал без процесса. С процессом тоже пробовал, суть та же. Результаты одинаковые. Ладно, попробую через примитив из unimacro, где можно определенным образом задать INIT векторы. Хм. Ничего не понимаю. ROM не хочет делать, а RAM влегкую. Такие дела, переписал код: удалил инициализацию, добавил порт для записи в память. Итого, RAM 512x64 он сделал без проблем на 1 RAMB36. Пруф из FPGA_Editor: Чудеса.
  14. Нет, это не влияет. Ура. Удалось сделать не на рассыпухе, а на 2 блоках RAMB36. Причем, без атрибутов ram_style. Но все равно он не хочет в 1 блок упихивать. Код такой: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity rams_21b is generic ( Data_w : integer:=64; Data_d : integer:=512 ); port ( CLK : in std_logic; EN : in std_logic; ADDR : in std_logic_vector(8 downto 0); DATA : out std_logic_vector(Data_w-1 downto 0) ); end rams_21b; architecture syn of rams_21b is type rom_type is array (Data_d-1 downto 0) of std_logic_vector (Data_w-1 downto 0); signal ROM : rom_type:= ( ТУТ 512 ОТСЧЕТОВ ); signal rdata : std_logic_vector(Data_w-1 downto 0); begin rdata <= ROM(conv_integer(ADDR)); process (CLK) begin if (CLK'event and CLK = '1') then if (EN = '1') then DATA <= rdata; end if; end if; end process; end syn;
  15. В том то и дело, что работать дальше могу, но и с этим хотелось бы решить вопрос. Похоже, что остается подключать unimacro и тащить оттуда большой примитив.
×
×
  • Создать...