library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; library unisim; use unisim.vcomponents.all; entity mersenne_twister is generic ( N : integer := 623; M : integer := 397; W : integer := 32; R : integer := 31; A : std_logic_vector(31 downto 0) := x"9908b0df"; cnt_width : integer := 10 ); port ( clk40 : in std_logic; rst40 : in std_logic; rnd : out std_logic_vector(W-1 downto 0); valid : out std_logic ); end mersenne_twister; architecture default of mersenne_twister is signal kn : std_logic_vector(cnt_width-1 downto 0); signal km : std_logic_vector(cnt_width-1 downto 0); signal kn_msb_r : std_logic; signal km_msb_r : std_logic; signal value : std_logic_vector(W-1 downto 0); signal wea1 : std_logic; signal wea2 : std_logic; signal din : std_logic_vector(31 downto 0); signal doutn : std_logic_vector(31 downto 0); signal doutn1 : std_logic_vector(31 downto 0); signal doutn2 : std_logic_vector(31 downto 0); signal doutm : std_logic_vector(31 downto 0); signal doutm1 : std_logic_vector(31 downto 0); signal doutm2 : std_logic_vector(31 downto 0); signal magic : std_logic_vector(31 downto 0); signal xk : std_logic_vector(31 downto 0); signal xkk : std_logic_vector(31 downto 0); signal xm : std_logic_vector(31 downto 0); signal xmm : std_logic_vector(31 downto 0); signal xnew : std_logic_vector(31 downto 0); signal x : std_logic_vector(31 downto 0); signal y : std_logic_vector(31 downto 0); signal z : std_logic_vector(31 downto 0); begin bram_inst1 : RAMB16_S36_S36 generic map ( WRITE_MODE_A => "READ_FIRST", WRITE_MODE_B => "READ_FIRST", INIT_00 => x"328058be4f0945ea2bc4c21441162062ef2ac80525a828da9c4563fa00001105", INIT_01 => x"dc0a720727ae869872c448c38dbdf57ca51980b20ab7471bb549c23f3152b0fe", INIT_02 => x"a951376091310a171d19c26d5863bf798e42fe033dfe1f30d7523fc5353f1fa4", INIT_03 => x"c9a32e86f23641d89ea6fc30514ad416e189417156ebd19fae42b5a31f5c4bc2", INIT_04 => x"a429ae5d7caa2cff205998656045d34113a1635965223dff34dad71942e98799", INIT_05 => x"07f30a81359464ea33ace40cf55485f0d2bef4772e14045cd78ec949eb5ba2a3", INIT_06 => x"c863d3dba0331cd6c71330234b326857822fd6e59ca769c864e2f4dfe9092e15", INIT_07 => x"da767a869b1d9039647bcdde00bf0d8d37b92b7d71e86b1bec9e01ce66a92c70", INIT_08 => x"4756e2f6f19e0480cb14ccb1ddb109ff9c26a49d7e50fa53ef3af93e0df283b9", INIT_09 => x"526b0de4e4f74872013bb75485786df966f532a8f1ecf19a240abf100d7ebabb", INIT_0a => x"f01bfdcffce6ec1b254ce2e1e9a2759f4f3970eee7aa71fc55976563cbef08a9", INIT_0b => x"de2406f3c100cd075ea3a3f46080274a22179356866f14dd06353bc7b6714dd4", INIT_0c => x"7b5f64be26d1390b357f9e41066436ace38f1cabd1d30aabe1f7e1165c7d2d10", INIT_0d => x"db91ec03b34b4e06071c09b805fd74ef85d41bc5c0aca551c87db6580ec5f6c3", INIT_0e => x"5b1d0cde6219c7dade8be597bf918f78f95be4b7e52230f732e928a12bde1c70", INIT_0f => x"18adde9fc81793a3d9b426c291eecb6344a7e45ab03385f1b4b353a9ec726b73", INIT_10 => x"29aa716f98c612caec57c6f7b9887e8826ffa7b4b72aafdf2f332a99f314ec3b", INIT_11 => x"88ec3bdd174c4036680b1a8930d8104cc5deb4c3d62ebbdbff46417e94fc2853", INIT_12 => x"8cb018d594a952648e0ed4b47727d132dad2d345f80cb5c9d60ca8682856f68b", INIT_13 => x"91d8b8bee61de53078f3522b3370b9766f1bb4d36527bbd9cf5239d020a5dc6b", INIT_14 => x"68e56e71c0c4bf0168da8cbe369226a53572ae6d78e8ff03759ccf4ce2817ecc", INIT_15 => x"bf5436891577edd21281f854e3b1f2180319cafceedba47e93cec1466fae82d8", INIT_16 => x"0b447340596144540ec8ca46bdfe52bf72b66eae2f9253dffabbea2aaf36e887", INIT_17 => x"92092103a4e4bcf68fc023daf2b5735ab720cd4463339654fd73b2913a6eb8f8", INIT_18 => x"a0149453c128d29fb4c5d96733fe3cfa112aa2feaf2c931d350fd0bfd34a8f25", INIT_19 => x"7ca42f824269623636527948ca42cc5c6bb8ac513cb4080e4b2917f565b4ddbd", INIT_1a => x"781869f190a1c010452b6bb39d7b8084dbed5df371a0a6a1439619229ac8da7f", INIT_1b => x"48812219b04825b03b10ad6ad937f80a7e7b3e972277490c67d2bd4b97e33c88", INIT_1c => x"d0141b4f5c833e49723aa326884f95af52afda6e2a0d202f6e14d3c8c4d94c58", INIT_1d => x"ef4d6f29b3c4eeb0b02a3b9826b87acf652565a65e31639edbc106a7a99e71e4", INIT_1e => x"cd837c90ee40202673654771d87d02cf680f4a3eed8fb4ecdadca1719c305682", INIT_1f => x"d293f1366720c76afbca7bff87275fd8e35163af8a6106a673c56a3dde8fd1f7", INIT_20 => x"4b09ccfe312f582b5ad29ac02b70f49f14cd38ff5e7ed64d410e50ee34e687e9", INIT_21 => x"2806347c423265681151ba52318662615f79f130d515bfc221de3458088b58a3", INIT_22 => x"b5d130a63320bfe3ff2fbd4abf05a293e3ed43105a5b98b8b52291acdbed11fc", INIT_23 => x"fbfafc3b1d8aeaece21c8cb525336fb82854186cc72e6d7e52d62695330bf5cc", INIT_24 => x"0e7aa2fa834866d5e0f2cb80c275a8bc59245bb9d69591dd60f41f9e40877b38", INIT_25 => x"95c8a5e91d7b2332e74f7bb7e44c2cc120d10e716af5a6cf47820740447017ca", INIT_26 => x"3eabd6433c4fb61cdeb305ed2cd50258ef237c57978d6e5635a97854266139e7", INIT_27 => x"bfef37e09d62c28f236ccf7d1a73d140043191b411cf038588b179edcf4a64a7", INIT_28 => x"4c9e5560d4ee4ea6fd26f1e378737347b4d10b45de7242d9aa796d499d76ff6a", INIT_29 => x"c85c5f63cabe0e87a40021475eba9d73a60ffc995f850037ccef0aea37cf998d", INIT_2a => x"7eee925fbdd7c06a38c65b849dd3e6018966ddabb237d17ac297a10b971c0230", INIT_2b => x"1fd90f3843cf6564f6a0968d0f778570f44d3c875c1831bde6261a2469060e6e", INIT_2c => x"5b9454e0505c0a84ce4ee1c59cc588e2fb69b0a5e6109f19fdf6a6e8c44ffa78", INIT_2d => x"78257e30468e9e2cf6a7bce53566d21892bcd93ebe7964d53cccd48fc118e72d", INIT_2e => x"35c4cc1bb5fc47d64499f6e127e37efce06072ebe40c501b7b89fdf496aa03c5", INIT_2f => x"efda7af8d53a38869f0d6e6a2105e0e9bd0ea16b6bb2193150b798ea809bfb1f", INIT_30 => x"299c6ffb10350764c6127f8524dfa600289708cc29ea9a15a7547695cddfd987", INIT_31 => x"2215e4ba584f394ee79abcc3924cb5fcbd60d3b2ddd4fa989f450af41682828f", INIT_32 => x"8bf022272505dd50be0b8e3045205dfef02c5921c9b84775520f41a6e320c8f2", INIT_33 => x"22ef2d866a51315a758f530d273dacb0af2bd786fe07950cffe2c78943064731", INIT_34 => x"b42fa5deb06c6b69b7b288051f3336e0b08baa8ea5546c0d938ecf8d8e63ad7e", INIT_35 => x"a0c579695ca0fa3337e450a1310f9de4ae0183dadc03ee00baa6a09cef932d74", INIT_36 => x"87cc6402759359eed8188fdba5d7862ca93f671a4b39acdabde1e00a91d02be7", INIT_37 => x"57ee8e15cd8cc09d4f24c4f2d5d99d9256625a1fe1f1a297b2a7fe1bb12775b8", INIT_38 => x"d32b16c6759f709290e82cdedbded9a6af42eb38b3cfe6d393c5083fadb2c3a4", INIT_39 => x"48b789ab5a32d8ad7ddcfcf2b2c16ec362dee52af15e4f702c4a0fae1a926a81", INIT_3a => x"886bc24355b6edfd777e0c9aaf2515e34a190a62ba3824e1d0b66d6064bb4be2", INIT_3b => x"fdd391e0f14cd06eb47bf35231184ed1716b4450037dcbd149927e2a393f6e7d", INIT_3c => x"7a3920ceb64da8593d715ef7bfbda0a805fe9974f6e708be0bebebac1ec00b6f", INIT_3d => x"23be5f04113021f1242721478c055950ffd835971e84003cab4c48e804c1ba93", INIT_3e => x"a0bc45385e0122ac62a5ed7f589a49c3dce0132033d5d0294f2c4d6a4410a284", INIT_3f => x"c4734f600f00724d769f51a243bf6940fb00f7f7d186bc4f241fd63187e95bda" ) port map ( ADDRA => kn(8 downto 0), DIA => xnew, DIPA => (others => '1'), DOA => doutn1, DOPA => open, WEA => wea1, ENA => '1', SSRA => rst40, CLKA => clk40, ADDRB => km(8 downto 0), DIB => (others => '1'), DIPB => (others => '1'), DOB => doutm1, DOPB => open, WEB => '0', ENB => '1', SSRB => rst40, CLKB => clk40 ); bram_inst2 : RAMB16_S36_S36 generic map ( WRITE_MODE_A => "READ_FIRST", WRITE_MODE_B => "READ_FIRST", INIT_00 => x"8e25772083f75ba7ce59a98e9be8d557a7f37a559cc33ae891e239ec26af4f0f", INIT_01 => x"26372f1765c22c69fec188bc3c05d8831dbfd0ab84fafa227027a239bb773472", INIT_02 => x"fb37bfc1eec0c161d21ef2ec98a00b89a07686d31ed685c0253d11169999e523", INIT_03 => x"c5f1862eb724ba61e76bf484e2b1b5d8d8a7870f0f2d9be4437f7b0308eb7ba2", INIT_04 => x"29bd0a01bd1957d087ce7960b56e441db5669707b0ff6516ab9721e6005306e1", INIT_05 => x"f65b8d0340c41c45cf929bc81a20e6ff4292edd68dcbd7cd8843766553f67d8d", INIT_06 => x"7b184f43727ece1d1a78515b011cb32e04645a7242a112d249e414210b93a330", INIT_07 => x"e182ab7011f289ddbcdb3eb138f2bd64fdadb00bbf5b019264aab87995cf9942", INIT_08 => x"8b5427ff75f00f593be7111752ba4f6b1a6e599b17e730788459acfc1a73319f", INIT_09 => x"88ca6288e0bf78468ac13a9a1f4378c9344ff33966909557bded1c8bd5852e19", INIT_0a => x"e1cc3f77618606a16a9d53ee8d403e27fa6af8d49d0374efa41e4cdb305abcc2", INIT_0b => x"b92d63bf160275e0093c2e5ae1f53aba3a280006714481ce534444650fb61f1c", INIT_0c => x"dede7d1945033dcb2c2aca014424fd6db13b62d737e21164473163dbcf7380f1", INIT_0d => x"bcb67495cf119a2d12251c53b50f06ec95a4ea826a4a51ca0653cbe0627047aa" ) port map ( ADDRA => kn(8 downto 0), DIA => xnew, DIPA => (others => '1'), DOA => doutn2, DOPA => open, WEA => wea2, ENA => '1', SSRA => rst40, CLKA => clk40, ADDRB => km(8 downto 0), DIB => (others => '1'), DIPB => (others => '1'), DOB => doutm2, DOPB => open, WEB => '0', ENB => '1', SSRB => rst40, CLKB => clk40 ); wea1 <= not kn(9) and not rst40; wea2 <= kn(9) and not rst40; doutn <= doutn1 when kn_msb_r = '0' else doutn2; doutm <= doutm1 when km_msb_r = '0' else doutm2; process (clk40) begin if rising_edge(clk40) then kn_msb_r <= kn(9); km_msb_r <= km(9); xk <= doutn; xkk <= xk; if (doutn(0) = '1') then magic <= x"9908b0df"; else magic <= (others => '0'); end if; xm <= doutm; xmm <= xm; xnew <= xmm xor ('0' & xkk(31) & xk(30 downto 1)) xor magic; x <= xnew xor ("00000000000" & xnew(31 downto 11)); y <= x xor ((x(24 downto 0) & "0000000") and x"9d2c5680"); z <= y xor ((y(16 downto 0) & "000000000000000") and x"efc60000"); rnd <= z xor ("000000000000000000" & z(31 downto 18)); end if; end process; process (clk40) begin if rst40 = '1' then kn <= (others => '0'); km <= conv_std_logic_vector(M, cnt_width); valid <= '0'; elsif rising_edge(clk40) then if kn = conv_std_logic_vector(N, cnt_width) then kn <= conv_std_logic_vector(4, cnt_width); -- (others => '0'); else kn <= kn + '1'; end if; if km = conv_std_logic_vector(N, cnt_width) then km <= conv_std_logic_vector(4, cnt_width); -- (others => '0'); else km <= km + '1'; end if; if kn >= conv_std_logic_vector(20, cnt_width) then valid <= '1'; end if; end if; end process; end default;