module MersenneTwister_TT800( input clk, output reg [31:0] rnd); parameter N = 25; parameter M = 7; integer MT [0:(N-1)]; integer y_1, y_2, y_3, y_4; integer index; integer indexM; initial begin index <= 0; indexM <= 0; rnd <= 0; y_1 <= 0; y_2 <= 0; y_3 <= 0; y_4 <= 0; `include "/home/trd/projects/LTUT/SRC/LTU_T_modules/MersenneTwister/MT_TT800_initialization.v" end always @(posedge clk) begin y_1 <= MT[index]; y_2 <= y_1 ^ ((y_1 << 7) & 32'h2b5b2500); y_3 <= y_2 ^ ((y_2 << 15) & 32'hdb8b0000); y_4 <= y_3 ^ (y_3 >> 16); // $display("%d",y); rnd <= y_4; if (index == (N-1)) index <= 0; else index <= index + 1'b1; end always @(posedge clk) begin if (index + M >= N) indexM = index + M - N; else indexM = index + M; if (MT[index][0] == 1) begin MT[index] = MT[indexM] ^ (MT[index]>>1) ^ 32'h8ebfd028; end else begin MT[index] = MT[indexM] ^ (MT[index]>>1); end end endmodule