axis_counter.v 2.2 KB

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