axis_variant.v 1.3 KB

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