| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- //////////////////////////////////////////////////////////////////////////////////
- // Company: NPK TAIR
- // Engineer: Mikhail Zaytsev
- //
- // Create Date: 21.02.2023
- // Design Name:
- // Module Name: ComplPrng
- // Project Name:
- // Target Devices:
- // Tool Versions:
- // Description: Pseudorandom number generator (PRNG) based on
- // Linear Feedback Shift Register (LFSR). Taus88
- //
- // Dependencies: None
- //
- //////////////////////////////////////////////////////////////////////////////////
- module ComplPrng
- #(
- parameter DataPrngWidth = 4,
- parameter InDataWidth = 14,
- parameter OutDataWidth = 20
- )
- (
- input [InDataWidth-1:0] Data_i,
- input Clk_i,
- input Rst_i,
- output signed [OutDataWidth-1:0] DataAndPrng_o
- );
- //================================================================================
- // REG/WIRE
- //================================================================================
- reg [31:0] s1;
- reg [31:0] s2;
- reg [31:0] s3;
- reg signed [31:0] dataPrng;
- wire signed [OutDataWidth-1:0] adcDataExtended;
- wire signed [DataPrngWidth-1:0] dataPrngCut;
- // wire signed [OutDataWidth-1:0] dataPrngCutExtended;
- reg signed [OutDataWidth-1:0] dataPrngCutExtended;
- reg signed [OutDataWidth-1:0] dataAndPrngReg;
- //================================================================================
- // ASSIGNMENTS
- //================================================================================
- // assign adcDataExtended = {Data_i[InDataWidth-1], Data_i[InDataWidth-1], Data_i, 4'b0};
- assign dataPrngCut = dataPrng[31-:DataPrngWidth];
- // assign dataPrngCutExtended = {{OutDataWidth-DataPrngWidth{dataPrngCut[DataPrngWidth-1]}}, dataPrngCut};
- // assign DataAndPrng_o = adcDataExtended+dataPrngCutExtended;
- assign DataAndPrng_o = dataAndPrngReg;
- //================================================================================
- // CODING
- //================================================================================
- always @(posedge Clk_i) begin
- if (Rst_i) begin
- s1 <= 32'd12345;
- s2 <= 32'd12345;
- s3 <= 32'd12345;
- end else begin
- s1 <= (((s1 & 32'd4294967294) << 12) ^ (((s1 << 13) ^ s1) >> 19));
- s2 <= (((s2 & 32'd4294967288) << 4) ^ (((s2 << 2) ^ s2) >> 25));
- s3 <= (((s3 & 32'd4294967280) << 17) ^ (((s3 << 3) ^ s3) >> 11));
- end
- end
- always @(posedge Clk_i) begin
- if (Rst_i) begin
- dataPrng <= 32'b0;
- end else begin
- dataPrng <= s1 ^ s2 ^ s3;
- end
- end
- always @(posedge Clk_i) begin
- if (Rst_i) begin
- dataPrngCutExtended <= 0;
- end else begin
- dataPrngCutExtended <= {{OutDataWidth-DataPrngWidth{dataPrngCut[DataPrngWidth-1]}}, dataPrngCut};
- end
- end
- always @(posedge Clk_i) begin
- if (Rst_i) begin
- dataAndPrngReg <= 0;
- end else begin
- dataAndPrngReg <= Data_i+dataPrngCutExtended;
- end
- end
- endmodule
|