axis_maxabs_finder.v 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. `timescale 1 ns / 1 ps
  2. module axis_maxabs_finder #
  3. (
  4. parameter integer AXIS_TDATA_WIDTH = 16,
  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_max_reg, int_max_next;
  22. reg [AXIS_TDATA_WIDTH-1:0] int_tdata_reg, int_tdata_next;
  23. reg [CNTR_WIDTH-1:0] int_cntr_reg, int_cntr_next;
  24. reg int_tvalid_reg, int_tvalid_next;
  25. wire [AXIS_TDATA_WIDTH-1:0] int_abs_wire;
  26. wire int_comp_wire;
  27. always @(posedge aclk)
  28. begin
  29. if(~aresetn)
  30. begin
  31. int_max_reg <= {(AXIS_TDATA_WIDTH){1'b0}};
  32. int_tdata_reg <= {(AXIS_TDATA_WIDTH){1'b0}};
  33. int_cntr_reg <= {(CNTR_WIDTH){1'b0}};
  34. int_tvalid_reg <= 1'b0;
  35. end
  36. else
  37. begin
  38. int_max_reg <= int_max_next;
  39. int_tdata_reg <= int_tdata_next;
  40. int_cntr_reg <= int_cntr_next;
  41. int_tvalid_reg <= int_tvalid_next;
  42. end
  43. end
  44. assign int_comp_wire = int_cntr_reg < cfg_data;
  45. assign int_abs_wire = s_axis_tdata[AXIS_TDATA_WIDTH-1] ? ~s_axis_tdata : s_axis_tdata;
  46. always @*
  47. begin
  48. int_max_next = int_max_reg;
  49. int_tdata_next = int_tdata_reg;
  50. int_cntr_next = int_cntr_reg;
  51. int_tvalid_next = int_tvalid_reg;
  52. if(s_axis_tvalid & int_comp_wire)
  53. begin
  54. int_max_next = int_abs_wire > int_max_reg ? int_abs_wire : int_max_reg;
  55. int_cntr_next = int_cntr_reg + 1'b1;
  56. end
  57. if(s_axis_tvalid & ~int_comp_wire)
  58. begin
  59. int_max_next = {(AXIS_TDATA_WIDTH){1'b0}};
  60. int_tdata_next = int_max_reg;
  61. int_cntr_next = {(CNTR_WIDTH){1'b0}};
  62. int_tvalid_next = 1'b1;
  63. end
  64. if(m_axis_tready & int_tvalid_reg)
  65. begin
  66. int_tvalid_next = 1'b0;
  67. end
  68. end
  69. assign s_axis_tready = 1'b1;
  70. assign m_axis_tdata = int_tdata_reg;
  71. assign m_axis_tvalid = int_tvalid_reg;
  72. endmodule