------------------------------------------------------------
-- 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 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;
      ICNTxSO     : out unsigned(3 downto 0);
      ROUNDxSO    : out unsigned(3 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;
      ICNTxSI  : in  unsigned(3 downto 0);
      ROUNDxSI : in  unsigned(3 downto 0);
      VxDI     : in  SUB16;
      MxDI     : in  SUB16;
      VxDO     : out SUB16
      );
  end component;

  signal VxD, VFxD, MxDN, MxDP : SUB16;
  signal HxDN, HxDP            : SUB8;
  signal TxD                   : SUB2;
  signal ICNTxS, ROUNDxS       : unsigned(3 downto 0);
  signal NewChainxS, UseIVxS   : std_logic;

-------------------------------------------------------------------------------
-- BEGIN **********************************************************************
-------------------------------------------------------------------------------
begin  -- hash

  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;

  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,
      ICNTxSO     => ICNTxS,
      ROUNDxSO    => ROUNDxS,
      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,
      ICNTxSI  => ICNTxS,
      ROUNDxSI => ROUNDxS,
      VxDI     => VxD,
      MxDI     => MxDP,
      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;

Generated on Fri Sep 24 10:39:12 CEST 2010
Home