2021-02-28 18:59:56 +03:00

38 lines
727 B
Systemverilog

`timescale 1ns/100ps
`default_nettype none
module lfsr #(parameter POLY = 32'hA3000000)
(clock,
preset,
data_i,
prnd_o);
localparam WIDTH = $size(POLY);
input wire clock;
input wire preset;
input wire [WIDTH-1:0] data_i;
output wire prnd_o;
logic [WIDTH-1:0] sreg;
logic feedback;
initial sreg = '1;
assign feedback = sreg[0];
assign prnd_o = feedback;
integer i;
always_ff @ (posedge clock)
if (preset)
sreg <= (data_i == '0) ? '1 : data_i;
else begin
sreg[WIDTH-1] <= feedback;
for (i = 0; i < (WIDTH-1); i ++)
sreg[i] <= POLY[i] ? (sreg[i+1] ^ feedback) : sreg[i+1];
end
endmodule // lfsr