------------------------------------------------------------
-- Copyright: 2010 Integrated Sytems Laboratory, ETH Zurich
-- http://www.iis.ee.ethz.ch/~sha3
------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.blakePkg.all;
entity blake is
port (
CLKxCI : in std_logic;
RSTxRBI : in std_logic;
MxDI : in std_logic_vector(WWIDTH*16-1 downto 0);
TxDI : in std_logic_vector(WWIDTH*2-1 downto 0);
HxDO : out std_logic_vector(WWIDTH*8-1 downto 0);
InENxSI : in std_logic;
OutENxSO : out std_logic
);
end blake;
architecture hash of blake is
component controller
port (
CLKxCI : in std_logic;
RSTxRBI : in std_logic;
VALIDINxSI : in std_logic;
VALIDOUTxSO : out std_logic;
ROUNDxSO : out unsigned(4 downto 0);
PROUNDxSO : out unsigned(4 downto 0);
NewChainxSO : out std_logic;
UseIVxSO : out std_logic);
end component;
component roundreg
port (
CLKxCI : in std_logic;
RSTxRBI : in std_logic;
WEIxSI : in std_logic;
ROUNDxSI : in unsigned(4 downto 0);
PROUNDxSI : in unsigned(4 downto 0);
VxDI : in SUB16;
MxDI : in SUB16;
MIxDI : in SUB4;
VxDO : out SUB16);
end component;
signal VxD, VFxD, MxDN, MxDP : SUB16;
signal HxDN, HxDP : SUB8;
signal MxD : SUB4;
signal TxD : SUB2;
signal ROUNDxS, PROUNDxS : unsigned(4 downto 0);
signal NewChainxS, UseIVxS : std_logic;
begin -- hash
-- Unform
-----------------------------------------------------------------------------
p_un16 : for i in 15 downto 0 generate
MxDN(15-i) <= MxDI(WWIDTH*(i+1)-1 downto WWIDTH*i) when InENxSI = '1' else MxDP(15-i);
end generate p_un16;
MxD(0) <= MxDN(0);
MxD(1) <= MxDN(2);
MxD(2) <= MxDN(4);
MxD(3) <= MxDN(6);
p_un8: for i in 7 downto 0 generate
HxDO(WWIDTH*(i+1)-1 downto WWIDTH*i) <= HxDN(7-i);
end generate p_un8;
p_un2: for i in 1 downto 0 generate
TxD(1-i) <= TxDI(WWIDTH*(i+1)-1 downto WWIDTH*i);
end generate p_un2;
-- CONTROLLER
-----------------------------------------------------------------------------
u_controller : controller
port map (
CLKxCI => CLKxCI,
RSTxRBI => RSTxRBI,
VALIDINxSI => InENxSI,
VALIDOUTxSO => OutENxSO,
ROUNDxSO => ROUNDxS,
PROUNDxSO => PROUNDxS,
NewChainxSO => NewChainxS,
UseIVxSO => UseIVxS
);
-- INITIALIZATION
-----------------------------------------------------------------------------
VxD(0) <= HxDN(0) when UseIVxS = '0' else IV(0);
VxD(1) <= HxDN(1) when UseIVxS = '0' else IV(1);
VxD(2) <= HxDN(2) when UseIVxS = '0' else IV(2);
VxD(3) <= HxDN(3) when UseIVxS = '0' else IV(3);
VxD(4) <= HxDN(4) when UseIVxS = '0' else IV(4);
VxD(5) <= HxDN(5) when UseIVxS = '0' else IV(5);
VxD(6) <= HxDN(6) when UseIVxS = '0' else IV(6);
VxD(7) <= HxDN(7) when UseIVxS = '0' else IV(7);
VxD(8) <= C(0);
VxD(9) <= C(1);
VxD(10) <= C(2);
VxD(11) <= C(3);
VxD(12) <= TxD(0) xor C(4);
VxD(13) <= TxD(0) xor C(5);
VxD(14) <= TxD(1) xor C(6);
VxD(15) <= TxD(1) xor C(7);
-- ROUND
-----------------------------------------------------------------------------
u_roundreg : roundreg
port map (
CLKxCI => CLKxCI,
RSTxRBI => RSTxRBI,
WEIxSI => InENxSI,
ROUNDxSI => ROUNDxS,
PROUNDxSI => PROUNDxS,
VxDI => VxD,
MxDI => MxDP,
MIxDI => MxD,
VxDO => VFxD
);
-- FINALIZATION
-----------------------------------------------------------------------------
HxDN(0) <= IV(0) when UseIVxS = '1' else (HxDP(0) xor VFxD(0) xor VFxD(8)) when NewChainxS = '1' else HxDP(0);
HxDN(1) <= IV(1) when UseIVxS = '1' else (HxDP(1) xor VFxD(1) xor VFxD(9)) when NewChainxS = '1' else HxDP(1);
HxDN(2) <= IV(2) when UseIVxS = '1' else (HxDP(2) xor VFxD(2) xor VFxD(10)) when NewChainxS = '1' else HxDP(2);
HxDN(3) <= IV(3) when UseIVxS = '1' else (HxDP(3) xor VFxD(3) xor VFxD(11)) when NewChainxS = '1' else HxDP(3);
HxDN(4) <= IV(4) when UseIVxS = '1' else (HxDP(4) xor VFxD(4) xor VFxD(12)) when NewChainxS = '1' else HxDP(4);
HxDN(5) <= IV(5) when UseIVxS = '1' else (HxDP(5) xor VFxD(5) xor VFxD(13)) when NewChainxS = '1' else HxDP(5);
HxDN(6) <= IV(6) when UseIVxS = '1' else (HxDP(6) xor VFxD(6) xor VFxD(14)) when NewChainxS = '1' else HxDP(6);
HxDN(7) <= IV(7) when UseIVxS = '1' else (HxDP(7) xor VFxD(7) xor VFxD(15)) when NewChainxS = '1' else HxDP(7);
-- M and H Memories
-----------------------------------------------------------------------------
p_mem: process (CLKxCI, RSTxRBI)
begin -- process p_mem
if RSTxRBI = '0' then -- asynchronous reset (active low)
HxDP <= (others => (others => '0'));
MxDP <= (others => (others => '0'));
elsif CLKxCI'event and CLKxCI = '1' then -- rising clock edge
HxDP <= HxDN;
MxDP <= MxDN;
end if;
end process p_mem;
end hash;