------------------------------------------------------------
-- 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 std.textio.all;
use ieee.std_logic_textio.all;
use work.blakePkg.all;
entity roundreg is
port (
CLKxCI : in std_logic;
RSTxRBI : in std_logic;
WEIxSI : in std_logic;
ICNTxSI : in unsigned(3 downto 0);
ROUNDxSI : in unsigned(3 downto 0);
VxDI : in SUB16;
MxDI : in SUB16;
VxDO : out SUB16
);
end roundreg;
architecture hash of roundreg is
signal VxDN, VxDP, MxD : SUB16;
signal G0AxD, G0BxD, G0CxD, G0DxD : std_logic_vector(WWIDTH-1 downto 0);
signal G0MxD, G0KxD : std_logic_vector(WWIDTH-1 downto 0);
signal G0AOxD, G0BOxD, G0COxD, G0DOxD : std_logic_vector(WWIDTH-1 downto 0);
signal T1, T4 : unsigned(WWIDTH-1 downto 0);
signal T2, T3, T5, T6 : std_logic_vector(WWIDTH-1 downto 0);
begin -- hash
VxDO <= VxDP;
-----------------------------------------------------------------------------
-- MEMORY INPUTS
-----------------------------------------------------------------------------
p_inmem: process (G0AOxD, G0BOxD, G0COxD, G0DOxD, VxDI, VxDP, WEIxSI, ICNTxSI)
begin -- process p_inmem
VxDN <= VxDP;
if WEIxSI = '1' then
VxDN <= VxDI;
else
VxDN(IMATRIX(to_integer(ICNTxSI(3 downto 1)), 0)) <= G0AOxD;
VxDN(IMATRIX(to_integer(ICNTxSI(3 downto 1)), 1)) <= G0BOxD;
VxDN(IMATRIX(to_integer(ICNTxSI(3 downto 1)), 2)) <= G0COxD;
VxDN(IMATRIX(to_integer(ICNTxSI(3 downto 1)), 3)) <= G0DOxD;
end if;
end process p_inmem;
-----------------------------------------------------------------------------
-- F AND G INPUTS
-----------------------------------------------------------------------------
p_outmem: process (ICNTxSI, MxDI, ROUNDxSI, VxDP)
variable IND : integer;
begin -- process p_outmem
IND := to_integer(ICNTxSI(3 downto 1));
G0AxD <= VxDP(IMATRIX(IND, 0));
G0BxD <= VxDP(IMATRIX(IND, 1));
G0CxD <= VxDP(IMATRIX(IND, 2));
G0DxD <= VxDP(IMATRIX(IND, 3));
if ICNTxSI(0) = '0' then
G0MxD <= MxDI(PMATRIX(to_integer(ROUNDxSI), IND*2));
G0KxD <= C(PMATRIX(to_integer(ROUNDxSI), IND*2+1));
else
G0MxD <= MxDI(PMATRIX(to_integer(ROUNDxSI), IND*2+1));
G0KxD <= C(PMATRIX(to_integer(ROUNDxSI), IND*2));
end if;
end process p_outmem;
-----------------------------------------------------------------------------
-- PASS INSTANTIATION
-----------------------------------------------------------------------------
T1 <= unsigned(G0AxD) + unsigned(G0BxD) + unsigned(G0MxD xor G0KxD);
T2 <= std_logic_vector(T1) xor G0DxD;
T4 <= unsigned(G0CxD) + unsigned(T3);
T5 <= std_logic_vector(T4) xor G0BxD;
T3 <= T2(15 downto 0) & T2(WWIDTH-1 downto 16) when ICNTxSI(0) = '0' else T2(7 downto 0) & T2(WWIDTH-1 downto 8);
T6 <= T5(11 downto 0) & T5(WWIDTH-1 downto 12) when ICNTxSI(0) = '0' else T5(6 downto 0) & T5(WWIDTH-1 downto 7);
G0AOxD <= std_logic_vector(T1);
G0BOxD <= T6;
G0COxD <= std_logic_vector(T4);
G0DOxD <= T3;
-----------------------------------------------------------------------------
-- V MEMORY
-----------------------------------------------------------------------------
p_mem: process (CLKxCI, RSTxRBI)
begin -- process p_vmem
if RSTxRBI = '0' then -- asynchronous reset (active low)
VxDP <= (others => (others => '0'));
elsif CLKxCI'event and CLKxCI = '1' then -- rising clock edge
VxDP <= VxDN;
end if;
end process p_mem;
end hash;