| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- //////////////////////////////////////////////////////////////////////////////////
- // 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
- output signed [OutDataWidth-1:0] PrngData_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;
- assign PrngData_o = dataPrngCutExtended;
- //================================================================================
- // 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
|