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

likeasm

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Местный
    Местный

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

3 576 просмотров профиля
  1. Скорее всего криво формируете пакеты. Там есть особенность: внутри xdma есть fifo, вроде на 64 beat. Кроме того, в доке на xdma имеется описание на рекомендованный размер пакета. Мы работали фиксированными пакетами по 4k байт и проблем не было и это было под linux. Вообще xdma в режиме stream для весьма специфических задач, обычно все стараются поднять режим mm и работать с памятью DDR на плис.
  2. Добрый вечер. Мы разделяем частоту работы JESD от фабрики через dual clock FIFO и ILA ставим на фабрике. В этом решении есть одно но, FIFO тоже криво работает, если нет клока. Разрешение работы такого фифо с порта приема данных от JESD, только после появления частоты. Частомер стоит на стороне фабрики. Сигнал разрешения через CDC из домена фабрики в домен JESD. Тут нужно понимать, что частота фабрики должна быть выше частоты JESD. ЗЫ у вас частота JESD и ПЛИС какая?
  3. Насколько я помню, можно было схематик из Xilinx Foundation 4.1 версии транслировать в VHDL. Среда очень древняя, verilog 2001 она не поддерживала, только 95. Я помнится написал на verilog для XC4000 полином crc16. Скачайте лучше Xilinx Foundation 4.1 там есть больше возможностей. Но по мне такой дичью лучше не заниматься, а переходить на что-то посовременнее типа UltraScale и Vivado.
  4. Вангую, что лучше посчитать не в вентелях, а в ПЛИС от КТЦ ЭЛЕКТРОННИКА. Чтобы заменить один xcku115 по частоте и по ёмкости надо где-то около 1500 5578ТС024, если считать по FF. Ну а по вашему вопросу можно максимальный размер bit stream в битах выдать за вентили.
  5. Ага, xilinx vivado любит тихо без шума и пыли оптимизировать сигналы в их неактивное состояние. Например, master tready в ноль.
  6. Такое иногда бывает. В 2018 г. меня работа заставила знакомится с серией XC3000 под DOS в среде Xilinx XACT Design Edition, помню это все крутилось на Pentium 166 MMX и имелась ISAшная плата для функционирования данного софта. Эхо НИИ.
  7. Пользуемся SmartLynq, удалённо очень удобно работать и скорость JTAG почти в два раза выше, чем у USB отладчика.
  8. Натягивали на AD9680, на Texas не пробовали, позже будем пробовать. Физика jesd у Xilinx бесплатная, использовали ее, а core логику и axi управление от AD.
  9. Вы TREADY не триггеруете или это в другом модуле?
  10. `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 21.04.2021 13:32:39 // Design Name: // Module Name: axis_tlast_generator // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module axis_pipe_line #( //////////////////////////////////////////////////////////////////////////// //------------------------------- Inputs ----------------------------------- // Width of AXI stream interfaces in bits parameter TDATA_WIDTH = 16, // Propagate tkeep signal parameter TKEEP_ENABLE = (TDATA_WIDTH>8), // tkeep signal width (words per cycle) parameter TKEEP_WIDTH = (TDATA_WIDTH/8), // Propagate tid signal parameter TID_ENABLE = 0, // tid signal width parameter TID_WIDTH = 8, // Propagate tdest signal parameter TDEST_ENABLE = 0, // tdest signal width parameter TDEST_WIDTH = 8, // Propagate tuser signal parameter TUSER_ENABLE = 1, // tuser signal width parameter TUSER_WIDTH = 1, // Propagate tlast signal parameter TLAST_ENABLE = 1, // Output register type // 0 to bypass, 1 for simple buffer, 2 for skid buffer parameter OUT_REG_TYPE = 2 ) ( ////////////////////////////////////////////////////////////////////////////////////// //------------------------------- System signals ------------------------------------- input aclk, input aresetn, ////////////////////////////////////////////////////////////////////////////////////// //------------------- (Slave) AXIS Payload Interface ------------------------ input wire [TDATA_WIDTH-1:0] s_axis_tdata, input wire [TKEEP_WIDTH-1:0] s_axis_tkeep, input wire s_axis_tvalid, output wire s_axis_tready, input wire s_axis_tlast, input wire [TID_WIDTH-1:0] s_axis_tid, input wire [TDEST_ENABLE-1:0] s_axis_tdest, input wire [TUSER_WIDTH-1:0] s_axis_tuser, ////////////////////////////////////////////////////////////////////////////////////// //------------------- (Slave) AXIS Control Interface ------------------------ ////////////////////////////////////////////////////////////////////////////////////// //------------------- (Master) AXIS Payload Interface ----------------------- output wire [TDATA_WIDTH-1:0] m_axis_tdata, output wire [TKEEP_WIDTH-1:0] m_axis_tkeep, output wire m_axis_tvalid, input wire m_axis_tready, output wire m_axis_tlast, output wire [TID_WIDTH-1:0] m_axis_tid, output wire [TDEST_ENABLE-1:0] m_axis_tdest, output wire [TUSER_WIDTH-1:0] m_axis_tuser ); reg [TDATA_WIDTH-1:0] m_axis_tdata_stage_01_ff = {TDATA_WIDTH{1'b0}}; reg [TKEEP_WIDTH-1:0] m_axis_tkeep_stage_01_ff = {TKEEP_WIDTH{1'b0}}; reg m_axis_tvalid_stage_01_ff = 1'b0; reg m_axis_tlast_stage_01_ff = 1'b0; reg [TID_WIDTH-1:0] m_axis_tid_stage_01_ff = {TID_WIDTH{1'b0}}; reg [TDEST_WIDTH-1:0] m_axis_tdest_stage_01_ff = {TDEST_WIDTH{1'b0}}; reg [TUSER_WIDTH-1:0] m_axis_tuser_stage_01_ff = {TUSER_WIDTH{1'b0}}; reg [TDATA_WIDTH-1:0] m_axis_tdata_stage_02_ff = {TDATA_WIDTH{1'b0}}; reg [TKEEP_WIDTH-1:0] m_axis_tkeep_stage_02_ff = {TKEEP_WIDTH{1'b0}}; reg m_axis_tvalid_stage_02_ff = 1'b0; reg m_axis_tlast_stage_02_ff = 1'b0; reg [TID_WIDTH-1:0] m_axis_tid_stage_02_ff = {TID_WIDTH{1'b0}}; reg [TDEST_WIDTH-1:0] m_axis_tdest_stage_02_ff = {TDEST_WIDTH{1'b0}}; reg [TUSER_WIDTH-1:0] m_axis_tuser_stage_02_ff = {TUSER_WIDTH{1'b0}}; reg [TDATA_WIDTH-1:0] m_axis_tdata_stage_03_ff = {TDATA_WIDTH{1'b0}}; reg [TKEEP_WIDTH-1:0] m_axis_tkeep_stage_03_ff = {TKEEP_WIDTH{1'b0}}; reg m_axis_tvalid_stage_03_ff = 1'b0; reg m_axis_tlast_stage_03_ff = 1'b0; reg [TID_WIDTH-1:0] m_axis_tid_stage_03_ff = {TID_WIDTH{1'b0}}; reg [TDEST_WIDTH-1:0] m_axis_tdest_stage_03_ff = {TDEST_WIDTH{1'b0}}; reg [TUSER_WIDTH-1:0] m_axis_tuser_stage_03_ff = {TUSER_WIDTH{1'b0}}; always @(posedge aclk) begin: proc_s_axis_tlast_rmap_cnt_ff if(~aresetn) begin m_axis_tvalid_stage_01_ff <= 0; m_axis_tvalid_stage_02_ff <= 0; m_axis_tvalid_stage_03_ff <= 0; end else if(s_axis_tready == 1) begin m_axis_tvalid_stage_01_ff <= s_axis_tvalid; m_axis_tvalid_stage_02_ff <= m_axis_tvalid_stage_01_ff; m_axis_tvalid_stage_03_ff <= m_axis_tvalid_stage_02_ff; if(s_axis_tvalid == 1) begin m_axis_tdata_stage_01_ff <= s_axis_tdata; m_axis_tkeep_stage_01_ff <= s_axis_tkeep; m_axis_tlast_stage_01_ff <= s_axis_tlast; m_axis_tid_stage_01_ff <= s_axis_tid; m_axis_tdest_stage_01_ff <= s_axis_tdest; m_axis_tuser_stage_01_ff <= s_axis_tuser; end if(m_axis_tvalid_stage_01_ff == 1) begin m_axis_tdata_stage_02_ff <= m_axis_tdata_stage_01_ff; m_axis_tkeep_stage_02_ff <= m_axis_tkeep_stage_01_ff; m_axis_tlast_stage_02_ff <= m_axis_tlast_stage_01_ff; m_axis_tid_stage_02_ff <= m_axis_tid_stage_01_ff; m_axis_tdest_stage_02_ff <= m_axis_tdest_stage_01_ff; m_axis_tuser_stage_02_ff <= m_axis_tuser_stage_01_ff; end if(m_axis_tvalid_stage_02_ff == 1) begin m_axis_tdata_stage_03_ff <= m_axis_tdata_stage_02_ff; m_axis_tkeep_stage_03_ff <= m_axis_tkeep_stage_02_ff; m_axis_tlast_stage_03_ff <= m_axis_tlast_stage_02_ff; m_axis_tid_stage_03_ff <= m_axis_tid_stage_02_ff; m_axis_tdest_stage_03_ff <= m_axis_tdest_stage_02_ff; m_axis_tuser_stage_03_ff <= m_axis_tuser_stage_02_ff; end end end wire [TDATA_WIDTH-1:0] out_reg_s_axis_tdata; wire [TKEEP_WIDTH-1:0] out_reg_s_axis_tkeep; wire out_reg_s_axis_tvalid; wire out_reg_s_axis_tready; wire out_reg_s_axis_tlast; wire [TID_WIDTH-1:0] out_reg_s_axis_tid; wire [TDEST_ENABLE-1:0] out_reg_s_axis_tdest; wire [TUSER_WIDTH-1:0] out_reg_s_axis_tuser; assign out_reg_s_axis_tdata = m_axis_tdata_stage_03_ff; assign out_reg_s_axis_tkeep = TKEEP_ENABLE ? m_axis_tkeep_stage_03_ff : {TKEEP_WIDTH{1'b1}}; assign out_reg_s_axis_tvalid = m_axis_tvalid_stage_03_ff; assign out_reg_s_axis_tlast = TLAST_ENABLE ? m_axis_tlast_stage_03_ff : 1'b1; assign out_reg_s_axis_tid = TID_ENABLE ? m_axis_tid_stage_03_ff : {TID_WIDTH{1'b0}}; assign out_reg_s_axis_tdest = TDEST_ENABLE ? m_axis_tdest_stage_03_ff : {TDEST_WIDTH{1'b0}}; assign out_reg_s_axis_tuser = TUSER_ENABLE ? m_axis_tuser_stage_03_ff : {TUSER_WIDTH{1'b0}}; assign s_axis_tready = out_reg_s_axis_tready; axis_register #( // Width of AXI stream interfaces in bits .TDATA_WIDTH(TDATA_WIDTH), // Propagate tlast signal .TLAST_ENABLE(TLAST_ENABLE), // Propagate tid signal .TID_ENABLE(TID_ENABLE), // tid signal width .TID_WIDTH(TID_WIDTH), // Propagate tdest signal .TDEST_ENABLE(TDEST_ENABLE), // tdest signal width .TDEST_WIDTH(TDEST_WIDTH), // Propagate tuser signal .TUSER_ENABLE(TUSER_ENABLE), // tuser signal width .TUSER_WIDTH(TUSER_WIDTH), // Register type // 0 to bypass, 1 for simple buffer, 2 for skid buffer .REG_TYPE(OUT_REG_TYPE) ) axis_register_inst0 ( .clk(aclk), .rst(aresetn), /* * AXI Stream input */ .s_axis_tdata(out_reg_s_axis_tdata), .s_axis_tkeep(out_reg_s_axis_tkeep), .s_axis_tvalid(out_reg_s_axis_tvalid), .s_axis_tready(out_reg_s_axis_tready), .s_axis_tlast(out_reg_s_axis_tlast), .s_axis_tid(out_reg_s_axis_tid), .s_axis_tdest(out_reg_s_axis_tdest), .s_axis_tuser(out_reg_s_axis_tuser), /* * AXI Stream output */ .m_axis_tdata(m_axis_tdata), .m_axis_tkeep(m_axis_tkeep), .m_axis_tvalid(m_axis_tvalid), .m_axis_tready(m_axis_tready), .m_axis_tlast(m_axis_tlast), .m_axis_tid(m_axis_tid), .m_axis_tdest(m_axis_tdest), .m_axis_tuser(m_axis_tuser) ); endmodule Вот в моем представлении конвейер. Данные я пробросил условно, без математических операций. TREADY имею общий для всех стадий конвейера, как глобальный EN. TVALID свой для каждой стадии обработки. Правильно ли я понимаю, TVALID я двигаю по конвейеру только по TREADY? Вопрос по поводу сброса, достаточно будет сбросить только TVALID во всех стадиях или все триггеры сбрасывать?
  11. Сигнал TDATA, TLAST нужно рассматривать как данные, а вот как продвигать сигнал TVALID по конвейеру, я так полагаю по сигналу TREADY от приемника, в данном случае от молуля axis_register.v? Сомнений по модулю нет, по axi тоже вопросов пока нет, вопрос больше по идеологии построения линии конвейера. Я могу модуль axis_register.v поставить после каждой стадии конвейера, либо в конце и тормозить все стадии конвейера по TREADY, и в последней ситуации не понятно, как тащить TVALID? Я предполагаю, что TVALID будет идти вместе с данным по сигналу TREADY от axis_register.v
  12. Добрый вечер, коллеги. Захотелось мне создать свой модуль конвейерной обработки пакетов по интерфейсу AXI Stream. Имею AXI Stream Slave и Master с сигналами TDATA, TVALID, TREADY, TLAST. Без сигнала TREADY все просто и понятно, поток идет в одном направление без тормозов и все ок. Как только появляется сигнал обратной связи TREADY, то начинается веселье с торможением конвейера и триггерованием TREADY. На просторах сети в github нашел код некого Alex'a https://github.com/alexforencich/verilog-axis в модуле axis_register.v и были те заветные буферизированные тормоза конвейера, которые я и поставил на выход своего модуля. Есть некие сомнения в правильности обработки... правильно ли я понимаю, что tvalid я проталкиваю по ступеням конвейера как данные по сигналу s_axis_tready из axis_register.v, а обработку данных веду как по s_axis_tready из axis_register.v, так еще и по tvalid соответствующей ступени конвейера? Может есть у кого пример построения такого конвейера или ссылка на чтиво по данной теме?
  13. Я использовал идеологию построения Serial interface от сюда https://www.fpga4fun.com/SerialInterface.html. Там все написано. З.Ы. за падежи прошу понять и простить, последнее время хроническое недосыпание.
×
×
  • Создать...