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

Vivado 2016.2 Parametres

Добрый день, уважаемые форумчане! Очень рассчитываю на вашу помощь, поскольку спросить мне больше не у кого :(

 

Суть следующая:

 

Создал через IP Catalog Axi4stream-fifo названный axis_data_fifo_0.

 

Вставил его в top-level verilog:

axis_data_fifo_0
stream_0 
(
      .s_axis_aresetn    (resetn                                          ),          // input wire s_axis_aresetn
      .s_axis_aclk       (s_aclk_i      [0]                               ),                // input wire s_axis_aclk
      .s_axis_tvalid     (s_tvalid_i    [0]                               ),            // input wire s_axis_tvalid
      .s_axis_tready     (s_tready_o    [0]                               ),            // output wire s_axis_tready
      .s_axis_tdata      (s_tdata_i     [1*DATA_WIDTH - 1 :0*DATA_WIDTH]  ),              // input wire [31 : 0] s_axis_tdata
      .s_axis_tlast      (s_tlast_i     [0]                               ),              // input wire s_axis_tlast
      .s_axis_tid        (s_tid_i       [1*ID_WIDTH - 1: 0*ID_WIDTH]      ),
      .m_axis_aclk       (clk                                             ),
      .m_axis_tvalid     (tvalid        [0]                               ),            // output wire m_axis_tvalid
      .m_axis_tready     (tready        [0]                               ),            // input wire m_axis_tready
      .m_axis_tdata      (tdata         [1*DATA_WIDTH - 1 :0*DATA_WIDTH]  ),              // output wire [31 : 0] m_axis_tdata
      .m_axis_tlast      (tlast         [0]                               ),              // output wire m_axis_tlast
      .m_axis_tid        (tid           [1*ID_WIDTH - 1: 0*ID_WIDTH]      ), 
      .axis_data_count   (                                                ),        // output wire [31 : 0] axis_data_count
      .axis_wr_data_count(                                                ),  // output wire [31 : 0] axis_wr_data_count
      .axis_rd_data_count(data_count    [31:0]                            )  // output wire [31 : 0] axis_rd_data_count
    );

 

однако по тз необходимо, чтобы размер FIFO был опционален и задавался в параметрах top-level файла. В верхней строке добавил параметр, покапался в исходниках сгенерированного axis_data_fifo_0, и вытащил его наружу

#(S_FIFO_SIZE).

axis_data_fifo_0  #(S_FIFO_SIZE)
stream_0 
(
      .s_axis_aresetn    (resetn                                          ),          // input wire s_axis_aresetn
      .s_axis_aclk       (s_aclk_i      [0]                               ),                // input wire s_axis_aclk
      .s_axis_tvalid     (s_tvalid_i    [0]                               ),            // input wire s_axis_tvalid
      .s_axis_tready     (s_tready_o    [0]                               ),            // output wire s_axis_tready
      .s_axis_tdata      (s_tdata_i     [1*DATA_WIDTH - 1 :0*DATA_WIDTH]  ),              // input wire [31 : 0] s_axis_tdata
      .s_axis_tlast      (s_tlast_i     [0]                               ),              // input wire s_axis_tlast
      .s_axis_tid        (s_tid_i       [1*ID_WIDTH - 1: 0*ID_WIDTH]      ),
      .m_axis_aclk       (clk                                             ),
      .m_axis_tvalid     (tvalid        [0]                               ),            // output wire m_axis_tvalid
      .m_axis_tready     (tready        [0]                               ),            // input wire m_axis_tready
      .m_axis_tdata      (tdata         [1*DATA_WIDTH - 1 :0*DATA_WIDTH]  ),              // output wire [31 : 0] m_axis_tdata
      .m_axis_tlast      (tlast         [0]                               ),              // output wire m_axis_tlast
      .m_axis_tid        (tid           [1*ID_WIDTH - 1: 0*ID_WIDTH]      ), 
      .axis_data_count   (                                                ),        // output wire [31 : 0] axis_data_count
      .axis_wr_data_count(                                                ),  // output wire [31 : 0] axis_wr_data_count
      .axis_rd_data_count(data_count    [31:0]                            )  // output wire [31 : 0] axis_rd_data_count
    );

 

И ведь не все так просто. Вивадо не реагирует, что я вытащил параметризацию наружу и задает те, которые я создал при генерации IP-блокаю

 

Попробовал скопировать все исходники, сгенерированные IP-catalog'ом. Вставляю их в проект и вивадо жалуется, что

[synth 8-439] module 'fifo_generator_v13_1_1' not found

 

Подскажите, кто чем сможет!

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


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

Что не позволяет использовать одно FIFO самого большого размера из требуемых?

 

 

Так задано в ТЗ, что размер должен быть настраеваимым через параметр.

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


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

Тогда самому настраиваемый модуль фифо надо написать ...с использованием DPRAM, counters и тд.

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


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

Тогда самому настраиваемый модуль фифо надо написать.

 

В смысле? Какой еще настраиваемый модуль? Что вы под этим подразумеваете? Я не понимаю :(

 

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


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

Тогда самому настраиваемый модуль фифо надо написать.

На самом деле, у Ксайлинкса память может быть сделана либо распределенной, либо на блоках. А у блоков размер фиксированный. И если Вы просите объем ФИФО меньше блока, то все равно будет физически задействован весь блок. Так вот и подумайте, нужен ли "Генератор ФИФО"? Я всегда пользуюсь библиотекой примитивов, потому как это гораздо проще. И точно не пролетаю с латентностью...

 

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


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

Приветствую!

 

Увы - философия использования IP корок в Vivado НЕ предполагает динамическое изменение параметров оных при синтезе в RTL. Тое-есть юзер может изменить параметры корки через tcl скрипт и только!

 

И если для некоторых корок еще можно использовать трюк с прямым включением исходников корки в проект то для для того же FIFO это не прокатывает - в отличии от ISE корок - например - FIFO это теперь 2 НЕЗАВИСИМЫЕ корки - само FIFO и корка BRAM которая генерится через вызов скрипта TCL при генерации FIFO корки :(

 

Так что либо плодить скрипты для перегенерации корок при изменении параметров TOPа

- либо делать все на RTL самому (FIFO, RAM, ...)

 

Успехов! Rob.

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


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

На самом деле, у Ксайлинкса память может быть сделана либо распределенной, либо на блоках. А у блоков размер фиксированный. И если Вы просите объем ФИФО меньше блока, то все равно будет физически задействован весь блок. Так вот и подумайте, нужен ли "Генератор ФИФО"? Я всегда пользуюсь библиотекой примитивов, потому как это гораздо проще. И точно не пролетаю с латентностью...

 

 

Приветствую!

 

Увы - философия использования IP корок в Vivado не предполагает динамическое изменение параметров оных при синтезе в RTL. Тое-есть юзер может изменить параметры корки через tcl скрипт и только!

 

И если для некоторых корок еще можно использовать трюк с прямым включением исходников корки в проект то для для того же FIFO это не прокатывает - в отличии от ISE корок - например - FIFO это теперь 2 НЕЗАВИСИМЫЕ корки - само FIFO и корка BRAM которая генерится через вызов скрипта TCL при генерации FIFO корки :(

 

Так что либо плодить скрипты для перегенерации корок при изменении параметров TOPа

- либо делать все на RTL самому (FIFO, RAM, ...)

 

Успехов! Rob.

 

 

Огромное спасибо за ваши ответы!!! Я вам очень благодарен!!!

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


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

На самом деле, у Ксайлинкса память ...

Я всегда пользуюсь библиотекой примитивов, потому как это гораздо проще. И точно не пролетаю с латентностью...

И еще. У блочной памяти на каждый байт есть дополнительный бит. Его можно использовать для паритета-нечетности. Но я эти биты использовал как теги для передачи служебной информации о данных. Начало-конец пакета, ошибки в данных и т.д. Это весьма полезно было...

 

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


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

Если оглянуться назад, то Xilinx имел несколько xapp'ов на тему создания фифо.

Поиск в гугле указывает, Например xapp051, xapp258, xapp291, xapp691, xapp131.

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


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

Для синхронных FIFO, я ушёл от фифо-генератор-визарда, использую: http://www.billauer.co.il/reg_fifo.html

 

Для асинхронных - лучше использовать IP-шечку всё-таки.

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


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

Приветствую!

 

Для синхронных FIFO, я ушёл от фифо-генератор-визарда, использую: http://www.billauer.co.il/reg_fifo.html

 

Для асинхронных - лучше использовать IP-шечку всё-таки.

Асинхронное фифо не намного сложнее синхронного - один раз сделать и забыть кошмар с перегенерацией корок при каждом чихе.

 

Всего то нужно 3 типа синхронного (на SRL, LUT_RAM и BRAM)

и 3 типа асинхронного (LUT_RAM, BRAM, EmbededFIFO)

с выбором latency на чтение 0,1,2 такта для каждого. Причем структуры фифо на LUT_RAM и BRAM фактически почти идентичные.

 

Успехов! Rob.

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


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

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

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

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

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

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

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

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

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

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