axis_lfsr.v 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. `timescale 1 ns / 1 ps
  2. module axis_lfsr #
  3. (
  4. parameter integer AXIS_TDATA_WIDTH = 64,
  5. parameter HAS_TREADY = "FALSE"
  6. )
  7. (
  8. // System signals
  9. input wire aclk,
  10. input wire aresetn,
  11. // Master side
  12. input wire m_axis_tready,
  13. output wire [AXIS_TDATA_WIDTH-1:0] m_axis_tdata,
  14. output wire m_axis_tvalid
  15. );
  16. reg [AXIS_TDATA_WIDTH-1:0] int_lfsr_reg, int_lfsr_next;
  17. reg int_enbl_reg, int_enbl_next;
  18. always @(posedge aclk)
  19. begin
  20. if(~aresetn)
  21. begin
  22. int_lfsr_reg <= 64'h85fac8a1658d6f0d;
  23. int_enbl_reg <= 1'b0;
  24. end
  25. else
  26. begin
  27. int_lfsr_reg <= int_lfsr_next;
  28. int_enbl_reg <= int_enbl_next;
  29. end
  30. end
  31. generate
  32. if(HAS_TREADY == "TRUE")
  33. begin : HAS_TREADY
  34. always @*
  35. begin
  36. int_lfsr_next = int_lfsr_reg;
  37. int_enbl_next = int_enbl_reg;
  38. if(~int_enbl_reg)
  39. begin
  40. int_enbl_next = 1'b1;
  41. end
  42. if(int_enbl_reg & m_axis_tready)
  43. begin
  44. int_lfsr_next = {int_lfsr_reg[62:0], int_lfsr_reg[62] ~^ int_lfsr_reg[61]};
  45. end
  46. end
  47. end
  48. else
  49. begin : NO_TREADY
  50. always @*
  51. begin
  52. int_lfsr_next = int_lfsr_reg;
  53. int_enbl_next = int_enbl_reg;
  54. if(~int_enbl_reg)
  55. begin
  56. int_enbl_next = 1'b1;
  57. end
  58. if(int_enbl_reg)
  59. begin
  60. int_lfsr_next = {int_lfsr_reg[62:0], int_lfsr_reg[62] ~^ int_lfsr_reg[61]};
  61. end
  62. end
  63. end
  64. endgenerate
  65. assign m_axis_tdata = int_lfsr_reg;
  66. assign m_axis_tvalid = int_enbl_reg;
  67. endmodule