------------------------------------------------------------
-- Copyright: 2011 Integrated Sytems Laboratory, ETH Zurich
-- http://www.iis.ee.ethz.ch/~sha3
------------------------------------------------------------
-------------------------------------------------------------------------------
-- Title : Blake controller
-- Project : Shabziger
-------------------------------------------------------------------------------
-- File : controller_2G.vhd
-- Author : Beat Muheim
-- Company : Integrated Systems Laboratory, ETH Zurich
-- Created : 2011-09-15
-- Last update: 2011-09-15
-- Platform : ModelSim (simulation), Synopsys (synthesis)
-- Standard : VHDL'87
-------------------------------------------------------------------------------
-- Description: Blake controller for 2G original by Luca Henzen
-------------------------------------------------------------------------------
-- Copyright (c) 2011 Integrated Systems Laboratory, ETH Zurich
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 2011-09-15 1.0 bm Copy from controller.vhd adaptet to 2G
-- 2011-09-16 2.0 bm for new ethz_blake
-------------------------------------------------------------------------------
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 controller is
port (
CLKxCI : in std_logic;
RSTxRBI : in std_logic;
VALIDINxSI : in std_logic;
FinBlockxSI : in std_logic;
VALIDOUTxSO : out std_logic;
NewMsgxSO : out std_logic;
NewBlockSO : out std_logic;
PenUltCyclexSO : out std_logic;
ICNTxSO : out unsigned(3 downto 0);
ROUNDxSO : out unsigned(3 downto 0)
);
end controller;
architecture hash of controller is
type state is (idle, round, ready, fin);
signal STATExDP, STATExDN : state;
signal ROUNDxDP, ROUNDxDN : unsigned(3 downto 0);
signal ICNTxDP, ICNTxDN : unsigned(3 downto 0);
signal FinBlockxS, FinBlockxSP, FinBlockxSN : std_logic;
begin -- hash
ROUNDxSO <= ROUNDxDP;
ICNTxSO <= ICNTxDP;
fsm: process (ICNTxDP, ROUNDxDP, STATExDP, VALIDINxSI, FinBlockxSI, FinBlockxSP)
begin -- process fsm
VALIDOUTxSO <= '0';
ROUNDxDN <= (others => '0');
ICNTxDN <= (others => '0');
PenUltCyclexSO <= '0';
NewMsgxSO <= '0';
NewBlockSO <= '0';
FinBlockxSN <= FinBlockxSP;
case STATExDP is
-------------------------------------------------------------------------
when idle =>
if VALIDINxSI = '1' then
FinBlockxSN <= FinBlockxSI;
NewMsgxSO <= '1';
NewBlockSO <= '1';
STATExDN <= round;
else
STATExDN <= idle;
end if;
-------------------------------------------------------------------------
when round =>
if ROUNDxDP < NROUND-1 then
if ICNTxDP = 3 then
ROUNDxDN <= ROUNDxDP + 1;
STATExDN <= round;
else
ROUNDxDN <= ROUNDxDP;
ICNTxDN <= ICNTxDP + 1;
STATExDN <= round;
end if;
else
if ICNTxDP = 3 then
PenUltCyclexSO <= '1';
if FinBlockxSP = '1' then
STATExDN <= fin;
else
STATExDN <= ready;
end if;
else
ROUNDxDN <= ROUNDxDP;
ICNTxDN <= ICNTxDP + 1;
STATExDN <= round;
end if;
end if;
-------------------------------------------------------------------------
when ready =>
if VALIDINxSI = '1' then
NewBlockSO <= '1';
FinBlockxSN <= FinBlockxSI;
StatexDN <= round;
else
StatexDN <= ready;
end if;
-------------------------------------------------------------------------
when fin =>
VALIDOUTxSO <= '1';
if VALIDINxSI = '1' then
FinBlockxSN <= FinBlockxSI;
NewMsgxSO <= '1';
NewBlockSO <= '1';
STATExDN <= round;
else
STATExDN <= idle;
end if;
-------------------------------------------------------------------------
when others =>
STATExDN <= idle;
end case;
end process fsm;
process (CLKxCI, RSTxRBI)
begin -- process
if RSTxRBI = '0' then -- asynchronous reset (active low)
STATExDP <= idle;
ROUNDxDP <= (others => '0');
ICNTxDP <= (others => '0');
FinBlockxSP <= '1';
elsif CLKxCI'event and CLKxCI = '1' then -- rising clock edge
STATExDP <= STATExDN;
ROUNDxDP <= ROUNDxDN;
ICNTxDP <= ICNTxDN;
FinBlockxSP <= FinBlockxSN;
end if;
end process;
end hash;