------------------------------------------------------------
-- Copyright: 2011 Integrated Sytems Laboratory, ETH Zurich
-- http://www.iis.ee.ethz.ch/~sha3
------------------------------------------------------------
-------------------------------------------------------------------------------
-- Title : MainLoop
-- Project :
-------------------------------------------------------------------------------
-- File : MainLoop.vhdl
-- Author : Köppel Benedikt;Schnydrig Mathias
-- Company : Integrated Systems Laboratory, ETH Zurich
-- Created : 2010-10-28
-- Last update: 2011-08-29
-- Platform : ModelSim (simulation), Synopsys (synthesis)
-- Standard : VHDL'87
-------------------------------------------------------------------------------
-- Description: SHA 256 Main Loop
-------------------------------------------------------------------------------
-- Copyright (c) 2010 Integrated Systems Laboratory, ETH Zurich
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 2010-10-28 1.0 sem10h7 Created
-- 2011-08-29 1.1 kgf changed the entity name for CSA
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;
use work.shapkg.all;
entity MainLoop is
port (
KKKxDI : in std_logic_vector(31 downto 0);
WKKxDI : in std_logic_vector(31 downto 0);
AtoHxDI : in h_arr;
AtoHxDO : out h_arr
);
end MainLoop;
architecture behave of MainLoop is
signal S0xD : std_logic_vector(31 downto 0);
signal MajxD : std_logic_vector(31 downto 0);
signal CHxD : std_logic_vector(31 downto 0);
signal S1xD : std_logic_vector(31 downto 0);
signal T1sum2xD : std_logic_vector(31 downto 0);
signal T2xD : std_logic_vector(31 downto 0);
signal T1sum1xD : std_logic_vector(31 downto 0);
signal T1sum3xD : std_logic_vector(31 downto 0);
signal T1xD : std_logic_vector(31 downto 0);
-- carry save adders
-- signal SCAxD : std_logic_vector(31 downto 0);
-- signal PSAxD : std_logic_vector(31 downto 0);
-- signal SumAxD : std_logic_vector(32 downto 0);
-- signal SCExD : std_logic_vector(31 downto 0);
-- signal PSExD : std_logic_vector(31 downto 0);
-- signal SumExD : std_logic_vector(32 downto 0);
constant WIDTH : integer := 32; -- CSA width
component ethz_csa
generic (
WIDTH : integer);
port (
XxDI : in std_logic_vector(WIDTH-1 downto 0);
YxDI : in std_logic_vector(WIDTH-1 downto 0);
ZxDI : in std_logic_vector(WIDTH-1 downto 0);
CxDO : out std_logic_vector(WIDTH-1 downto 0);
SxDO : out std_logic_vector(WIDTH-1 downto 0));
end component;
-- temp signals
signal CSAC1xD : std_logic_vector(WIDTH-1 downto 0);
signal CSAS1xD : std_logic_vector(WIDTH-1 downto 0);
signal CSAC2xD : std_logic_vector(WIDTH-1 downto 0);
signal CSAS2xD : std_logic_vector(WIDTH-1 downto 0);
signal CSAC3xD : std_logic_vector(WIDTH-1 downto 0);
signal CSAS3xD : std_logic_vector(WIDTH-1 downto 0);
signal CSAC4xD : std_logic_vector(WIDTH-1 downto 0);
signal CSAS4xD : std_logic_vector(WIDTH-1 downto 0);
signal CSAC5xD : std_logic_vector(WIDTH-1 downto 0);
signal CSAS5xD : std_logic_vector(WIDTH-1 downto 0);
signal CSAC6xD : std_logic_vector(WIDTH-1 downto 0);
signal CSAS6xD : std_logic_vector(WIDTH-1 downto 0);
-- component Add32Mod
-- port (
-- a : in std_logic_vector(31 downto 0);
-- b : in std_logic_vector(31 downto 0);
-- s : out std_logic_vector(31 downto 0));
-- end component;
begin
CSA_1: ethz_csa
generic map (
WIDTH => WIDTH)
port map (
XxDI => KKKxDI,
YxDI => WKKxDI,
ZxDI => AtoHxDI(7),
CxDO => CSAC1xD,
SxDO => CSAS1xD);
CSA_2: ethz_csa
generic map (
WIDTH => WIDTH)
port map (
XxDI => CSAC1xD,
YxDI => CSAS1xD,
ZxDI => S1xD,
CxDO => CSAC2xD,
SxDO => CSAS2xD);
CSA_3: ethz_csa
generic map (
WIDTH => WIDTH)
port map (
XxDI => CSAC2xD,
YxDI => CSAS2xD,
ZxDI => CHxD,
CxDO => CSAC3xD,
SxDO => CSAS3xD);
-- CSA.3 is now KKK + WKK + H + S1 + CH
CSA_4: ethz_csa
generic map (
WIDTH => WIDTH)
port map (
XxDI => CSAC3xD,
YxDI => CSAS3xD,
ZxDI => AtoHxDI(3),
CxDO => CSAC4xD,
SxDO => CSAS4xD);
-- CSA.4 is now CSA.3 + D
AtoHxDO(4) <= CSAC4xD + CSAS4xD;
CSA_5: ethz_csa
generic map (
WIDTH => WIDTH)
port map (
XxDI => CSAC3xD,
YxDI => CSAS3xD,
ZxDI => S0xD,
CxDO => CSAC5xD,
SxDO => CSAS5xD);
CSA_6: ethz_csa
generic map (
WIDTH => WIDTH)
port map (
XxDI => CSAC5xD,
YxDI => CSAS5xD,
ZxDI => MajxD,
CxDO => CSAC6xD,
SxDO => CSAS6xD);
AtoHxDO(0) <= CSAC6xD + CSAS6xD;
S0xD <= (AtoHxDI(0)(1 downto 0)&AtoHxDI(0)(31 downto 2)) xor (AtoHxDI(0)(12 downto 0)&AtoHxDI(0)(31 downto 13)) xor (AtoHxDI(0)(21 downto 0)&AtoHxDI(0)(31 downto 22));
MajxD <= (AtoHxDI(0) and AtoHxDI(1)) xor (AtoHxDI(0) and AtoHxDI(2)) xor (AtoHxDI(1) and AtoHxDI(2));
CHxD <= (AtoHxDI(4) and AtoHxDI(5)) xor ((not AtoHxDI(4)) and AtoHxDI(6));
S1xD <= (AtoHxDI(4)(5 downto 0)&AtoHxDI(4)(31 downto 6)) xor (AtoHxDI(4)(10 downto 0)&AtoHxDI(4)(31 downto 11)) xor (AtoHxDI(4)(24 downto 0)&AtoHxDI(4)(31 downto 25));
-- the easy ones
AtoHxDO(1) <= AtoHxDI(0);
AtoHxDO(2) <= AtoHxDI(1);
AtoHxDO(3) <= AtoHxDI(2);
AtoHxDO(5) <= AtoHxDI(4);
AtoHxDO(6) <= AtoHxDI(5);
AtoHxDO(7) <= AtoHxDI(6);
end behave;