axis_interpolator.v 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. `timescale 1 ns / 1 ps
  2. module axis_interpolator #
  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. always @(posedge aclk)
  26. begin
  27. if(~aresetn)
  28. begin
  29. int_tdata_reg <= {(AXIS_TDATA_WIDTH){1'b0}};
  30. int_tvalid_reg <= 1'b0;
  31. int_tready_reg <= 1'b0;
  32. int_cntr_reg <= {(CNTR_WIDTH){1'b0}};
  33. end
  34. else
  35. begin
  36. int_tdata_reg <= int_tdata_next;
  37. int_tvalid_reg <= int_tvalid_next;
  38. int_tready_reg <= int_tready_next;
  39. int_cntr_reg <= int_cntr_next;
  40. end
  41. end
  42. always @*
  43. begin
  44. int_tdata_next = int_tdata_reg;
  45. int_tvalid_next = int_tvalid_reg;
  46. int_tready_next = int_tready_reg;
  47. int_cntr_next = int_cntr_reg;
  48. if(s_axis_tvalid & ~int_tvalid_reg)
  49. begin
  50. int_tdata_next = s_axis_tdata;
  51. int_tvalid_next = 1'b1;
  52. int_tready_next = 1'b1;
  53. end
  54. if(m_axis_tready & int_tvalid_reg)
  55. begin
  56. if(int_cntr_reg < cfg_data)
  57. begin
  58. int_cntr_next = int_cntr_reg + 1'b1;
  59. end
  60. else
  61. begin
  62. int_cntr_next = {(CNTR_WIDTH){1'b0}};
  63. int_tdata_next = s_axis_tdata;
  64. int_tvalid_next = s_axis_tvalid;
  65. int_tready_next = s_axis_tvalid;
  66. end
  67. end
  68. if(s_axis_tvalid & int_tready_reg)
  69. begin
  70. int_tready_next = 1'b0;
  71. end
  72. end
  73. assign s_axis_tready = int_tready_reg;
  74. assign m_axis_tdata = int_tdata_reg;
  75. assign m_axis_tvalid = int_tvalid_reg;
  76. endmodule