ComplPrng.v 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //////////////////////////////////////////////////////////////////////////////////
  2. // Company: NPK TAIR
  3. // Engineer: Mikhail Zaytsev
  4. //
  5. // Create Date: 21.02.2023
  6. // Design Name:
  7. // Module Name: ComplPrng
  8. // Project Name:
  9. // Target Devices:
  10. // Tool Versions:
  11. // Description: Pseudorandom number generator (PRNG) based on
  12. // Linear Feedback Shift Register (LFSR). Taus88
  13. //
  14. // Dependencies: None
  15. //
  16. //////////////////////////////////////////////////////////////////////////////////
  17. module ComplPrng
  18. #(
  19. parameter DataPrngWidth = 4,
  20. parameter InDataWidth = 14,
  21. parameter OutDataWidth = 20
  22. )
  23. (
  24. input [InDataWidth-1:0] Data_i,
  25. input Clk_i,
  26. input Rst_i,
  27. output signed [OutDataWidth-1:0] DataAndPrng_o
  28. );
  29. //================================================================================
  30. // REG/WIRE
  31. //================================================================================
  32. reg [31:0] s1;
  33. reg [31:0] s2;
  34. reg [31:0] s3;
  35. reg signed [31:0] dataPrng;
  36. wire signed [OutDataWidth-1:0] adcDataExtended;
  37. wire signed [DataPrngWidth-1:0] dataPrngCut;
  38. // wire signed [OutDataWidth-1:0] dataPrngCutExtended;
  39. reg signed [OutDataWidth-1:0] dataPrngCutExtended;
  40. reg signed [OutDataWidth-1:0] dataAndPrngReg;
  41. //================================================================================
  42. // ASSIGNMENTS
  43. //================================================================================
  44. // assign adcDataExtended = {Data_i[InDataWidth-1], Data_i[InDataWidth-1], Data_i, 4'b0};
  45. assign dataPrngCut = dataPrng[31-:DataPrngWidth];
  46. // assign dataPrngCutExtended = {{OutDataWidth-DataPrngWidth{dataPrngCut[DataPrngWidth-1]}}, dataPrngCut};
  47. // assign DataAndPrng_o = adcDataExtended+dataPrngCutExtended;
  48. assign DataAndPrng_o = dataAndPrngReg;
  49. //================================================================================
  50. // CODING
  51. //================================================================================
  52. always @(posedge Clk_i) begin
  53. if (Rst_i) begin
  54. s1 <= 32'd12345;
  55. s2 <= 32'd12345;
  56. s3 <= 32'd12345;
  57. end else begin
  58. s1 <= (((s1 & 32'd4294967294) << 12) ^ (((s1 << 13) ^ s1) >> 19));
  59. s2 <= (((s2 & 32'd4294967288) << 4) ^ (((s2 << 2) ^ s2) >> 25));
  60. s3 <= (((s3 & 32'd4294967280) << 17) ^ (((s3 << 3) ^ s3) >> 11));
  61. end
  62. end
  63. always @(posedge Clk_i) begin
  64. if (Rst_i) begin
  65. dataPrng <= 32'b0;
  66. end else begin
  67. dataPrng <= s1 ^ s2 ^ s3;
  68. end
  69. end
  70. always @(posedge Clk_i) begin
  71. if (Rst_i) begin
  72. dataPrngCutExtended <= 0;
  73. end else begin
  74. dataPrngCutExtended <= {{OutDataWidth-DataPrngWidth{dataPrngCut[DataPrngWidth-1]}}, dataPrngCut};
  75. end
  76. end
  77. always @(posedge Clk_i) begin
  78. if (Rst_i) begin
  79. dataAndPrngReg <= 0;
  80. end else begin
  81. dataAndPrngReg <= Data_i+dataPrngCutExtended;
  82. end
  83. end
  84. endmodule