axis_averager.v 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. `timescale 1 ns / 1 ps
  2. module axis_averager #
  3. (
  4. parameter integer AXIS_TDATA_WIDTH = 32,
  5. parameter integer CNTR_WIDTH = 16,
  6. parameter AXIS_TDATA_SIGNED = "FALSE"
  7. )
  8. (
  9. // System signals
  10. input wire aclk,
  11. input wire aresetn,
  12. input wire [CNTR_WIDTH-1:0] pre_data,
  13. input wire [CNTR_WIDTH-1:0] tot_data,
  14. // Slave side
  15. output wire s_axis_tready,
  16. input wire [AXIS_TDATA_WIDTH-1:0] s_axis_tdata,
  17. input wire s_axis_tvalid,
  18. // Master side
  19. input wire m_axis_tready,
  20. output wire [AXIS_TDATA_WIDTH-1:0] m_axis_tdata,
  21. output wire m_axis_tvalid,
  22. // FIFO programmable flag
  23. input wire fifo_prog_full,
  24. // FIFO_WRITE port
  25. input wire fifo_write_full,
  26. output wire [AXIS_TDATA_WIDTH-1:0] fifo_write_data,
  27. output wire fifo_write_wren,
  28. // FIFO_READ port
  29. input wire fifo_read_empty,
  30. input wire [AXIS_TDATA_WIDTH-1:0] fifo_read_data,
  31. output wire fifo_read_rden
  32. );
  33. reg [CNTR_WIDTH-1:0] int_cntr_reg, int_cntr_next;
  34. reg int_rden_reg, int_rden_next;
  35. reg int_tvalid_reg, int_tvalid_next;
  36. wire [AXIS_TDATA_WIDTH-1:0] int_data_wire, sum_data_wire;
  37. always @(posedge aclk)
  38. begin
  39. if(~aresetn)
  40. begin
  41. int_cntr_reg <= {(CNTR_WIDTH){1'b0}};
  42. int_rden_reg <= 1'b0;
  43. int_tvalid_reg <= 1'b1;
  44. end
  45. else
  46. begin
  47. int_cntr_reg <= int_cntr_next;
  48. int_rden_reg <= int_rden_next;
  49. int_tvalid_reg <= int_tvalid_next;
  50. end
  51. end
  52. always @*
  53. begin
  54. int_cntr_next = int_cntr_reg;
  55. int_rden_next = int_rden_reg;
  56. int_tvalid_next = int_tvalid_reg;
  57. if(s_axis_tvalid)
  58. begin
  59. int_cntr_next = int_cntr_reg + 1'b1;
  60. if(int_cntr_reg == pre_data)
  61. begin
  62. int_rden_next = 1'b1;
  63. int_tvalid_next = 1'b0;
  64. end
  65. if(int_cntr_reg == tot_data)
  66. begin
  67. int_cntr_next = {(CNTR_WIDTH){1'b0}};
  68. int_tvalid_next = 1'b1;
  69. end
  70. end
  71. end
  72. assign int_data_wire = int_tvalid_reg ? {(AXIS_TDATA_WIDTH){1'b0}} : fifo_read_data;
  73. generate
  74. if(AXIS_TDATA_SIGNED == "TRUE")
  75. begin : SIGNED
  76. assign sum_data_wire = $signed(int_data_wire) + $signed(s_axis_tdata);
  77. end
  78. else
  79. begin : UNSIGNED
  80. assign sum_data_wire = int_data_wire + s_axis_tdata;
  81. end
  82. endgenerate
  83. assign s_axis_tready = 1'b1;
  84. assign m_axis_tdata = fifo_read_data;
  85. assign m_axis_tvalid = fifo_prog_full & int_tvalid_reg & s_axis_tvalid;
  86. assign fifo_read_rden = int_rden_reg & s_axis_tvalid;
  87. assign fifo_write_data = sum_data_wire;
  88. assign fifo_write_wren = s_axis_tvalid;
  89. endmodule