ComplPrng.v 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. output signed [OutDataWidth-1:0] PrngData_o
  29. );
  30. //================================================================================
  31. // REG/WIRE
  32. //================================================================================
  33. reg [31:0] s1;
  34. reg [31:0] s2;
  35. reg [31:0] s3;
  36. reg signed [31:0] dataPrng;
  37. wire signed [OutDataWidth-1:0] adcDataExtended;
  38. wire signed [DataPrngWidth-1:0] dataPrngCut;
  39. // wire signed [OutDataWidth-1:0] dataPrngCutExtended;
  40. reg signed [OutDataWidth-1:0] dataPrngCutExtended;
  41. reg signed [OutDataWidth-1:0] dataAndPrngReg;
  42. //================================================================================
  43. // ASSIGNMENTS
  44. //================================================================================
  45. // assign adcDataExtended = {Data_i[InDataWidth-1], Data_i[InDataWidth-1], Data_i, 4'b0};
  46. assign dataPrngCut = dataPrng[31-:DataPrngWidth];
  47. // assign dataPrngCutExtended = {{OutDataWidth-DataPrngWidth{dataPrngCut[DataPrngWidth-1]}}, dataPrngCut};
  48. // assign DataAndPrng_o = adcDataExtended+dataPrngCutExtended;
  49. // assign DataAndPrng_o = dataAndPrngReg;
  50. assign PrngData_o = dataPrngCutExtended;
  51. //================================================================================
  52. // CODING
  53. //================================================================================
  54. always @(posedge Clk_i) begin
  55. if (Rst_i) begin
  56. s1 <= 32'd12345;
  57. s2 <= 32'd12345;
  58. s3 <= 32'd12345;
  59. end else begin
  60. s1 <= (((s1 & 32'd4294967294) << 12) ^ (((s1 << 13) ^ s1) >> 19));
  61. s2 <= (((s2 & 32'd4294967288) << 4) ^ (((s2 << 2) ^ s2) >> 25));
  62. s3 <= (((s3 & 32'd4294967280) << 17) ^ (((s3 << 3) ^ s3) >> 11));
  63. end
  64. end
  65. always @(posedge Clk_i) begin
  66. if (Rst_i) begin
  67. dataPrng <= 32'b0;
  68. end else begin
  69. dataPrng <= s1 ^ s2 ^ s3;
  70. end
  71. end
  72. always @(posedge Clk_i) begin
  73. if (Rst_i) begin
  74. dataPrngCutExtended <= 0;
  75. end else begin
  76. dataPrngCutExtended <= {{OutDataWidth-DataPrngWidth{dataPrngCut[DataPrngWidth-1]}}, dataPrngCut};
  77. end
  78. end
  79. // always @(posedge Clk_i) begin
  80. // if (Rst_i) begin
  81. // dataAndPrngReg <= 0;
  82. // end else begin
  83. // dataAndPrngReg <= Data_i+dataPrngCutExtended;
  84. // end
  85. // end
  86. endmodule