axis_gate_controller.v 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. `timescale 1 ns / 1 ps
  2. module axis_gate_controller
  3. (
  4. input wire aclk,
  5. input wire aresetn,
  6. // Slave side
  7. output wire s_axis_tready,
  8. input wire [127:0] s_axis_tdata,
  9. input wire s_axis_tvalid,
  10. output wire [31:0] poff,
  11. output wire [15:0] level,
  12. output wire dout
  13. );
  14. reg [63:0] int_cntr_reg;
  15. reg [48:0] int_data_reg;
  16. reg [31:0] int_poff_reg;
  17. reg [15:0] int_level_reg;
  18. reg int_dout_reg;
  19. wire [48:0] int_data_wire;
  20. wire int_enbl_wire;
  21. assign int_data_wire = int_enbl_wire ? int_data_reg : s_axis_tdata[112:64];
  22. assign int_enbl_wire = |int_cntr_reg;
  23. always @(posedge aclk)
  24. begin
  25. if(~aresetn)
  26. begin
  27. int_cntr_reg <= 64'd0;
  28. int_data_reg <= 49'd0;
  29. int_poff_reg <= 32'd0;
  30. int_level_reg <= 16'd0;
  31. int_dout_reg <= 1'b0;
  32. end
  33. else
  34. begin
  35. if(int_enbl_wire)
  36. begin
  37. int_cntr_reg <= int_cntr_reg - 1'b1;
  38. end
  39. else if(s_axis_tvalid)
  40. begin
  41. int_cntr_reg <= s_axis_tdata[63:0];
  42. int_data_reg <= s_axis_tdata[112:64];
  43. end
  44. int_poff_reg <= int_data_wire[31:0];
  45. int_level_reg <= int_data_wire[47:32];
  46. int_dout_reg <= int_data_wire[48] & (int_enbl_wire | s_axis_tvalid);
  47. end
  48. end
  49. assign s_axis_tready = ~int_enbl_wire & aresetn;
  50. assign poff = int_poff_reg;
  51. assign level = int_level_reg;
  52. assign dout = int_dout_reg;
  53. endmodule