axis_timer.v 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. `timescale 1 ns / 1 ps
  2. module axis_timer #
  3. (
  4. parameter integer CNTR_WIDTH = 64
  5. )
  6. (
  7. // System signals
  8. input wire aclk,
  9. input wire aresetn,
  10. input wire run_flag,
  11. input wire [CNTR_WIDTH-1:0] cfg_data,
  12. output wire trg_flag,
  13. output wire [CNTR_WIDTH-1:0] sts_data,
  14. // Slave side
  15. output wire s_axis_tready,
  16. input wire s_axis_tvalid
  17. );
  18. reg [CNTR_WIDTH-1:0] int_cntr_reg, int_cntr_next;
  19. reg int_enbl_reg, int_enbl_next;
  20. wire int_comp_wire;
  21. always @(posedge aclk)
  22. begin
  23. if(~aresetn)
  24. begin
  25. int_cntr_reg <= {(CNTR_WIDTH){1'b0}};
  26. int_enbl_reg <= 1'b0;
  27. end
  28. else
  29. begin
  30. int_cntr_reg <= int_cntr_next;
  31. int_enbl_reg <= int_enbl_next;
  32. end
  33. end
  34. assign int_comp_wire = run_flag & (int_cntr_reg < cfg_data);
  35. always @*
  36. begin
  37. int_cntr_next = int_cntr_reg;
  38. int_enbl_next = int_enbl_reg;
  39. if(~int_enbl_reg & int_comp_wire & s_axis_tvalid)
  40. begin
  41. int_enbl_next = 1'b1;
  42. end
  43. if(int_enbl_reg & int_comp_wire & s_axis_tvalid)
  44. begin
  45. int_cntr_next = int_cntr_reg + 1'b1;
  46. end
  47. if(int_enbl_reg & ~int_comp_wire & s_axis_tvalid)
  48. begin
  49. int_enbl_next = 1'b0;
  50. end
  51. end
  52. assign trg_flag = int_enbl_reg;
  53. assign sts_data = int_cntr_reg;
  54. assign s_axis_tready = 1'b1;
  55. endmodule