Darky777 0 27 октября, 2016 Опубликовано 27 октября, 2016 · Жалоба Добрый день, уважаемые форумчане! Очень рассчитываю на вашу помощь, поскольку спросить мне больше не у кого :( Суть следующая: Создал через 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 Подскажите, кто чем сможет! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алга 0 27 октября, 2016 Опубликовано 27 октября, 2016 · Жалоба Что не позволяет использовать одно FIFO самого большого размера из требуемых? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darky777 0 27 октября, 2016 Опубликовано 27 октября, 2016 · Жалоба Что не позволяет использовать одно FIFO самого большого размера из требуемых? Так задано в ТЗ, что размер должен быть настраеваимым через параметр. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алга 0 27 октября, 2016 Опубликовано 27 октября, 2016 · Жалоба Тогда самому настраиваемый модуль фифо надо написать ...с использованием DPRAM, counters и тд. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darky777 0 27 октября, 2016 Опубликовано 27 октября, 2016 · Жалоба Тогда самому настраиваемый модуль фифо надо написать. В смысле? Какой еще настраиваемый модуль? Что вы под этим подразумеваете? Я не понимаю :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 27 октября, 2016 Опубликовано 27 октября, 2016 · Жалоба Тогда самому настраиваемый модуль фифо надо написать. На самом деле, у Ксайлинкса память может быть сделана либо распределенной, либо на блоках. А у блоков размер фиксированный. И если Вы просите объем ФИФО меньше блока, то все равно будет физически задействован весь блок. Так вот и подумайте, нужен ли "Генератор ФИФО"? Я всегда пользуюсь библиотекой примитивов, потому как это гораздо проще. И точно не пролетаю с латентностью... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 27 октября, 2016 Опубликовано 27 октября, 2016 · Жалоба Приветствую! Увы - философия использования IP корок в Vivado НЕ предполагает динамическое изменение параметров оных при синтезе в RTL. Тое-есть юзер может изменить параметры корки через tcl скрипт и только! И если для некоторых корок еще можно использовать трюк с прямым включением исходников корки в проект то для для того же FIFO это не прокатывает - в отличии от ISE корок - например - FIFO это теперь 2 НЕЗАВИСИМЫЕ корки - само FIFO и корка BRAM которая генерится через вызов скрипта TCL при генерации FIFO корки :( Так что либо плодить скрипты для перегенерации корок при изменении параметров TOPа - либо делать все на RTL самому (FIFO, RAM, ...) Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darky777 0 27 октября, 2016 Опубликовано 27 октября, 2016 · Жалоба На самом деле, у Ксайлинкса память может быть сделана либо распределенной, либо на блоках. А у блоков размер фиксированный. И если Вы просите объем ФИФО меньше блока, то все равно будет физически задействован весь блок. Так вот и подумайте, нужен ли "Генератор ФИФО"? Я всегда пользуюсь библиотекой примитивов, потому как это гораздо проще. И точно не пролетаю с латентностью... Приветствую! Увы - философия использования IP корок в Vivado не предполагает динамическое изменение параметров оных при синтезе в RTL. Тое-есть юзер может изменить параметры корки через tcl скрипт и только! И если для некоторых корок еще можно использовать трюк с прямым включением исходников корки в проект то для для того же FIFO это не прокатывает - в отличии от ISE корок - например - FIFO это теперь 2 НЕЗАВИСИМЫЕ корки - само FIFO и корка BRAM которая генерится через вызов скрипта TCL при генерации FIFO корки :( Так что либо плодить скрипты для перегенерации корок при изменении параметров TOPа - либо делать все на RTL самому (FIFO, RAM, ...) Успехов! Rob. Огромное спасибо за ваши ответы!!! Я вам очень благодарен!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 27 октября, 2016 Опубликовано 27 октября, 2016 · Жалоба На самом деле, у Ксайлинкса память ... Я всегда пользуюсь библиотекой примитивов, потому как это гораздо проще. И точно не пролетаю с латентностью... И еще. У блочной памяти на каждый байт есть дополнительный бит. Его можно использовать для паритета-нечетности. Но я эти биты использовал как теги для передачи служебной информации о данных. Начало-конец пакета, ошибки в данных и т.д. Это весьма полезно было... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алга 0 28 октября, 2016 Опубликовано 28 октября, 2016 · Жалоба Если оглянуться назад, то Xilinx имел несколько xapp'ов на тему создания фифо. Поиск в гугле указывает, Например xapp051, xapp258, xapp291, xapp691, xapp131. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
myq 0 2 ноября, 2016 Опубликовано 2 ноября, 2016 · Жалоба Для синхронных FIFO, я ушёл от фифо-генератор-визарда, использую: http://www.billauer.co.il/reg_fifo.html Для асинхронных - лучше использовать IP-шечку всё-таки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 2 ноября, 2016 Опубликовано 2 ноября, 2016 · Жалоба Приветствую! Для синхронных 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться