axis_misc_writer.v 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. `timescale 1 ns / 1 ps
  2. module axis_misc_writer #
  3. (
  4. parameter integer S_AXIS_TDATA_WIDTH = 32,
  5. parameter integer M_AXIS_TDATA_WIDTH = 64,
  6. parameter integer CNTR_WIDTH = 16,
  7. parameter integer MISC_WIDTH = 16
  8. )
  9. (
  10. // System signals
  11. input wire aclk,
  12. input wire aresetn,
  13. input wire [CNTR_WIDTH-1:0] cfg_data,
  14. input wire [MISC_WIDTH-1:0] misc_data,
  15. // Slave side
  16. output wire s_axis_tready,
  17. input wire [S_AXIS_TDATA_WIDTH-1:0] s_axis_tdata,
  18. input wire s_axis_tvalid,
  19. // Master side
  20. input wire m_axis_tready,
  21. output wire [M_AXIS_TDATA_WIDTH-1:0] m_axis_tdata,
  22. output wire m_axis_tvalid
  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_last_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_last_wire = ~int_comp_wire;
  46. always @*
  47. begin
  48. int_cntr_next = int_cntr_reg;
  49. int_enbl_next = int_enbl_reg;
  50. if(~int_enbl_reg & int_comp_wire)
  51. begin
  52. int_enbl_next = 1'b1;
  53. end
  54. if(m_axis_tready & int_tvalid_wire & int_comp_wire)
  55. begin
  56. int_cntr_next = int_cntr_reg + 1'b1;
  57. end
  58. if(m_axis_tready & int_tvalid_wire & int_last_wire)
  59. begin
  60. int_cntr_next = {(CNTR_WIDTH){1'b0}};
  61. end
  62. end
  63. assign s_axis_tready = int_enbl_reg & m_axis_tready;
  64. assign m_axis_tdata = {misc_data, int_cntr_reg, s_axis_tdata};
  65. assign m_axis_tvalid = int_tvalid_wire;
  66. endmodule