------------------------------------------------------------ -- Copyright: 2011 Integrated Sytems Laboratory, ETH Zurich -- http://www.iis.ee.ethz.ch/~sha3 ------------------------------------------------------------ ------------------------------------------------------------------------------- -- Title : LFSR that generates 64 bit outputs -- Project : Shabziger ------------------------------------------------------------------------------- -- File : lfsr73.vhd -- Author : Frank K. Guerkaynak -- Company : Integrated Systems Laboratory, ETH Zurich -- Created : 2011-08-15 -- Last update: 2011-08-15 -- Platform : ModelSim (simulation), Synopsys (synthesis) -- Standard : VHDL'87 ------------------------------------------------------------------------------- -- Description: Simple LFSR to generate the input ------------------------------------------------------------------------------- -- Copyright (c) 2011 Integrated Systems Laboratory, ETH Zurich ------------------------------------------------------------------------------- -- Revisions : -- Date Version Author Description -- 2011-08-15 1.0 kgf Created by lfsrgen, modified to -- have serial I/O for initialization ------------------------------------------------------------------------------- -- Simple LFSR generated by lfsrgen.pl -- lfsr73x64x1.vhd -- x^73 + x^{25} + 1 -- calculated output after 64 iterations -- Primitive polynomial selected from HAC page 161. We need a polynomial -- with large coefficients. There are several sources where such lists can -- be found. HAC seems to be a more respected source. See also -- http://www.jjj.de/mathdata/highbit-normalprimpoly.txt -- http://www.jjj.de/mathdata/all-trinomial-primpoly.txt -- actually 71 65 would be much smaller (64 xors) but it is not in the -- HAC list.. library IEEE; use IEEE.std_logic_1164.all; entity lfsr73 is port( ScanInxTI : in std_logic; ScanEnxTI : in std_logic; ScanOutxTO : out std_logic; DataOutxDO : out std_logic_vector (63 downto 0); ClkxCI : in std_logic; RstxRBI : in std_logic ); end lfsr73; architecture generated of lfsr73 is signal DataxDP, DataxDN : std_logic_vector (72 downto 0); signal LFSRxD : std_logic_vector (72 downto 0); signal NextDataxD : std_logic_vector (72 downto 0); begin DataOutxDO <= DataxDP (72 downto 9); p_clk: process (ClkxCI, RstxRBI) begin if RstxRBI='0' then DataxDP <= (others => '1'); -- reset to one always elsif ClkxCI'event and ClkxCI= '1' then -- 'rising clock DataxDP <= DataxDN; end if; end process p_clk; -- LFSR assignments start here LFSRxD(0) <= DataxDP(11) xor DataxDP(59) xor DataxDP(34) xor DataxDP(9); LFSRxD(1) <= DataxDP(12) xor DataxDP(60) xor DataxDP(35) xor DataxDP(10); LFSRxD(2) <= DataxDP(13) xor DataxDP(61) xor DataxDP(36) xor DataxDP(11); LFSRxD(3) <= DataxDP(14) xor DataxDP(62) xor DataxDP(37) xor DataxDP(12); LFSRxD(4) <= DataxDP(15) xor DataxDP(63) xor DataxDP(38) xor DataxDP(13); LFSRxD(5) <= DataxDP(16) xor DataxDP(64) xor DataxDP(39) xor DataxDP(14); LFSRxD(6) <= DataxDP(17) xor DataxDP(65) xor DataxDP(40) xor DataxDP(15); LFSRxD(7) <= DataxDP(18) xor DataxDP(66) xor DataxDP(41) xor DataxDP(16); LFSRxD(8) <= DataxDP(19) xor DataxDP(67) xor DataxDP(42) xor DataxDP(17); LFSRxD(9) <= DataxDP(20) xor DataxDP(68) xor DataxDP(43) xor DataxDP(18); LFSRxD(10) <= DataxDP(21) xor DataxDP(69) xor DataxDP(44) xor DataxDP(19); LFSRxD(11) <= DataxDP(22) xor DataxDP(70) xor DataxDP(45) xor DataxDP(20); LFSRxD(12) <= DataxDP(23) xor DataxDP(71) xor DataxDP(46) xor DataxDP(21); LFSRxD(13) <= DataxDP(24) xor DataxDP(72) xor DataxDP(47) xor DataxDP(22); LFSRxD(14) <= DataxDP(0) xor DataxDP(48) xor DataxDP(23); LFSRxD(15) <= DataxDP(1) xor DataxDP(49) xor DataxDP(24); LFSRxD(16) <= DataxDP(2) xor DataxDP(50) xor DataxDP(25); LFSRxD(17) <= DataxDP(3) xor DataxDP(51) xor DataxDP(26); LFSRxD(18) <= DataxDP(4) xor DataxDP(52) xor DataxDP(27); LFSRxD(19) <= DataxDP(5) xor DataxDP(53) xor DataxDP(28); LFSRxD(20) <= DataxDP(6) xor DataxDP(54) xor DataxDP(29); LFSRxD(21) <= DataxDP(7) xor DataxDP(55) xor DataxDP(30); LFSRxD(22) <= DataxDP(8) xor DataxDP(56) xor DataxDP(31); LFSRxD(23) <= DataxDP(9) xor DataxDP(57) xor DataxDP(32); LFSRxD(24) <= DataxDP(10) xor DataxDP(58) xor DataxDP(33); LFSRxD(25) <= DataxDP(11) xor DataxDP(59) xor DataxDP(34); LFSRxD(26) <= DataxDP(12) xor DataxDP(60) xor DataxDP(35); LFSRxD(27) <= DataxDP(13) xor DataxDP(61) xor DataxDP(36); LFSRxD(28) <= DataxDP(14) xor DataxDP(62) xor DataxDP(37); LFSRxD(29) <= DataxDP(15) xor DataxDP(63) xor DataxDP(38); LFSRxD(30) <= DataxDP(16) xor DataxDP(64) xor DataxDP(39); LFSRxD(31) <= DataxDP(17) xor DataxDP(65) xor DataxDP(40); LFSRxD(32) <= DataxDP(18) xor DataxDP(66) xor DataxDP(41); LFSRxD(33) <= DataxDP(19) xor DataxDP(67) xor DataxDP(42); LFSRxD(34) <= DataxDP(20) xor DataxDP(68) xor DataxDP(43); LFSRxD(35) <= DataxDP(21) xor DataxDP(69) xor DataxDP(44); LFSRxD(36) <= DataxDP(22) xor DataxDP(70) xor DataxDP(45); LFSRxD(37) <= DataxDP(23) xor DataxDP(71) xor DataxDP(46); LFSRxD(38) <= DataxDP(24) xor DataxDP(72) xor DataxDP(47); LFSRxD(39) <= DataxDP(0) xor DataxDP(48); LFSRxD(40) <= DataxDP(1) xor DataxDP(49); LFSRxD(41) <= DataxDP(2) xor DataxDP(50); LFSRxD(42) <= DataxDP(3) xor DataxDP(51); LFSRxD(43) <= DataxDP(4) xor DataxDP(52); LFSRxD(44) <= DataxDP(5) xor DataxDP(53); LFSRxD(45) <= DataxDP(6) xor DataxDP(54); LFSRxD(46) <= DataxDP(7) xor DataxDP(55); LFSRxD(47) <= DataxDP(8) xor DataxDP(56); LFSRxD(48) <= DataxDP(9) xor DataxDP(57); LFSRxD(49) <= DataxDP(10) xor DataxDP(58); LFSRxD(50) <= DataxDP(11) xor DataxDP(59); LFSRxD(51) <= DataxDP(12) xor DataxDP(60); LFSRxD(52) <= DataxDP(13) xor DataxDP(61); LFSRxD(53) <= DataxDP(14) xor DataxDP(62); LFSRxD(54) <= DataxDP(15) xor DataxDP(63); LFSRxD(55) <= DataxDP(16) xor DataxDP(64); LFSRxD(56) <= DataxDP(17) xor DataxDP(65); LFSRxD(57) <= DataxDP(18) xor DataxDP(66); LFSRxD(58) <= DataxDP(19) xor DataxDP(67); LFSRxD(59) <= DataxDP(20) xor DataxDP(68); LFSRxD(60) <= DataxDP(21) xor DataxDP(69); LFSRxD(61) <= DataxDP(22) xor DataxDP(70); LFSRxD(62) <= DataxDP(23) xor DataxDP(71); LFSRxD(63) <= DataxDP(24) xor DataxDP(72); LFSRxD(64) <= DataxDP(0); LFSRxD(65) <= DataxDP(1); LFSRxD(66) <= DataxDP(2); LFSRxD(67) <= DataxDP(3); LFSRxD(68) <= DataxDP(4); LFSRxD(69) <= DataxDP(5); LFSRxD(70) <= DataxDP(6); LFSRxD(71) <= DataxDP(7); LFSRxD(72) <= DataxDP(8); -- This section has been modified to allow a regular shift register function -- into the LFSR. This way it can be initialized. with ScanEnxTI select DataxDN <= NextDataxD when '1', LFSRxD when others; -- NextData assignment NextDataxD(72 downto 1) <= DataxDP(71 downto 0); NextDataxD(0) <= ScanInxTI; ScanOutxTO <= DataxDP(72); end architecture generated;