------------------------------------------------------------
-- Copyright: 2011 George Mason University, Virginia USA
-- http://www.iis.ee.ethz.ch/~sha3
------------------------------------------------------------
-- =====================================================================
-- Copyright © 2010-2011 by Cryptographic Engineering Research Group (CERG),
-- ECE Department, George Mason University
-- Fairfax, VA, U.S.A.
-- =====================================================================
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use work.keccak_pkg.all;
-- asynchronous memory for Keccak constants
-- possible combinations for generic unrolled round factor ur = {1, 2, 3, 4, 6, 8, 12, 24}
entity keccak_cons is
generic (ur : integer:=1);
port(
addr : in std_logic_vector(4 downto 0);
rc : out std_logic_vector(ur*w-1 downto 0));
end keccak_cons;
architecture keccak_cons of keccak_cons is
type matrix is array (0 to 31) of std_logic_vector(w-1 downto 0);
constant my_rom: matrix :=(
x"0000000000000001", x"0000000000008082", x"800000000000808A", x"8000000080008000",
x"000000000000808B", x"0000000080000001", x"8000000080008081", x"8000000000008009",
x"000000000000008A", x"0000000000000088", x"0000000080008009", x"000000008000000A",
x"000000008000808B", x"800000000000008B", x"8000000000008089", x"8000000000008003",
x"8000000000008002", x"8000000000000080", x"000000000000800A", x"800000008000000A",
x"8000000080008081", x"8000000000008080", x"0000000080000001", x"8000000080008008",
x"0000000000000000", x"0000000000000000", x"0000000000000000", x"0000000000000000",
x"0000000000000000", x"0000000000000000", x"0000000000000000", x"0000000000000000");
begin
l1_con: if ur = 1 generate
rc <= my_rom(conv_integer(unsigned(addr)));
end generate;
l2_con: if ur > 1 generate
l2_gen: for i in 0 to ur-1 generate
rc(w*(i+1)-1 downto w*i) <= my_rom(conv_integer(unsigned(addr+i)));
end generate;
end generate;
end keccak_cons;