axis_phase_generator.v 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. `timescale 1 ns / 1 ps
  2. module axis_phase_generator #
  3. (
  4. parameter integer AXIS_TDATA_WIDTH = 32,
  5. parameter integer PHASE_WIDTH = 30
  6. )
  7. (
  8. // System signals
  9. input wire aclk,
  10. input wire aresetn,
  11. input wire [PHASE_WIDTH-1:0] cfg_data,
  12. // Master side
  13. input wire m_axis_tready,
  14. output wire [AXIS_TDATA_WIDTH-1:0] m_axis_tdata,
  15. output wire m_axis_tvalid
  16. );
  17. reg [PHASE_WIDTH-1:0] int_cntr_reg, int_cntr_next;
  18. reg int_enbl_reg, int_enbl_next;
  19. always @(posedge aclk)
  20. begin
  21. if(~aresetn)
  22. begin
  23. int_cntr_reg <= {(PHASE_WIDTH){1'b0}};
  24. int_enbl_reg <= 1'b0;
  25. end
  26. else
  27. begin
  28. int_cntr_reg <= int_cntr_next;
  29. int_enbl_reg <= int_enbl_next;
  30. end
  31. end
  32. always @*
  33. begin
  34. int_cntr_next = int_cntr_reg;
  35. int_enbl_next = int_enbl_reg;
  36. if(~int_enbl_reg)
  37. begin
  38. int_enbl_next = 1'b1;
  39. end
  40. if(int_enbl_reg & m_axis_tready)
  41. begin
  42. int_cntr_next = int_cntr_reg + cfg_data;
  43. end
  44. end
  45. assign m_axis_tdata = {{(AXIS_TDATA_WIDTH-PHASE_WIDTH){int_cntr_reg[PHASE_WIDTH-1]}}, int_cntr_reg};
  46. assign m_axis_tvalid = int_enbl_reg;
  47. endmodule