axis_decimator.v 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. `timescale 1 ns / 1 ps
  2. module axis_decimator #
  3. (
  4. parameter integer AXIS_TDATA_WIDTH = 32,
  5. parameter integer CNTR_WIDTH = 32
  6. )
  7. (
  8. // System signals
  9. input wire aclk,
  10. input wire aresetn,
  11. input wire [CNTR_WIDTH-1:0] cfg_data,
  12. // Slave side
  13. output wire s_axis_tready,
  14. input wire [AXIS_TDATA_WIDTH-1:0] s_axis_tdata,
  15. input wire s_axis_tvalid,
  16. // Master side
  17. input wire m_axis_tready,
  18. output wire [AXIS_TDATA_WIDTH-1:0] m_axis_tdata,
  19. output wire m_axis_tvalid
  20. );
  21. reg [AXIS_TDATA_WIDTH-1:0] int_tdata_reg, int_tdata_next;
  22. reg [CNTR_WIDTH-1:0] int_cntr_reg, int_cntr_next;
  23. reg int_tvalid_reg, int_tvalid_next;
  24. reg int_tready_reg, int_tready_next;
  25. wire int_comp_wire, int_tvalid_wire;
  26. always @(posedge aclk)
  27. begin
  28. if(~aresetn)
  29. begin
  30. int_tdata_reg <= {(AXIS_TDATA_WIDTH){1'b0}};
  31. int_tvalid_reg <= 1'b0;
  32. int_tready_reg <= 1'b0;
  33. int_cntr_reg <= {(CNTR_WIDTH){1'b0}};
  34. end
  35. else
  36. begin
  37. int_tdata_reg <= int_tdata_next;
  38. int_tvalid_reg <= int_tvalid_next;
  39. int_tready_reg <= int_tready_next;
  40. int_cntr_reg <= int_cntr_next;
  41. end
  42. end
  43. assign int_comp_wire = int_cntr_reg < cfg_data;
  44. assign int_tvalid_wire = int_tready_reg & s_axis_tvalid;
  45. always @*
  46. begin
  47. int_tdata_next = int_tdata_reg;
  48. int_tvalid_next = int_tvalid_reg;
  49. int_tready_next = int_tready_reg;
  50. int_cntr_next = int_cntr_reg;
  51. if(~int_tready_reg & int_comp_wire)
  52. begin
  53. int_tready_next = 1'b1;
  54. end
  55. if(int_tvalid_wire & int_comp_wire)
  56. begin
  57. int_cntr_next = int_cntr_reg + 1'b1;
  58. end
  59. if(int_tvalid_wire & ~int_comp_wire)
  60. begin
  61. int_cntr_next = {(CNTR_WIDTH){1'b0}};
  62. int_tdata_next = s_axis_tdata;
  63. int_tvalid_next = 1'b1;
  64. end
  65. if(m_axis_tready & int_tvalid_reg)
  66. begin
  67. int_tvalid_next = 1'b0;
  68. end
  69. end
  70. assign s_axis_tready = int_tready_reg;
  71. assign m_axis_tdata = int_tdata_reg;
  72. assign m_axis_tvalid = int_tvalid_reg;
  73. endmodule