axis_packetizer.v 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. `timescale 1 ns / 1 ps
  2. module axis_packetizer #
  3. (
  4. parameter integer AXIS_TDATA_WIDTH = 32,
  5. parameter integer CNTR_WIDTH = 32,
  6. parameter CONTINUOUS = "FALSE",
  7. parameter ALWAYS_READY = "FALSE"
  8. )
  9. (
  10. // System signals
  11. input wire aclk,
  12. input wire aresetn,
  13. input wire [CNTR_WIDTH-1:0] cfg_data,
  14. // Slave side
  15. output wire s_axis_tready,
  16. input wire [AXIS_TDATA_WIDTH-1:0] s_axis_tdata,
  17. input wire s_axis_tvalid,
  18. // Master side
  19. input wire m_axis_tready,
  20. output wire [AXIS_TDATA_WIDTH-1:0] m_axis_tdata,
  21. output wire m_axis_tvalid,
  22. output wire m_axis_tlast
  23. );
  24. reg [CNTR_WIDTH-1:0] int_cntr_reg, int_cntr_next;
  25. reg [CNTR_WIDTH-1:0] int_data_reg;
  26. reg int_enbl_reg, int_enbl_next;
  27. wire int_comp_wire, int_tvalid_wire, int_tlast_wire;
  28. always @(posedge aclk)
  29. begin
  30. if(~aresetn)
  31. begin
  32. int_cntr_reg <= {(CNTR_WIDTH){1'b0}};
  33. int_data_reg <= {(CNTR_WIDTH){1'b0}};
  34. int_enbl_reg <= 1'b0;
  35. end
  36. else
  37. begin
  38. int_cntr_reg <= int_cntr_next;
  39. int_data_reg <= cfg_data;
  40. int_enbl_reg <= int_enbl_next;
  41. end
  42. end
  43. assign int_comp_wire = int_cntr_reg < int_data_reg;
  44. assign int_tvalid_wire = int_enbl_reg & s_axis_tvalid;
  45. assign int_tlast_wire = ~int_comp_wire;
  46. generate
  47. if(CONTINUOUS == "TRUE")
  48. begin : CONTINUE
  49. always @*
  50. begin
  51. int_cntr_next = int_cntr_reg;
  52. int_enbl_next = int_enbl_reg;
  53. if(~int_enbl_reg & int_comp_wire)
  54. begin
  55. int_enbl_next = 1'b1;
  56. end
  57. if(m_axis_tready & int_tvalid_wire & int_comp_wire)
  58. begin
  59. int_cntr_next = int_cntr_reg + 1'b1;
  60. end
  61. if(m_axis_tready & int_tvalid_wire & int_tlast_wire)
  62. begin
  63. int_cntr_next = {(CNTR_WIDTH){1'b0}};
  64. end
  65. end
  66. end
  67. else
  68. begin : STOP
  69. always @*
  70. begin
  71. int_cntr_next = int_cntr_reg;
  72. int_enbl_next = int_enbl_reg;
  73. if(~int_enbl_reg & int_comp_wire)
  74. begin
  75. int_enbl_next = 1'b1;
  76. end
  77. if(m_axis_tready & int_tvalid_wire & int_comp_wire)
  78. begin
  79. int_cntr_next = int_cntr_reg + 1'b1;
  80. end
  81. if(m_axis_tready & int_tvalid_wire & int_tlast_wire)
  82. begin
  83. int_enbl_next = 1'b0;
  84. end
  85. end
  86. end
  87. endgenerate
  88. generate
  89. if(ALWAYS_READY == "TRUE")
  90. begin : READY
  91. assign s_axis_tready = 1'b1;
  92. end
  93. else
  94. begin : BLOCKING
  95. assign s_axis_tready = int_enbl_reg & m_axis_tready;
  96. end
  97. endgenerate
  98. assign m_axis_tdata = s_axis_tdata;
  99. assign m_axis_tvalid = int_tvalid_wire;
  100. assign m_axis_tlast = int_enbl_reg & int_tlast_wire;
  101. endmodule