opencore hasher
diff --git a/verilog/rtl/opencore_hasher/fuse.xmsgs b/verilog/rtl/opencore_hasher/fuse.xmsgs
new file mode 100755
index 0000000..c42b14a
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/fuse.xmsgs
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!-- IMPORTANT: This is an internal file that has been generated

+     by the Xilinx ISE software.  Any direct editing or

+     changes made to this file may result in unpredictable

+     behavior or data corruption.  It is strongly advised that

+     users do not edit the contents of this file. -->

+<messages>
+</messages>
+

diff --git a/verilog/rtl/opencore_hasher/fuseRelaunch.cmd b/verilog/rtl/opencore_hasher/fuseRelaunch.cmd
new file mode 100755
index 0000000..2f5e58d
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/fuseRelaunch.cmd
@@ -0,0 +1 @@
+-intstyle "ise" -incremental -lib "secureip" -o "Z:/Dropbox/develop/fpga/sha256_hash_core/sha256_hash_core/trunk/syn/sha256/testbench_isim_beh.exe" -prj "Z:/Dropbox/develop/fpga/sha256_hash_core/sha256_hash_core/trunk/syn/sha256/testbench_beh.prj" "work.testbench" 

diff --git a/verilog/rtl/opencore_hasher/gv_sha256.vhd b/verilog/rtl/opencore_hasher/gv_sha256.vhd
new file mode 100755
index 0000000..4213ede
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/gv_sha256.vhd
@@ -0,0 +1,334 @@
+----------------------------------------------------------------------------------

+-- Author:          Jonny Doin, jdoin@opencores.org, jonnydoin@gmail.com, jonnydoin@gridvortex.com

+-- 

+-- Create Date:     01:21:32 05/05/2016 

+-- Design Name:     gv_sha256

+-- Module Name:     GV_SHA256 toplevel

+-- Project Name:    GV_SHA256 engine

+-- Target Devices:  Spartan-6 LX45

+-- Tool versions:   ISE 14.7

+-- Description: 

+--

+--      This is the gv_sha256 engine top level.

+--      The gv_sha256 is a stream hash engine, i.e., the data words are hashed as a stream of words read from an input bus, with

+--      control inputs for BEGIN/END of the message data stream. The input bus is a 32bit word bus, with a byte lane selector to signalize

+--      how many bytes are valid in the last word. 

+--

+--      The core is a structural integration of the logic blocks for the SHA256 engine, with the internal datapath and controlpath wires.

+--

+--      Written in synthesizable VHDL, the hash engine is a low resource, area-efficient implementation of the FIPS-180-4 SHA256 hash algorithm.

+--      Designed around the core registers and combinational hash functions as a 768bit-wide engine, the engine takes 64+1 clocks to 

+--      compute a hash block.

+--

+--      It is designed for stand-alone ASIC functions and 32-bit bus interfaces for generic processor integration.

+--

+--      The data input port is organized as a 32bit word write register, with flow control and begin/end signals.

+--      The 256bit result register is organized as 8 x 32bit registers that can be read simultaneously.

+--

+--      This implementation is a conservative implementation of the approved FIPS-180-4 algorithm, with a fair compromise of resources, 

+--      comprising of only 32 registers of 32bit words for the hash engine, with a single-cycle combinational logic for each algorithm step.

+--      The combinational logic depth of the engine is 10 logic layers. For a process with 650ps of average (Tpd + Tsu), this core can

+--      be synthesized to 75MHz system clock. 

+--

+--      The GV_SHA256 is a basic cryptographic block, used by almost all encryption and digital signature schemes. 

+--

+--      Applications include low-cost CyberPhysical Systems and also fast backend crypto functions for realtime hashing of packet data.

+--      It is used in the GridVortex CyberSec IP, as a base for the fused HMAC-SHA256, HKDF, HMAC-SHA256-DRBG, and the SP-800 TRNG Entropy Source.

+--

+------------------------------ COPYRIGHT NOTICE -----------------------------------------------------------------------

+--                                                                   

+--      This file is part of the SHA256 HASH CORE project http://opencores.org/project,sha256_hash_core

+--                                                                   

+--      Author(s):      Jonny Doin, jdoin@opencores.org, jonnydoin@gridvortex.com, jonnydoin@gmail.com

+--                                                                   

+--      Copyright (C) 2016 Jonny Doin

+--      -----------------------------

+--                                                                   

+--      This source file may be used and distributed without restriction provided that this copyright statement is not    

+--      removed from the file and that any derivative work contains the original copyright notice and the associated 

+--      disclaimer. 

+--                                                                   

+--      This source file is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser 

+--      General Public License as published by the Free Software Foundation; either version 2.1 of the License, or 

+--      (at your option) any later version.

+--                                                                   

+--      This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied

+--      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more  

+--      details.

+--

+--      You should have received a copy of the GNU Lesser General Public License along with this source; if not, download 

+--      it from http://www.gnu.org/licenses/lgpl.txt

+--                                                                   

+------------------------------ REVISION HISTORY -----------------------------------------------------------------------

+--

+-- 2016/05/22   v0.01.0010  [JD]    started development. design of blocks and port interfaces.

+-- 2016/06/05   v0.01.0090  [JD]    all modules integrated. testbench for basic test vectors verification.

+-- 2016/06/05   v0.01.0095  [JD]    verification failed. misalignment of words in the datapath. 

+-- 2016/06/06   v0.01.0100  [JD]    first simulation verification against NIST-FIPS-180-4 test vectors "abc" passed.

+-- 2016/06/07   v0.01.0105  [JD]    verification against all NIST-FIPS-180-4 test vectors passed.

+-- 2016/06/11   v0.01.0105  [JD]    verification against NIST-SHA2_Additional test vectors #1 to #10 passed.

+-- 2016/06/11   v0.01.0110  [JD]    optimized controller states, reduced 2 clocks per block, added lookahead register feedback.

+-- 2016/09/25   v0.01.0220  [JD]    changed 'di_ack_i' name to 'di_wr_i', and changed semantics to 'data write'.

+--

+--

+-----------------------------------------------------------------------------------------------------------------------

+library ieee;

+use ieee.std_logic_1164.all;

+use ieee.numeric_std.all;

+

+

+entity gv_sha256 is

+    port (

+        -- clock and core enable

+        clk_i : in std_logic := 'U';                                    -- system clock

+        ce_i : in std_logic := 'U';                                     -- core clock enable

+        -- input data

+        di_i : in std_logic_vector (31 downto 0) := (others => 'U');    -- big endian input message words

+        bytes_i : in std_logic_vector (1 downto 0) := (others => 'U');  -- valid bytes in input word

+        -- start/end commands

+        start_i : in std_logic := 'U';                                  -- reset the engine and start a new hash

+        end_i : in std_logic := 'U';                                    -- marks end of last block data input

+        -- handshake

+        di_req_o : out std_logic;                                       -- requests data input for next word

+        di_wr_i : in std_logic := 'U';                                  -- high for di_i valid, low for hold

+        error_o : out std_logic;                                        -- signalizes error. output data is invalid

+        do_valid_o : out std_logic;                                     -- when high, the output is valid

+        -- 256bit output registers

+        H0_o : out std_logic_vector (31 downto 0);

+        H1_o : out std_logic_vector (31 downto 0);

+        H2_o : out std_logic_vector (31 downto 0);

+        H3_o : out std_logic_vector (31 downto 0);

+        H4_o : out std_logic_vector (31 downto 0);

+        H5_o : out std_logic_vector (31 downto 0);

+        H6_o : out std_logic_vector (31 downto 0);

+        H7_o : out std_logic_vector (31 downto 0)

+    );                      

+end gv_sha256;

+

+architecture rtl of gv_sha256 is

+    -- internal register data values

+    signal R0_data : std_logic_vector (31 downto 0);

+    signal R1_data : std_logic_vector (31 downto 0);

+    signal R2_data : std_logic_vector (31 downto 0);

+    signal R3_data : std_logic_vector (31 downto 0);

+    signal R4_data : std_logic_vector (31 downto 0);

+    signal R5_data : std_logic_vector (31 downto 0);

+    signal R6_data : std_logic_vector (31 downto 0);

+    signal R7_data : std_logic_vector (31 downto 0);

+    -- initial hash data values

+    signal K0_data : std_logic_vector (31 downto 0);

+    signal K1_data : std_logic_vector (31 downto 0);

+    signal K2_data : std_logic_vector (31 downto 0);

+    signal K3_data : std_logic_vector (31 downto 0);

+    signal K4_data : std_logic_vector (31 downto 0);

+    signal K5_data : std_logic_vector (31 downto 0);

+    signal K6_data : std_logic_vector (31 downto 0);

+    signal K7_data : std_logic_vector (31 downto 0);

+    -- hash result lookahead port

+    signal N0_data : std_logic_vector (31 downto 0);

+    signal N1_data : std_logic_vector (31 downto 0);

+    signal N2_data : std_logic_vector (31 downto 0);

+    signal N3_data : std_logic_vector (31 downto 0);

+    signal N4_data : std_logic_vector (31 downto 0);

+    signal N5_data : std_logic_vector (31 downto 0);

+    signal N6_data : std_logic_vector (31 downto 0);

+    signal N7_data : std_logic_vector (31 downto 0);

+    -- hash result data

+    signal H0_data : std_logic_vector (31 downto 0);

+    signal H1_data : std_logic_vector (31 downto 0);

+    signal H2_data : std_logic_vector (31 downto 0);

+    signal H3_data : std_logic_vector (31 downto 0);

+    signal H4_data : std_logic_vector (31 downto 0);

+    signal H5_data : std_logic_vector (31 downto 0);

+    signal H6_data : std_logic_vector (31 downto 0);

+    signal H7_data : std_logic_vector (31 downto 0);

+    -- message schedule word datapath

+    signal Mi_data : std_logic_vector (31 downto 0);

+    signal Wt_data : std_logic_vector (31 downto 0);

+    -- coefficients ROMs

+    signal Kt_data : std_logic_vector (31 downto 0);

+    signal Kt_addr : std_logic_vector (5 downto 0);

+    -- padding control

+    signal words_sel : std_logic_vector (1 downto 0);

+    signal bytes_ena : std_logic_vector (3 downto 0);

+    signal one_insert : std_logic;

+    signal msg_bitlen : std_logic_vector (63 downto 0);

+    signal pad_data : std_logic_vector (31 downto 0);

+    -- block mux selectors

+    signal sch_ld : std_logic;

+    signal core_ld : std_logic;

+    signal oregs_ld : std_logic;

+    -- block clock enables

+    signal sch_ce : std_logic;

+    signal core_ce : std_logic;

+    signal oregs_ce : std_logic;

+    -- output data valid / error

+    signal data_valid : std_logic;

+    signal error_pad : std_logic;

+    signal error_ctrl : std_logic;

+begin

+    --=============================================================================================

+    -- INTERNAL COMPONENT INSTANTIATIONS AND CONNECTIONS

+    --=============================================================================================

+

+    -- control path core logic

+    Inst_sha256_control: entity work.sha256_control(rtl)

+        port map(

+            -- inputs

+            clk_i           => clk_i,

+            ce_i            => ce_i,

+            bytes_i         => bytes_i,

+            wr_i            => di_wr_i,

+            start_i         => start_i,

+            end_i           => end_i,

+            error_i         => error_pad,

+            -- output control signals

+            bitlen_o        => msg_bitlen,

+            words_sel_o     => words_sel,

+            Kt_addr_o       => Kt_addr,

+            sch_ld_o        => sch_ld,

+            core_ld_o       => core_ld,

+            oregs_ld_o      => oregs_ld,

+            sch_ce_o        => sch_ce,

+            core_ce_o       => core_ce,

+            oregs_ce_o      => oregs_ce,

+            one_insert_o    => one_insert,

+            bytes_ena_o     => bytes_ena,

+            di_req_o        => di_req_o,

+            data_valid_o    => data_valid,

+            error_o         => error_ctrl

+        );

+    

+    -- datapath: sha256 byte padding

+    Inst_sha256_padding: entity work.sha256_padding(rtl) 

+        port map(

+            words_sel_i     => words_sel,

+            one_insert_i    => one_insert,

+            bytes_ena_i     => bytes_ena,

+            bitlen_i        => msg_bitlen,

+            di_i            => di_i,

+            do_o            => Mi_data,

+            error_o         => error_pad

+        );

+

+    -- datapath: sha256 message schedule

+    Inst_sha256_msg_sch: entity work.sha256_msg_sch(rtl) 

+        port map(

+            clk_i => clk_i,

+            ce_i  => sch_ce,

+            ld_i  => sch_ld,

+            M_i   => Mi_data,

+            Wt_o  => Wt_data

+        );

+

+    -- datapath: sha256 core logic

+    Inst_sha256_hash_core: entity work.sha256_hash_core(rtl) 

+        port map( 

+            clk_i => clk_i,

+            ce_i  => core_ce,

+            ld_i  => core_ld,

+            -- initial hash data values 

+            A_i => N0_data,

+            B_i => N1_data,

+            C_i => N2_data,

+            D_i => N3_data,

+            E_i => N4_data,

+            F_i => N5_data,

+            G_i => N6_data,

+            H_i => N7_data,

+            -- block hash values

+            A_o => R0_data, 

+            B_o => R1_data,

+            C_o => R2_data,

+            D_o => R3_data,

+            E_o => R4_data,

+            F_o => R5_data,

+            G_o => R6_data,

+            H_o => R7_data,

+            -- key coefficients 

+            Kt_i => Kt_data,

+            -- message schedule word input

+            Wt_i => Wt_data

+        );                      

+

+    -- datapath: sha256 output registers

+    Inst_sha256_regs: entity work.sha256_regs(rtl)

+        port map(  

+            clk_i => clk_i,

+            ce_i  => oregs_ce,

+            ld_i =>  oregs_ld,

+            -- register data from the core logic

+            A_i => R0_data,

+            B_i => R1_data,

+            C_i => R2_data,

+            D_i => R3_data,

+            E_i => R4_data,

+            F_i => R5_data,

+            G_i => R6_data,

+            H_i => R7_data,

+            -- initial hash values

+            K0_i => K0_data,

+            K1_i => K1_data,

+            K2_i => K2_data,

+            K3_i => K3_data,

+            K4_i => K4_data,

+            K5_i => K5_data,

+            K6_i => K6_data,

+            K7_i => K7_data,

+            -- lookahead output hash values, one pipeline advanced

+            N0_o => N0_data,

+            N1_o => N1_data,

+            N2_o => N2_data,

+            N3_o => N3_data,

+            N4_o => N4_data,

+            N5_o => N5_data,

+            N6_o => N6_data,

+            N7_o => N7_data,

+            -- output hash values

+            H0_o => H0_data,

+            H1_o => H1_data,

+            H2_o => H2_data,

+            H3_o => H3_data,

+            H4_o => H4_data,

+            H5_o => H5_data,

+            H6_o => H6_data,

+            H7_o => H7_data 

+        );

+

+    -- coefficients ROM: modelled as an asynchronously addressable ROM

+    Inst_sha256_kt_rom: entity work.sha256_kt_rom(behavioral)

+        port map(  

+            addr_i => Kt_addr,

+            dout_o => Kt_data

+        );

+

+    -- init output data ROM: modelled as a statically defined constant

+    Inst_sha256_ki_rom: entity work.sha256_ki_rom(behavioral)

+        port map(

+            K0_o => K0_data,

+            K1_o => K1_data, 

+            K2_o => K2_data, 

+            K3_o => K3_data, 

+            K4_o => K4_data, 

+            K5_o => K5_data, 

+            K6_o => K6_data, 

+            K7_o => K7_data 

+        );

+    

+    --=============================================================================================

+    --  OUTPUTS LOGIC

+    --=============================================================================================

+

+    error_o_proc:       error_o <= error_ctrl;

+    do_valid_o_proc:    do_valid_o <= data_valid;

+    H0_o_proc:          H0_o <= H0_data;

+    H1_o_proc:          H1_o <= H1_data;

+    H2_o_proc:          H2_o <= H2_data;

+    H3_o_proc:          H3_o <= H3_data;

+    H4_o_proc:          H4_o <= H4_data;

+    H5_o_proc:          H5_o <= H5_data;

+    H6_o_proc:          H6_o <= H6_data;

+    H7_o_proc:          H7_o <= H7_data;

+    

+end rtl;

+

diff --git a/verilog/rtl/opencore_hasher/iseconfig/gv_sha256.xreport b/verilog/rtl/opencore_hasher/iseconfig/gv_sha256.xreport
new file mode 100755
index 0000000..3ea9877
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/iseconfig/gv_sha256.xreport
@@ -0,0 +1,215 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<report-views version="2.0" >
+ <header>
+  <DateModified>2016-10-02T16:50:09</DateModified>
+  <ModuleName>gv_sha256</ModuleName>
+  <SummaryTimeStamp>Unknown</SummaryTimeStamp>
+  <SavedFilePath>Z:/Dropbox/develop/fpga/sha256_hash_core/sha256_hash_core/trunk/syn/sha256/iseconfig/gv_sha256.xreport</SavedFilePath>
+  <ImplementationReportsDirectory>Z:/Dropbox/develop/fpga/sha256_hash_core/sha256_hash_core/trunk/syn/sha256\</ImplementationReportsDirectory>
+  <DateInitialized>2016-05-24T02:29:42</DateInitialized>
+  <EnableMessageFiltering>false</EnableMessageFiltering>
+ </header>
+ <body>
+  <viewgroup label="Design Overview" >
+   <view inputState="Unknown" program="implementation" ShowPartitionData="false" type="FPGASummary" file="gv_sha256_summary.html" label="Summary" ExpandClockNets="true" >
+    <toc-item title="Design Overview" target="Design Overview" />
+    <toc-item title="Design Utilization Summary" target="Design Utilization Summary" />
+    <toc-item title="Performance Summary" target="Performance Summary" />
+    <toc-item title="Failing Constraints" target="Failing Constraints" />
+    <toc-item title="Detailed Reports" target="Detailed Reports" />
+   </view>
+   <view inputState="Unknown" program="implementation" contextTags="FPGA_ONLY" hidden="true" type="HTML" file="gv_sha256_envsettings.html" label="System Settings" />
+   <view inputState="Translated" program="map" locator="MAP_IOB_TABLE" contextTags="FPGA_ONLY" type="IOBProperties" file="gv_sha256_map.xrpt" label="IOB Properties" />
+   <view inputState="Translated" program="map" contextTags="FPGA_ONLY" hidden="true" type="Control_Sets" file="gv_sha256_map.xrpt" label="Control Set Information" />
+   <view inputState="Translated" program="map" locator="MAP_MODULE_HIERARCHY" contextTags="FPGA_ONLY" type="Module_Utilization" file="gv_sha256_map.xrpt" label="Module Level Utilization" />
+   <view inputState="Mapped" program="par" locator="CONSTRAINT_TABLE" contextTags="FPGA_ONLY" type="ConstraintsData" file="gv_sha256.ptwx" label="Timing Constraints" translator="ptwxToTableXML.xslt" />
+   <view inputState="Mapped" program="par" locator="PAR_PINOUT_BY_PIN_NUMBER" contextTags="FPGA_ONLY" type="PinoutData" file="gv_sha256_par.xrpt" label="Pinout Report" />
+   <view inputState="Mapped" program="par" locator="PAR_CLOCK_TABLE" contextTags="FPGA_ONLY" type="ClocksData" file="gv_sha256_par.xrpt" label="Clock Report" />
+   <view inputState="Mapped" program="par" contextTags="FPGA_ONLY,EDK_OFF" type="Timing_Analyzer" file="gv_sha256.twx" label="Static Timing" />
+   <view inputState="Translated" program="cpldfit" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="EXTERNAL_HTML" file="gv_sha256_html/fit/report.htm" label="CPLD Fitter Report" />
+   <view inputState="Fitted" program="taengine" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="EXTERNAL_HTML" file="gv_sha256_html/tim/report.htm" label="CPLD Timing Report" />
+  </viewgroup>
+  <viewgroup label="XPS Errors and Warnings" >
+   <view program="platgen" WrapMessages="true" contextTags="EDK_ON" hidden="true" type="MessageList" hideColumns="Filtered" file="__xps/ise/_xmsgs/platgen.xmsgs" label="Platgen Messages" />
+   <view program="simgen" WrapMessages="true" contextTags="EDK_ON" hidden="true" type="MessageList" hideColumns="Filtered" file="__xps/ise/_xmsgs/simgen.xmsgs" label="Simgen Messages" />
+   <view program="bitinit" WrapMessages="true" contextTags="EDK_ON" hidden="true" type="MessageList" hideColumns="Filtered" file="__xps/ise/_xmsgs/bitinit.xmsgs" label="BitInit Messages" />
+  </viewgroup>
+  <viewgroup label="XPS Reports" >
+   <view inputState="PreSynthesized" program="platgen" contextTags="EDK_ON" hidden="true" type="Secondary_Report" file="platgen.log" label="Platgen Log File" />
+   <view inputState="PreSynthesized" program="simgen" contextTags="EDK_ON" hidden="true" type="Secondary_Report" file="simgen.log" label="Simgen Log File" />
+   <view inputState="PreSynthesized" program="bitinit" contextTags="EDK_ON" hidden="true" type="Secondary_Report" file="bitinit.log" label="BitInit Log File" />
+   <view inputState="PreSynthesized" program="system" contextTags="EDK_ON" hidden="true" type="Secondary_Report" file="gv_sha256.log" label="System Log File" />
+  </viewgroup>
+  <viewgroup label="Errors and Warnings" >
+   <view program="pn" WrapMessages="true" contextTags="EDK_OFF" type="MessageList" hideColumns="Filtered, New" file="_xmsgs/pn_parser.xmsgs" label="Parser Messages" />
+   <view program="xst" WrapMessages="true" contextTags="XST_ONLY,EDK_OFF" hidden="false" type="MessageList" hideColumns="Filtered" file="_xmsgs/xst.xmsgs" label="Synthesis Messages" />
+   <view inputState="Synthesized" program="ngdbuild" WrapMessages="true" type="MessageList" hideColumns="Filtered" file="_xmsgs/ngdbuild.xmsgs" label="Translation Messages" />
+   <view inputState="Translated" program="map" WrapMessages="true" contextTags="FPGA_ONLY" type="MessageList" hideColumns="Filtered" file="_xmsgs/map.xmsgs" label="Map Messages" />
+   <view inputState="Mapped" program="par" WrapMessages="true" contextTags="FPGA_ONLY" type="MessageList" hideColumns="Filtered" file="_xmsgs/par.xmsgs" label="Place and Route Messages" />
+   <view inputState="Routed" program="trce" WrapMessages="true" contextTags="FPGA_ONLY" type="MessageList" hideColumns="Filtered" file="_xmsgs/trce.xmsgs" label="Timing Messages" />
+   <view inputState="Routed" program="xpwr" WrapMessages="true" contextTags="EDK_OFF" hidden="true" type="MessageList" hideColumns="Filtered" file="_xmsgs/xpwr.xmsgs" label="Power Messages" />
+   <view inputState="Routed" program="bitgen" WrapMessages="true" contextTags="FPGA_ONLY" type="MessageList" hideColumns="Filtered" file="_xmsgs/bitgen.xmsgs" label="Bitgen Messages" />
+   <view inputState="Translated" program="cpldfit" WrapMessages="true" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="MessageList" hideColumns="Filtered" file="_xmsgs/cpldfit.xmsgs" label="Fitter Messages" />
+   <view inputState="Current" program="implementation" WrapMessages="true" fileList="_xmsgs/xst.xmsgs,_xmsgs/ngdbuild.xmsgs,_xmsgs/map.xmsgs,_xmsgs/par.xmsgs,_xmsgs/trce.xmsgs,_xmsgs/xpwr.xmsgs,_xmsgs/bitgen.xmsgs" contextTags="FPGA_ONLY" type="MessageList" hideColumns="Filtered" file="_xmsgs/*.xmsgs" label="All Implementation Messages" />
+   <view inputState="Current" program="fitting" WrapMessages="true" fileList="_xmsgs/xst.xmsgs,_xmsgs/ngdbuild.xmsgs,_xmsgs/cpldfit.xmsgs,_xmsgs/xpwr.xmsgs" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="CPLD_MessageList" hideColumns="Filtered" file="_xmsgs/*.xmsgs" label="All Implementation Messages (CPLD)" />
+  </viewgroup>
+  <viewgroup label="Detailed Reports" >
+   <view program="xst" contextTags="XST_ONLY,EDK_OFF" hidden="false" type="Report" file="gv_sha256.syr" label="Synthesis Report" >
+    <toc-item title="Top of Report" target="Copyright " searchDir="Forward" />
+    <toc-item title="Synthesis Options Summary" target="   Synthesis Options Summary   " />
+    <toc-item title="HDL Compilation" target="   HDL Compilation   " />
+    <toc-item title="Design Hierarchy Analysis" target="   Design Hierarchy Analysis   " />
+    <toc-item title="HDL Analysis" target="   HDL Analysis   " />
+    <toc-item title="HDL Parsing" target="   HDL Parsing   " />
+    <toc-item title="HDL Elaboration" target="   HDL Elaboration   " />
+    <toc-item title="HDL Synthesis" target="   HDL Synthesis   " />
+    <toc-item title="HDL Synthesis Report" target="HDL Synthesis Report" searchCnt="2" searchDir="Backward" subItemLevel="1" />
+    <toc-item title="Advanced HDL Synthesis" target="   Advanced HDL Synthesis   " searchDir="Backward" />
+    <toc-item title="Advanced HDL Synthesis Report" target="Advanced HDL Synthesis Report" subItemLevel="1" />
+    <toc-item title="Low Level Synthesis" target="   Low Level Synthesis   " />
+    <toc-item title="Partition Report" target="   Partition Report     " />
+    <toc-item title="Final Report" target="   Final Report   " />
+    <toc-item title="Design Summary" target="   Design Summary   " />
+    <toc-item title="Primitive and Black Box Usage" target="Primitive and Black Box Usage:" subItemLevel="1" />
+    <toc-item title="Device Utilization Summary" target="Device utilization summary:" subItemLevel="1" />
+    <toc-item title="Partition Resource Summary" target="Partition Resource Summary:" subItemLevel="1" />
+    <toc-item title="Timing Report" target="Timing Report" subItemLevel="1" />
+    <toc-item title="Clock Information" target="Clock Information" subItemLevel="2" />
+    <toc-item title="Asynchronous Control Signals Information" target="Asynchronous Control Signals Information" subItemLevel="2" />
+    <toc-item title="Timing Summary" target="Timing Summary" subItemLevel="2" />
+    <toc-item title="Timing Details" target="Timing Details" subItemLevel="2" />
+    <toc-item title="Cross Clock Domains Report" target="Cross Clock Domains Report:" subItemLevel="2" />
+   </view>
+   <view program="synplify" contextTags="SYNPLIFY_ONLY,EDK_OFF" hidden="true" type="Report" file="gv_sha256.srr" label="Synplify Report" />
+   <view program="precision" contextTags="PRECISION_ONLY,EDK_OFF" hidden="true" type="Report" file="gv_sha256.prec_log" label="Precision Report" />
+   <view inputState="Synthesized" program="ngdbuild" type="Report" file="gv_sha256.bld" label="Translation Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+    <toc-item title="Command Line" target="Command Line:" />
+    <toc-item title="Partition Status" target="Partition Implementation Status" />
+    <toc-item title="Final Summary" target="NGDBUILD Design Results Summary:" />
+   </view>
+   <view inputState="Translated" program="map" contextTags="FPGA_ONLY" type="Report" file="gv_sha256_map.mrp" label="Map Report" >
+    <toc-item title="Top of Report" target="Release" searchDir="Forward" />
+    <toc-item title="Section 1: Errors" target="Section 1 -" searchDir="Backward" />
+    <toc-item title="Section 2: Warnings" target="Section 2 -" searchDir="Backward" />
+    <toc-item title="Section 3: Infos" target="Section 3 -" searchDir="Backward" />
+    <toc-item title="Section 4: Removed Logic Summary" target="Section 4 -" searchDir="Backward" />
+    <toc-item title="Section 5: Removed Logic" target="Section 5 -" searchDir="Backward" />
+    <toc-item title="Section 6: IOB Properties" target="Section 6 -" searchDir="Backward" />
+    <toc-item title="Section 7: RPMs" target="Section 7 -" searchDir="Backward" />
+    <toc-item title="Section 8: Guide Report" target="Section 8 -" searchDir="Backward" />
+    <toc-item title="Section 9: Area Group and Partition Summary" target="Section 9 -" searchDir="Backward" />
+    <toc-item title="Section 10: Timing Report" target="Section 10 -" searchDir="Backward" />
+    <toc-item title="Section 11: Configuration String Details" target="Section 11 -" searchDir="Backward" />
+    <toc-item title="Section 12: Control Set Information" target="Section 12 -" searchDir="Backward" />
+    <toc-item title="Section 13: Utilization by Hierarchy" target="Section 13 -" searchDir="Backward" />
+   </view>
+   <view inputState="Mapped" program="par" contextTags="FPGA_ONLY" type="Report" file="gv_sha256.par" label="Place and Route Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+    <toc-item title="Device Utilization" target="Device Utilization Summary:" />
+    <toc-item title="Router Information" target="Starting Router" />
+    <toc-item title="Partition Status" target="Partition Implementation Status" />
+    <toc-item title="Clock Report" target="Generating Clock Report" />
+    <toc-item title="Timing Results" target="Timing Score:" />
+    <toc-item title="Final Summary" target="Peak Memory Usage:" />
+   </view>
+   <view inputState="Routed" program="trce" contextTags="FPGA_ONLY" type="Report" file="gv_sha256.twr" label="Post-PAR Static Timing Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+    <toc-item title="Timing Report Description" target="Device,package,speed:" />
+    <toc-item title="Informational Messages" target="INFO:" />
+    <toc-item title="Warning Messages" target="WARNING:" />
+    <toc-item title="Timing Constraints" target="Timing constraint:" />
+    <toc-item title="Derived Constraint Report" target="Derived Constraint Report" />
+    <toc-item title="Data Sheet Report" target="Data Sheet report:" />
+    <toc-item title="Timing Summary" target="Timing summary:" />
+    <toc-item title="Trace Settings" target="Trace Settings:" />
+   </view>
+   <view inputState="Translated" program="cpldfit" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="Report" file="gv_sha256.rpt" label="CPLD Fitter Report (Text)" >
+    <toc-item title="Top of Report" target="cpldfit:" searchDir="Forward" />
+    <toc-item title="Resources Summary" target="**  Mapped Resource Summary  **" />
+    <toc-item title="Pin Resources" target="** Pin Resources **" />
+    <toc-item title="Global Resources" target="** Global Control Resources **" />
+   </view>
+   <view inputState="Fitted" program="taengine" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="Report" file="gv_sha256.tim" label="CPLD Timing Report (Text)" >
+    <toc-item title="Top of Report" target="Performance Summary Report" searchDir="Forward" />
+    <toc-item title="Performance Summary" target="Performance Summary:" />
+   </view>
+   <view inputState="Routed" program="xpwr" contextTags="EDK_OFF" type="Report" file="gv_sha256.pwr" label="Power Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+    <toc-item title="Power summary" target="Power summary" />
+    <toc-item title="Thermal summary" target="Thermal summary" />
+   </view>
+   <view inputState="Routed" program="bitgen" contextTags="FPGA_ONLY" type="Report" file="gv_sha256.bgn" label="Bitgen Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+    <toc-item title="Bitgen Options" target="Summary of Bitgen Options:" />
+    <toc-item title="Final Summary" target="DRC detected" />
+   </view>
+  </viewgroup>
+  <viewgroup label="Secondary Reports" >
+   <view inputState="PreSynthesized" program="isim" hidden="if_missing" type="Secondary_Report" file="isim.log" label="ISIM Simulator Log" />
+   <view inputState="Synthesized" program="netgen" hidden="if_missing" type="Secondary_Report" file="netgen/synthesis/gv_sha256_synthesis.nlf" label="Post-Synthesis Simulation Model Report" >
+    <toc-item title="Top of Report" target="Release" searchDir="Forward" />
+   </view>
+   <view inputState="Translated" program="netgen" hidden="if_missing" type="Secondary_Report" file="netgen/translate/gv_sha256_translate.nlf" label="Post-Translate Simulation Model Report" >
+    <toc-item title="Top of Report" target="Release" searchDir="Forward" />
+   </view>
+   <view inputState="Translated" program="netgen" hidden="if_missing" type="Secondary_Report" file="gv_sha256_tran_fecn.nlf" label="Post-Translate Formality Netlist Report" />
+   <view inputState="Translated" program="map" contextTags="FPGA_ONLY" hidden="true" type="Secondary_Report" file="gv_sha256_map.map" label="Map Log File" >
+    <toc-item title="Top of Report" target="Release" searchDir="Forward" />
+    <toc-item title="Design Information" target="Design Information" />
+    <toc-item title="Design Summary" target="Design Summary" />
+   </view>
+   <view inputState="Routed" program="smartxplorer" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="smartxplorer_results/smartxplorer.txt" label="SmartXplorer Report" />
+   <view inputState="Mapped" program="trce" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="gv_sha256_preroute.twr" label="Post-Map Static Timing Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+    <toc-item title="Timing Report Description" target="Device,package,speed:" />
+    <toc-item title="Informational Messages" target="INFO:" />
+    <toc-item title="Warning Messages" target="WARNING:" />
+    <toc-item title="Timing Constraints" target="Timing constraint:" />
+    <toc-item title="Derived Constraint Report" target="Derived Constraint Report" />
+    <toc-item title="Data Sheet Report" target="Data Sheet report:" />
+    <toc-item title="Timing Summary" target="Timing summary:" />
+    <toc-item title="Trace Settings" target="Trace Settings:" />
+   </view>
+   <view inputState="Mapped" program="netgen" hidden="if_missing" type="Secondary_Report" file="netgen/map/gv_sha256_map.nlf" label="Post-Map Simulation Model Report" />
+   <view inputState="Mapped" program="map" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="gv_sha256_map.psr" label="Physical Synthesis Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+   </view>
+   <view inputState="Mapped" program="par" contextTags="FPGA_ONLY" hidden="true" type="Pad_Report" file="gv_sha256_pad.txt" label="Pad Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+   </view>
+   <view inputState="Mapped" program="par" contextTags="FPGA_ONLY" hidden="true" type="Secondary_Report" file="gv_sha256.unroutes" label="Unroutes Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+   </view>
+   <view inputState="Mapped" program="map" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="gv_sha256_preroute.tsi" label="Post-Map Constraints Interaction Report" >
+    <toc-item title="Top of Report" target="Release" searchDir="Forward" />
+   </view>
+   <view inputState="Mapped" program="par" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="gv_sha256.grf" label="Guide Results Report" />
+   <view inputState="Routed" program="par" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="gv_sha256.dly" label="Asynchronous Delay Report" />
+   <view inputState="Routed" program="par" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="gv_sha256.clk_rgn" label="Clock Region Report" />
+   <view inputState="Routed" program="par" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="gv_sha256.tsi" label="Post-Place and Route Constraints Interaction Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+   </view>
+   <view inputState="Routed" program="netgen" hidden="if_missing" type="Secondary_Report" file="gv_sha256_par_fecn.nlf" label="Post-Place and Route Formality Netlist Report" />
+   <view inputState="Routed" program="netgen" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="netgen/par/gv_sha256_timesim.nlf" label="Post-Place and Route Simulation Model Report" />
+   <view inputState="Routed" program="netgen" hidden="if_missing" type="Secondary_Report" file="gv_sha256_sta.nlf" label="Primetime Netlist Report" >
+    <toc-item title="Top of Report" target="Release" searchDir="Forward" />
+   </view>
+   <view inputState="Routed" program="ibiswriter" hidden="if_missing" type="Secondary_Report" file="gv_sha256.ibs" label="IBIS Model" >
+    <toc-item title="Top of Report" target="IBIS Models for" searchDir="Forward" />
+    <toc-item title="Component" target="Component " />
+   </view>
+   <view inputState="Routed" program="pin2ucf" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="gv_sha256.lck" label="Back-annotate Pin Report" >
+    <toc-item title="Top of Report" target="pin2ucf Report File" searchDir="Forward" />
+    <toc-item title="Constraint Conflicts Information" target="Constraint Conflicts Information" />
+   </view>
+   <view inputState="Routed" program="pin2ucf" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="gv_sha256.lpc" label="Locked Pin Constraints" >
+    <toc-item title="Top of Report" target="top.lpc" searchDir="Forward" />
+    <toc-item title="Newly Added Constraints" target="The following constraints were newly added" />
+   </view>
+   <view inputState="Translated" program="netgen" contextTags="CPLD_ONLY,EDK_OFF" hidden="if_missing" type="Secondary_Report" file="netgen/fit/gv_sha256_timesim.nlf" label="Post-Fit Simulation Model Report" />
+   <view inputState="Routed" program="bitgen" contextTags="FPGA_ONLY" hidden="if_missing" type="HTML" file="usage_statistics_webtalk.html" label="WebTalk Report" />
+   <view inputState="Routed" program="bitgen" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="webtalk.log" label="WebTalk Log File" />
+  </viewgroup>
+ </body>
+</report-views>
diff --git a/verilog/rtl/opencore_hasher/iseconfig/sha256.projectmgr b/verilog/rtl/opencore_hasher/iseconfig/sha256.projectmgr
new file mode 100755
index 0000000..e87e5e2
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/iseconfig/sha256.projectmgr
@@ -0,0 +1,117 @@
+<?xml version='1.0' encoding='utf-8'?>

+<!--This is an ISE project configuration file.-->

+<!--It holds project specific layout data for the projectmgr plugin.-->

+<!--Copyright (c) 1995-2009 Xilinx, Inc.  All rights reserved.-->

+<Project version="2" owner="projectmgr" name="sha256" >

+   <!--This is an ISE project configuration file.-->

+   <ItemView engineview="SynthesisOnly" guiview="Source" compilemode="AutoCompile" >

+      <ClosedNodes>

+         <ClosedNodesVersion>2</ClosedNodesVersion>

+         <ClosedNode>/sha256_hash - rtl Z:|Dropbox|develop|fpga|sha_256|trunk|syn|sha256|gv_sha256.vhd</ClosedNode>

+         <ClosedNode>/spi_master_atlys_top - rtl Z:|Dropbox|develop|fpga|sha_256|trunk|syn|sha256|sha256_hash.vhd</ClosedNode>

+         <ClosedNode>/spi_master_atlys_top - rtl Z:|Dropbox|develop|fpga|sha_256|trunk|syn|sha256|spi_master_atlys_top.vhd</ClosedNode>

+      </ClosedNodes>

+      <SelectedItems>

+         <SelectedItem>gv_sha256 - rtl (Z:/Dropbox/develop/fpga/sha256_hash_core/sha256_hash_core/trunk/syn/sha256/gv_sha256.vhd)</SelectedItem>

+      </SelectedItems>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff00000000000000010000000100000000000000000000000000000000020200000001000000010000006400000381000000020000000000000000000000000200000064ffffffff000000810000000300000002000003810000000100000003000000000000000100000003</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >true</UserChangedColumnWidths>

+      <CurrentItem>gv_sha256 - rtl (Z:/Dropbox/develop/fpga/sha256_hash_core/sha256_hash_core/trunk/syn/sha256/gv_sha256.vhd)</CurrentItem>

+   </ItemView>

+   <ItemView engineview="SynthesisOnly" sourcetype="" guiview="Process" >

+      <ClosedNodes>

+         <ClosedNodesVersion>1</ClosedNodesVersion>

+         <ClosedNode>Design Utilities/Compile HDL Simulation Libraries</ClosedNode>

+      </ClosedNodes>

+      <SelectedItems>

+         <SelectedItem>Design Utilities</SelectedItem>

+      </SelectedItems>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff000000000000000100000001000000000000000000000000000000000000000000000002e4000000010000000100000000000000000000000064ffffffff000000810000000000000001000002e40000000100000000</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>

+      <CurrentItem>Design Utilities</CurrentItem>

+   </ItemView>

+   <ItemView guiview="File" >

+      <ClosedNodes>

+         <ClosedNodesVersion>1</ClosedNodesVersion>

+      </ClosedNodes>

+      <SelectedItems/>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff0000000000000001000000000000000001000000000000000000000000000000000000039d000000040101000100000000000000000000000064ffffffff000000810000000000000004000001ad00000001000000000000009d0000000100000000000000660000000100000000000000ed0000000100000000</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>

+      <CurrentItem></CurrentItem>

+   </ItemView>

+   <ItemView guiview="Library" >

+      <ClosedNodes>

+         <ClosedNodesVersion>1</ClosedNodesVersion>

+      </ClosedNodes>

+      <SelectedItems/>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff00000000000000010000000000000000010000000000000000000000000000000000000099000000010001000100000000000000000000000064ffffffff000000810000000000000001000000990000000100000000</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>

+      <CurrentItem>work</CurrentItem>

+   </ItemView>

+   <ItemView engineview="SynthesisOnly" sourcetype="DESUT_VHDL_ARCHITECTURE" guiview="Process" >

+      <ClosedNodes>

+         <ClosedNodesVersion>1</ClosedNodesVersion>

+         <ClosedNode>Configure Target Device</ClosedNode>

+         <ClosedNode>Implement Design</ClosedNode>

+      </ClosedNodes>

+      <SelectedItems>

+         <SelectedItem>View RTL Schematic</SelectedItem>

+      </SelectedItems>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff00000000000000010000000100000000000000000000000000000000000000000000000064000000010000000100000000000000000000000064ffffffff000000810000000000000001000000640000000100000000</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>

+      <CurrentItem>View RTL Schematic</CurrentItem>

+   </ItemView>

+   <SourceProcessView>000000ff0000000000000002000000d4000000dc01000000050100000002</SourceProcessView>

+   <CurrentView>Behavioral Simulation</CurrentView>

+   <ItemView engineview="BehavioralSim" guiview="Source" compilemode="AutoCompile" >

+      <ClosedNodes>

+         <ClosedNodesVersion>2</ClosedNodesVersion>

+         <ClosedNode>/gv_sha256 - rtl Z:|Dropbox|develop|fpga|sha_256|trunk|syn|sha256|gv_sha256.vhd</ClosedNode>

+      </ClosedNodes>

+      <SelectedItems>

+         <SelectedItem>testbench - behavior (Z:/Dropbox/develop/fpga/sha256_hash_core/sha256_hash_core/trunk/syn/sha256/sha256_test.vhd)</SelectedItem>

+      </SelectedItems>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff00000000000000010000000100000000000000000000000000000000020200000001000000010000006400000395000000020000000000000000000000000200000064ffffffff000000810000000300000002000003950000000100000003000000000000000100000003</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >true</UserChangedColumnWidths>

+      <CurrentItem>testbench - behavior (Z:/Dropbox/develop/fpga/sha256_hash_core/sha256_hash_core/trunk/syn/sha256/sha256_test.vhd)</CurrentItem>

+   </ItemView>

+   <ItemView engineview="BehavioralSim" sourcetype="" guiview="Process" >

+      <ClosedNodes>

+         <ClosedNodesVersion>1</ClosedNodesVersion>

+         <ClosedNode>Design Utilities</ClosedNode>

+      </ClosedNodes>

+      <SelectedItems>

+         <SelectedItem/>

+      </SelectedItems>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff000000000000000100000001000000000000000000000000000000000000000000000002ad000000010000000100000000000000000000000064ffffffff000000810000000000000001000002ad0000000100000000</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>

+      <CurrentItem/>

+   </ItemView>

+   <ItemView engineview="BehavioralSim" sourcetype="DESUT_VHDL_ARCHITECTURE" guiview="Process" >

+      <ClosedNodes>

+         <ClosedNodesVersion>1</ClosedNodesVersion>

+      </ClosedNodes>

+      <SelectedItems>

+         <SelectedItem></SelectedItem>

+      </SelectedItems>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff000000000000000100000001000000000000000000000000000000000000000000000003af000000010000000100000000000000000000000064ffffffff000000810000000000000001000003af0000000100000000</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>

+      <CurrentItem></CurrentItem>

+   </ItemView>

+</Project>

diff --git a/verilog/rtl/opencore_hasher/iseconfig/spi_master_atlys.projectmgr b/verilog/rtl/opencore_hasher/iseconfig/spi_master_atlys.projectmgr
new file mode 100755
index 0000000..b8bbe0e
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/iseconfig/spi_master_atlys.projectmgr
@@ -0,0 +1,131 @@
+<?xml version='1.0' encoding='utf-8'?>

+<!--This is an ISE project configuration file.-->

+<!--It holds project specific layout data for the projectmgr plugin.-->

+<!--Copyright (c) 1995-2009 Xilinx, Inc.  All rights reserved.-->

+<Project version="2" owner="projectmgr" name="spi_master_atlys" >

+   <!--This is an ISE project configuration file.-->

+   <ItemView engineview="SynthesisOnly" guiview="Source" compilemode="AutoCompile" >

+      <ClosedNodes>

+         <ClosedNodesVersion>2</ClosedNodesVersion>

+      </ClosedNodes>

+      <SelectedItems>

+         <SelectedItem>spi_master_atlys_top - rtl (Z:/Dropbox/develop/fpga/spi_master_slave/trunk/syn/spi_master_atlys/spi_master_atlys_top.vhd)</SelectedItem>

+      </SelectedItems>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff0000000000000001000000010000000000000000000000000000000002020000000100000001000000640000031d000000020000000000000000000000000200000064ffffffff0000008100000003000000020000031d0000000100000003000000000000000100000003</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >true</UserChangedColumnWidths>

+      <CurrentItem>spi_master_atlys_top - rtl (Z:/Dropbox/develop/fpga/spi_master_slave/trunk/syn/spi_master_atlys/spi_master_atlys_top.vhd)</CurrentItem>

+   </ItemView>

+   <ItemView engineview="SynthesisOnly" sourcetype="" guiview="Process" >

+      <ClosedNodes>

+         <ClosedNodesVersion>1</ClosedNodesVersion>

+         <ClosedNode>Design Utilities</ClosedNode>

+      </ClosedNodes>

+      <SelectedItems>

+         <SelectedItem/>

+      </SelectedItems>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff0000000000000001000000010000000000000000000000000000000000000000000000018f000000010000000100000000000000000000000064ffffffff0000008100000000000000010000018f0000000100000000</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>

+      <CurrentItem/>

+   </ItemView>

+   <ItemView guiview="File" >

+      <ClosedNodes>

+         <ClosedNodesVersion>1</ClosedNodesVersion>

+      </ClosedNodes>

+      <SelectedItems>

+         <SelectedItem>Z:\Dropbox\develop\fpga\spi_master_slave\trunk\syn\spi_master_atlys\gray_counter.vhd</SelectedItem>

+      </SelectedItems>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff000000000000000100000000000000000100000000000000000000000000000000000003c5000000040101000100000000000000000000000064ffffffff0000008100000000000000040000021b00000001000000000000009d0000000100000000000000660000000100000000000000a70000000100000000</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>

+      <CurrentItem>Z:\Dropbox\develop\fpga\spi_master_slave\trunk\syn\spi_master_atlys\gray_counter.vhd</CurrentItem>

+   </ItemView>

+   <ItemView guiview="Library" >

+      <ClosedNodes>

+         <ClosedNodesVersion>1</ClosedNodesVersion>

+      </ClosedNodes>

+      <SelectedItems>

+         <SelectedItem>Z:\Dropbox\develop\fpga\spi_master_slave\trunk\syn\spi_master_atlys\spi_master.vhd</SelectedItem>

+      </SelectedItems>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff000000000000000100000000000000000100000000000000000000000000000000000003c5000000010001000100000000000000000000000064ffffffff000000810000000000000001000003c50000000100000000</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>

+      <CurrentItem>Z:\Dropbox\develop\fpga\spi_master_slave\trunk\syn\spi_master_atlys\spi_master.vhd</CurrentItem>

+   </ItemView>

+   <ItemView engineview="SynthesisOnly" sourcetype="DESUT_UCF" guiview="Process" >

+      <ClosedNodes>

+         <ClosedNodesVersion>1</ClosedNodesVersion>

+         <ClosedNode>User Constraints</ClosedNode>

+      </ClosedNodes>

+      <SelectedItems>

+         <SelectedItem/>

+      </SelectedItems>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff0000000000000001000000010000000000000000000000000000000000000000000000018f000000010000000100000000000000000000000064ffffffff0000008100000000000000010000018f0000000100000000</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>

+      <CurrentItem/>

+   </ItemView>

+   <ItemView engineview="SynthesisOnly" sourcetype="DESUT_VHDL_ARCHITECTURE" guiview="Process" >

+      <ClosedNodes>

+         <ClosedNodesVersion>1</ClosedNodesVersion>

+         <ClosedNode>Implement Design/Map/Generate Post-Map Static Timing</ClosedNode>

+         <ClosedNode>Implement Design/Place &amp; Route/Back-annotate Pin Locations</ClosedNode>

+         <ClosedNode>Implement Design/Place &amp; Route/Generate IBIS Model</ClosedNode>

+      </ClosedNodes>

+      <SelectedItems>

+         <SelectedItem>I/O Pin Planning (PlanAhead) - Post-Synthesis</SelectedItem>

+      </SelectedItems>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff000000000000000100000001000000000000000000000000000000000000000000000003b4000000010000000100000000000000000000000064ffffffff000000810000000000000001000003b40000000100000000</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>

+      <CurrentItem>I/O Pin Planning (PlanAhead) - Post-Synthesis</CurrentItem>

+   </ItemView>

+   <SourceProcessView>000000ff00000000000000020000011b0000011b01000000050100000002</SourceProcessView>

+   <CurrentView>Behavioral Simulation</CurrentView>

+   <ItemView engineview="BehavioralSim" guiview="Source" compilemode="AutoCompile" >

+      <ClosedNodes>

+         <ClosedNodesVersion>2</ClosedNodesVersion>

+      </ClosedNodes>

+      <SelectedItems>

+         <SelectedItem>testbench - behavior (Z:/Dropbox/develop/fpga/spi_master_slave/trunk/syn/spi_master_atlys/spi_master_atlys_test.vhd)</SelectedItem>

+      </SelectedItems>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff00000000000000010000000100000000000000000000000000000000020200000001000000010000006400000372000000020000000000000000000000000200000064ffffffff000000810000000300000002000003720000000100000003000000000000000100000003</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>

+      <CurrentItem>testbench - behavior (Z:/Dropbox/develop/fpga/spi_master_slave/trunk/syn/spi_master_atlys/spi_master_atlys_test.vhd)</CurrentItem>

+   </ItemView>

+   <ItemView engineview="BehavioralSim" sourcetype="" guiview="Process" >

+      <ClosedNodes>

+         <ClosedNodesVersion>1</ClosedNodesVersion>

+      </ClosedNodes>

+      <SelectedItems>

+         <SelectedItem></SelectedItem>

+      </SelectedItems>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff000000000000000100000001000000000000000000000000000000000000000000000003c5000000010000000100000000000000000000000064ffffffff000000810000000000000001000003c50000000100000000</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>

+      <CurrentItem></CurrentItem>

+   </ItemView>

+   <ItemView engineview="BehavioralSim" sourcetype="DESUT_VHDL_ARCHITECTURE" guiview="Process" >

+      <ClosedNodes>

+         <ClosedNodesVersion>1</ClosedNodesVersion>

+      </ClosedNodes>

+      <SelectedItems>

+         <SelectedItem></SelectedItem>

+      </SelectedItems>

+      <ScrollbarPosition orientation="vertical" >0</ScrollbarPosition>

+      <ScrollbarPosition orientation="horizontal" >0</ScrollbarPosition>

+      <ViewHeaderState orientation="horizontal" >000000ff000000000000000100000001000000000000000000000000000000000000000000000003c5000000010000000100000000000000000000000064ffffffff000000810000000000000001000003c50000000100000000</ViewHeaderState>

+      <UserChangedColumnWidths orientation="horizontal" >false</UserChangedColumnWidths>

+      <CurrentItem></CurrentItem>

+   </ItemView>

+</Project>

diff --git a/verilog/rtl/opencore_hasher/iseconfig/spi_master_atlys_top.xreport b/verilog/rtl/opencore_hasher/iseconfig/spi_master_atlys_top.xreport
new file mode 100755
index 0000000..938e2d0
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/iseconfig/spi_master_atlys_top.xreport
@@ -0,0 +1,226 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<report-views version="2.0" >
+ <header>
+  <DateModified>2016-05-24T01:52:42</DateModified>
+  <ModuleName>sha256_hash</ModuleName>
+  <SummaryTimeStamp>2014-07-24T11:26:18</SummaryTimeStamp>
+  <SavedFilePath>Z:/Dropbox/develop/fpga/sha_256/trunk/syn/sha256/iseconfig/spi_master_atlys_top.xreport</SavedFilePath>
+  <ImplementationReportsDirectory>Z:/Dropbox/develop/fpga/sha_256/trunk/syn/sha256\</ImplementationReportsDirectory>
+  <DateInitialized>2016-05-24T01:52:41</DateInitialized>
+  <EnableMessageFiltering>false</EnableMessageFiltering>
+ </header>
+ <body>
+  <viewgroup label="Design Overview" >
+   <view inputState="Unknown" program="implementation" ShowPartitionData="false" type="FPGASummary" file="sha256_hash_summary.html" label="Summary" >
+    <toc-item title="Design Overview" target="Design Overview" />
+    <toc-item title="Design Utilization Summary" target="Design Utilization Summary" />
+    <toc-item title="Performance Summary" target="Performance Summary" />
+    <toc-item title="Failing Constraints" target="Failing Constraints" />
+    <toc-item title="Detailed Reports" target="Detailed Reports" />
+    <table-item tableState="CollapsedTable" tableKey="DeviceUtilizationSummary" />
+    <table-item tableState="CollapsedTable" tableKey="DeviceUtilizationSummary" />
+    <table-item tableState="CollapsedTable" tableKey="DeviceUtilizationSummary" />
+    <table-item tableState="CollapsedTable" tableKey="DeviceUtilizationSummary" />
+    <table-item tableState="CollapsedTable" tableKey="DeviceUtilizationSummary" />
+    <table-item tableState="CollapsedTable" tableKey="DeviceUtilizationSummary" />
+    <table-item tableState="CollapsedTable" tableKey="DeviceUtilizationSummary" />
+    <table-item tableState="CollapsedTable" tableKey="DeviceUtilizationSummary" />
+    <table-item tableState="CollapsedTable" tableKey="DeviceUtilizationSummary" />
+    <table-item tableState="CollapsedTable" tableKey="DeviceUtilizationSummary" />
+    <table-item tableState="CollapsedTable" tableKey="DeviceUtilizationSummary" />
+   </view>
+   <view inputState="Unknown" program="implementation" contextTags="FPGA_ONLY" hidden="true" type="HTML" file="sha256_hash_envsettings.html" label="System Settings" />
+   <view inputState="Translated" program="map" locator="MAP_IOB_TABLE" contextTags="FPGA_ONLY" type="IOBProperties" file="sha256_hash_map.xrpt" label="IOB Properties" />
+   <view inputState="Translated" program="map" contextTags="FPGA_ONLY" hidden="true" type="Control_Sets" file="sha256_hash_map.xrpt" label="Control Set Information" />
+   <view inputState="Translated" program="map" locator="MAP_MODULE_HIERARCHY" contextTags="FPGA_ONLY" type="Module_Utilization" file="sha256_hash_map.xrpt" label="Module Level Utilization" />
+   <view inputState="Mapped" program="par" locator="CONSTRAINT_TABLE" contextTags="FPGA_ONLY" type="ConstraintsData" file="sha256_hash.ptwx" showConstraints="0" label="Timing Constraints" translator="ptwxToTableXML.xslt" />
+   <view inputState="Mapped" program="par" locator="PAR_PINOUT_BY_PIN_NUMBER" contextTags="FPGA_ONLY" type="PinoutData" file="sha256_hash_par.xrpt" label="Pinout Report" />
+   <view inputState="Mapped" program="par" locator="PAR_CLOCK_TABLE" contextTags="FPGA_ONLY" type="ClocksData" file="sha256_hash_par.xrpt" label="Clock Report" />
+   <view inputState="Mapped" program="par" contextTags="FPGA_ONLY,EDK_OFF" type="Timing_Analyzer" file="sha256_hash.twx" label="Static Timing" />
+   <view inputState="Translated" program="cpldfit" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="EXTERNAL_HTML" file="sha256_hash_html/fit/report.htm" label="CPLD Fitter Report" />
+   <view inputState="Fitted" program="taengine" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="EXTERNAL_HTML" file="sha256_hash_html/tim/report.htm" label="CPLD Timing Report" />
+  </viewgroup>
+  <viewgroup label="XPS Errors and Warnings" >
+   <view program="platgen" WrapMessages="true" contextTags="EDK_ON" hidden="true" type="MessageList" hideColumns="Filtered" file="__xps/ise/_xmsgs/platgen.xmsgs" label="Platgen Messages" />
+   <view program="simgen" WrapMessages="true" contextTags="EDK_ON" hidden="true" type="MessageList" hideColumns="Filtered" file="__xps/ise/_xmsgs/simgen.xmsgs" label="Simgen Messages" />
+   <view program="bitinit" WrapMessages="true" contextTags="EDK_ON" hidden="true" type="MessageList" hideColumns="Filtered" file="__xps/ise/_xmsgs/bitinit.xmsgs" label="BitInit Messages" />
+  </viewgroup>
+  <viewgroup label="XPS Reports" >
+   <view inputState="PreSynthesized" program="platgen" contextTags="EDK_ON" hidden="true" type="Secondary_Report" file="platgen.log" label="Platgen Log File" />
+   <view inputState="PreSynthesized" program="simgen" contextTags="EDK_ON" hidden="true" type="Secondary_Report" file="simgen.log" label="Simgen Log File" />
+   <view inputState="PreSynthesized" program="bitinit" contextTags="EDK_ON" hidden="true" type="Secondary_Report" file="bitinit.log" label="BitInit Log File" />
+   <view inputState="PreSynthesized" program="system" contextTags="EDK_ON" hidden="true" type="Secondary_Report" file="sha256_hash.log" label="System Log File" />
+  </viewgroup>
+  <viewgroup label="Errors and Warnings" >
+   <view program="pn" WrapMessages="true" contextTags="EDK_OFF" type="MessageList" hideColumns="Filtered, New" file="_xmsgs/pn_parser.xmsgs" label="Parser Messages" />
+   <view program="xst" WrapMessages="true" contextTags="XST_ONLY,EDK_OFF" hidden="false" type="MessageList" hideColumns="Filtered" file="_xmsgs/xst.xmsgs" label="Synthesis Messages" />
+   <view inputState="Synthesized" program="ngdbuild" WrapMessages="true" type="MessageList" hideColumns="Filtered" file="_xmsgs/ngdbuild.xmsgs" label="Translation Messages" />
+   <view inputState="Translated" program="map" WrapMessages="true" contextTags="FPGA_ONLY" type="MessageList" hideColumns="Filtered" file="_xmsgs/map.xmsgs" label="Map Messages" />
+   <view inputState="Mapped" program="par" WrapMessages="true" contextTags="FPGA_ONLY" type="MessageList" hideColumns="Filtered" file="_xmsgs/par.xmsgs" label="Place and Route Messages" />
+   <view inputState="Routed" program="trce" WrapMessages="true" contextTags="FPGA_ONLY" type="MessageList" hideColumns="Filtered" file="_xmsgs/trce.xmsgs" label="Timing Messages" />
+   <view inputState="Routed" program="xpwr" WrapMessages="true" contextTags="EDK_OFF" hidden="true" type="MessageList" hideColumns="Filtered" file="_xmsgs/xpwr.xmsgs" label="Power Messages" />
+   <view inputState="Routed" program="bitgen" WrapMessages="true" contextTags="FPGA_ONLY" type="MessageList" hideColumns="Filtered" file="_xmsgs/bitgen.xmsgs" label="Bitgen Messages" />
+   <view inputState="Translated" program="cpldfit" WrapMessages="true" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="MessageList" hideColumns="Filtered" file="_xmsgs/cpldfit.xmsgs" label="Fitter Messages" />
+   <view inputState="Current" program="implementation" WrapMessages="true" fileList="_xmsgs/xst.xmsgs,_xmsgs/ngdbuild.xmsgs,_xmsgs/map.xmsgs,_xmsgs/par.xmsgs,_xmsgs/trce.xmsgs,_xmsgs/xpwr.xmsgs,_xmsgs/bitgen.xmsgs" contextTags="FPGA_ONLY" type="MessageList" hideColumns="Filtered" file="_xmsgs/*.xmsgs" label="All Implementation Messages" />
+   <view inputState="Current" program="fitting" WrapMessages="true" fileList="_xmsgs/xst.xmsgs,_xmsgs/ngdbuild.xmsgs,_xmsgs/cpldfit.xmsgs,_xmsgs/xpwr.xmsgs" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="CPLD_MessageList" hideColumns="Filtered" file="_xmsgs/*.xmsgs" label="All Implementation Messages (CPLD)" />
+  </viewgroup>
+  <viewgroup label="Detailed Reports" >
+   <view program="xst" contextTags="XST_ONLY,EDK_OFF" hidden="false" type="Report" file="sha256_hash.syr" label="Synthesis Report" >
+    <toc-item title="Top of Report" target="Copyright " searchDir="Forward" />
+    <toc-item title="Synthesis Options Summary" target="   Synthesis Options Summary   " />
+    <toc-item title="HDL Compilation" target="   HDL Compilation   " />
+    <toc-item title="Design Hierarchy Analysis" target="   Design Hierarchy Analysis   " />
+    <toc-item title="HDL Analysis" target="   HDL Analysis   " />
+    <toc-item title="HDL Parsing" target="   HDL Parsing   " />
+    <toc-item title="HDL Elaboration" target="   HDL Elaboration   " />
+    <toc-item title="HDL Synthesis" target="   HDL Synthesis   " />
+    <toc-item title="HDL Synthesis Report" target="HDL Synthesis Report" searchCnt="2" searchDir="Backward" subItemLevel="1" />
+    <toc-item title="Advanced HDL Synthesis" target="   Advanced HDL Synthesis   " searchDir="Backward" />
+    <toc-item title="Advanced HDL Synthesis Report" target="Advanced HDL Synthesis Report" subItemLevel="1" />
+    <toc-item title="Low Level Synthesis" target="   Low Level Synthesis   " />
+    <toc-item title="Partition Report" target="   Partition Report     " />
+    <toc-item title="Final Report" target="   Final Report   " />
+    <toc-item title="Design Summary" target="   Design Summary   " />
+    <toc-item title="Primitive and Black Box Usage" target="Primitive and Black Box Usage:" subItemLevel="1" />
+    <toc-item title="Device Utilization Summary" target="Device utilization summary:" subItemLevel="1" />
+    <toc-item title="Partition Resource Summary" target="Partition Resource Summary:" subItemLevel="1" />
+    <toc-item title="Timing Report" target="Timing Report" subItemLevel="1" />
+    <toc-item title="Clock Information" target="Clock Information" subItemLevel="2" />
+    <toc-item title="Asynchronous Control Signals Information" target="Asynchronous Control Signals Information" subItemLevel="2" />
+    <toc-item title="Timing Summary" target="Timing Summary" subItemLevel="2" />
+    <toc-item title="Timing Details" target="Timing Details" subItemLevel="2" />
+    <toc-item title="Cross Clock Domains Report" target="Cross Clock Domains Report:" subItemLevel="2" />
+   </view>
+   <view program="synplify" contextTags="SYNPLIFY_ONLY,EDK_OFF" hidden="true" type="Report" file="sha256_hash.srr" label="Synplify Report" />
+   <view program="precision" contextTags="PRECISION_ONLY,EDK_OFF" hidden="true" type="Report" file="sha256_hash.prec_log" label="Precision Report" />
+   <view inputState="Synthesized" program="ngdbuild" type="Report" file="sha256_hash.bld" label="Translation Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+    <toc-item title="Command Line" target="Command Line:" />
+    <toc-item title="Partition Status" target="Partition Implementation Status" />
+    <toc-item title="Final Summary" target="NGDBUILD Design Results Summary:" />
+   </view>
+   <view inputState="Translated" program="map" contextTags="FPGA_ONLY" type="Report" file="sha256_hash_map.mrp" label="Map Report" >
+    <toc-item title="Top of Report" target="Release" searchDir="Forward" />
+    <toc-item title="Section 1: Errors" target="Section 1 -" searchDir="Backward" />
+    <toc-item title="Section 2: Warnings" target="Section 2 -" searchDir="Backward" />
+    <toc-item title="Section 3: Infos" target="Section 3 -" searchDir="Backward" />
+    <toc-item title="Section 4: Removed Logic Summary" target="Section 4 -" searchDir="Backward" />
+    <toc-item title="Section 5: Removed Logic" target="Section 5 -" searchDir="Backward" />
+    <toc-item title="Section 6: IOB Properties" target="Section 6 -" searchDir="Backward" />
+    <toc-item title="Section 7: RPMs" target="Section 7 -" searchDir="Backward" />
+    <toc-item title="Section 8: Guide Report" target="Section 8 -" searchDir="Backward" />
+    <toc-item title="Section 9: Area Group and Partition Summary" target="Section 9 -" searchDir="Backward" />
+    <toc-item title="Section 10: Timing Report" target="Section 10 -" searchDir="Backward" />
+    <toc-item title="Section 11: Configuration String Details" target="Section 11 -" searchDir="Backward" />
+    <toc-item title="Section 12: Control Set Information" target="Section 12 -" searchDir="Backward" />
+    <toc-item title="Section 13: Utilization by Hierarchy" target="Section 13 -" searchDir="Backward" />
+   </view>
+   <view inputState="Mapped" program="par" contextTags="FPGA_ONLY" type="Report" file="sha256_hash.par" label="Place and Route Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+    <toc-item title="Device Utilization" target="Device Utilization Summary:" />
+    <toc-item title="Router Information" target="Starting Router" />
+    <toc-item title="Partition Status" target="Partition Implementation Status" />
+    <toc-item title="Clock Report" target="Generating Clock Report" />
+    <toc-item title="Timing Results" target="Timing Score:" />
+    <toc-item title="Final Summary" target="Peak Memory Usage:" />
+   </view>
+   <view inputState="Routed" program="trce" contextTags="FPGA_ONLY" type="Report" file="sha256_hash.twr" label="Post-PAR Static Timing Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+    <toc-item title="Timing Report Description" target="Device,package,speed:" />
+    <toc-item title="Informational Messages" target="INFO:" />
+    <toc-item title="Warning Messages" target="WARNING:" />
+    <toc-item title="Timing Constraints" target="Timing constraint:" />
+    <toc-item title="Derived Constraint Report" target="Derived Constraint Report" />
+    <toc-item title="Data Sheet Report" target="Data Sheet report:" />
+    <toc-item title="Timing Summary" target="Timing summary:" />
+    <toc-item title="Trace Settings" target="Trace Settings:" />
+   </view>
+   <view inputState="Translated" program="cpldfit" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="Report" file="sha256_hash.rpt" label="CPLD Fitter Report (Text)" >
+    <toc-item title="Top of Report" target="cpldfit:" searchDir="Forward" />
+    <toc-item title="Resources Summary" target="**  Mapped Resource Summary  **" />
+    <toc-item title="Pin Resources" target="** Pin Resources **" />
+    <toc-item title="Global Resources" target="** Global Control Resources **" />
+   </view>
+   <view inputState="Fitted" program="taengine" contextTags="CPLD_ONLY,EDK_OFF" hidden="true" type="Report" file="sha256_hash.tim" label="CPLD Timing Report (Text)" >
+    <toc-item title="Top of Report" target="Performance Summary Report" searchDir="Forward" />
+    <toc-item title="Performance Summary" target="Performance Summary:" />
+   </view>
+   <view inputState="Routed" program="xpwr" contextTags="EDK_OFF" type="Report" file="sha256_hash.pwr" label="Power Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+    <toc-item title="Power summary" target="Power summary" />
+    <toc-item title="Thermal summary" target="Thermal summary" />
+   </view>
+   <view inputState="Routed" program="bitgen" contextTags="FPGA_ONLY" type="Report" file="sha256_hash.bgn" label="Bitgen Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+    <toc-item title="Bitgen Options" target="Summary of Bitgen Options:" />
+    <toc-item title="Final Summary" target="DRC detected" />
+   </view>
+  </viewgroup>
+  <viewgroup label="Secondary Reports" >
+   <view inputState="PreSynthesized" program="isim" hidden="if_missing" type="Secondary_Report" file="isim.log" label="ISIM Simulator Log" />
+   <view inputState="Synthesized" program="netgen" hidden="if_missing" type="Secondary_Report" file="netgen/synthesis/sha256_hash_synthesis.nlf" label="Post-Synthesis Simulation Model Report" >
+    <toc-item title="Top of Report" target="Release" searchDir="Forward" />
+   </view>
+   <view inputState="Translated" program="netgen" hidden="if_missing" type="Secondary_Report" file="netgen/translate/sha256_hash_translate.nlf" label="Post-Translate Simulation Model Report" >
+    <toc-item title="Top of Report" target="Release" searchDir="Forward" />
+   </view>
+   <view inputState="Translated" program="netgen" hidden="if_missing" type="Secondary_Report" file="sha256_hash_tran_fecn.nlf" label="Post-Translate Formality Netlist Report" />
+   <view inputState="Translated" program="map" contextTags="FPGA_ONLY" hidden="true" type="Secondary_Report" file="sha256_hash_map.map" label="Map Log File" >
+    <toc-item title="Top of Report" target="Release" searchDir="Forward" />
+    <toc-item title="Design Information" target="Design Information" />
+    <toc-item title="Design Summary" target="Design Summary" />
+   </view>
+   <view inputState="Routed" program="smartxplorer" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="smartxplorer_results/smartxplorer.txt" label="SmartXplorer Report" />
+   <view inputState="Mapped" program="trce" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="sha256_hash_preroute.twr" label="Post-Map Static Timing Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+    <toc-item title="Timing Report Description" target="Device,package,speed:" />
+    <toc-item title="Informational Messages" target="INFO:" />
+    <toc-item title="Warning Messages" target="WARNING:" />
+    <toc-item title="Timing Constraints" target="Timing constraint:" />
+    <toc-item title="Derived Constraint Report" target="Derived Constraint Report" />
+    <toc-item title="Data Sheet Report" target="Data Sheet report:" />
+    <toc-item title="Timing Summary" target="Timing summary:" />
+    <toc-item title="Trace Settings" target="Trace Settings:" />
+   </view>
+   <view inputState="Mapped" program="netgen" hidden="if_missing" type="Secondary_Report" file="netgen/map/sha256_hash_map.nlf" label="Post-Map Simulation Model Report" />
+   <view inputState="Mapped" program="map" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="sha256_hash_map.psr" label="Physical Synthesis Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+   </view>
+   <view inputState="Mapped" program="par" contextTags="FPGA_ONLY" hidden="true" type="Pad_Report" file="sha256_hash_pad.txt" label="Pad Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+   </view>
+   <view inputState="Mapped" program="par" contextTags="FPGA_ONLY" hidden="true" type="Secondary_Report" file="sha256_hash.unroutes" label="Unroutes Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+   </view>
+   <view inputState="Mapped" program="map" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="sha256_hash_preroute.tsi" label="Post-Map Constraints Interaction Report" >
+    <toc-item title="Top of Report" target="Release" searchDir="Forward" />
+   </view>
+   <view inputState="Mapped" program="par" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="sha256_hash.grf" label="Guide Results Report" />
+   <view inputState="Routed" program="par" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="sha256_hash.dly" label="Asynchronous Delay Report" />
+   <view inputState="Routed" program="par" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="sha256_hash.clk_rgn" label="Clock Region Report" />
+   <view inputState="Routed" program="par" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="sha256_hash.tsi" label="Post-Place and Route Constraints Interaction Report" >
+    <toc-item title="Top of Report" target="Copyright (c)" searchDir="Forward" />
+   </view>
+   <view inputState="Routed" program="netgen" hidden="if_missing" type="Secondary_Report" file="sha256_hash_par_fecn.nlf" label="Post-Place and Route Formality Netlist Report" />
+   <view inputState="Routed" program="netgen" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="netgen/par/sha256_hash_timesim.nlf" label="Post-Place and Route Simulation Model Report" />
+   <view inputState="Routed" program="netgen" hidden="if_missing" type="Secondary_Report" file="sha256_hash_sta.nlf" label="Primetime Netlist Report" >
+    <toc-item title="Top of Report" target="Release" searchDir="Forward" />
+   </view>
+   <view inputState="Routed" program="ibiswriter" hidden="if_missing" type="Secondary_Report" file="sha256_hash.ibs" label="IBIS Model" >
+    <toc-item title="Top of Report" target="IBIS Models for" searchDir="Forward" />
+    <toc-item title="Component" target="Component " />
+   </view>
+   <view inputState="Routed" program="pin2ucf" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="sha256_hash.lck" label="Back-annotate Pin Report" >
+    <toc-item title="Top of Report" target="pin2ucf Report File" searchDir="Forward" />
+    <toc-item title="Constraint Conflicts Information" target="Constraint Conflicts Information" />
+   </view>
+   <view inputState="Routed" program="pin2ucf" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="sha256_hash.lpc" label="Locked Pin Constraints" >
+    <toc-item title="Top of Report" target="top.lpc" searchDir="Forward" />
+    <toc-item title="Newly Added Constraints" target="The following constraints were newly added" />
+   </view>
+   <view inputState="Translated" program="netgen" contextTags="CPLD_ONLY,EDK_OFF" hidden="if_missing" type="Secondary_Report" file="netgen/fit/sha256_hash_timesim.nlf" label="Post-Fit Simulation Model Report" />
+   <view inputState="Routed" program="bitgen" contextTags="FPGA_ONLY" hidden="if_missing" type="HTML" file="usage_statistics_webtalk.html" label="WebTalk Report" />
+   <view inputState="Routed" program="bitgen" contextTags="FPGA_ONLY" hidden="if_missing" type="Secondary_Report" file="webtalk.log" label="WebTalk Log File" />
+  </viewgroup>
+ </body>
+</report-views>
diff --git a/verilog/rtl/opencore_hasher/makefile b/verilog/rtl/opencore_hasher/makefile
new file mode 100755
index 0000000..6302314
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/makefile
@@ -0,0 +1,18 @@
+GHDL=ghdl
+
+
+build:
+
+	$(GHDL)	 -a sha256_hash_core.vhd
+	$(GHDL)	 -a sha256_Ki_rom.vhd
+	$(GHDL)	 -a sha256_Kt_rom.vhd
+	$(GHDL)	 -a sha256_msg_sch.vhd
+	$(GHDL)	 -a sha256_padding.vhd
+	$(GHDL)	 -a sha256_regs.vhd
+	$(GHDL)  -a gv_sha256.vhd
+	$(GDHL)  -a sha256_test.vh
+
+sim:
+
+	$(GHDL)   -e testbench
+	$(GHDL)	  -r testbench --wave=wave.ghw --stop-time=50us --ieee-asserts=disable	
diff --git a/verilog/rtl/opencore_hasher/sha256.gise b/verilog/rtl/opencore_hasher/sha256.gise
new file mode 100755
index 0000000..de8c954
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/sha256.gise
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>

+<generated_project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">

+

+  <!--                                                          -->

+

+  <!--             For tool use only. Do not edit.              -->

+

+  <!--                                                          -->

+

+  <!-- ProjectNavigator created generated project file.         -->

+

+  <!-- For use in tracking generated file and other information -->

+

+  <!-- allowing preservation of process status.                 -->

+

+  <!--                                                          -->

+

+  <!-- Copyright (c) 1995-2013 Xilinx, Inc.  All rights reserved. -->

+

+  <version xmlns="http://www.xilinx.com/XMLSchema">11.1</version>

+

+  <sourceproject xmlns="http://www.xilinx.com/XMLSchema" xil_pn:fileType="FILE_XISE" xil_pn:name="sha256.xise"/>

+

+  <files xmlns="http://www.xilinx.com/XMLSchema">

+    <file xil_pn:fileType="FILE_LOG" xil_pn:name="fuse.log"/>

+    <file xil_pn:fileType="FILE_DIRECTORY" xil_pn:name="isim"/>

+    <file xil_pn:branch="BehavioralSim" xil_pn:fileType="FILE_CMD" xil_pn:name="isim.cmd"/>

+    <file xil_pn:branch="BehavioralSim" xil_pn:fileType="FILE_LOG" xil_pn:name="isim.log"/>

+    <file xil_pn:branch="BehavioralSim" xil_pn:fileType="FILE_ISIM_EXE" xil_pn:name="sha256_control_isim_beh.exe"/>

+    <file xil_pn:fileType="FILE_XST_PROJECT" xil_pn:name="sha256_control_stx_beh.prj"/>

+    <file xil_pn:fileType="FILE_XST_PROJECT" xil_pn:name="testbench_beh.prj"/>

+    <file xil_pn:branch="BehavioralSim" xil_pn:fileType="FILE_ISIM_EXE" xil_pn:name="testbench_isim_beh.exe"/>

+    <file xil_pn:fileType="FILE_ISIM_MISC" xil_pn:name="testbench_isim_beh.wdb"/>

+    <file xil_pn:fileType="FILE_XST_PROJECT" xil_pn:name="testbench_stx_beh.prj"/>

+    <file xil_pn:branch="BehavioralSim" xil_pn:fileType="FILE_INI" xil_pn:name="xilinxsim.ini"/>

+  </files>

+

+  <transforms xmlns="http://www.xilinx.com/XMLSchema">

+    <transform xil_pn:end_ts="1475335110" xil_pn:name="TRAN_copyInitialToAbstractSimulation" xil_pn:start_ts="1475335110">

+      <status xil_pn:value="SuccessfullyRun"/>

+      <status xil_pn:value="ReadyToRun"/>

+    </transform>

+    <transform xil_pn:end_ts="1475418461" xil_pn:in_ck="7880234553005555019" xil_pn:name="TRAN_copyAbstractToPostAbstractSimulation" xil_pn:start_ts="1475418461">

+      <status xil_pn:value="SuccessfullyRun"/>

+      <status xil_pn:value="ReadyToRun"/>

+      <status xil_pn:value="OutOfDateForInputs"/>

+      <status xil_pn:value="OutOfDateForOutputs"/>

+      <status xil_pn:value="InputChanged"/>

+      <status xil_pn:value="OutputChanged"/>

+      <outfile xil_pn:name="gv_sha256.vhd"/>

+      <outfile xil_pn:name="sha256_Ki_rom.vhd"/>

+      <outfile xil_pn:name="sha256_Kt_rom.vhd"/>

+      <outfile xil_pn:name="sha256_control.vhd"/>

+      <outfile xil_pn:name="sha256_hash_core.vhd"/>

+      <outfile xil_pn:name="sha256_msg_sch.vhd"/>

+      <outfile xil_pn:name="sha256_padding.vhd"/>

+      <outfile xil_pn:name="sha256_regs.vhd"/>

+      <outfile xil_pn:name="sha256_test.vhd"/>

+    </transform>

+    <transform xil_pn:end_ts="1475335110" xil_pn:name="TRAN_xawsToSimhdl" xil_pn:prop_ck="4434870115928851094" xil_pn:start_ts="1475335110">

+      <status xil_pn:value="SuccessfullyRun"/>

+      <status xil_pn:value="ReadyToRun"/>

+    </transform>

+    <transform xil_pn:end_ts="1475335110" xil_pn:name="TRAN_schematicsToHdlSim" xil_pn:prop_ck="-1902104842233773292" xil_pn:start_ts="1475335110">

+      <status xil_pn:value="SuccessfullyRun"/>

+      <status xil_pn:value="ReadyToRun"/>

+    </transform>

+    <transform xil_pn:end_ts="1475335110" xil_pn:name="TRAN_regenerateCoresSim" xil_pn:prop_ck="-1109748418894572325" xil_pn:start_ts="1475335110">

+      <status xil_pn:value="SuccessfullyRun"/>

+      <status xil_pn:value="ReadyToRun"/>

+    </transform>

+    <transform xil_pn:end_ts="1475418464" xil_pn:in_ck="7880234553005555019" xil_pn:name="TRAN_copyPostAbstractToPreSimulation" xil_pn:start_ts="1475418464">

+      <status xil_pn:value="SuccessfullyRun"/>

+      <status xil_pn:value="ReadyToRun"/>

+      <status xil_pn:value="OutOfDateForInputs"/>

+      <status xil_pn:value="OutOfDateForPredecessor"/>

+      <status xil_pn:value="OutOfDateForOutputs"/>

+      <status xil_pn:value="InputChanged"/>

+      <status xil_pn:value="OutputChanged"/>

+      <outfile xil_pn:name="gv_sha256.vhd"/>

+      <outfile xil_pn:name="sha256_Ki_rom.vhd"/>

+      <outfile xil_pn:name="sha256_Kt_rom.vhd"/>

+      <outfile xil_pn:name="sha256_control.vhd"/>

+      <outfile xil_pn:name="sha256_hash_core.vhd"/>

+      <outfile xil_pn:name="sha256_msg_sch.vhd"/>

+      <outfile xil_pn:name="sha256_padding.vhd"/>

+      <outfile xil_pn:name="sha256_regs.vhd"/>

+      <outfile xil_pn:name="sha256_test.vhd"/>

+    </transform>

+    <transform xil_pn:end_ts="1475418472" xil_pn:in_ck="7880234553005555019" xil_pn:name="TRAN_ISimulateBehavioralModelRunFuse" xil_pn:prop_ck="1459423336703152140" xil_pn:start_ts="1475418464">

+      <status xil_pn:value="SuccessfullyRun"/>

+      <status xil_pn:value="ReadyToRun"/>

+      <status xil_pn:value="OutOfDateForInputs"/>

+      <status xil_pn:value="OutOfDateForPredecessor"/>

+      <status xil_pn:value="OutOfDateForOutputs"/>

+      <status xil_pn:value="InputChanged"/>

+      <status xil_pn:value="OutputChanged"/>

+      <outfile xil_pn:name="fuse.log"/>

+      <outfile xil_pn:name="isim"/>

+      <outfile xil_pn:name="isim.log"/>

+      <outfile xil_pn:name="testbench_beh.prj"/>

+      <outfile xil_pn:name="testbench_isim_beh.exe"/>

+      <outfile xil_pn:name="xilinxsim.ini"/>

+    </transform>

+    <transform xil_pn:end_ts="1475418473" xil_pn:in_ck="-5570483995328803433" xil_pn:name="TRAN_ISimulateBehavioralModel" xil_pn:prop_ck="-5414671575160791934" xil_pn:start_ts="1475418472">

+      <status xil_pn:value="SuccessfullyRun"/>

+      <status xil_pn:value="ReadyToRun"/>

+      <status xil_pn:value="OutOfDateForPredecessor"/>

+      <status xil_pn:value="OutOfDateForOutputs"/>

+      <status xil_pn:value="OutputChanged"/>

+      <outfile xil_pn:name="isim.cmd"/>

+      <outfile xil_pn:name="isim.log"/>

+      <outfile xil_pn:name="testbench_isim_beh.wdb"/>

+    </transform>

+  </transforms>

+

+</generated_project>

diff --git a/verilog/rtl/opencore_hasher/sha256.wcfg b/verilog/rtl/opencore_hasher/sha256.wcfg
new file mode 100755
index 0000000..454b6ad
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/sha256.wcfg
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<wave_config>

+   <wave_state>

+   </wave_state>

+   <db_ref_list>

+      <db_ref path="Z:/Dropbox/develop/fpga/sha256_hash_core/sha256_hash_core/trunk/syn/sha256/testbench_isim_beh.wdb" id="1" type="auto">

+         <top_modules>

+            <top_module name="numeric_std" />

+            <top_module name="std_logic_1164" />

+            <top_module name="testbench" />

+         </top_modules>

+      </db_ref>

+   </db_ref_list>

+   <WVObjectSize size="41" />

+   <wvobject fp_name="/testbench/test_case" type="other" db_ref_id="1">

+      <obj_property name="ElementShortName">test_case</obj_property>

+      <obj_property name="ObjectShortName">test_case</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/pclk" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">pclk</obj_property>

+      <obj_property name="ObjectShortName">pclk</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/hash_control_st_reg" type="other" db_ref_id="1">

+      <obj_property name="ElementShortName">hash_control_st_reg</obj_property>

+      <obj_property name="ObjectShortName">hash_control_st_reg</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/hash_control_st_next" type="other" db_ref_id="1">

+      <obj_property name="ElementShortName">hash_control_st_next</obj_property>

+      <obj_property name="ObjectShortName">hash_control_st_next</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_ce" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_ce</obj_property>

+      <obj_property name="ObjectShortName">dut_ce</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_start" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_start</obj_property>

+      <obj_property name="ObjectShortName">dut_start</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_end" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_end</obj_property>

+      <obj_property name="ObjectShortName">dut_end</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/di_wr_window" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">di_wr_window</obj_property>

+      <obj_property name="ObjectShortName">di_wr_window</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_di_req" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_di_req</obj_property>

+      <obj_property name="ObjectShortName">dut_di_req</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_di_wr" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_di_wr</obj_property>

+      <obj_property name="ObjectShortName">dut_di_wr</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_error" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_error</obj_property>

+      <obj_property name="ObjectShortName">dut_error</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_do_valid" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_do_valid</obj_property>

+      <obj_property name="ObjectShortName">dut_do_valid</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/error_i" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">error_i</obj_property>

+      <obj_property name="ObjectShortName">error_i</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/core_error" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">core_error</obj_property>

+      <obj_property name="ObjectShortName">core_error</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_di" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_di[31:0]</obj_property>

+      <obj_property name="ObjectShortName">dut_di[31:0]</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_bytes" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_bytes[1:0]</obj_property>

+      <obj_property name="ObjectShortName">dut_bytes[1:0]</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/st_cnt_reg" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">st_cnt_reg[6:0]</obj_property>

+      <obj_property name="ObjectShortName">st_cnt_reg[6:0]</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/bitlen_o" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">bitlen_o[63:0]</obj_property>

+      <obj_property name="ObjectShortName">bitlen_o[63:0]</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/sha_reset" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">sha_reset</obj_property>

+      <obj_property name="ObjectShortName">sha_reset</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/sha_init" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">sha_init</obj_property>

+      <obj_property name="ObjectShortName">sha_init</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/sch_ld_o" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">sch_ld_o</obj_property>

+      <obj_property name="ObjectShortName">sch_ld_o</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/core_ld_o" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">core_ld_o</obj_property>

+      <obj_property name="ObjectShortName">core_ld_o</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/oregs_ld_o" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">oregs_ld_o</obj_property>

+      <obj_property name="ObjectShortName">oregs_ld_o</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/core_ce_o" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">core_ce_o</obj_property>

+      <obj_property name="ObjectShortName">core_ce_o</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/sch_ce_o" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">sch_ce_o</obj_property>

+      <obj_property name="ObjectShortName">sch_ce_o</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/oregs_ce_o" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">oregs_ce_o</obj_property>

+      <obj_property name="ObjectShortName">oregs_ce_o</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/one_insert_o" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">one_insert_o</obj_property>

+      <obj_property name="ObjectShortName">one_insert_o</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/sha_last_blk_reg" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">sha_last_blk_reg</obj_property>

+      <obj_property name="ObjectShortName">sha_last_blk_reg</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_control/sha_last_blk_next" type="logic" db_ref_id="1">

+      <obj_property name="ElementShortName">sha_last_blk_next</obj_property>

+      <obj_property name="ObjectShortName">sha_last_blk_next</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_hash_core/kt_i" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">kt_i[31:0]</obj_property>

+      <obj_property name="ObjectShortName">kt_i[31:0]</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_msg_sch/wt_o" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">wt_o[31:0]</obj_property>

+      <obj_property name="ObjectShortName">wt_o[31:0]</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_hash_core/wt_i" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">wt_i[31:0]</obj_property>

+      <obj_property name="ObjectShortName">wt_i[31:0]</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/Inst_sha_256_dut/Inst_sha256_hash_core/a_o" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">a_o[31:0]</obj_property>

+      <obj_property name="ObjectShortName">a_o[31:0]</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_h0" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_h0[31:0]</obj_property>

+      <obj_property name="ObjectShortName">dut_h0[31:0]</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_h1" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_h1[31:0]</obj_property>

+      <obj_property name="ObjectShortName">dut_h1[31:0]</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_h2" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_h2[31:0]</obj_property>

+      <obj_property name="ObjectShortName">dut_h2[31:0]</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_h3" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_h3[31:0]</obj_property>

+      <obj_property name="ObjectShortName">dut_h3[31:0]</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_h4" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_h4[31:0]</obj_property>

+      <obj_property name="ObjectShortName">dut_h4[31:0]</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_h5" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_h5[31:0]</obj_property>

+      <obj_property name="ObjectShortName">dut_h5[31:0]</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_h6" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_h6[31:0]</obj_property>

+      <obj_property name="ObjectShortName">dut_h6[31:0]</obj_property>

+   </wvobject>

+   <wvobject fp_name="/testbench/dut_h7" type="array" db_ref_id="1">

+      <obj_property name="ElementShortName">dut_h7[31:0]</obj_property>

+      <obj_property name="ObjectShortName">dut_h7[31:0]</obj_property>

+   </wvobject>

+</wave_config>

diff --git a/verilog/rtl/opencore_hasher/sha256.xise b/verilog/rtl/opencore_hasher/sha256.xise
new file mode 100755
index 0000000..6ad5807
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/sha256.xise
@@ -0,0 +1,397 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">
+
+  <header>
+    <!-- ISE source project file created by Project Navigator.             -->
+    <!--                                                                   -->
+    <!-- This file contains project source information including a list of -->
+    <!-- project source files, project and process properties.  This file, -->
+    <!-- along with the project source files, is sufficient to open and    -->
+    <!-- implement in ISE Project Navigator.                               -->
+    <!--                                                                   -->
+    <!-- Copyright (c) 1995-2013 Xilinx, Inc.  All rights reserved. -->
+  </header>
+
+  <version xil_pn:ise_version="14.7" xil_pn:schema_version="2"/>
+
+  <files>
+    <file xil_pn:name="sha256_msg_sch.vhd" xil_pn:type="FILE_VHDL">
+      <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="3"/>
+      <association xil_pn:name="Implementation" xil_pn:seqID="3"/>
+    </file>
+    <file xil_pn:name="sha256_hash_core.vhd" xil_pn:type="FILE_VHDL">
+      <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="6"/>
+      <association xil_pn:name="Implementation" xil_pn:seqID="6"/>
+    </file>
+    <file xil_pn:name="sha256_Ki_rom.vhd" xil_pn:type="FILE_VHDL">
+      <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="5"/>
+      <association xil_pn:name="Implementation" xil_pn:seqID="5"/>
+    </file>
+    <file xil_pn:name="sha256_Kt_rom.vhd" xil_pn:type="FILE_VHDL">
+      <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="4"/>
+      <association xil_pn:name="Implementation" xil_pn:seqID="4"/>
+    </file>
+    <file xil_pn:name="gv_sha256.vhd" xil_pn:type="FILE_VHDL">
+      <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="8"/>
+      <association xil_pn:name="Implementation" xil_pn:seqID="8"/>
+    </file>
+    <file xil_pn:name="sha256_padding.vhd" xil_pn:type="FILE_VHDL">
+      <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="2"/>
+      <association xil_pn:name="Implementation" xil_pn:seqID="2"/>
+    </file>
+    <file xil_pn:name="sha256_control.vhd" xil_pn:type="FILE_VHDL">
+      <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="7"/>
+      <association xil_pn:name="Implementation" xil_pn:seqID="7"/>
+    </file>
+    <file xil_pn:name="sha256_regs.vhd" xil_pn:type="FILE_VHDL">
+      <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="1"/>
+      <association xil_pn:name="Implementation" xil_pn:seqID="1"/>
+    </file>
+    <file xil_pn:name="sha256_test.vhd" xil_pn:type="FILE_VHDL">
+      <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="9"/>
+      <association xil_pn:name="PostMapSimulation" xil_pn:seqID="11"/>
+      <association xil_pn:name="PostRouteSimulation" xil_pn:seqID="11"/>
+      <association xil_pn:name="PostTranslateSimulation" xil_pn:seqID="11"/>
+    </file>
+  </files>
+
+  <autoManagedFiles>
+    <!-- The following files are identified by `include statements in verilog -->
+    <!-- source files and are automatically managed by Project Navigator.     -->
+    <!--                                                                      -->
+    <!-- Do not hand-edit this section, as it will be overwritten when the    -->
+    <!-- project is analyzed based on files automatically identified as       -->
+    <!-- include files.                                                       -->
+  </autoManagedFiles>
+
+  <properties>
+    <property xil_pn:name="AES Initial Vector spartan6" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="AES Key (Hex String) spartan6" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Add I/O Buffers" xil_pn:value="true" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Allow Logic Optimization Across Hierarchy" xil_pn:value="true" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Allow SelectMAP Pins to Persist" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Allow Unexpanded Blocks" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Allow Unmatched LOC Constraints" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Allow Unmatched Timing Group Constraints" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Analysis Effort Level" xil_pn:value="Standard" xil_pn:valueState="default"/>
+    <property xil_pn:name="Asynchronous To Synchronous" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Auto Implementation Compile Order" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Auto Implementation Top" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Automatic BRAM Packing" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Automatically Insert glbl Module in the Netlist" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Automatically Run Generate Target PROM/ACE File" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="BRAM Utilization Ratio" xil_pn:value="100" xil_pn:valueState="default"/>
+    <property xil_pn:name="Bring Out Global Set/Reset Net as a Port" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Bring Out Global Tristate Net as a Port" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Bus Delimiter" xil_pn:value="&lt;>" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Case" xil_pn:value="Maintain" xil_pn:valueState="default"/>
+    <property xil_pn:name="Case Implementation Style" xil_pn:value="Full-Parallel" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Change Device Speed To" xil_pn:value="-2" xil_pn:valueState="default"/>
+    <property xil_pn:name="Change Device Speed To Post Trace" xil_pn:value="-2" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Combinatorial Logic Optimization" xil_pn:value="true" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Compile EDK Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Compile SIMPRIM (Timing) Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Compile UNISIM (Functional) Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Compile XilinxCoreLib (CORE Generator) Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Compile for HDL Debugging" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Configuration Pin Done" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
+    <property xil_pn:name="Configuration Pin Program" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
+    <property xil_pn:name="Configuration Rate spartan6" xil_pn:value="2" xil_pn:valueState="default"/>
+    <property xil_pn:name="Correlate Output to Input Design" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Create ASCII Configuration File" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Create Binary Configuration File" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Create Bit File" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Create I/O Pads from Ports" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Create IEEE 1532 Configuration File spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Create Logic Allocation File" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Create Mask File" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Create ReadBack Data Files" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Cross Clock Analysis" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="DSP Utilization Ratio" xil_pn:value="100" xil_pn:valueState="default"/>
+    <property xil_pn:name="Delay Values To Be Read from SDF" xil_pn:value="Setup Time" xil_pn:valueState="default"/>
+    <property xil_pn:name="Device" xil_pn:value="xc6slx45" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Device Family" xil_pn:value="Spartan6" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Device Speed Grade/Select ABS Minimum" xil_pn:value="-2" xil_pn:valueState="default"/>
+    <property xil_pn:name="Disable Detailed Package Model Insertion" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Do Not Escape Signal and Instance Names in Netlist" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Done (Output Events)" xil_pn:value="Default (4)" xil_pn:valueState="default"/>
+    <property xil_pn:name="Drive Awake Pin During Suspend/Wake Sequence spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Drive Done Pin High" xil_pn:value="true" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Enable BitStream Compression" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Enable Cyclic Redundancy Checking (CRC) spartan6" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Enable Debugging of Serial Mode BitStream" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Enable External Master Clock spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Enable Hardware Co-Simulation" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Enable Internal Done Pipe" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Enable Message Filtering" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Enable Multi-Pin Wake-Up Suspend Mode spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Enable Multi-Threading" xil_pn:value="2" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Enable Multi-Threading par spartan6" xil_pn:value="4" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Enable Outputs (Output Events)" xil_pn:value="Default (5)" xil_pn:valueState="default"/>
+    <property xil_pn:name="Enable Suspend/Wake Global Set/Reset spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Encrypt Bitstream spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Encrypt Key Select spartan6" xil_pn:value="BBRAM" xil_pn:valueState="default"/>
+    <property xil_pn:name="Equivalent Register Removal Map" xil_pn:value="true" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Equivalent Register Removal XST" xil_pn:value="true" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Essential Bits" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Evaluation Development Board" xil_pn:value="None Specified" xil_pn:valueState="default"/>
+    <property xil_pn:name="Exclude Compilation of Deprecated EDK Cores" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Exclude Compilation of EDK Sub-Libraries" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Extra Cost Tables Map" xil_pn:value="3" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Extra Effort (Highest PAR level only)" xil_pn:value="Continue on Impossible" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="FPGA Start-Up Clock" xil_pn:value="CCLK" xil_pn:valueState="default"/>
+    <property xil_pn:name="FSM Encoding Algorithm" xil_pn:value="Auto" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="FSM Style" xil_pn:value="LUT" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Filter Files From Compile Order" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Flatten Output Netlist" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Functional Model Target Language ArchWiz" xil_pn:value="VHDL" xil_pn:valueState="default"/>
+    <property xil_pn:name="Functional Model Target Language Coregen" xil_pn:value="VHDL" xil_pn:valueState="default"/>
+    <property xil_pn:name="Functional Model Target Language Schematic" xil_pn:value="VHDL" xil_pn:valueState="default"/>
+    <property xil_pn:name="GTS Cycle During Suspend/Wakeup Sequence spartan6" xil_pn:value="4" xil_pn:valueState="default"/>
+    <property xil_pn:name="GWE Cycle During Suspend/Wakeup Sequence spartan6" xil_pn:value="5" xil_pn:valueState="default"/>
+    <property xil_pn:name="Generate Architecture Only (No Entity Declaration)" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Generate Asynchronous Delay Report" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Generate Clock Region Report" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Generate Constraints Interaction Report" xil_pn:value="true" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Generate Constraints Interaction Report Post Trace" xil_pn:value="true" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Generate Datasheet Section" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Generate Datasheet Section Post Trace" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Generate Detailed MAP Report" xil_pn:value="true" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Generate Multiple Hierarchical Netlist Files" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Generate Post-Place &amp; Route Power Report" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Generate Post-Place &amp; Route Simulation Model" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Generate RTL Schematic" xil_pn:value="Yes" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Generate SAIF File for Power Optimization/Estimation Par" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Generate Testbench File" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Generate Timegroups Section" xil_pn:value="true" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Generate Timegroups Section Post Trace" xil_pn:value="true" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Generics, Parameters" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Global Optimization Goal" xil_pn:value="AllClockNets" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Global Optimization map spartan6" xil_pn:value="Speed" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Global Set/Reset Port Name" xil_pn:value="GSR_PORT" xil_pn:valueState="default"/>
+    <property xil_pn:name="Global Tristate Port Name" xil_pn:value="GTS_PORT" xil_pn:valueState="default"/>
+    <property xil_pn:name="HDL Instantiation Template Target Language" xil_pn:value="VHDL" xil_pn:valueState="default"/>
+    <property xil_pn:name="Hierarchy Separator" xil_pn:value="/" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="ISim UUT Instance Name" xil_pn:value="Inst_spi_master_atlys_top" xil_pn:valueState="default"/>
+    <property xil_pn:name="Ignore User Timing Constraints Map" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Ignore User Timing Constraints Par" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Implementation Top" xil_pn:value="Architecture|gv_sha256|rtl" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Implementation Top File" xil_pn:value="gv_sha256.vhd" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Implementation Top Instance Path" xil_pn:value="/gv_sha256" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Include 'uselib Directive in Verilog File" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Include SIMPRIM Models in Verilog File" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Include UNISIM Models in Verilog File" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Include sdf_annotate task in Verilog File" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Incremental Compilation" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Insert Buffers to Prevent Pulse Swallowing" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Instantiation Template Target Language Xps" xil_pn:value="VHDL" xil_pn:valueState="default"/>
+    <property xil_pn:name="JTAG Pin TCK" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
+    <property xil_pn:name="JTAG Pin TDI" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
+    <property xil_pn:name="JTAG Pin TDO" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
+    <property xil_pn:name="JTAG Pin TMS" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
+    <property xil_pn:name="Keep Hierarchy" xil_pn:value="No" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="LUT Combining Map" xil_pn:value="Auto" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="LUT Combining Xst" xil_pn:value="Auto" xil_pn:valueState="default"/>
+    <property xil_pn:name="Language" xil_pn:value="VHDL" xil_pn:valueState="default"/>
+    <property xil_pn:name="Last Applied Goal" xil_pn:value="Timing Performance" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Last Applied Strategy" xil_pn:value="SmartXplorer - mapruntimect3;Z:/Dropbox/develop/fpga/spi_master_slave/trunk/syn/mapruntimect3.xds" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Last Unlock Status" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Launch SDK after Export" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Library for Verilog Sources" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Load glbl" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Manual Implementation Compile Order" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Map Slice Logic into Unused Block RAMs" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Mask Pins for Multi-Pin Wake-Up Suspend Mode spartan6" xil_pn:value="0x00" xil_pn:valueState="default"/>
+    <property xil_pn:name="Max Fanout" xil_pn:value="100000" xil_pn:valueState="default"/>
+    <property xil_pn:name="Maximum Compression" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Maximum Number of Lines in Report" xil_pn:value="1000" xil_pn:valueState="default"/>
+    <property xil_pn:name="Maximum Signal Name Length" xil_pn:value="20" xil_pn:valueState="default"/>
+    <property xil_pn:name="Move First Flip-Flop Stage" xil_pn:value="true" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Move Last Flip-Flop Stage" xil_pn:value="true" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="MultiBoot: Insert IPROG CMD in the Bitfile spartan6" xil_pn:value="Enable" xil_pn:valueState="default"/>
+    <property xil_pn:name="MultiBoot: Next Configuration Mode spartan6" xil_pn:value="001" xil_pn:valueState="default"/>
+    <property xil_pn:name="MultiBoot: Starting Address for Golden Configuration spartan6" xil_pn:value="0x00000000" xil_pn:valueState="default"/>
+    <property xil_pn:name="MultiBoot: Starting Address for Next Configuration spartan6" xil_pn:value="0x00000000" xil_pn:valueState="default"/>
+    <property xil_pn:name="MultiBoot: Use New Mode for Next Configuration spartan6" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="MultiBoot: User-Defined Register for Failsafe Scheme spartan6" xil_pn:value="0x0000" xil_pn:valueState="default"/>
+    <property xil_pn:name="Mux Extraction" xil_pn:value="Yes" xil_pn:valueState="default"/>
+    <property xil_pn:name="Netlist Hierarchy" xil_pn:value="As Optimized" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Netlist Translation Type" xil_pn:value="On" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Number of Clock Buffers" xil_pn:value="16" xil_pn:valueState="default"/>
+    <property xil_pn:name="Number of Paths in Error/Verbose Report" xil_pn:value="10" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Number of Paths in Error/Verbose Report Post Trace" xil_pn:value="10" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Optimization Effort" xil_pn:value="Normal" xil_pn:valueState="default"/>
+    <property xil_pn:name="Optimization Effort spartan6" xil_pn:value="High" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Optimization Goal" xil_pn:value="Speed" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Optimize Instantiated Primitives" xil_pn:value="true" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Other Bitgen Command Line Options spartan6" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Other Compiler Options" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Other Compiler Options Fit" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Other Compiler Options Map" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Other Compiler Options Par" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Other Compiler Options Translate" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Other Compxlib Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Other Map Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Other NETGEN Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Other Ngdbuild Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Other Place &amp; Route Command Line Options" xil_pn:value="" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Other Simulator Commands Behavioral" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Other Simulator Commands Post-Map" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Other Simulator Commands Post-Route" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Other Simulator Commands Post-Translate" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Other XPWR Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Other XST Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Output Extended Identifiers" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Output File Name" xil_pn:value="sha256_hash" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Overwrite Compiled Libraries" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Overwrite Existing Symbol" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Pack I/O Registers into IOBs" xil_pn:value="Auto" xil_pn:valueState="default"/>
+    <property xil_pn:name="Pack I/O Registers/Latches into IOBs" xil_pn:value="Off" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Package" xil_pn:value="csg324" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Perform Advanced Analysis" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Perform Advanced Analysis Post Trace" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Perform Timing-Driven Packing and Placement" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Place &amp; Route Effort Level (Overall)" xil_pn:value="High" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Place And Route Mode" xil_pn:value="Normal Place and Route" xil_pn:valueState="default"/>
+    <property xil_pn:name="Place MultiBoot Settings into Bitstream spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Placer Effort Level Map" xil_pn:value="High" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Placer Extra Effort Map" xil_pn:value="Continue on Impossible" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Port to be used" xil_pn:value="Auto - default" xil_pn:valueState="default"/>
+    <property xil_pn:name="Post Map Simulation Model Name" xil_pn:value="sha256_hash_map.vhd" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Post Place &amp; Route Simulation Model Name" xil_pn:value="sha256_hash_timesim.vhd" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Post Synthesis Simulation Model Name" xil_pn:value="sha256_hash_synthesis.vhd" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Post Translate Simulation Model Name" xil_pn:value="sha256_hash_translate.vhd" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Power Reduction Map spartan6" xil_pn:value="Off" xil_pn:valueState="default"/>
+    <property xil_pn:name="Power Reduction Par" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Power Reduction Xst" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Preferred Language" xil_pn:value="VHDL" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Produce Verbose Report" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Project Description" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Project Generator" xil_pn:value="ProjNav" xil_pn:valueState="default"/>
+    <property xil_pn:name="Property Specification in Project File" xil_pn:value="Store all values" xil_pn:valueState="default"/>
+    <property xil_pn:name="RAM Extraction" xil_pn:value="false" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="RAM Style" xil_pn:value="Auto" xil_pn:valueState="default"/>
+    <property xil_pn:name="ROM Extraction" xil_pn:value="false" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="ROM Style" xil_pn:value="Auto" xil_pn:valueState="default"/>
+    <property xil_pn:name="Read Cores" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Reduce Control Sets" xil_pn:value="Auto" xil_pn:valueState="default"/>
+    <property xil_pn:name="Regenerate Core" xil_pn:value="Under Current Project Setting" xil_pn:valueState="default"/>
+    <property xil_pn:name="Register Balancing" xil_pn:value="No" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Register Duplication Map" xil_pn:value="On" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Register Duplication Xst" xil_pn:value="false" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Register Ordering spartan6" xil_pn:value="Off" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Release Write Enable (Output Events)" xil_pn:value="Default (6)" xil_pn:valueState="default"/>
+    <property xil_pn:name="Rename Design Instance in Testbench File to" xil_pn:value="UUT" xil_pn:valueState="default"/>
+    <property xil_pn:name="Rename Top Level Architecture To" xil_pn:value="Structure" xil_pn:valueState="default"/>
+    <property xil_pn:name="Rename Top Level Entity to" xil_pn:value="sha256_hash" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Rename Top Level Module To" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Report Fastest Path(s) in Each Constraint" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Report Fastest Path(s) in Each Constraint Post Trace" xil_pn:value="true" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Report Paths by Endpoint" xil_pn:value="10" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Report Paths by Endpoint Post Trace" xil_pn:value="10" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Report Type" xil_pn:value="Verbose Report" xil_pn:valueState="default"/>
+    <property xil_pn:name="Report Type Post Trace" xil_pn:value="Verbose Report" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Report Unconstrained Paths" xil_pn:value="10" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Report Unconstrained Paths Post Trace" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Reset On Configuration Pulse Width" xil_pn:value="100" xil_pn:valueState="default"/>
+    <property xil_pn:name="Resource Sharing" xil_pn:value="false" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Retain Hierarchy" xil_pn:value="false" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Retry Configuration if CRC Error Occurs spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Run Design Rules Checker (DRC)" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Run for Specified Time" xil_pn:value="false" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Run for Specified Time Map" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Run for Specified Time Par" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Run for Specified Time Translate" xil_pn:value="false" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Safe Implementation" xil_pn:value="No" xil_pn:valueState="default"/>
+    <property xil_pn:name="Security" xil_pn:value="Enable Readback and Reconfiguration" xil_pn:valueState="default"/>
+    <property xil_pn:name="Selected Module Instance Name" xil_pn:value="/testbench" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Selected Simulation Root Source Node Behavioral" xil_pn:value="work.testbench" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Selected Simulation Root Source Node Post-Map" xil_pn:value="work.testbench" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Selected Simulation Root Source Node Post-Route" xil_pn:value="work.testbench" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Selected Simulation Root Source Node Post-Translate" xil_pn:value="work.testbench" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Selected Simulation Source Node" xil_pn:value="Inst_spi_master_atlys_top" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Set SPI Configuration Bus Width spartan6" xil_pn:value="1" xil_pn:valueState="default"/>
+    <property xil_pn:name="Setup External Master Clock Division spartan6" xil_pn:value="1" xil_pn:valueState="default"/>
+    <property xil_pn:name="Shift Register Extraction" xil_pn:value="true" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Shift Register Minimum Size spartan6" xil_pn:value="2" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Show All Models" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Simulation Model Target" xil_pn:value="VHDL" xil_pn:valueState="default"/>
+    <property xil_pn:name="Simulation Run Time ISim" xil_pn:value="30000 ns" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Simulation Run Time Map" xil_pn:value="1000 ns" xil_pn:valueState="default"/>
+    <property xil_pn:name="Simulation Run Time Par" xil_pn:value="12000 ns" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Simulation Run Time Translate" xil_pn:value="12 us" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Simulator" xil_pn:value="ISim (VHDL/Verilog)" xil_pn:valueState="default"/>
+    <property xil_pn:name="Slice Utilization Ratio" xil_pn:value="100" xil_pn:valueState="default"/>
+    <property xil_pn:name="Specify 'define Macro Name and Value" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Specify Top Level Instance Names Behavioral" xil_pn:value="work.testbench" xil_pn:valueState="default"/>
+    <property xil_pn:name="Specify Top Level Instance Names Post-Map" xil_pn:value="work.testbench" xil_pn:valueState="default"/>
+    <property xil_pn:name="Specify Top Level Instance Names Post-Route" xil_pn:value="work.testbench" xil_pn:valueState="default"/>
+    <property xil_pn:name="Specify Top Level Instance Names Post-Translate" xil_pn:value="work.testbench" xil_pn:valueState="default"/>
+    <property xil_pn:name="Speed Grade" xil_pn:value="-2" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Starting Placer Cost Table (1-100) Map spartan6" xil_pn:value="1" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Synthesis Tool" xil_pn:value="XST (VHDL/Verilog)" xil_pn:valueState="default"/>
+    <property xil_pn:name="Target Simulator" xil_pn:value="Please Specify" xil_pn:valueState="default"/>
+    <property xil_pn:name="Timing Mode Map" xil_pn:value="Performance Evaluation" xil_pn:valueState="default"/>
+    <property xil_pn:name="Timing Mode Par" xil_pn:value="Performance Evaluation" xil_pn:valueState="default"/>
+    <property xil_pn:name="Top-Level Module Name in Output Netlist" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Top-Level Source Type" xil_pn:value="HDL" xil_pn:valueState="default"/>
+    <property xil_pn:name="Trim Unconnected Signals" xil_pn:value="true" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Tristate On Configuration Pulse Width" xil_pn:value="0" xil_pn:valueState="default"/>
+    <property xil_pn:name="Unused IOB Pins" xil_pn:value="Pull Down" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use 64-bit PlanAhead on 64-bit Systems" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use Clock Enable" xil_pn:value="Yes" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Use Custom Project File Behavioral" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use Custom Project File Post-Map" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use Custom Project File Post-Route" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use Custom Project File Post-Translate" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use Custom Simulation Command File Behavioral" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use Custom Simulation Command File Map" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use Custom Simulation Command File Par" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use Custom Simulation Command File Translate" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use Custom Waveform Configuration File Behav" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use Custom Waveform Configuration File Map" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use Custom Waveform Configuration File Par" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use Custom Waveform Configuration File Translate" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use DSP Block spartan6" xil_pn:value="Auto" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use LOC Constraints" xil_pn:value="true" xil_pn:valueState="default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Use RLOC Constraints" xil_pn:value="Yes" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use Smart Guide" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Use Synchronous Reset" xil_pn:value="Yes" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Use Synchronous Set" xil_pn:value="Yes" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <property xil_pn:name="Use Synthesis Constraints File" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="User Browsed Strategy Files" xil_pn:value="Z:/Dropbox/develop/fpga/spi_master_slave/trunk/syn/mapruntimect3.xds" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="UserID Code (8 Digit Hexadecimal)" xil_pn:value="0xFFFFFFFF" xil_pn:valueState="default"/>
+    <property xil_pn:name="VCCAUX Voltage Level spartan6" xil_pn:value="2.5V" xil_pn:valueState="default"/>
+    <property xil_pn:name="VHDL Source Analysis Standard" xil_pn:value="VHDL-200X" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Value Range Check" xil_pn:value="false" xil_pn:valueState="default"/>
+    <property xil_pn:name="Verilog 2001 Xst" xil_pn:value="true" xil_pn:valueState="default"/>
+    <property xil_pn:name="Verilog Macros" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="Wait for DCM and PLL Lock (Output Events) spartan6" xil_pn:value="Default (NoWait)" xil_pn:valueState="default"/>
+    <property xil_pn:name="Wakeup Clock spartan6" xil_pn:value="Startup Clock" xil_pn:valueState="default"/>
+    <property xil_pn:name="Watchdog Timer Value spartan6" xil_pn:value="0xFFFF" xil_pn:valueState="default"/>
+    <property xil_pn:name="Working Directory" xil_pn:value="." xil_pn:valueState="non-default"/>
+    <property xil_pn:name="Write Timing Constraints" xil_pn:value="true" xil_pn:valueState="non-default" xil_pn:x_locked="true"/>
+    <!--                                                                                  -->
+    <!-- The following properties are for internal use only. These should not be modified.-->
+    <!--                                                                                  -->
+    <property xil_pn:name="PROP_BehavioralSimTop" xil_pn:value="Architecture|testbench|behavior" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="PROP_DesignName" xil_pn:value="spi_master_atlys" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="PROP_DevFamilyPMName" xil_pn:value="spartan6" xil_pn:valueState="default"/>
+    <property xil_pn:name="PROP_FPGAConfiguration" xil_pn:value="FPGAConfiguration" xil_pn:valueState="default"/>
+    <property xil_pn:name="PROP_PostFitSimTop" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="PROP_PostMapSimTop" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="PROP_PostParSimTop" xil_pn:value="Architecture|testbench|behavior" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="PROP_PostSynthSimTop" xil_pn:value="" xil_pn:valueState="default"/>
+    <property xil_pn:name="PROP_PostXlateSimTop" xil_pn:value="Architecture|testbench|behavior" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="PROP_PreSynthesis" xil_pn:value="PreSynthesis" xil_pn:valueState="default"/>
+    <property xil_pn:name="PROP_intProjectCreationTimestamp" xil_pn:value="2011-07-07T09:55:20" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="PROP_intWbtProjectID" xil_pn:value="2C5BE631B69F48AB8C2F24035AF7A13B" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="PROP_intWorkingDirLocWRTProjDir" xil_pn:value="Same" xil_pn:valueState="non-default"/>
+    <property xil_pn:name="PROP_intWorkingDirUsed" xil_pn:value="No" xil_pn:valueState="non-default"/>
+  </properties>
+
+  <bindings/>
+
+  <libraries/>
+
+</project>
diff --git a/verilog/rtl/opencore_hasher/sha256_Ki_rom.vhd b/verilog/rtl/opencore_hasher/sha256_Ki_rom.vhd
new file mode 100755
index 0000000..c984c12
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/sha256_Ki_rom.vhd
@@ -0,0 +1,84 @@
+-----------------------------------------------------------------------------------------------------------------------

+-- Author:          Jonny Doin, jdoin@opencores.org, jonnydoin@gmail.com, jonnydoin@gridvortex.com

+-- 

+-- Create Date:     09:56:30 05/06/2016  

+-- Module Name:     sha256_Ki_rom

+-- Project Name:    sha256 processor

+-- Target Devices:  Spartan-6

+-- Tool versions:   ISE 14.7

+-- Description: 

+--

+--      Initial values for the hash result registers.

+--      This module is modelled as a fixed value function.

+--      It can be implemented as a local constant fixed value.

+--

+------------------------------ COPYRIGHT NOTICE -----------------------------------------------------------------------

+--                                                                   
+--      This file is part of the SHA256 HASH CORE project http://opencores.org/project,sha256_hash_core
+--                                                                   
+--      Author(s):      Jonny Doin, jdoin@opencores.org, jonnydoin@gridvortex.com, jonnydoin@gmail.com
+--                                                                   
+--      Copyright (C) 2016 Jonny Doin
+--      -----------------------------
+--                                                                   
+--      This source file may be used and distributed without restriction provided that this copyright statement is not    
+--      removed from the file and that any derivative work contains the original copyright notice and the associated 
+--      disclaimer. 
+--                                                                   
+--      This source file is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser 
+--      General Public License as published by the Free Software Foundation; either version 2.1 of the License, or 
+--      (at your option) any later version.
+--                                                                   
+--      This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
+--      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more  
+--      details.
+--
+--      You should have received a copy of the GNU Lesser General Public License along with this source; if not, download 
+--      it from http://www.gnu.org/licenses/lgpl.txt
+--                                                                   
+------------------------------ REVISION HISTORY -----------------------------------------------------------------------

+--

+-- 2016/05/22   v0.01.0010  [JD]    started development. design of blocks and port interfaces.

+-- 2016/06/05   v0.01.0090  [JD]    all modules integrated. testbench for basic test vectors verification.

+-- 2016/06/05   v0.01.0095  [JD]    verification failed. misalignment of words in the datapath. 

+-- 2016/06/06   v0.01.0100  [JD]    first simulation verification against NIST-FIPS-180-4 test vectors passed.

+--

+-----------------------------------------------------------------------------------------------------------------------

+--  TODO

+--  ====

+--

+--

+-----------------------------------------------------------------------------------------------------------------------

+library ieee;

+use ieee.std_logic_1164.all;

+use ieee.numeric_std.all;

+

+entity sha256_ki_rom is

+    port (  

+        K0_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        K1_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        K2_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        K3_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        K4_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        K5_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        K6_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        K7_o : out std_logic_vector (31 downto 0) := (others => 'U')

+    );                      

+end sha256_ki_rom;

+

+architecture behavioral of sha256_ki_rom is

+begin

+    --=============================================================================================

+    -- CONSTANTS FOR Ki VALUES

+    --=============================================================================================

+    K0_o_proc:      K0_o <= x"6A09E667";

+    K1_o_proc:      K1_o <= x"BB67AE85";

+    K2_o_proc:      K2_o <= x"3C6EF372";

+    K3_o_proc:      K3_o <= x"A54FF53A";

+    K4_o_proc:      K4_o <= x"510E527F";

+    K5_o_proc:      K5_o <= x"9B05688C";

+    K6_o_proc:      K6_o <= x"1F83D9AB";

+    K7_o_proc:      K7_o <= x"5BE0CD19";

+

+end behavioral;

+

diff --git a/verilog/rtl/opencore_hasher/sha256_Kt_rom.vhd b/verilog/rtl/opencore_hasher/sha256_Kt_rom.vhd
new file mode 100755
index 0000000..985650e
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/sha256_Kt_rom.vhd
@@ -0,0 +1,152 @@
+-----------------------------------------------------------------------------------------------------------------------

+-- Author:          Jonny Doin, jdoin@opencores.org, jonnydoin@gmail.com, jonnydoin@gridvortex.com

+-- 

+-- Create Date:     09:56:30 05/06/2016  

+-- Module Name:     sha256_kt_rom - RTL

+-- Project Name:    sha256 processor

+-- Target Devices:  Spartan-6

+-- Tool versions:   ISE 14.7

+-- Description: 

+--

+--      This is the 64 words coefficients rom for the block hash core.

+--      It is modelled as an asynchronous addressable ROM memory.

+--      Depending on the fabrication process and technology, this memory can be implemented

+--      as a OTP, a MUX, a fixed LUT or a combinational function.

+--

+------------------------------ COPYRIGHT NOTICE -----------------------------------------------------------------------

+--                                                                   
+--      This file is part of the SHA256 HASH CORE project http://opencores.org/project,sha256_hash_core
+--                                                                   
+--      Author(s):      Jonny Doin, jdoin@opencores.org, jonnydoin@gridvortex.com, jonnydoin@gmail.com
+--                                                                   
+--      Copyright (C) 2016 Jonny Doin
+--      -----------------------------
+--                                                                   
+--      This source file may be used and distributed without restriction provided that this copyright statement is not    
+--      removed from the file and that any derivative work contains the original copyright notice and the associated 
+--      disclaimer. 
+--                                                                   
+--      This source file is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser 
+--      General Public License as published by the Free Software Foundation; either version 2.1 of the License, or 
+--      (at your option) any later version.
+--                                                                   
+--      This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
+--      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more  
+--      details.
+--
+--      You should have received a copy of the GNU Lesser General Public License along with this source; if not, download 
+--      it from http://www.gnu.org/licenses/lgpl.txt
+--                                                                   
+------------------------------ REVISION HISTORY -----------------------------------------------------------------------

+--

+-- 2016/05/22   v0.01.0010  [JD]    started development. design of blocks and port interfaces.

+-- 2016/06/05   v0.01.0090  [JD]    all modules integrated. testbench for basic test vectors verification.

+-- 2016/06/05   v0.01.0095  [JD]    verification failed. misalignment of words in the datapath. 

+-- 2016/06/06   v0.01.0100  [JD]    first simulation verification against NIST-FIPS-180-4 test vectors passed.

+--

+-----------------------------------------------------------------------------------------------------------------------

+--  TODO

+--  ====

+--

+--

+-----------------------------------------------------------------------------------------------------------------------

+

+

+library ieee;

+use ieee.std_logic_1164.all;

+use ieee.numeric_std.all;

+

+entity sha256_kt_rom is

+    port (  

+        addr_i : in std_logic_vector(5 downto 0) := (others => '0');    -- address of the Kt constant

+        dout_o : out std_logic_vector(31 downto 0)                      -- output delayed one clock

+    );                      

+end sha256_kt_rom;

+

+architecture behavioral of sha256_kt_rom is

+    signal addr : integer range 0 to 63;

+    signal next_rout : std_logic_vector (31 downto 0);

+begin

+    --=============================================================================================

+    -- COEFFICIENTS ROM

+    --=============================================================================================

+    -- The coefficients for the block hash are synthesized as an unregistered 64x32bit ROM.

+    

+    addr <= to_integer(unsigned(addr_i));

+    

+    -- The ROM is a 5-bit select MUX

+    next_rout <=    x"428a2f98" when addr =  0 else 

+                    x"71374491" when addr =  1 else

+                    x"b5c0fbcf" when addr =  2 else

+                    x"e9b5dba5" when addr =  3 else

+                    x"3956c25b" when addr =  4 else

+                    x"59f111f1" when addr =  5 else

+                    x"923f82a4" when addr =  6 else

+                    x"ab1c5ed5" when addr =  7 else

+                    x"d807aa98" when addr =  8 else

+                    x"12835b01" when addr =  9 else

+                    x"243185be" when addr = 10 else

+                    x"550c7dc3" when addr = 11 else

+                    x"72be5d74" when addr = 12 else

+                    x"80deb1fe" when addr = 13 else

+                    x"9bdc06a7" when addr = 14 else

+                    x"c19bf174" when addr = 15 else

+                    x"e49b69c1" when addr = 16 else

+                    x"efbe4786" when addr = 17 else

+                    x"0fc19dc6" when addr = 18 else

+                    x"240ca1cc" when addr = 19 else

+                    x"2de92c6f" when addr = 20 else

+                    x"4a7484aa" when addr = 21 else

+                    x"5cb0a9dc" when addr = 22 else

+                    x"76f988da" when addr = 23 else

+                    x"983e5152" when addr = 24 else

+                    x"a831c66d" when addr = 25 else

+                    x"b00327c8" when addr = 26 else

+                    x"bf597fc7" when addr = 27 else

+                    x"c6e00bf3" when addr = 28 else

+                    x"d5a79147" when addr = 29 else

+                    x"06ca6351" when addr = 30 else

+                    x"14292967" when addr = 31 else

+                    x"27b70a85" when addr = 32 else

+                    x"2e1b2138" when addr = 33 else

+                    x"4d2c6dfc" when addr = 34 else

+                    x"53380d13" when addr = 35 else

+                    x"650a7354" when addr = 36 else

+                    x"766a0abb" when addr = 37 else

+                    x"81c2c92e" when addr = 38 else

+                    x"92722c85" when addr = 39 else

+                    x"a2bfe8a1" when addr = 40 else

+                    x"a81a664b" when addr = 41 else

+                    x"c24b8b70" when addr = 42 else

+                    x"c76c51a3" when addr = 43 else

+                    x"d192e819" when addr = 44 else

+                    x"d6990624" when addr = 45 else

+                    x"f40e3585" when addr = 46 else

+                    x"106aa070" when addr = 47 else

+                    x"19a4c116" when addr = 48 else

+                    x"1e376c08" when addr = 49 else

+                    x"2748774c" when addr = 50 else

+                    x"34b0bcb5" when addr = 51 else

+                    x"391c0cb3" when addr = 52 else

+                    x"4ed8aa4a" when addr = 53 else

+                    x"5b9cca4f" when addr = 54 else

+                    x"682e6ff3" when addr = 55 else

+                    x"748f82ee" when addr = 56 else

+                    x"78a5636f" when addr = 57 else

+                    x"84c87814" when addr = 58 else

+                    x"8cc70208" when addr = 59 else

+                    x"90befffa" when addr = 60 else

+                    x"a4506ceb" when addr = 61 else

+                    x"bef9a3f7" when addr = 62 else

+                    x"c67178f2";            

+                                            

+    --=============================================================================================

+    -- OUTPUT LOGIC                         

+    --=============================================================================================

+    -- connect output port                  

+                                            

+    dout_o_proc:    dout_o <= next_rout;

+    

+end behavioral;

+

+

diff --git a/verilog/rtl/opencore_hasher/sha256_control.vhd b/verilog/rtl/opencore_hasher/sha256_control.vhd
new file mode 100755
index 0000000..ffdc428
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/sha256_control.vhd
@@ -0,0 +1,651 @@
+-----------------------------------------------------------------------------------------------------------------------

+-- Author:          Jonny Doin, jdoin@opencores.org, jonnydoin@gmail.com, jonnydoin@gridvortex.com

+-- 

+-- Create Date:     09:56:30 05/06/2016  

+-- Module Name:     sha256_control - RTL

+-- Project Name:    sha256 hash engine

+-- Target Devices:  Spartan-6

+-- Tool versions:   ISE 14.7

+-- Description: 

+--

+--      This is the control path logic for the GV_SHA256 fast engine.

+--

+--      It is a fully synchronous design, with all signals synchronous to the rising edge of the system clock.

+--      The sequencer state machine controls the hash datapath modules, generating addresses for the coefficients ROM, load/enable signals for the 

+--      message schedule, hash core and output registers circuit blocks, and control signals for the input padding logic.

+--

+--      The SHA256 hash core follows the FIPS-180-4 logic description for the SHA-256 algorithm, optimized as a single-cycle per iteration engine. 

+--                                                                                              

+--      This implementation follows the implementation guidelines of the NIST Cryptographic Toolkit, and the NIST Approved Algorithms notes. 

+--

+--      RELEVANT NIST PUBLICATIONS

+--      Link to Document                                                               | Description

+--      ------------------------------------------------------------------------------ | ---------------------------------------------------------

+--      http://csrc.nist.gov/publications/fips/fips140-2/fips1402.pdf                  | SECURITY REQUIREMENTS FOR CRYPTOGRAPHIC MODULES           

+--      http://csrc.nist.gov/groups/ST/toolkit/index.html                              | NIST CRYPTOGRAPHIC TOOLKIT                                

+--      http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf                      | Secure Hash Standard (SHS) SHA-256                        

+--      http://csrc.nist.gov/publications/fips/fips198-1/FIPS-198-1_final.pdf          | The Keyed-Hash Message Authentication Code (HMAC)         

+--      http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA256.pdf           | SHA-256 verification test vectors                         

+--      http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA2_Additional.pdf  | Additional SHA-256 corner case verification test vectors  

+--                                                                                             

+--      RELEVANT RFCs

+--      Link to PDF document                       | Description

+--      ------------------------------------------ | ---------------------------------------------------------

+--      https://tools.ietf.org/pdf/rfc2104.pdf     | RFC2104 - HMAC: Keyed-Hashing for Message Authentication

+--      https://tools.ietf.org/pdf/rfc4231.pdf     | RFC4231 - Identifiers and Test Vectors for HMAC-SHA-256

+--      https://tools.ietf.org/pdf/rfc4868.pdf     | RFC4868 - Using HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512 with IPsec

+---------------------------------------------------------------------------------------------------------------------------------------------------------------

+--      SHA256 ENGINE

+--      =============

+--

+--      The setup of all circuit blocks is performed in a single extra clock cycle, besides the 64 steps needed to compute a hash block operation, 

+--      resulting in a 65-cycle per block hash computation processor. Heavy pipelining is implemented to suppress control path operations logic steps. 

+--      The engine is internally implemented as a 256-bit machine, with all combinational operations performed as a single-cycle operation on each

+--      64 steps of the hash algorithm. Wide transfers of 256-bit data are also performed as single-cycle operations. 

+--

+--      The data input accepts 16 consecutive 32bit words for a total of 64 bytes per block, one word per clock cycle. The input signal 'wr_i' can be

+--      used as a flow control input to hold the processor to wait for slower data.

+--

+--      A hash computation starts with a 'start_i' pulse that resets the processor. A pulse of the 'end_i' signal marks the last input data word. The

+--      core will pad the last block according to the SHA256 rules, and present the results of the hash computation at the output registers, raising the

+--      'data_valid' signal to mark the end of the computation. The hash results are available at the 256-bit output port.

+--

+--      The following waveforms describe the detailed operation for message start, update and end, with internal signals and FSM states. 

+--

+--      BEGIN BLOCK (1st block) - showing lookahead Wt and Kt

+--      ======================

+--

+--      The hash operation starts with a 'start' sync pulse, which causes the RESET of the processor. The processor comes out of RESET only after 'start' is

+--      released. 

+--      The DATA_INPUT state is signalled by the data request signal 'di_req' going HIGH. The processor will latch 16 words from the 'di' port, at every 

+--      rising edge of the system clock. At the end of the block input, the 'di_req' signal goes LOW. 

+--      The input data can be held by bringing the 'ack' input LOW. When the 'ack' input is held LOW, it includes a wait state in the whole processor, to

+--      cope with slow inputs or to allow periodic fetches of input data from multiple data sources. 

+--

+--      STATE              |reset| data                                    |wait |                                                     | process                  

+--                    __   |__   |__    __    __    __    __    __    __   |__   |__    __    __    __    __    __    __    __    __   |__    __    __ 

+--      clk_i      __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \...     -- system clock

+--                        _____                                                                                                                                      

+--      start_i    ______/   \_\_______________________________________________________________________________________________________________________...     -- 'start_i' resets the processor and starts a new hash

+--                                                                                                                                                       

+--      end_i      ____________________________________________________________________________________________________________________________________...     -- 'end_i' marks end of last block data input

+--                 __ _ _ _       _____________________________________________________________________________________________________                  

+--      di_req_o   __ _ _ _\_____/                                                                                                     \_______________...     -- 'di_req_o' asserted during data input

+--                            ___________________________________________       _________________________________________________________                

+--      wr_i       __________/____/                                      \_____/                                                         \_____________...     -- 'wr_i' can hold the core for slow data

+--                 __________ _________ _____ _____ _____ _____ _____ ___________ _____ _____ _____ _____ _____ _____ _____ _____ ______ ______________...

+--      di_i       __________\___\_W0__\__W1_\__W2_\__W3_\__W4_\__W5_\\\\\\\__W6_\__W7_\__W8_\__W9_\_W10_\_W11_\_W12_\_W13_\_W14_\_W15__\______X_______...     -- user words on 'di_i' are latched on 'clk_i' rising edge

+--                 ____________________ _____ _____ _____ _____ _____ ___________ _____ _____ _____ _____ _____ _____ _____ _____ _____________________...

+--      st_cnt_reg ________/__0__/__0__/__1__/__2__/__3__/__4__/__5__/___6_______/__7__/__8__/__9__/__10_/__11_/__12_/__13_/__14_/__15_/__16_/__17_/_18...     -- internal state counter value

+--                 __________ ___ _____ _____ _____ _____ _____ _____ ___________ _____ _____ _____ _____ _____ _____ _____ _____ _____________________...

+--      Wt_i@core  __________\___\__W0_\__W1_\__W2_\__W3_\__W4_\__W5_\\\\\\\__W6_\__W7_\__W8_\__W9_\_W10_\_W11_\_W12_\_W13_\_W14_\_W15_________________...     -- msg scheduler lookahead output for Wt_i at core

+--                 ______________ _____ _____ _____ _____ _____ _____ ___________ _____ _____ _____ _____ _____ _____ _____ _____ _____________________...

+--      Kt_i@core  ______________/__K0_/__K1_/__K2_/__K3_/__K4_/__K5_/__K6_______/__K7_/__K8_/__K9_/_K10_/_K11_/_K12_/_K13_/_K14_/_K15_________________...     -- Kt rom synchronous with scheduler for Kt_i at core

+--                 __ _ _ _                                                                                                                                            

+--      error_o    __ _ _ _\___________________________________________________________________________________________________________________________...     -- 'start_i' clears any error condition

+--                 __ _ _ _                                                                                                                                            

+--      do_valid_o __ _ _ _\___________________________________________________________________________________________________________________________...     -- 'start_i' invalidates any previous results

+--

+--

+--      UPDATE BLOCK (preload)

+--      =====================

+--

+--      At the start of each block, the 'di_req' signal is raised to request new data.

+--

+--      STATE       ... process  |next | data                                    |wait |                                                     | process                    

+--                    __    __    __    __    __    __    __    __    __    __   |__   |__    __    __    __    __    __    __    __    __    __ 

+--      clk_i      __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \...        -- system clock

+--                                                                                                                                                  

+--      end_i      ______________________________________________________________________________________________________________________________...        -- 'end_i' marks end of last block data input

+--                                      _____________________________________________________________________________________________________       

+--      di_req_o   ____________________/                                                                                                     \___...        -- 'di_req_o' asserted during data input

+--                          ___________________________________________________       _________________________________________________________     

+--      wr_i       ________/__________/                                        \_____/                                                         \_...        -- 'wr_i' can hold the core for slow data

+--                 _________________ _ ______ _____ _____ _____ _____ _____ ___________ _____ _____ _____ _____ _____ _____ _____ _____ _____ ____...

+--      di_i       _________________\\\___W0_\__W1_\__W2_\__W3_\__W4_\__W5_\\\\\\\\_W6_\__W7_\__W8_\__W9_\_W10_\_W11_\_W12_\_W13_\_W14_\_W15_\\_X_...       -- user words on 'di_i' are latched on 'clk_i' rising edge

+--                 

+--

+--      UPDATE BLOCK (delayed start)

+--      ===========================

+--

+--      The data for the new block can be delayed, by keeping the 'ack' signal low until the data is present at the data input port. 

+--

+--      STATE      ..|next | data                                                                  |wait |                                         | process                    

+--                    __    __    __    __    __    __    __    __    __    __    __    __    __   |__   |__    __    __    __    __    __    __    __ 

+--      clk_i      __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \...     -- system clock

+--                                                                                                                                                       

+--      end_i      ____________________________________________________________________________________________________________________________________...     -- 'end_i' marks end of last block data input

+--                          _______ _ _ ___________________________________________________________________________________________________________      

+--      di_req_o   ________/                                                                                                                       \___...     -- 'di_req_o' asserted during data input

+--                                             __________________________________________________       _____________________________________________    

+--      wr_i       ________________ _ _ ______/                                                  \_____/                                             \_...     -- 'wr_i' valid on rising edge of 'clk_i'

+--                 ________________ _ _ ___________ _____ _____ _____ _____ _____ _____ _____ ___________ _____ _____ _____ _____ _____ _____ _____ ____...

+--      di_i       ________________ _ _ ______\_W0_\__W1_\__W2_\__W3_\__W4_\__W5_\__W6_\__W7_\\\\\\\__W8_\__W9_\_W10_\_W11_\_W12_\_W13_\_W14_\_W15_\\_Z_...     -- user words on 'di_i' are latched on 'clk_i' rising edge

+--                 

+--

+--      END BLOCK (success)

+--      ==================

+--

+--      At the end of the last block the signal 'end' must be raised for at least one clock cycle. 

+--      The 'bytes' input marks the number of valid bytes in the last word. 

+--      A PADDING state completes the last data block and a BLK_PROCESS finishes the hash computation.

+--      The 'do_valid' remains HIGH until the next RESET.

+--

+--      STATE      ..|next | data                              | padding         | process                     |next | valid     |reset| data     

+--                    __    __    __    __    __    __    __    __    __          __    __    __          __    __    __    __    __    __    __  

+--      clk_i      __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \_ _ _ __/  \__/  \__/  \_ _ _ __/  \__/  \__/  \__/  \__/  \__/  \__/  \_...     -- system clock

+--                                                                                                                              ______                    

+--      start_i    ____________________________________________________________________________________________________________/   \__\___________...     -- 'start_i' resets the processor and starts a new hash

+--                                                           ______                                                                               

+--      end_i      _________________________________________/      \______ _ _ ___________________ _ _ ___________________________________________...     -- 'end_i' marks end of last block data input

+--                          ___________________________________                                                                         __________  

+--      di_req_o   ________/                                   \__________ _ _ ___________________ _ _ ________________________________/          ...     -- 'di_req_o' asserted during data input

+--                           ______________________________________                                                                      _________  

+--      wr_i       _________/                                    \\\______ _ _ ___________________ _ _ _________________________________/         ...     -- 'wr_i' can hold the core for slow data

+--                 ______________ _____ _____ _____ _____ _____ __________ _ _ ___________________ _ _ ______________________________________ ____...

+--      di_i       _________\_W0_\__W1_\__W2_\__W3_\__W4_\__W5_\__________ _ _ ___________________ _ _ _________________________________\_W0_\__W1...     -- words after the end_i assertion are ignored

+--                 __ _____ _____ _____ _____ _____ _____ _____ _____ ____ _ ____ _____ _____ ____ _ _ ______________________________________ ____

+--      st_cnt_reg __/_64__/__0__/__1__/__2__/__3__/__4__/__5__/__6__/__7_ _ _15_/__16_/__17_/__18 _ _ __/__63_/__64_/______0__________/__0__/__1_...     -- internal state counter value

+--                          _____ _____ _____ _____ _____ _____                                                                         _____ ____

+--      bytes_i    --------<__0__\__0__\__0__\__0__\__0__\__3__>-----------------------------------------------------------------------<__0__\__0_...     -- bytes_i mark number of valid bytes in each word

+--                                                                                                                                                   

+--      error_o    _______________________________________________________ _ _ ___________________ _ _ ___________________________________________...     -- 'error_o' goes high on an invalid computation

+--                                                                                                                    ___________                 

+--      do_valid_o _______________________________________________________ _ _ ___________________ _ _ ______________/           \________________...     -- 'do_valid_o' goes high at the end of a computation

+--                                                                                                                    ___________                 

+--      H0_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H0______\________________...     -- H0 holds the bytes 0..3 of the output

+--                                                                                                                    ___________                                 

+--      H1_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H1______\________________...     -- H1 holds the bytes 4..7 of the output

+--                                                                                                                    ___________                            

+--      H2_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H2______\________________...     -- H2 holds the bytes 8..11 of the output

+--                                                                                                                    ___________                            

+--      H3_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H3______\________________...     -- H3 holds the bytes 12..15 of the output

+--                                                                                                                    ___________                            

+--      H4_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H4______\________________...     -- H4 holds the bytes 16..19 of the output

+--                                                                                                                    ___________                            

+--      H5_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H5______\________________...     -- H5 holds the bytes 20..23 of the output

+--                                                                                                                    ___________                            

+--      H6_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H6______\________________...     -- H6 holds the bytes 24..27 of the output

+--                                                                                                                    ___________                            

+--      H7_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H7______\________________...     -- H7 holds the bytes 28..31 of the output

+--

+--

+--      END BLOCK (full last block)

+--      ==================

+--

+--      If the last block has exactly 16 full words, the controller starts the block processing in the PADDING cycle, processes the input block, 

+--      and inserts a last PADDING block followed by a last BLK_PROCESS block.

+--

+--      STATE      ... data         |pad  | process   |next | pad                   | process   |next | valid     |reset| data

+--                 __    __    __   |__   |__         |__   |__    __          __   |__         |__   |__    __   |__   |__    __     

+--      clk_i        \__/  \__/  \__/  \__/  \_ _ _ __/  \__/  \__/  \_ _ _ __/  \__/  \_ _ _ __/  \__/  \__/  \__/  \__/  \__/  \_...     -- system clock

+--                                                                                                               ______                  

+--      start_i    ____________________________ _ _ ____________________________________________________________/   \__\___________...     -- 'start_i' resets the processor and starts a new hash

+--                              _____                                                                                                         

+--      end_i      ____________/     \_________ _ _ ___________________ _ _ _____________ _ _ _____________________________________...     -- 'end_i' marks end of last block data input

+--                 _________________                                                                                     __________  

+--      di_req_o                    \__________ _ _ ___________________ _ _ _____________ _ _ __________________________/          ...     -- 'di_req_o' asserted on rising edge of 'clk_i'

+--                 ____________________                                                                                   _________  

+--      wr_i                         \\\_______ _ _ ___________________ _ _ _____________ _ _ ___________________________/         ...     -- 'wr_i' valid on rising edge of 'clk_i'

+--                 _____ _____ _____ __________ _ _ ___________________ _ _ _____________ _ _ ________________________________ ____...

+--      di_i       _W13_\_W14_\_W15_\__________ _ _ ___________________ _ _ _____________ _ _ ___________________________\_W0_\__W1...     -- words after the end_i assertion are ignored

+--                 _____ _____ _____ _____ ____ _ ____ _____ _____ ____ _ _ ________ ____ _ ____ _____ _______________________ ____

+--      st_cnt_reg _13__/_14__/_15__/_16__/_17_ _ _63_/__64_/__0__/__1_ _ _ __/_15__/_16_ _ _63_/__64_/_____0_____/__0__/__0__/__1_...     -- internal state counter value

+--                 _____ _____ _____                                                                                     _____ ____

+--      bytes_i    __0__/__0__/__0__>-----------------------------------------------------------------------------------<__0__/__0_...     -- bytes_i mark number of valid bytes in each word

+--                                                                                                     ___________                 

+--      do_valid_o ____________________________ _ _ ___________________ _ _ __________________________/           \________________...     -- 'do_valid_o' goes high at the end of a computation

+--

+--

+------------------------------ COPYRIGHT NOTICE -----------------------------------------------------------------------

+--                                                                   

+--      This file is part of the SHA256 HASH CORE project http://opencores.org/project,sha256_hash_core

+--                                                                   

+--      Author(s):      Jonny Doin, jdoin@opencores.org, jonnydoin@gridvortex.com, jonnydoin@gmail.com

+--                                                                   

+--      Copyright (C) 2016 Jonny Doin

+--      -----------------------------

+--                                                                   

+--      This source file may be used and distributed without restriction provided that this copyright statement is not    

+--      removed from the file and that any derivative work contains the original copyright notice and the associated 

+--      disclaimer. 

+--                                                                   

+--      This source file is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser 

+--      General Public License as published by the Free Software Foundation; either version 2.1 of the License, or 

+--      (at your option) any later version.

+--                                                                   

+--      This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied

+--      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more  

+--      details.

+--

+--      You should have received a copy of the GNU Lesser General Public License along with this source; if not, download 

+--      it from http://www.gnu.org/licenses/lgpl.txt

+--                                                                   

+------------------------------ REVISION HISTORY -----------------------------------------------------------------------

+--

+-- 2016/05/22   v0.01.0010  [JD]    started development. design of blocks and port interfaces.

+-- 2016/06/05   v0.01.0090  [JD]    all modules integrated. testbench for basic test vectors verification.

+-- 2016/06/05   v0.01.0095  [JD]    verification failed. misalignment of words in the datapath. 

+-- 2016/06/06   v0.01.0100  [JD]    first simulation verification against NIST-FIPS-180-4 test vectors "abc" passed.

+-- 2016/06/07   v0.01.0101  [JD]    failed 2-block test for "abcdbcdecd..." vector. Fixed padding control logic.

+-- 2016/06/07   v0.01.0105  [JD]    verification against all NIST-FIPS-180-4 test vectors passed.

+-- 2016/06/11   v0.01.0105  [JD]    verification against NIST-SHA2_Additional test vectors #1 to #10 passed.

+-- 2016/06/11   v0.01.0110  [JD]    optimized controller states, reduced 2 clocks per block. 

+-- 2016/06/18   v0.01.0120  [JD]    implemented error detection on 'bytes_i' input.

+-- 2016/07/06   v0.01.0210  [JD]    optimized suspend logic on 'sch_ld' to supress possible glitch in 'pad_one_next'.

+-- 2016/09/25   v0.01.0220  [JD]    changed 'ack_i' name to 'wr_i', and changed semantics to 'data write'.

+-- 2016/10/01   v0.01.0250  [JD]    optimized the last null-padding state, making the algorithm isochronous for full last data blocks. 

+-- 2016/10/01   v0.01.0260  [JD]    eliminated bytes error register, streamlined error logic.

+--

+-----------------------------------------------------------------------------------------------------------------------

+--  TODO

+--  ====

+--

+--

+-----------------------------------------------------------------------------------------------------------------------

+library ieee;

+use ieee.std_logic_1164.all;

+use ieee.numeric_std.all;

+

+entity sha256_control is

+    port (  

+        -- inputs

+        clk_i : in std_logic := 'U';                                    -- system clock

+        ce_i : in std_logic := 'U';                                     -- core clock enable

+        start_i : in std_logic := 'U';                                  -- reset the processor and start a new hash

+        end_i : in std_logic := 'U';                                    -- marks end of last block data input

+        wr_i  : in std_logic := 'U';                                    -- input word write/hold control

+        bytes_i : in std_logic_vector (1 downto 0) := (others => 'U');  -- valid bytes in input word

+        error_i : in std_logic := 'U';                                  -- datapath error input from other modules

+        -- output control signals

+        bitlen_o : out std_logic_vector (63 downto 0);                  -- message bit length

+        words_sel_o : out std_logic_vector (1 downto 0);                -- bitlen insertion control

+        Kt_addr_o : out std_logic_vector (5 downto 0);                  -- address for the Kt coefficients ROM

+        sch_ld_o : out std_logic;                                       -- load/recirculate words for message scheduler

+        core_ld_o : out std_logic;                                      -- load all registers for hash core

+        oregs_ld_o : out std_logic;                                     -- load output registers

+        sch_ce_o : out std_logic;                                       -- clock enable for message scheduler logic block

+        core_ce_o : out std_logic;                                      -- clock enable for hash core logic block

+        oregs_ce_o : out std_logic;                                     -- clock enable for output regs logic block

+        bytes_ena_o : out std_logic_vector (3 downto 0);                -- byte lane selectors for padding logic block

+        one_insert_o : out std_logic;                                   -- insert leading '1' in the padding

+        di_req_o : out std_logic;                                       -- external data request by the 'di_i' port

+        data_valid_o : out std_logic;                                   -- operation finished. output data is valid

+        error_o : out std_logic                                         -- operation aborted. output data is not valid

+    );                      

+end sha256_control;

+

+architecture rtl of sha256_control is

+    --=============================================================================================

+    -- Type definitions

+    --=============================================================================================

+    -- controller states

+    type hash_toplevel_control is 

+            (   st_reset,                   -- core reset, initial state

+                st_sha_data_input,          -- sha data input

+                st_sha_blk_process,         -- sha block process

+                st_sha_blk_nxt,             -- sha block next

+                st_sha_padding,             -- sha padding    

+                st_sha_data_valid,          -- sha data valid

+                st_error                    -- fsm locks on error, exit only by reset

+            );

+

+    --=============================================================================================

+    -- Signals for state machine control

+    --=============================================================================================

+    signal hash_control_st_reg  : hash_toplevel_control := st_reset;

+    signal hash_control_st_next : hash_toplevel_control := st_reset;

+  

+    --=============================================================================================

+    -- Signals for internal operation

+    --=============================================================================================

+    -- combinational flags: message data input / padding control / block internal process selection

+    signal reset : std_logic;

+    signal sha_reset : std_logic;

+    signal sha_init : std_logic;

+    signal wait_run_ce : std_logic;

+    -- registered flags: last block, padding control

+    signal sha_last_blk_reg : std_logic;

+    signal sha_last_blk_next : std_logic;

+    signal padding_reg : std_logic;

+    signal padding_next : std_logic;

+    signal pad_one_reg : std_logic;

+    signal pad_one_next : std_logic;

+    -- 64 bit message bit counter

+    signal msg_bit_cnt_reg : unsigned (63 downto 0);

+    signal msg_bit_cnt_next : unsigned (63 downto 0);

+    signal bits_to_add : unsigned (5 downto 0);

+    signal msg_bit_cnt_ce : std_logic;

+    -- sequencer state counter

+    signal st_cnt_reg : unsigned (6 downto 0);

+    signal st_cnt_next : unsigned (6 downto 0);

+    signal st_cnt_ce : std_logic;

+    signal st_cnt_clr : std_logic;

+    

+    --=============================================================================================

+    -- Output Control Signals

+    --=============================================================================================

+    -- unregistered control signals

+    signal words_sel : std_logic_vector (1 downto 0);   -- bitlen insertion control

+    signal sch_ld : std_logic;                          -- input data load into message scheduler control

+    signal core_ld : std_logic;                         -- hash core load data registers control

+    signal oregs_ld : std_logic;                        -- load initial value into output regs control

+    signal sch_ce : std_logic;                          -- clock enable for message scheduler logic block

+    signal core_ce : std_logic;                         -- clock enable for hash core logic block

+    signal oregs_ce : std_logic;                        -- clock enable for output regs logic block

+    signal bytes_ena : std_logic_vector (3 downto 0);   -- byte lane selectors for padding logic block

+    signal one_insert : std_logic;                      -- insert leading one in the padding

+    signal di_req : std_logic;                          -- data request

+    signal di_wr_window : std_logic;                    -- valid data write window    

+    signal data_valid : std_logic;                      -- operation finished. output data is valid

+    signal data_input_error : std_logic;                -- data write outside write valid window

+    signal bytes_error : std_logic;                     -- bytes selection error

+    signal error_lock : std_logic;                      -- error state lock

+    signal core_error : std_logic;                      -- operation aborted. output data is not valid

+    

+begin

+    --=============================================================================================

+    --  REGISTER TRANSFER PROCESSES

+    --=============================================================================================

+    -- control fsm register transfer logic

+    control_fsm_proc: process (clk_i) is

+    begin

+        -- FSM state register: sync RESET on 'reset', and sync PRESET on error_i

+        if clk_i'event and clk_i = '1' then

+            if reset = '1' then

+                -- all registered values are reset on master clear

+                hash_control_st_reg <= st_reset;

+            elsif core_error = '1' then

+                -- error latch: lock on the error state

+                hash_control_st_reg <= st_error;

+            elsif ce_i = '1' then

+                -- all registered values are held on master clock enable

+                hash_control_st_reg <= hash_control_st_next;

+            end if;

+        end if;

+        -- SHA256 registers, RESET on 'sha_init'

+        if clk_i'event and clk_i = '1' then

+            if sha_init = '1' then

+                -- all SHA256 registered values are reset on SHA master clear

+                sha_last_blk_reg <= '0';

+                padding_reg <= '0';

+            elsif ce_i = '1' then

+                -- all registered values are held on master clock enable

+                sha_last_blk_reg <= sha_last_blk_next;

+                padding_reg <= padding_next;

+            end if;

+        end if;

+    end process control_fsm_proc;

+

+    -- bit counter register transfer logic

+    bit_counter_proc: process (clk_i) is

+    begin

+        -- bit counter

+        if clk_i'event and clk_i = '1' then

+            if sha_init = '1' then

+                msg_bit_cnt_reg <= (others => '0');

+            elsif ce_i = '1' and msg_bit_cnt_ce = '1' then

+                msg_bit_cnt_reg <= msg_bit_cnt_next;

+            end if;

+        end if;

+    end process bit_counter_proc;

+

+    -- state counter register transfer process

+    state_counter_proc: process (clk_i) is

+    begin

+        -- core state counter

+        if clk_i'event and clk_i = '1' then

+            if (sha_init = '1') or (st_cnt_clr = '1') then

+                st_cnt_reg <= (others => '0');

+            elsif (ce_i = '1') and (st_cnt_ce = '1') then

+                st_cnt_reg <= st_cnt_next;

+            end if;

+        end if;

+    end process state_counter_proc;

+    

+    -- one-padding register transfer logic

+    pad_one_fsm_proc: process (clk_i) is

+    begin

+        if clk_i'event and clk_i = '1' then

+            if sha_init = '1' then

+                -- all registered values are reset on master clear

+                pad_one_reg <= '1';

+            elsif (ce_i = '1') and (sch_ce = '1') then

+                -- one-padding register is clocked synchronous with the message schedule

+                pad_one_reg <= pad_one_next;

+            end if;

+        end if;

+    end process pad_one_fsm_proc;

+

+    --=============================================================================================

+    --  COMBINATIONAL NEXT-STATE LOGIC

+    --=============================================================================================

+    -- State and control path combinational logic

+    -- The hash_control_st_reg state register controls the SHA256 algorithm.

+    control_combi_proc : process (  hash_control_st_reg, sha_last_blk_reg, padding_reg, wait_run_ce, 

+                                    end_i, st_cnt_reg, sha_last_blk_next, one_insert, sha_reset ) is

+    begin

+        -- default logic that applies to all states at each fsm clock --

+

+        -- assign default values to all unchanging combinational outputs (avoid latches)

+        hash_control_st_next <= hash_control_st_reg;

+        sha_last_blk_next <= sha_last_blk_reg;

+        padding_next <= padding_reg;

+        -- handshaking

+        sha_init <= '0';

+        error_lock <= '0';

+        di_wr_window <= '0';        

+        words_sel <= b"00";

+        data_valid <= '0';

+        di_req <= '0';              -- data request only during data input

+        -- state counter

+        st_cnt_clr <= '0';          -- only clear the state counter at the beginning of each block

+        st_cnt_ce <= '0';

+        -- message scheduler

+        sch_ld <= '1';              -- enable pass-thru input through message schedule

+        sch_ce <= '0';              -- stop message schedule clock

+        -- hash core

+        core_ld <= '0';             -- enable internal hash core logic

+        core_ce <= '0';             -- core computation enabled only for data input and processing

+        -- output registers

+        oregs_ld <= '0';            -- defaults for accumulate blk hash

+        oregs_ce <= '0';            -- only register init values and end of computation

+        case hash_control_st_reg is

+        

+            when st_reset =>                -- master reset: starts a new hash/hmac processing

+                -- moore outputs

+                sha_init <= '1';            -- reset SHA256 engine

+                oregs_ld <= '1';            -- load initial hash values

+                oregs_ce <= '1';            -- latch initial hash values into output registers

+                core_ld <= '1';             -- load initial value into core registers

+                core_ce <= '1';             -- latch initial value into core registers

+                st_cnt_clr <= '1';          -- reset state counter

+                di_wr_window <= '1';        -- enable data write window                

+                -- next state

+                hash_control_st_next <= st_sha_data_input;

+

+            when st_sha_data_input =>       -- message data words are clocked into the processor

+                -- moore outputs

+                di_req <= '1';              -- request message data

+                di_wr_window <= '1';        -- enable data write window                

+                sch_ce <= wait_run_ce;      -- hold the message scheduler with data hold

+                st_cnt_ce <= wait_run_ce;   -- hold state count with data hold

+                core_ce <= wait_run_ce;     -- hold processing clock with data hold

+                -- next state

+                if wait_run_ce = '1' then

+                    if end_i = '1' then 

+                        hash_control_st_next <= st_sha_padding;     -- pad incomplete blocks

+                    elsif st_cnt_reg = 15 then

+                        hash_control_st_next <= st_sha_blk_process; -- process one more block

+                    end if;

+                end if;

+

+            when st_sha_blk_process =>      -- internal block hash processing

+                -- moore outputs

+                st_cnt_ce <= '1';           -- enable state counter

+                sch_ld <= '0';              -- recirculate scheduler data

+                sch_ce <= '1';              -- enable message scheduler clock

+                core_ce <= '1';             -- enable processing clock

+                -- next state

+                if st_cnt_reg = 63 then

+                    hash_control_st_next <= st_sha_blk_nxt;

+                end if;

+

+            when st_sha_blk_nxt =>          -- prepare for next block

+                -- moore outputs

+                st_cnt_clr <= '1';          -- reset state counter at the beginning of each block

+                sch_ce <= '0';              -- stop the message schedule

+                core_ld <= '1';             -- load result value into core registers

+                core_ce <= '1';             -- latch result value into core registers

+                oregs_ce <= '1';            -- latch core result into regs accumulator

+                -- next state

+                if sha_last_blk_reg = '1' then

+                    hash_control_st_next <= st_sha_data_valid;  -- no hmac operation: publish data valid

+                elsif padding_reg = '1' then

+                    hash_control_st_next <= st_sha_padding;     -- additional padding block

+                else

+                    hash_control_st_next <= st_sha_data_input;  -- continue requesting input data

+                end if;

+            

+            when st_sha_padding =>          -- padding of bits on the last message block

+                -- moore outputs                

+                padding_next <= '1';

+                if st_cnt_reg = 16 then     -- if word 16, data block was full: proceed to process this block

+                    -- process state #16 in this cycle and proceed to process the rest of the block

+                    st_cnt_ce <= '1';           -- enable state counter

+                    sch_ld <= '0';              -- recirculate scheduler data

+                    sch_ce <= '1';              -- enable message scheduler clock

+                    core_ce <= '1';             -- enable processing clock

+                    -- next state

+                    hash_control_st_next <= st_sha_blk_process;

+                else                        -- incomplete block: pad words until data block completes

+                    sch_ld <= '1';          -- load padded data into scheduler

+                    sch_ce <= '1';          -- enable message scheduler clock

+                    core_ce <= '1';         -- enable processing clock

+                    st_cnt_ce <= '1';       -- enable state counter

+                    if st_cnt_reg = 15 then -- pad up to word 15

+                        if sha_last_blk_next = '1' then

+                            words_sel <= b"10";  -- insert bitlen lo

+                        end if;

+                        -- next state

+                        hash_control_st_next <= st_sha_blk_process;

+                    elsif (one_insert = '0') and (st_cnt_reg = 14) then

+                        words_sel <= b"01";     -- insert bitlen hi

+                        sha_last_blk_next <= '1';   -- mark this as the last block

+                    elsif st_cnt_reg = 13 then

+                        sha_last_blk_next <= '1';   -- mark this as the last block

+                    end if;

+                end if;

+

+            when st_sha_data_valid =>       -- process is finished, waiting for begin command

+                -- moore outputs

+                data_valid <= '1';          -- output results are valid

+                -- wait for core reset with 'start'               

+

+            when st_error =>                -- processing or input error: reset with 'reset' = 1

+                -- moore outputs

+                error_lock <= '1';          -- lock error state

+                st_cnt_clr <= '1';          -- clear state counter

+                -- wait for core reset with 'start'               

+

+            when others =>                  -- internal state machine error

+                -- next state

+                hash_control_st_next <= st_error;

+

+        end case; 

+    end process control_combi_proc;

+

+    --=============================================================================================

+    --  COMBINATIONAL CONTROL LOGIC

+    --=============================================================================================

+

+    -- controller RESET signal logic

+    sha_reset_combi_proc:   sha_reset <= '1' when start_i = '1'   else '0';

+    reset_combi_proc:       reset <= '1'     when sha_reset = '1' else '0';

+

+    -- pad-one flag register

+    pad_one_next_combi_proc: process (bytes_ena, sch_ld, pad_one_reg) is

+    begin

+        -- after one-insertion, clear the pad-one flag register 

+        if (bytes_ena /= b"1111") and (sch_ld = '1') then

+            pad_one_next <= '0';

+        else 

+            pad_one_next <= pad_one_reg;

+        end if;

+    end process pad_one_next_combi_proc;

+

+    -- padding byte lane selectors

+    bytes_ena_combi_proc: process (bytes_i, padding_next, di_req, one_insert, end_i) is

+    begin

+        if di_req = '1' and end_i /= '1' then

+            -- accept only full words before last word

+            bytes_ena <= b"1111";

+        elsif di_req = '1' and end_i = '1' then

+            -- user data: bytes controlled by 'bytes_i'

+            case bytes_i is

+                when b"01"  => bytes_ena <= b"0001";

+                when b"10"  => bytes_ena <= b"0011";

+                when b"11"  => bytes_ena <= b"0111";

+                when others => bytes_ena <= b"1111";

+            end case;

+        else

+            -- no data input: force zero bits valid

+            bytes_ena <= b"0000";

+        end if;

+    end process bytes_ena_combi_proc;

+

+    -- bit counter next logic

+    msg_bit_cnt_next_combi_proc: process (bytes_ena, msg_bit_cnt_reg, bits_to_add) is

+    begin

+        case bytes_ena is

+            when b"0001"    => bits_to_add <= to_unsigned( 8, 6);

+            when b"0011"    => bits_to_add <= to_unsigned(16, 6);

+            when b"0111"    => bits_to_add <= to_unsigned(24, 6);

+            when b"1111"    => bits_to_add <= to_unsigned(32, 6);

+            when others     => bits_to_add <= to_unsigned( 0, 6);

+        end case;

+        msg_bit_cnt_next <= msg_bit_cnt_reg + bits_to_add;

+    end process msg_bit_cnt_next_combi_proc;

+

+    -- data input wait/run: insert wait states during data input for 'wr_i' = '0'

+    wait_run_ce_proc:       wait_run_ce <= '1' when di_req = '1' and wr_i  = '1' else '0';

+

+    -- padding one-insertion control

+    one_insert_proc:        one_insert <= '1' when pad_one_reg = '1' else '0';

+

+    -- bit counter clock enable

+    msg_bit_cnt_ce_proc :   msg_bit_cnt_ce <= '1' when wait_run_ce = '1' else '0';

+

+    -- state counter next logic

+    st_cnt_next_proc:       st_cnt_next <= st_cnt_reg + 1;

+

+    -- bytes_i error logic

+    bytes_error_proc:       bytes_error <= '1' when bytes_i /= b"00" and end_i /= '1' and di_req = '1' and wr_i = '1' else '0';

+

+    -- data input error logic

+    data_input_error_proc:  data_input_error <= '1' when wr_i = '1' and di_wr_window /= '1' else '0';

+

+    -- error detection logic

+    core_error_combi_proc:  core_error <= '1' when error_i = '1' or error_lock = '1' or bytes_error = '1' or data_input_error = '1' else '0';

+    

+    --=============================================================================================

+    --  OUTPUT LOGIC PROCESSES

+    --=============================================================================================

+    

+    bitlen_o_proc :         bitlen_o        <= std_logic_vector(msg_bit_cnt_reg);

+    bytes_ena_o_proc :      bytes_ena_o     <= bytes_ena;

+    one_insert_o_proc :     one_insert_o    <= one_insert;

+    words_sel_o_proc :      words_sel_o     <= words_sel;

+    sch_ce_o_proc :         sch_ce_o        <= sch_ce;

+    sch_ld_o_proc :         sch_ld_o        <= sch_ld;

+    core_ce_o_proc :        core_ce_o       <= core_ce;

+    core_ld_o_proc :        core_ld_o       <= core_ld;

+    oregs_ce_o_proc :       oregs_ce_o      <= oregs_ce;

+    oregs_ld_o_proc :       oregs_ld_o      <= oregs_ld;

+    Kt_addr_o_proc :        Kt_addr_o       <= std_logic_vector(st_cnt_reg(5 downto 0));

+    di_req_o_proc :         di_req_o        <= di_req;

+    data_valid_o_proc :     data_valid_o    <= data_valid;

+    error_o_proc :          error_o         <= core_error;

+    

+end rtl;

+

diff --git a/verilog/rtl/opencore_hasher/sha256_hash_core.vhd b/verilog/rtl/opencore_hasher/sha256_hash_core.vhd
new file mode 100755
index 0000000..ab52949
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/sha256_hash_core.vhd
@@ -0,0 +1,190 @@
+-----------------------------------------------------------------------------------------------------------------------

+-- Author:          Jonny Doin, jdoin@opencores.org, jonnydoin@gmail.com, jonnydoin@gridvortex.com

+-- 

+-- Create Date:     09:56:30 05/06/2016  

+-- Module Name:     sha256_hash_core - RTL

+-- Project Name:    sha256 processor

+-- Target Devices:  Spartan-6

+-- Tool versions:   ISE 14.7

+-- Description: 

+--

+--      This is the 256bit single-cycle hash core processing logic for each of the 64 block steps. 

+--      The combinational depth of this block is 8 layers of logic and adders.

+--      This module will be the largest limitation of the synthesis top operating frequency.

+--      If extra pipelining is needed, the control logic must account for the extra clock delays.

+--

+------------------------------ COPYRIGHT NOTICE -----------------------------------------------------------------------

+--                                                                   

+--      This file is part of the SHA256 HASH CORE project http://opencores.org/project,sha256_hash_core

+--                                                                   

+--      Author(s):      Jonny Doin, jdoin@opencores.org, jonnydoin@gridvortex.com, jonnydoin@gmail.com

+--                                                                   

+--      Copyright (C) 2016 Jonny Doin

+--      -----------------------------

+--                                                                   

+--      This source file may be used and distributed without restriction provided that this copyright statement is not    

+--      removed from the file and that any derivative work contains the original copyright notice and the associated 

+--      disclaimer. 

+--                                                                   

+--      This source file is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser 

+--      General Public License as published by the Free Software Foundation; either version 2.1 of the License, or 

+--      (at your option) any later version.

+--                                                                   

+--      This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied

+--      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more  

+--      details.

+--

+--      You should have received a copy of the GNU Lesser General Public License along with this source; if not, download 

+--      it from http://www.gnu.org/licenses/lgpl.txt

+--                                                                   

+------------------------------ REVISION HISTORY -----------------------------------------------------------------------

+--

+-- 2016/05/22   v0.01.0010  [JD]    started development. design of blocks and port interfaces.

+-- 2016/06/05   v0.01.0090  [JD]    all modules integrated. testbench for basic test vectors verification.

+-- 2016/06/05   v0.01.0095  [JD]    failed verification. misalignment of words in the datapath. 

+-- 2016/06/06   v0.01.0100  [JD]    passed first simulation verification against NIST-FIPS-180-4 test vectors.

+-- 2016/06/06   v0.01.0100  [JD]    passed first simulation verification against NIST-FIPS-180-4 test vectors.

+-- 2016/06/07   v0.01.0105  [JD]    passed verification against all NIST-FIPS-180-4 test vectors.

+-- 2016/06/11   v0.01.0105  [JD]    passed verification against NIST-SHA2_Additional test vectors #1 to #10.

+--

+-----------------------------------------------------------------------------------------------------------------------

+--  TODO

+--  ====

+--

+-----------------------------------------------------------------------------------------------------------------------

+library ieee;

+use ieee.std_logic_1164.all;

+use ieee.numeric_std.all;

+

+

+entity sha256_hash_core is

+    port (  

+        clk_i : in std_logic := 'U';                                    -- system clock

+        ce_i : in std_logic := 'U';                                     -- clock enable from control logic

+        ld_i : in std_logic := 'U';                                     -- parallel load internal registers with input words

+        A_i : in std_logic_vector (31 downto 0) := (others => 'U');     -- input for reg A

+        B_i : in std_logic_vector (31 downto 0) := (others => 'U');     -- input for reg B

+        C_i : in std_logic_vector (31 downto 0) := (others => 'U');     -- input for reg C

+        D_i : in std_logic_vector (31 downto 0) := (others => 'U');     -- input for reg D

+        E_i : in std_logic_vector (31 downto 0) := (others => 'U');     -- input for reg E

+        F_i : in std_logic_vector (31 downto 0) := (others => 'U');     -- input for reg F

+        G_i : in std_logic_vector (31 downto 0) := (others => 'U');     -- input for reg G

+        H_i : in std_logic_vector (31 downto 0) := (others => 'U');     -- input for reg H

+        A_o : out std_logic_vector (31 downto 0) := (others => 'U');    -- output for reg A

+        B_o : out std_logic_vector (31 downto 0) := (others => 'U');    -- output for reg B

+        C_o : out std_logic_vector (31 downto 0) := (others => 'U');    -- output for reg C

+        D_o : out std_logic_vector (31 downto 0) := (others => 'U');    -- output for reg D

+        E_o : out std_logic_vector (31 downto 0) := (others => 'U');    -- output for reg E

+        F_o : out std_logic_vector (31 downto 0) := (others => 'U');    -- output for reg F

+        G_o : out std_logic_vector (31 downto 0) := (others => 'U');    -- output for reg G

+        H_o : out std_logic_vector (31 downto 0) := (others => 'U');    -- output for reg H

+        Kt_i : in std_logic_vector (31 downto 0) := (others => 'U');    -- coefficients for the 64 steps of the message schedule

+        Wt_i : in std_logic_vector (31 downto 0) := (others => 'U')     -- message schedule words for the 64 steps

+    );                      

+end sha256_hash_core;

+

+architecture rtl of sha256_hash_core is

+    -- core registers

+    signal reg_a : unsigned (31 downto 0) := (others => '0');

+    signal reg_b : unsigned (31 downto 0) := (others => '0');

+    signal reg_c : unsigned (31 downto 0) := (others => '0');

+    signal reg_d : unsigned (31 downto 0) := (others => '0');

+    signal reg_e : unsigned (31 downto 0) := (others => '0');

+    signal reg_f : unsigned (31 downto 0) := (others => '0');

+    signal reg_g : unsigned (31 downto 0) := (others => '0');

+    signal reg_h : unsigned (31 downto 0) := (others => '0');

+    -- combinational inputs

+    signal next_reg_a : unsigned (31 downto 0);

+    signal next_reg_b : unsigned (31 downto 0);

+    signal next_reg_c : unsigned (31 downto 0);

+    signal next_reg_d : unsigned (31 downto 0);

+    signal next_reg_e : unsigned (31 downto 0);

+    signal next_reg_f : unsigned (31 downto 0);

+    signal next_reg_g : unsigned (31 downto 0);

+    signal next_reg_h : unsigned (31 downto 0);

+    -- internal modulo adders

+    signal sum0 : unsigned (31 downto 0);

+    signal sum1 : unsigned (31 downto 0);

+    signal sum2 : unsigned (31 downto 0);

+    signal sum3 : unsigned (31 downto 0);

+    signal sum4 : unsigned (31 downto 0);

+    signal sum5 : unsigned (31 downto 0);

+    signal sum6 : unsigned (31 downto 0);

+    -- upper sigma functions

+    signal SIG0 : unsigned (31 downto 0);

+    signal SIG1 : unsigned (31 downto 0);

+    -- Ch and Maj functions

+    signal Ch : unsigned (31 downto 0);

+    signal Maj : unsigned (31 downto 0);

+begin

+    --=============================================================================================

+    -- HASH BLOCK CORE LOGIC

+    --=============================================================================================

+    -- The hash core block implements the hash kernel operation that is used in each of the 64 block hash steps. 

+    -- All operations for a kernel step execute in a single clock cycle.

+    -- The longest combinational path is the 'next_reg_a', with 12 logic layers total, including the upstream 

+    -- datapath from the message scheduler. 

+    

+    -- core register transfer logic

+    core_regs_proc: process (clk_i, ce_i) is

+    begin

+        if clk_i'event and clk_i = '1' then

+            if ce_i = '1' then

+                reg_a <= next_reg_a;

+                reg_b <= next_reg_b;

+                reg_c <= next_reg_c;

+                reg_d <= next_reg_d;

+                reg_e <= next_reg_e;

+                reg_f <= next_reg_f;

+                reg_g <= next_reg_g;

+                reg_h <= next_reg_h;

+            end if;

+        end if;

+    end process core_regs_proc;

+

+    --=============================================================================================

+    --  COMBINATIONAL LOGIC

+    --=============================================================================================

+    -- word rotation and bit manipulation for each cycle

+    

+    -- input muxes and word shifter wires

+    next_reg_a_proc: next_reg_a <= unsigned(A_i) when ld_i = '1' else sum0;

+    next_reg_b_proc: next_reg_b <= unsigned(B_i) when ld_i = '1' else reg_a;

+    next_reg_c_proc: next_reg_c <= unsigned(C_i) when ld_i = '1' else reg_b;

+    next_reg_d_proc: next_reg_d <= unsigned(D_i) when ld_i = '1' else reg_c;

+    next_reg_e_proc: next_reg_e <= unsigned(E_i) when ld_i = '1' else sum2;

+    next_reg_f_proc: next_reg_f <= unsigned(F_i) when ld_i = '1' else reg_e;

+    next_reg_g_proc: next_reg_g <= unsigned(G_i) when ld_i = '1' else reg_f;

+    next_reg_h_proc: next_reg_h <= unsigned(H_i) when ld_i = '1' else reg_g;

+    

+    -- adders for the ARX functions

+    sum0_proc: sum0 <= sum1 + sum3;

+    sum1_proc: sum1 <= SIG0 + Maj;

+    sum2_proc: sum2 <= sum3 + reg_d;

+    sum3_proc: sum3 <= sum4 + SIG1;

+    sum4_proc: sum4 <= sum5 + unsigned(Wt_i);

+    sum5_proc: sum5 <= sum6 + unsigned(Kt_i);

+    sum6_proc: sum6 <= reg_h + Ch;

+    

+    -- upper sigma functions

+    SIG0_proc: SIG0 <= (reg_a(1 downto 0) & reg_a(31 downto 2)) xor (reg_a(12 downto 0) & reg_a(31 downto 13)) xor (reg_a(21 downto 0) & reg_a(31 downto 22));

+    SIG1_proc: SIG1 <= (reg_e(5 downto 0) & reg_e(31 downto 6)) xor (reg_e(10 downto 0) & reg_e(31 downto 11)) xor (reg_e(24 downto 0) & reg_e(31 downto 25));

+    

+    -- Maj and Ch functions

+    Maj_proc: Maj <= (reg_a and reg_b) xor (reg_a and reg_c) xor (reg_b and reg_c);

+    Ch_proc:  Ch <= (reg_e and reg_f) xor ((not reg_e) and reg_g);

+    

+    --=============================================================================================

+    -- OUTPUT LOGIC

+    --=============================================================================================

+    -- connect output ports

+    A_o_proc:       A_o <= std_logic_vector(reg_a);

+    B_o_proc:       B_o <= std_logic_vector(reg_b);

+    C_o_proc:       C_o <= std_logic_vector(reg_c);

+    D_o_proc:       D_o <= std_logic_vector(reg_d);

+    E_o_proc:       E_o <= std_logic_vector(reg_e);

+    F_o_proc:       F_o <= std_logic_vector(reg_f);

+    G_o_proc:       G_o <= std_logic_vector(reg_g);

+    H_o_proc:       H_o <= std_logic_vector(reg_h);

+end rtl;

+

diff --git a/verilog/rtl/opencore_hasher/sha256_msg_sch.vhd b/verilog/rtl/opencore_hasher/sha256_msg_sch.vhd
new file mode 100755
index 0000000..97eeabd
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/sha256_msg_sch.vhd
@@ -0,0 +1,180 @@
+-----------------------------------------------------------------------------------------------------------------------

+-- Author:          Jonny Doin, jdoin@opencores.org, jonnydoin@gmail.com, jonnydoin@gridvortex.com

+-- 

+-- Create Date:     09:56:30 05/06/2016  

+-- Module Name:     sha256_msg_sch - RTL

+-- Project Name:    sha256 processor

+-- Target Devices:  Spartan-6

+-- Tool versions:   ISE 14.7

+-- Description: 

+--

+--      This is the message scheduler datapath for the sha256 processor.

+--

+------------------------------ COPYRIGHT NOTICE -----------------------------------------------------------------------

+--                                                                   

+--      This file is part of the SHA256 HASH CORE project http://opencores.org/project,sha256_hash_core

+--                                                                   

+--      Author(s):      Jonny Doin, jdoin@opencores.org, jonnydoin@gridvortex.com, jonnydoin@gmail.com

+--                                                                   

+--      Copyright (C) 2016 Jonny Doin

+--      -----------------------------

+--                                                                   

+--      This source file may be used and distributed without restriction provided that this copyright statement is not    

+--      removed from the file and that any derivative work contains the original copyright notice and the associated 

+--      disclaimer. 

+--                                                                   

+--      This source file is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser 

+--      General Public License as published by the Free Software Foundation; either version 2.1 of the License, or 

+--      (at your option) any later version.

+--                                                                   

+--      This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied

+--      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more  

+--      details.

+--

+--      You should have received a copy of the GNU Lesser General Public License along with this source; if not, download 

+--      it from http://www.gnu.org/licenses/lgpl.txt

+--                                                                   

+------------------------------ REVISION HISTORY -----------------------------------------------------------------------

+--

+-- 2016/05/22   v0.01.0010  [JD]    started development. design of blocks and port interfaces.

+-- 2016/06/05   v0.01.0090  [JD]    all modules integrated. testbench for basic test vectors verification.

+-- 2016/06/05   v0.01.0095  [JD]    verification failed. misalignment of words in the datapath. 

+-- 2016/06/06   v0.01.0100  [JD]    first simulation verification against NIST-FIPS-180-4 test vectors passed.

+--

+-----------------------------------------------------------------------------------------------------------------------

+--  TODO

+--  ====

+--

+-----------------------------------------------------------------------------------------------------------------------

+library ieee;

+use ieee.std_logic_1164.all;

+use ieee.numeric_std.all;

+

+

+entity sha256_msg_sch is

+    port (  

+        clk_i : in std_logic := 'U';                                            -- system clock

+        ce_i : in std_logic := 'U';                                             -- clock input to word shifter

+        ld_i : in std_logic := 'U';                                             -- transparent load input to output

+        M_i : in std_logic_vector (31 downto 0) := (others => 'U');             -- big endian input message words

+        Wt_o : out std_logic_vector (31 downto 0)                               -- message schedule output words

+    );                      

+end sha256_msg_sch;

+

+architecture rtl of sha256_msg_sch is

+    -- datapath pipeline 

+    signal r0 : unsigned (31 downto 0) := (others => '0');              -- internal message register

+    signal r1 : unsigned (31 downto 0) := (others => '0');              -- internal message register

+    signal r2 : unsigned (31 downto 0) := (others => '0');              -- internal message register

+    signal r3 : unsigned (31 downto 0) := (others => '0');              -- internal message register

+    signal r4 : unsigned (31 downto 0) := (others => '0');              -- internal message register

+    signal r5 : unsigned (31 downto 0) := (others => '0');              -- internal message register

+    signal r6 : unsigned (31 downto 0) := (others => '0');              -- internal message register

+    signal r7 : unsigned (31 downto 0) := (others => '0');              -- internal message register

+    signal r8 : unsigned (31 downto 0) := (others => '0');              -- internal message register

+    signal r9 : unsigned (31 downto 0) := (others => '0');              -- internal message register

+    signal r10 : unsigned (31 downto 0) := (others => '0');             -- internal message register

+    signal r11 : unsigned (31 downto 0) := (others => '0');             -- internal message register

+    signal r12 : unsigned (31 downto 0) := (others => '0');             -- internal message register

+    signal r13 : unsigned (31 downto 0) := (others => '0');             -- internal message register

+    signal r14 : unsigned (31 downto 0) := (others => '0');             -- internal message register

+    signal r15 : unsigned (31 downto 0) := (others => '0');             -- internal message register

+    -- input mux feedback

+    signal next_M : unsigned (31 downto 0);                             -- sum feedback

+    -- word shifter wires

+    signal next_r0 : unsigned (31 downto 0);

+    signal next_r1 : unsigned (31 downto 0);

+    signal next_r2 : unsigned (31 downto 0);

+    signal next_r3 : unsigned (31 downto 0);

+    signal next_r4 : unsigned (31 downto 0);

+    signal next_r5 : unsigned (31 downto 0);

+    signal next_r6 : unsigned (31 downto 0);

+    signal next_r7 : unsigned (31 downto 0);

+    signal next_r8 : unsigned (31 downto 0);

+    signal next_r9 : unsigned (31 downto 0);

+    signal next_r10 : unsigned (31 downto 0);

+    signal next_r11 : unsigned (31 downto 0);

+    signal next_r12 : unsigned (31 downto 0);

+    signal next_r13 : unsigned (31 downto 0);

+    signal next_r14 : unsigned (31 downto 0);

+    signal next_r15 : unsigned (31 downto 0);

+    -- internal modulo adders

+    signal sum0 : unsigned (31 downto 0);               -- modulo adder r1 + sum1

+    signal sum1 : unsigned (31 downto 0);               -- modulo adder s0 + sum2

+    signal sum2 : unsigned (31 downto 0);               -- modulo adder s1 + r10

+    -- lower sigma functions

+    signal s0 : unsigned (31 downto 0);                 -- lower sigma0 function

+    signal s1 : unsigned (31 downto 0);                 -- lower sigma1 function

+begin

+    --=============================================================================================

+    -- MESSAGE SCHEDULER LOGIC

+    --=============================================================================================

+    -- This logic implements the 256 bytes message schedule as a folded 16 word circular word shifter.

+    -- The Add-Rotate-Xor functions s0 and s1 are implemented and fed back to the word shifter.

+    -- To avoid a datapath pipeline delay insertion, the output is taken from the r0 input, rather than

+    -- the registered r0 output. This lookahead reduces one clock cycle in the overall hash computation,

+    -- but increases the combinational path from the input to the processor core.

+    -- The next_r0 combinational function has 5 layers of logic, including 3 carry chains.

+    

+    -- word shifter register transfer logic

+    word_shifter_proc: process (clk_i, ce_i) is

+    begin

+        if clk_i'event and clk_i = '1' then

+            if ce_i = '1' then

+                r0 <= next_r0;

+                r1 <= next_r1;

+                r2 <= next_r2;

+                r3 <= next_r3;

+                r4 <= next_r4;

+                r5 <= next_r5;

+                r6 <= next_r6;

+                r7 <= next_r7;

+                r8 <= next_r8;

+                r9 <= next_r9;

+                r10 <= next_r10;

+                r11 <= next_r11;

+                r12 <= next_r12;

+                r13 <= next_r13;

+                r14 <= next_r14;

+                r15 <= next_r15;

+            end if;

+        end if;

+    end process word_shifter_proc;

+    

+    -- input mux 

+    next_r0_proc: next_r0 <= unsigned(M_i) when ld_i = '1' else next_M;

+    next_m_proc:  next_M <= sum0;

+    

+    -- word shifter wires

+    next_r15_proc: next_r15 <= r0;

+    next_r14_proc: next_r14 <= r15;

+    next_r13_proc: next_r13 <= r14;

+    next_r12_proc: next_r12 <= r13;

+    next_r11_proc: next_r11 <= r12;

+    next_r10_proc: next_r10 <= r11;

+    next_r9_proc: next_r9 <= r10;

+    next_r8_proc: next_r8 <= r9;

+    next_r7_proc: next_r7 <= r8;

+    next_r6_proc: next_r6 <= r7;

+    next_r5_proc: next_r5 <= r6;

+    next_r4_proc: next_r4 <= r5;

+    next_r3_proc: next_r3 <= r4;

+    next_r2_proc: next_r2 <= r3;

+    next_r1_proc: next_r1 <= r2;

+    

+    -- adders 

+    sum0_proc: sum0 <= sum1 + r1;

+    sum1_proc: sum1 <= sum2 + s0;

+    sum2_proc: sum2 <= r10 + s1;

+    

+    -- lower sigma functions

+    s0_proc: s0 <= (B"000" & r2(31 downto 3)) xor (r2(17 downto 0) & r2(31 downto 18)) xor (r2(6 downto 0) & r2(31 downto 7));

+    s1_proc: s1 <= (B"0000000000" & r15(31 downto 10)) xor (r15(18 downto 0) & r15(31 downto 19)) xor (r15(16 downto 0) & r15(31 downto 17));

+    

+    --=============================================================================================

+    -- OUTPUT LOGIC

+    --=============================================================================================

+    -- connect output ports

+    Wt_o_proc:      Wt_o <= std_logic_vector(next_r0);  -- message scheduler output look ahead

+end rtl;

+

diff --git a/verilog/rtl/opencore_hasher/sha256_padding.vhd b/verilog/rtl/opencore_hasher/sha256_padding.vhd
new file mode 100755
index 0000000..ebeabc6
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/sha256_padding.vhd
@@ -0,0 +1,165 @@
+-----------------------------------------------------------------------------------------------------------------------

+-- Author:          Jonny Doin, jdoin@opencores.org, jonnydoin@gmail.com, jonnydoin@gridvortex.com

+-- 

+-- Create Date:     09:56:30 05/04/2016

+-- Module Name:     sha256_padding - RTL

+-- Project Name:    sha256 processor

+-- Target Devices:  Spartan-6

+-- Tool versions:   ISE 14.7

+-- Description: 

+--

+--      This is the byte padding datapath logic for the sha256 processor. 

+--      The padding of the last block is controlled by the byte lane selectors and the last words selectors.

+--      These control signals are generated at the Control Logic block of the SHA256 processor. 

+--      A consistency check error signal is generated, to flag illegal control conditions.

+--      This block is a fully combinational circuit, with 2 layers of logic. 

+--

+------------------------------ COPYRIGHT NOTICE -----------------------------------------------------------------------

+--                                                                   
+--      This file is part of the SHA256 HASH CORE project http://opencores.org/project,sha256_hash_core
+--                                                                   
+--      Author(s):      Jonny Doin, jdoin@opencores.org, jonnydoin@gridvortex.com, jonnydoin@gmail.com
+--                                                                   
+--      Copyright (C) 2016 Jonny Doin
+--      -----------------------------
+--                                                                   
+--      This source file may be used and distributed without restriction provided that this copyright statement is not    
+--      removed from the file and that any derivative work contains the original copyright notice and the associated 
+--      disclaimer. 
+--                                                                   
+--      This source file is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser 
+--      General Public License as published by the Free Software Foundation; either version 2.1 of the License, or 
+--      (at your option) any later version.
+--                                                                   
+--      This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
+--      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more  
+--      details.
+--
+--      You should have received a copy of the GNU Lesser General Public License along with this source; if not, download 
+--      it from http://www.gnu.org/licenses/lgpl.txt
+--                                                                   
+------------------------------ REVISION HISTORY -----------------------------------------------------------------------

+--

+-- 2016/05/22   v0.01.0010  [JD]    started development. design of blocks and port interfaces.

+-- 2016/06/05   v0.01.0090  [JD]    all modules integrated. testbench for basic test vectors verification.

+-- 2016/06/05   v0.01.0095  [JD]    verification failed. misalignment of words in the datapath. 

+-- 2016/06/06   v0.01.0100  [JD]    first simulation verification against NIST-FIPS-180-4 test vectors passed.

+--

+-----------------------------------------------------------------------------------------------------------------------

+--  TODO

+--  ====

+--

+-----------------------------------------------------------------------------------------------------------------------

+library ieee;

+use ieee.std_logic_1164.all;

+use ieee.numeric_std.all;

+

+

+entity sha256_padding is

+    port (

+        words_sel_i : in std_logic_vector (1 downto 0) := (others => 'U');      -- selector for bitcnt insertion at the last block

+        one_insert_i : in std_logic;                                            -- insert a leading one in the padding

+        bytes_ena_i : in std_logic_vector (3 downto 0) := (others => 'U');      -- byte lane selector lines

+        bitlen_i : in std_logic_vector (63 downto 0) := (others => 'U');        -- 64bit message bit length

+        di_i : in std_logic_vector (31 downto 0) := (others => 'U');            -- big endian input message words

+        do_o : out std_logic_vector (31 downto 0);                              -- padded output words

+        error_o : out std_logic                                                 -- '1' if error in the byte_ena selectors

+    );

+end sha256_padding;

+

+architecture rtl of sha256_padding is

+    -- byte lane wires 

+    signal BL0 : std_logic_vector (7 downto 0);                                 -- byte lane 0 (MSB)

+    signal BL1 : std_logic_vector (7 downto 0);                                 -- byte lane 1 (1SB)

+    signal BL2 : std_logic_vector (7 downto 0);                                 -- byte lane 2 (2SB)

+    signal BL3 : std_logic_vector (7 downto 0);                                 -- byte lane 3 (LSB)

+    -- selectors

+    signal one_insert : std_logic;                                              -- leading one padding

+    signal B_ena : std_logic_vector (3 downto 0);                               -- byte lane selectors

+    signal W_sel : std_logic_vector (1 downto 0);                               -- last words selector

+    -- padded words

+    signal W_pad : std_logic_vector (31 downto 0);                              -- padding mux output

+    signal W_out : std_logic_vector (31 downto 0);                              -- output word

+    -- ones insertion muxes

+    signal BL0_top_bit : std_logic;

+    signal BL1_top_bit : std_logic;

+    signal BL2_top_bit : std_logic;

+    signal BL3_top_bit : std_logic;

+    -- bit length words

+    signal bitlen_hi : std_logic_vector (31 downto 0);

+    signal bitlen_lo : std_logic_vector (31 downto 0);

+    -- error indication

+    signal bsel_error : std_logic;

+    signal wsel_error : std_logic;

+    signal err : std_logic;

+begin

+    --=============================================================================================

+    -- INPUT LOGIC

+    --=============================================================================================

+    -- copy the input ports into the internal wires

+    

+    -- byte lanes are internally spliced from the 32bit input word

+    BL0 <= di_i(31 downto 24);

+    BL1 <= di_i(23 downto 16);

+    BL2 <= di_i(15 downto 8);

+    BL3 <= di_i(7 downto 0);

+    

+    -- bitlen words spliced from the 64bit bitlen input word

+    bitlen_hi <= bitlen_i(63 downto 32);

+    bitlen_lo <= bitlen_i(31 downto 0);

+    

+    -- byte lane selectors

+    one_insert <= one_insert_i;

+    B_ena <= bytes_ena_i;

+    W_sel <= words_sel_i;

+    

+    --=============================================================================================

+    -- PADDING LOGIC

+    --=============================================================================================

+    -- The last block padding logic is implemented as a stream insertion into the input words datapath.

+    

+    -- top bit for the padding bytes. one_insert controls whether a leading one will be inserted on the leading pad byte.

+    BL0_top_bit <= one_insert and (not B_ena(0));

+    BL1_top_bit <= one_insert and (B_ena(0) and not B_ena(1));

+    BL2_top_bit <= one_insert and (B_ena(1) and not B_ena(2));

+    BL3_top_bit <= one_insert and (B_ena(2) and not B_ena(3));

+    

+    -- byte lane padding muxes

+    W_pad(31 downto 24) <= BL0 when B_ena(0) = '1' else (BL0_top_bit & b"0000000");

+    W_pad(23 downto 16) <= BL1 when B_ena(1) = '1' else (BL1_top_bit & b"0000000");

+    W_pad(15 downto 8)  <= BL2 when B_ena(2) = '1' else (BL2_top_bit & b"0000000");

+    W_pad(7 downto 0)   <= BL3 when B_ena(3) = '1' else (BL3_top_bit & b"0000000");

+    

+    --=============================================================================================

+    -- BIT COUNTER INSERTION LOGIC

+    --=============================================================================================

+    -- At the end of the last block, the 64bit message length is inserted as the last 2 words.

+    

+    W_out <=    bitlen_hi   when W_sel = b"01" else

+                bitlen_lo   when W_sel = b"10" else

+                W_pad;

+    

+    --=============================================================================================

+    -- ERROR INDICATION LOGIC

+    --=============================================================================================

+    -- Invalid selectors conditions are flagged as errors

+    

+    -- byte lane selectors error: priority encoder

+    bsel_error <=   '1' when (B_ena(3) = '1') and ((B_ena(2) = '0') or (B_ena(1) = '0') or (B_ena(0) = '0')) else

+                    '1' when (B_ena(2) = '1') and ((B_ena(1) = '0') or (B_ena(0) = '0')) else

+                    '1' when (B_ena(1) = '1') and  (B_ena(0) = '0') else

+                    '0';

+                    

+    -- word selector error: invalid code B"11"

+    wsel_error <=   '1' when W_sel = b"11" else '0';

+    

+    err <= bsel_error or wsel_error;

+    

+    --=============================================================================================

+    -- OUTPUT LOGIC

+    --=============================================================================================

+    -- connect output ports

+    do_o_proc:      do_o <= W_out;

+    error_o_proc:   error_o <= err;

+end rtl;

+

diff --git a/verilog/rtl/opencore_hasher/sha256_regs.vhd b/verilog/rtl/opencore_hasher/sha256_regs.vhd
new file mode 100755
index 0000000..4d5f6f8
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/sha256_regs.vhd
@@ -0,0 +1,189 @@
+-----------------------------------------------------------------------------------------------------------------------

+-- Author:          Jonny Doin, jdoin@opencores.org, jonnydoin@gmail.com, jonnydoin@gridvortex.com

+-- 

+-- Create Date:     09:56:30 05/06/2016  

+-- Module Name:     sha256_regs - RTL

+-- Project Name:    sha256 processor

+-- Target Devices:  Spartan-6

+-- Tool versions:   ISE 14.7

+-- Description: 

+--

+--      The regs block has the output result registers for the SHA256 processor.

+--      It is a single-cycle 256bit Accumulator for the block hash results, and can be implemented

+--      as a 32bit MUX and a 32bit carry chain for each register.

+--

+------------------------------ COPYRIGHT NOTICE -----------------------------------------------------------------------

+--                                                                   
+--      This file is part of the SHA256 HASH CORE project http://opencores.org/project,sha256_hash_core
+--                                                                   
+--      Author(s):      Jonny Doin, jdoin@opencores.org, jonnydoin@gridvortex.com, jonnydoin@gmail.com
+--                                                                   
+--      Copyright (C) 2016 Jonny Doin
+--      -----------------------------
+--                                                                   
+--      This source file may be used and distributed without restriction provided that this copyright statement is not    
+--      removed from the file and that any derivative work contains the original copyright notice and the associated 
+--      disclaimer. 
+--                                                                   
+--      This source file is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser 
+--      General Public License as published by the Free Software Foundation; either version 2.1 of the License, or 
+--      (at your option) any later version.
+--                                                                   
+--      This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
+--      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more  
+--      details.
+--
+--      You should have received a copy of the GNU Lesser General Public License along with this source; if not, download 
+--      it from http://www.gnu.org/licenses/lgpl.txt
+--                                                                   
+------------------------------ REVISION HISTORY -----------------------------------------------------------------------

+--

+-- 2016/05/22   v0.01.0010  [JD]    started development. design of blocks and port interfaces.

+-- 2016/06/05   v0.01.0090  [JD]    all modules integrated. testbench for basic test vectors verification.

+-- 2016/06/05   v0.01.0095  [JD]    verification failed. misalignment of words in the datapath. 

+-- 2016/06/06   v0.01.0100  [JD]    first simulation verification against NIST-FIPS-180-4 test vectors passed.

+--

+-----------------------------------------------------------------------------------------------------------------------

+--  TODO

+--  ====

+--

+-----------------------------------------------------------------------------------------------------------------------

+library ieee;

+use ieee.std_logic_1164.all;

+use ieee.numeric_std.all;

+

+entity sha256_regs is

+    port (  

+        clk_i : in std_logic := 'U';                                            -- system clock

+        ce_i : in std_logic := 'U';                                             -- clock enable from control logic

+        ld_i : in std_logic := 'U';                                             -- internal mux selection from control logic

+        A_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        B_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        C_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        D_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        E_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        F_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        G_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        H_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        K0_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        K1_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        K2_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        K3_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        K4_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        K5_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        K6_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        K7_i : in std_logic_vector (31 downto 0) := (others => 'U');

+        N0_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        N1_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        N2_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        N3_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        N4_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        N5_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        N6_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        N7_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        H0_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        H1_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        H2_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        H3_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        H4_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        H5_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        H6_o : out std_logic_vector (31 downto 0) := (others => 'U');

+        H7_o : out std_logic_vector (31 downto 0) := (others => 'U')

+    );                      

+end sha256_regs;

+

+architecture rtl of sha256_regs is

+    -- output result registers 

+    signal reg_H0 : unsigned (31 downto 0) := (others => '0');

+    signal reg_H1 : unsigned (31 downto 0) := (others => '0');

+    signal reg_H2 : unsigned (31 downto 0) := (others => '0');

+    signal reg_H3 : unsigned (31 downto 0) := (others => '0');

+    signal reg_H4 : unsigned (31 downto 0) := (others => '0');

+    signal reg_H5 : unsigned (31 downto 0) := (others => '0');

+    signal reg_H6 : unsigned (31 downto 0) := (others => '0');

+    signal reg_H7 : unsigned (31 downto 0) := (others => '0');

+    -- word shifter wires

+    signal next_reg_H0 : unsigned (31 downto 0);

+    signal next_reg_H1 : unsigned (31 downto 0);

+    signal next_reg_H2 : unsigned (31 downto 0);

+    signal next_reg_H3 : unsigned (31 downto 0);

+    signal next_reg_H4 : unsigned (31 downto 0);

+    signal next_reg_H5 : unsigned (31 downto 0);

+    signal next_reg_H6 : unsigned (31 downto 0);

+    signal next_reg_H7 : unsigned (31 downto 0);

+    -- internal modulo adders

+    signal sum0 : unsigned (31 downto 0);

+    signal sum1 : unsigned (31 downto 0);

+    signal sum2 : unsigned (31 downto 0);

+    signal sum3 : unsigned (31 downto 0);

+    signal sum4 : unsigned (31 downto 0);

+    signal sum5 : unsigned (31 downto 0);

+    signal sum6 : unsigned (31 downto 0);

+    signal sum7 : unsigned (31 downto 0);

+begin

+    --=============================================================================================

+    -- OUTPUT RESULT REGISTERS LOGIC

+    --=============================================================================================

+    -- The output result registers hold the intermediate values for the hash update blocks, and also the final 256bit hash value. 

+    --

+    

+    -- output register transfer logic

+    out_regs_proc: process (clk_i, ce_i) is

+    begin

+        if clk_i'event and clk_i = '1' then

+            if ce_i = '1' then

+                reg_H0 <= next_reg_H0;

+                reg_H1 <= next_reg_H1;

+                reg_H2 <= next_reg_H2;

+                reg_H3 <= next_reg_H3;

+                reg_H4 <= next_reg_H4;

+                reg_H5 <= next_reg_H5;

+                reg_H6 <= next_reg_H6;

+                reg_H7 <= next_reg_H7;

+            end if;

+        end if;

+    end process out_regs_proc;

+    

+    -- input muxes

+    next_reg_H0_proc: next_reg_H0 <= unsigned(K0_i) when ld_i = '1' else sum0;

+    next_reg_H1_proc: next_reg_H1 <= unsigned(K1_i) when ld_i = '1' else sum1;

+    next_reg_H2_proc: next_reg_H2 <= unsigned(K2_i) when ld_i = '1' else sum2;

+    next_reg_H3_proc: next_reg_H3 <= unsigned(K3_i) when ld_i = '1' else sum3;

+    next_reg_H4_proc: next_reg_H4 <= unsigned(K4_i) when ld_i = '1' else sum4;

+    next_reg_H5_proc: next_reg_H5 <= unsigned(K5_i) when ld_i = '1' else sum5;

+    next_reg_H6_proc: next_reg_H6 <= unsigned(K6_i) when ld_i = '1' else sum6;

+    next_reg_H7_proc: next_reg_H7 <= unsigned(K7_i) when ld_i = '1' else sum7;

+    

+    -- adders 

+    sum0_proc: sum0 <= reg_H0 + unsigned(A_i);

+    sum1_proc: sum1 <= reg_H1 + unsigned(B_i);

+    sum2_proc: sum2 <= reg_H2 + unsigned(C_i);

+    sum3_proc: sum3 <= reg_H3 + unsigned(D_i);

+    sum4_proc: sum4 <= reg_H4 + unsigned(E_i);

+    sum5_proc: sum5 <= reg_H5 + unsigned(F_i);

+    sum6_proc: sum6 <= reg_H6 + unsigned(G_i);

+    sum7_proc: sum7 <= reg_H7 + unsigned(H_i);

+    

+    --=============================================================================================

+    -- OUTPUT LOGIC

+    --=============================================================================================

+    -- connect output ports

+    H0_o_proc:      H0_o <= std_logic_vector(reg_H0);

+    H1_o_proc:      H1_o <= std_logic_vector(reg_H1);

+    H2_o_proc:      H2_o <= std_logic_vector(reg_H2);

+    H3_o_proc:      H3_o <= std_logic_vector(reg_H3);

+    H4_o_proc:      H4_o <= std_logic_vector(reg_H4);

+    H5_o_proc:      H5_o <= std_logic_vector(reg_H5);

+    H6_o_proc:      H6_o <= std_logic_vector(reg_H6);

+    H7_o_proc:      H7_o <= std_logic_vector(reg_H7);

+    

+    N0_o_proc:      N0_o <= std_logic_vector(next_reg_H0);

+    N1_o_proc:      N1_o <= std_logic_vector(next_reg_H1);

+    N2_o_proc:      N2_o <= std_logic_vector(next_reg_H2);

+    N3_o_proc:      N3_o <= std_logic_vector(next_reg_H3);

+    N4_o_proc:      N4_o <= std_logic_vector(next_reg_H4);

+    N5_o_proc:      N5_o <= std_logic_vector(next_reg_H5);

+    N6_o_proc:      N6_o <= std_logic_vector(next_reg_H6);

+    N7_o_proc:      N7_o <= std_logic_vector(next_reg_H7);

+end rtl;

+

diff --git a/verilog/rtl/opencore_hasher/sha256_test.vhd b/verilog/rtl/opencore_hasher/sha256_test.vhd
new file mode 100755
index 0000000..16df21d
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/sha256_test.vhd
@@ -0,0 +1,1190 @@
+-----------------------------------------------------------------------------------------------------------------------

+-- Author:          Jonny Doin, jdoin@opencores.org, jonnydoin@gmail.com, jonnydoin@gridvortex.com

+-- 

+-- Create Date:     09:56:30 05/22/2016  

+-- Module Name:     sha256_test.vhd

+-- Project Name:    sha256 engine

+-- Target Devices:  Spartan-6

+-- Tool versions:   ISE 14.7

+-- Description: 

+--

+--      Testbench for the GV_SHA256 engine.

+--      This is the testbench for the GV_SHA256 engine. It exercises all the input control signals and error generation,

+--      and tests the GV_SHA256 engine with the NIST SHA256 test vectors, including the additional NIST test vectors up to the 

+--      1 million chars.

+--

+--      The logic implements a fast engine, with 65 cycles per 512-bit block. 

+--

+--      The following waveforms describe the operation of the engine control signals for message start, update and end.

+--

+--      BEGIN BLOCK (1st block)

+--      ======================

+--

+--      The hash operation starts with a 'begin' sync pulse, which causes the RESET of the processor. The processor comes out of RESET only after 'begin' is

+--      released. 

+--      The DATA_INPUT state is signalled by the data request signal 'di_req' going HIGH. The processor will latch 16 words from the 'di' port, at every 

+--      rising edge of the system clock. At the end of the block input, the 'di_req' signal goes LOW. 

+--      The input data can be held by bringing the 'wr_i' input LOW. When the 'wr_i' input is held LOW during data write, it inserts a wait state in the 

+--      processor, to cope with slow inputs or to allow periodic fetches of input data from multiple data sources. 

+--      The 'di_req' signal will remain HIGH while data input is requested. When all 16 words are clocked in, 'di_req' goes LOW, and 'wr_i' is not allowed

+--      during the internal processing phase.

+--

+--      state              |reset| data                                    |wait |                                                     | process                  

+--                    __   |__   |__    __    __    __    __    __    __   |__   |__    __    __    __    __    __    __    __    __   |__    __    __ 

+--      clk_i      __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \...     -- system clock

+--                        _____                                                                                                                                      

+--      start_i    ______/   \_\_______________________________________________________________________________________________________________________...     -- 'start_i' resets the processor and starts a new hash

+--                                                                                                                                                       

+--      end_i      ____________________________________________________________________________________________________________________________________...     -- 'end_i' marks end of last block data input

+--                 __ _ _ _       _____________________________________________________________________________________________________                  

+--      di_req_o   __ _ _ _\_____/                                                                                                     \_______________...     -- 'di_req_o' asserted during data input

+--                            ___________________________________________       _________________________________________________________                

+--      wr_i       __________/____/                                      \_____/                                                         \_____________...     -- 'wr_i' can hold the core for slow data

+--                 __________ _________ _____ _____ _____ _____ _____ ___________ _____ _____ _____ _____ _____ _____ _____ _____ ______ ______________...

+--      di_i       __________\___\_W0__\__W1_\__W2_\__W3_\__W4_\__W5_\\\\\\\__W6_\__W7_\__W8_\__W9_\_W10_\_W11_\_W12_\_W13_\_W14_\_W15__\______X_______...     -- user words on 'di_i' are latched on 'clk_i' rising edge

+--                 ____________________ _____ _____ _____ _____ _____ ___________ _____ _____ _____ _____ _____ _____ _____ _____ _____________________...

+--      st_cnt_reg ________/__0__/__0__/__1__/__2__/__3__/__4__/__5__/___6_______/__7__/__8__/__9__/__10_/__11_/__12_/__13_/__14_/__15_/__16_/__17_/_18...     -- internal state counter value

+--                 __________ ___ _____ _____ _____ _____ _____ _____ ___________ _____ _____ _____ _____ _____ _____ _____ _____ _____________________...

+--      Wt_i@core  __________\___\__W0_\__W1_\__W2_\__W3_\__W4_\__W5_\\\\\\\__W6_\__W7_\__W8_\__W9_\_W10_\_W11_\_W12_\_W13_\_W14_\_W15_________________...     -- msg scheduler lookahead output for Wt_i at core

+--                 ______________ _____ _____ _____ _____ _____ _____ ___________ _____ _____ _____ _____ _____ _____ _____ _____ _____________________...

+--      Kt_i@core  ______________/__K0_/__K1_/__K2_/__K3_/__K4_/__K5_/__K6_______/__K7_/__K8_/__K9_/_K10_/_K11_/_K12_/_K13_/_K14_/_K15_________________...     -- Kt rom synchronous with scheduler for Kt_i at core

+--                 __ _ _ _                                                                                                                                            

+--      error_o    __ _ _ _\___________________________________________________________________________________________________________________________...     -- 'start_i' clears any error condition

+--                 __ _ _ _                                                                                                                                            

+--      do_valid_o __ _ _ _\___________________________________________________________________________________________________________________________...     -- 'start_i' invalidates any previous results

+--

+--

+--      UPDATE BLOCK (preload)

+--      =====================

+--

+--      At the start of each block, the 'di_req' signal is raised to request new data.

+--

+--      state       ... process  |next | data                                    |wait |                                                     | process                    

+--                    __    __    __    __    __    __    __    __    __    __   |__   |__    __    __    __    __    __    __    __    __    __ 

+--      clk_i      __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \...        -- system clock

+--                                                                                                                                                  

+--      end_i      ______________________________________________________________________________________________________________________________...        -- 'end_i' marks end of last block data input

+--                                      _____________________________________________________________________________________________________       

+--      di_req_o   ____________________/                                                                                                     \___...        -- 'di_req_o' asserted during data input

+--                                       ______________________________________       _________________________________________________________     

+--      wr_i       _____________________/                                      \_____/                                                         \_...        -- 'wr_i' can hold the core for slow data

+--                 _________________ _ ______ _____ _____ _____ _____ _____ ___________ _____ _____ _____ _____ _____ _____ _____ _____ _____ ____...

+--      di_i       _________________\\\___W0_\__W1_\__W2_\__W3_\__W4_\__W5_\\\\\\\\_W6_\__W7_\__W8_\__W9_\_W10_\_W11_\_W12_\_W13_\_W14_\_W15_\\_X_...       -- user words on 'di_i' are latched on 'clk_i' rising edge

+--                 

+--

+--      UPDATE BLOCK (delayed start)

+--      ===========================

+--

+--      The data for the new block can be delayed, by keeping the 'wr_i' signal low until the data is present at the data input port. 

+--

+--      state      ..|next | wait                  | data                                          |wait |                                         | process                    

+--                    __    __    __    __    __   |__    __    __    __    __    __    __    __   |__   |__    __    __    __    __    __    __    __ 

+--      clk_i      __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \...     -- system clock

+--                                                                                                                                                       

+--      end_i      ____________________________________________________________________________________________________________________________________...     -- 'end_i' marks end of last block data input

+--                          _______ _ _ ___________________________________________________________________________________________________________      

+--      di_req_o   ________/                                                                                                                       \___...     -- 'di_req_o' asserted during data input

+--                                             __________________________________________________       _____________________________________________    

+--      wr_i       ________________ _ _ ______/                                                  \_____/                                             \_...     -- 'wr_i' valid on rising edge of 'clk_i'

+--                 ________________ _ _ ___________ _____ _____ _____ _____ _____ _____ _____ ___________ _____ _____ _____ _____ _____ _____ _____ ____...

+--      di_i       ________________ _ _ ______\_W0_\__W1_\__W2_\__W3_\__W4_\__W5_\__W6_\__W7_\\\\_____W8_\__W9_\_W10_\_W11_\_W12_\_W13_\_W14_\_W15_\__Z_...     -- user words on 'di_i' are latched on 'clk_i' rising edge

+--                 

+--

+--      END BLOCK (success)

+--      ==================

+--

+--      At the end of the last block the signal 'end' must be raised for at least one clock cycle. 

+--      The 'bytes' input marks the number of valid bytes in the last word. 

+--      A PADDING state completes the last data block and a BLK_PROCESS finishes the hash computation.

+--      The 'do_valid' remains HIGH until the next RESET.

+--

+--      state      ..|next | data                              | padding         | process                     |next | valid     |reset| data     

+--                    __    __    __    __    __    __    __    __    __          __    __    __          __    __    __    __    __    __    __  

+--      clk_i      __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \_ _ _ __/  \__/  \__/  \_ _ _ __/  \__/  \__/  \__/  \__/  \__/  \__/  \_...     -- system clock

+--                                                                                                                              ______                    

+--      start_i    ____________________________________________________________________________________________________________/   \__\___________...     -- 'start_i' resets the processor and starts a new hash

+--                                                           ______                                                                               

+--      end_i      _________________________________________/      \______ _ _ ___________________ _ _ ___________________________________________...     -- 'end_i' marks end of last block data input

+--                          ___________________________________                                                                         __________  

+--      di_req_o   ________/                                   \__________ _ _ ___________________ _ _ ________________________________/          ...     -- 'di_req_o' asserted during data input

+--                           ______________________________________                                                                      _________  

+--      wr_i       _________/                                    \\\______ _ _ ___________________ _ _ _________________________________/         ...     -- 'wr_i' can hold the core for slow data

+--                 ______________ _____ _____ _____ _____ _____ __________ _ _ ___________________ _ _ ______________________________________ ____...

+--      di_i       _________\_W0_\__W1_\__W2_\__W3_\__W4_\__W5_\__________ _ _ ___________________ _ _ _________________________________\_W0_\__W1...     -- words after the end_i assertion are ignored

+--                 __ _____ _____ _____ _____ _____ _____ _____ _____ ____ _ ____ _____ _____ ____ _ _ ______________________________________ ____

+--      st_cnt_reg __/_64__/__0__/__1__/__2__/__3__/__4__/__5__/__6__/__7_ _ _15_/__16_/__17_/__18 _ _ __/__63_/__64_/______0__________/__0__/__1_...     -- internal state counter value

+--                          _____ _____ _____ _____ _____ _____                                                                         _____ ____

+--      bytes_i    --------<__0__\__0__\__0__\__0__\__0__\__3__>-----------------------------------------------------------------------<__0__\__0_...     -- bytes_i mark number of valid bytes in each word

+--                                                                                                                                                   

+--      error_o    _______________________________________________________ _ _ ___________________ _ _ ___________________________________________...     -- 'error_o' goes high on an invalid computation

+--                                                                                                                    ___________                 

+--      do_valid_o _______________________________________________________ _ _ ___________________ _ _ ______________/           \________________...     -- 'do_valid_o' goes high at the end of a computation

+--                                                                                                                    ___________                 

+--      H0_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H0______\________________...     -- H0 holds the bytes 0..3 of the output

+--                                                                                                                    ___________                                 

+--      H1_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H1______\________________...     -- H1 holds the bytes 4..7 of the output

+--                                                                                                                    ___________                            

+--      H2_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H2______\________________...     -- H2 holds the bytes 8..11 of the output

+--                                                                                                                    ___________                            

+--      H3_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H3______\________________...     -- H3 holds the bytes 12..15 of the output

+--                                                                                                                    ___________                            

+--      H4_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H4______\________________...     -- H4 holds the bytes 16..19 of the output

+--                                                                                                                    ___________                            

+--      H5_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H5______\________________...     -- H5 holds the bytes 20..23 of the output

+--                                                                                                                    ___________                            

+--      H6_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H6______\________________...     -- H6 holds the bytes 24..27 of the output

+--                                                                                                                    ___________                            

+--      H7_o       _______________________________________________________ _ _ ___________________ _ _ ______________/___H7______\________________...     -- H7 holds the bytes 28..31 of the output

+--

+--

+--      END BLOCK (full last block)

+--      ==================

+--

+--      If the last block has exactly 16 full words, the controller starts the block processing in the PADDING cycle, processes the input block, 

+--      and inserts a last PADDING block followed by a last BLK_PROCESS block.

+--

+--      state      ... data         |pad  | process   |next | pad                   | process   |next | valid     |reset| data

+--                 __    __    __    __    __          __    __    __          __    __          __    __    __    __    __    __     

+--      clk_i        \__/  \__/  \__/  \__/  \_ _ _ __/  \__/  \__/  \_ _ _ __/  \__/  \_ _ _ __/  \__/  \__/  \__/  \__/  \__/  \_...     -- system clock

+--                                                                                                               ______                  

+--      start_i    _____________________________________________________________________________________________/   \__\___________...     -- 'start_i' resets the processor and starts a new hash

+--                                ______                                                                                                      

+--      end_i      ______________/      \______ _ _ ___________________ _ _ _____________ _ _ _____________________________________...     -- 'end_i' marks end of last block data input

+--                 _________________                                                                                     __________  

+--      di_req_o                    \__________ _ _ ___________________ _ _ _____________ _ _ __________________________/          ...     -- 'di_req_o' asserted on rising edge of 'clk_i'

+--                 ____________________                                                                                   _________  

+--      wr_i                         \\\_______ _ _ ___________________ _ _ _____________ _ _ ___________________________/         ...     -- 'wr_i' valid on rising edge of 'clk_i'

+--                 _____ _____ _____ __________ _ _ ___________________ _ _ _____________ _ _ ________________________________ ____...

+--      di_i       _W13_\_W14_\_W15_\__________ _ _ ___________________ _ _ _____________ _ _ ___________________________\_W0_\__W1...     -- words after the end_i assertion are ignored

+--                 _____ _____ _____ _____ ____ _ ____ _____ _____ ____ _ _ ________ ____ _ ____ _____ _______________________ ____

+--      st_cnt_reg _13__/_14__/_15__/_16__/_17_ _ _63_/__64_/__0__/__1_ _ _ __/_15__/_16_ _ _63_/__64_/_____0_____/__0__/__0__/__1_...     -- internal state counter value

+--                 _____ _____ _____                                                                                     _____ ____

+--      bytes_i    __0__/__0__/__0__>-----------------------------------------------------------------------------------<__0__/__0_...     -- bytes_i mark number of valid bytes in each word

+--                                                                                                     ___________                 

+--      do_valid_o ____________________________ _ _ ___________________ _ _ __________________________/           \________________...     -- 'do_valid_o' goes high at the end of a computation

+--

+------------------------------ COPYRIGHT NOTICE -----------------------------------------------------------------------

+--                                                                   

+--      This file is part of the SHA256 HASH CORE project http://opencores.org/project,sha256_hash_core

+--                                                                   

+--      Author(s):      Jonny Doin, jdoin@opencores.org, jonnydoin@gridvortex.com, jonnydoin@gmail.com

+--                                                                   

+--      Copyright (C) 2016 Jonny Doin

+--      -----------------------------

+--                                                                   

+--      This source file may be used and distributed without restriction provided that this copyright statement is not    

+--      removed from the file and that any derivative work contains the original copyright notice and the associated 

+--      disclaimer. 

+--                                                                   

+--      This source file is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser 

+--      General Public License as published by the Free Software Foundation; either version 2.1 of the License, or 

+--      (at your option) any later version.

+--                                                                   

+--      This source is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied

+--      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more  

+--      details.

+--

+--      You should have received a copy of the GNU Lesser General Public License along with this source; if not, download 

+--      it from http://www.gnu.org/licenses/lgpl.txt

+--                                                                   

+------------------------------ REVISION HISTORY -----------------------------------------------------------------------

+--

+-- 2016/05/22   v0.01.0010  [JD]    started development. design of blocks and port interfaces.

+-- 2016/06/05   v0.01.0090  [JD]    all modules integrated. testbench for basic test vectors verification.

+-- 2016/06/05   v0.01.0095  [JD]    verification failed. misalignment of words in the datapath. 

+-- 2016/06/06   v0.01.0100  [JD]    first simulation verification against NIST-FIPS-180-4 test vectors "abc" passed.

+-- 2016/06/07   v0.01.0101  [JD]    failed 2-block test for "abcdbcdecd..." vector. Fixed padding control logic.

+-- 2016/06/07   v0.01.0105  [JD]    sha256 verification against all NIST-FIPS-180-4 test vectors passed.

+-- 2016/06/11   v0.01.0105  [JD]    verification against NIST-SHA2_Additional test vectors #1 to #10 passed.

+-- 2016/06/11   v0.01.0110  [JD]    optimized controller states, reduced 2 clocks per block. 

+-- 2016/06/18   v0.01.0120  [JD]    implemented error detection on 'bytes_i' input.

+-- 2016/09/25   v0.01.0220  [JD]    changed 'di_ack_i' name to 'di_wr_i', and changed semantics to 'data write'.

+-- 2016/10/01   v0.01.0250  [JD]    optimized the last null-padding state, making the algorithm isochronous for full last data blocks. 

+--

+-----------------------------------------------------------------------------------------------------------------------

+--  TODO

+--  ====

+--

+--

+-----------------------------------------------------------------------------------------------------------------------

+library ieee;

+use ieee.std_logic_1164.all;

+use ieee.numeric_std.all;

+

+entity testbench is

+    Generic (   

+        CLK_PERIOD : time := 10 ns;                     -- clock period for pclk_i (default 100MHz)

+        START_DELAY : time := 200 ns                    -- start delay between each run

+    );

+end testbench;

+

+architecture behavior of testbench is 

+

+    --=============================================================================================

+    -- Constants

+    --=============================================================================================

+    -- clock period

+    constant PCLK_PERIOD : time := CLK_PERIOD;          -- parallel high-speed clock

+    

+    --=============================================================================================

+    -- Signals for state machine control

+    --=============================================================================================

+

+    --=============================================================================================

+    -- Signals for internal operation

+    --=============================================================================================

+    --- clock signals ---

+    signal pclk             : std_logic := '1';                 -- 100MHz clock

+    signal dut_ce           : std_logic;

+    -- input data

+    signal dut_di           : std_logic_vector (31 downto 0);   -- big endian input message words

+    signal dut_bytes        : std_logic_vector (1 downto 0);    -- valid bytes in input word

+    -- start/end commands

+    signal dut_start        : std_logic;                        -- reset the processor and start a new hash

+    signal dut_end          : std_logic;                        -- marks end of last block data input

+    -- handshake

+    signal dut_di_req       : std_logic;                        -- requests data input for next word

+    signal dut_di_wr        : std_logic;                        -- high for di_i write, low for hold

+    signal dut_error        : std_logic;                        -- signalizes error. output data is invalid

+    signal dut_do_valid     : std_logic;                        -- when high, the output is valid

+    -- 256bit output registers

+    signal dut_H0           : std_logic_vector (31 downto 0);

+    signal dut_H1           : std_logic_vector (31 downto 0);

+    signal dut_H2           : std_logic_vector (31 downto 0);

+    signal dut_H3           : std_logic_vector (31 downto 0);

+    signal dut_H4           : std_logic_vector (31 downto 0);

+    signal dut_H5           : std_logic_vector (31 downto 0);

+    signal dut_H6           : std_logic_vector (31 downto 0);

+    signal dut_H7           : std_logic_vector (31 downto 0);

+

+    -- testbench control signals

+    signal words            : natural;

+    signal blocks           : natural;

+    signal test_case        : natural;

+begin

+

+    --=============================================================================================

+    -- INSTANTIATION FOR THE DEVICE UNDER TEST

+    --=============================================================================================

+	Inst_sha_256_dut: entity work.gv_sha256(rtl)

+        port map(

+            -- clock and core enable

+            clk_i => pclk,

+            ce_i => dut_ce,

+            -- input data

+            di_i => dut_di,

+            bytes_i => dut_bytes,

+            -- start/end commands

+            start_i => dut_start,

+            end_i => dut_end,

+            -- handshake

+            di_req_o => dut_di_req,

+            di_wr_i => dut_di_wr,

+            error_o => dut_error,

+            do_valid_o => dut_do_valid,

+            -- 256bit output registers 

+            H0_o => dut_H0,

+            H1_o => dut_H1,

+            H2_o => dut_H2,

+            H3_o => dut_H3,

+            H4_o => dut_H4,

+            H5_o => dut_H5,

+            H6_o => dut_H6,

+            H7_o => dut_H7

+        );

+

+    --=============================================================================================

+    -- CLOCK GENERATION

+    --=============================================================================================

+    pclk_proc: process is

+    begin

+        loop

+            pclk <= not pclk;

+            wait for PCLK_PERIOD / 2;

+        end loop;

+    end process pclk_proc;

+    --=============================================================================================

+    -- TEST BENCH STIMULI

+    --=============================================================================================

+    -- This testbench exercises the SHA256 toplevel with the NIST-FIPS-180-4 test vectors.

+    --

+    tb1 : process is

+        variable count_words  : natural := 0;

+        variable count_blocks : natural := 0;

+        variable temp_di      : unsigned (31 downto 0) := (others => '0');

+    begin

+        wait for START_DELAY; -- wait until global set/reset completes

+        -------------------------------------------------------------------------------------------

+        -- test vector 1

+        -- src: NIST-FIPS-180-4 

+        -- msg := "abc" 

+        -- hash:= BA7816BF 8F01CFEA 414140DE 5DAE2223 B00361A3 96177A9C B410FF61 F20015AD

+        test_case <= 1;

+        dut_ce <= '0';

+        dut_di <= (others => '0');

+        dut_bytes <= b"00";

+        dut_start <= '0';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        dut_ce <= '1';

+        dut_start <= '1';

+        dut_di <= x"61626300";

+        dut_bytes <= b"11";

+        wait until pclk'event and pclk = '1';

+        dut_start <= '0';

+        dut_di_wr <= '1';

+        if dut_di_req = '0' then

+            wait until dut_di_req = '1';

+        end if;

+        dut_end <= '1';

+        wait until pclk'event and pclk = '1';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        if dut_error /= '1' and dut_do_valid /= '1' then 

+            while dut_error /= '1' and dut_do_valid /= '1' loop

+                wait until pclk'event and pclk = '1';

+            end loop;

+        end if;

+        wait for CLK_PERIOD*20;

+

+        -- expected: BA7816BF 8F01CFEA 414140DE 5DAE2223 B00361A3 96177A9C B410FF61 F20015AD

+        assert dut_H0 = x"BA7816BF" report "test #1 failed on H0" severity error;

+        assert dut_H1 = x"8F01CFEA" report "test #1 failed on H1" severity error;

+        assert dut_H2 = x"414140DE" report "test #1 failed on H2" severity error;

+        assert dut_H3 = x"5DAE2223" report "test #1 failed on H3" severity error;

+        assert dut_H4 = x"B00361A3" report "test #1 failed on H4" severity error;

+        assert dut_H5 = x"96177A9C" report "test #1 failed on H5" severity error;

+        assert dut_H6 = x"B410FF61" report "test #1 failed on H6" severity error;

+        assert dut_H7 = x"F20015AD" report "test #1 failed on H7" severity error;

+        

+        -------------------------------------------------------------------------------------------

+        -- test vector 2

+        -- src: NIST-FIPS-180-4 

+        -- msg := "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"

+        -- hash:= 248D6A61 D20638B8 E5C02693 0C3E6039 A33CE459 64FF2167 F6ECEDD4 19DB06C1

+        test_case <= 2;

+        dut_ce <= '0';

+        dut_di <= (others => '0');

+        dut_bytes <= b"00";

+        dut_start <= '0';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        dut_ce <= '1';

+        dut_start <= '1';

+        wait until pclk'event and pclk = '1';   -- 'begin' pulse minimum width is one clock

+        wait for 25 ns;                         -- TEST: stretch 'begin' pulse

+        dut_start <= '0';

+        if dut_di_req = '0' then

+            wait until dut_di_req = '1';

+        end if;

+        wait until pclk'event and pclk = '1';

+        dut_di_wr <= '1';

+        dut_bytes <= b"00";

+        dut_di <= x"61626364";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"62636465";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"63646566";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"64656667";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"65666768";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"66676869";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6768696A";

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        dut_di_wr <= '1';                      -- TEST: slow inputs with 'wr_i' handshake

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"68696A6B";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"696A6B6C";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6A6B6C6D";

+        dut_bytes <= b"01";                     -- induce ERROR

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6B6C6D6E";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6C6D6E6F";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6D6E6F70";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6E6F7071";

+        dut_end <= '1';

+        wait until pclk'event and pclk = '1';   -- 'end' pulse minimum width is one clock

+        dut_bytes <= b"01";                     -- TEST: change 'bytes' value after END

+        wait for 75 ns;                         -- TEST: stretch 'end' pulse

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        if dut_error /= '1' and dut_do_valid /= '1' then 

+            while dut_error /= '1' and dut_do_valid /= '1' loop

+                wait until pclk'event and pclk = '1';

+            end loop;

+        end if;

+        wait for CLK_PERIOD*20;

+        -------------------------------------------------------------------------

+        -- restart test #2: force error by stretching the write strobe

+        dut_ce <= '0';

+        test_case <= 0;

+        wait until pclk'event and pclk = '1';

+        test_case <= 2;

+        dut_di <= (others => '0');

+        dut_bytes <= b"00";

+        dut_start <= '0';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        dut_ce <= '1';

+        dut_start <= '1';

+        wait until pclk'event and pclk = '1';   -- 'begin' pulse minimum width is one clock

+        wait for 25 ns;                         -- TEST: stretch 'begin' pulse

+        dut_start <= '0';

+        if dut_di_req = '0' then

+            wait until dut_di_req = '1';

+        end if;

+        wait until pclk'event and pclk = '1';

+        dut_di_wr <= '1';

+        dut_bytes <= b"00";

+        dut_di <= x"61626364";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"62636465";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"63646566";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"64656667";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"65666768";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"66676869";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6768696A";

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        dut_di_wr <= '1';                      -- TEST: slow inputs with 'wr_i' handshake

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"68696A6B";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"696A6B6C";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6A6B6C6D";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6B6C6D6E";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6C6D6E6F";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6D6E6F70";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6E6F7071";

+        wait for 75 ns;

+        dut_di_wr <= '0';

+        if dut_error /= '1' and dut_do_valid /= '1' then 

+            while dut_error /= '1' and dut_do_valid /= '1' loop

+                wait until pclk'event and pclk = '1';

+            end loop;

+        end if;

+        wait for CLK_PERIOD*20;

+        -------------------------------------------------------------------------

+        -- restart test #2

+        dut_ce <= '0';

+        test_case <= 0;

+        wait until pclk'event and pclk = '1';

+        test_case <= 2;

+        dut_di <= (others => '0');

+        dut_bytes <= b"00";

+        dut_start <= '0';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        dut_ce <= '1';

+        dut_start <= '1';

+        dut_di <= x"61626364";

+        dut_bytes <= b"00";

+        wait until pclk'event and pclk = '1';   -- 'begin' pulse minimum width is one clock

+        dut_start <= '0';

+        dut_di_wr <= '1';

+        if dut_di_req = '0' then

+            wait until dut_di_req = '1';

+        end if;

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"62636465";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"63646566";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"64656667";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"65666768";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"66676869";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6768696A";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"68696A6B";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"696A6B6C";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6A6B6C6D";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6B6C6D6E";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6C6D6E6F";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6D6E6F70";

+        wait until pclk'event and pclk = '1';

+        dut_di <= x"6E6F7071";

+        dut_end <= '1';

+        wait until pclk'event and pclk = '1';   -- 'end' pulse minimum width is one clock

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        if dut_error /= '1' and dut_do_valid /= '1' then 

+            while dut_error /= '1' and dut_do_valid /= '1' loop

+                wait until pclk'event and pclk = '1';

+            end loop;

+        end if;

+        wait for CLK_PERIOD*20;

+

+        -- expected: 248D6A61 D20638B8 E5C02693 0C3E6039 A33CE459 64FF2167 F6ECEDD4 19DB06C1

+        assert dut_H0 = x"248D6A61" report "test #2 failed on H0" severity error;

+        assert dut_H1 = x"D20638B8" report "test #2 failed on H1" severity error;

+        assert dut_H2 = x"E5C02693" report "test #2 failed on H2" severity error;

+        assert dut_H3 = x"0C3E6039" report "test #2 failed on H3" severity error;

+        assert dut_H4 = x"A33CE459" report "test #2 failed on H4" severity error;

+        assert dut_H5 = x"64FF2167" report "test #2 failed on H5" severity error;

+        assert dut_H6 = x"F6ECEDD4" report "test #2 failed on H6" severity error;

+        assert dut_H7 = x"19DB06C1" report "test #2 failed on H7" severity error;

+

+        -------------------------------------------------------------------------------------------

+        -- test vector 3

+        -- src: NIST-ADDITIONAL-SHA256

+        -- #1) 1 byte 0xbd

+        -- msg := x"bd"

+        -- hash:= 68325720 aabd7c82 f30f554b 313d0570 c95accbb 7dc4b5aa e11204c0 8ffe732b

+        test_case <= 3;

+        dut_ce <= '0';

+        dut_di <= (others => '0');

+        dut_bytes <= b"00";

+        dut_start <= '0';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        dut_ce <= '1';

+        dut_start <= '1';

+        dut_di <= x"bd000000";

+        dut_bytes <= b"01";

+        wait until pclk'event and pclk = '1';

+        dut_start <= '0';

+        dut_di_wr <= '1';

+        if dut_di_req = '0' then

+            wait until dut_di_req = '1';

+        end if;

+        dut_end <= '1';

+        wait until pclk'event and pclk = '1';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        if dut_error /= '1' and dut_do_valid /= '1' then 

+            while dut_error /= '1' and dut_do_valid /= '1' loop

+                wait until pclk'event and pclk = '1';

+            end loop;

+        end if;

+        wait for CLK_PERIOD*20;

+

+        -- expected: 68325720 aabd7c82 f30f554b 313d0570 c95accbb 7dc4b5aa e11204c0 8ffe732b

+        assert dut_H0 = x"68325720" report "test #3 failed on H0" severity error;

+        assert dut_H1 = x"aabd7c82" report "test #3 failed on H1" severity error;

+        assert dut_H2 = x"f30f554b" report "test #3 failed on H2" severity error;

+        assert dut_H3 = x"313d0570" report "test #3 failed on H3" severity error;

+        assert dut_H4 = x"c95accbb" report "test #3 failed on H4" severity error;

+        assert dut_H5 = x"7dc4b5aa" report "test #3 failed on H5" severity error;

+        assert dut_H6 = x"e11204c0" report "test #3 failed on H6" severity error;

+        assert dut_H7 = x"8ffe732b" report "test #3 failed on H7" severity error;

+        

+        -------------------------------------------------------------------------------------------

+        -- test vector 4

+        -- src: NIST-ADDITIONAL-SHA256

+        -- #2) 4 bytes 0xc98c8e55

+        -- msg := x"c98c8e55"

+        -- hash:= 7abc22c0 ae5af26c e93dbb94 433a0e0b 2e119d01 4f8e7f65 bd56c61c cccd9504

+        test_case <= 4;

+        dut_ce <= '0';

+        dut_di <= (others => '0');

+        dut_bytes <= b"00";

+        dut_start <= '0';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        dut_ce <= '1';

+        dut_start <= '1';

+        dut_di <= x"c98c8e55";

+        dut_bytes <= b"00";

+        wait until pclk'event and pclk = '1';

+        dut_start <= '0';

+        dut_di_wr <= '1';

+        if dut_di_req = '0' then

+            wait until dut_di_req = '1';

+        end if;

+        dut_di_wr <= '1';

+        dut_end <= '1';

+        wait until pclk'event and pclk = '1';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        if dut_error /= '1' and dut_do_valid /= '1' then 

+            while dut_error /= '1' and dut_do_valid /= '1' loop

+                wait until pclk'event and pclk = '1';

+            end loop;

+        end if;

+        wait for CLK_PERIOD*20;

+

+        -- expected: 7abc22c0 ae5af26c e93dbb94 433a0e0b 2e119d01 4f8e7f65 bd56c61c cccd9504 

+        assert dut_H0 = x"7abc22c0" report "test #4 failed on H0" severity error;

+        assert dut_H1 = x"ae5af26c" report "test #4 failed on H1" severity error;

+        assert dut_H2 = x"e93dbb94" report "test #4 failed on H2" severity error;

+        assert dut_H3 = x"433a0e0b" report "test #4 failed on H3" severity error;

+        assert dut_H4 = x"2e119d01" report "test #4 failed on H4" severity error;

+        assert dut_H5 = x"4f8e7f65" report "test #4 failed on H5" severity error;

+        assert dut_H6 = x"bd56c61c" report "test #4 failed on H6" severity error;

+        assert dut_H7 = x"cccd9504" report "test #4 failed on H7" severity error;

+        

+        -------------------------------------------------------------------------------------------

+        -- test vector 5

+        -- src: NIST-ADDITIONAL-SHA256

+        -- #3) 55 bytes of zeros

+        -- msg := 55 x"00"

+        -- hash:= 02779466 cdec1638 11d07881 5c633f21 90141308 1449002f 24aa3e80 f0b88ef7

+        test_case <= 5;

+        dut_ce <= '0';

+        dut_di <= (others => '0');

+        dut_bytes <= b"00";

+        dut_start <= '0';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        dut_ce <= '1';

+        dut_start <= '1';

+        dut_di <= x"00000000";

+        dut_bytes <= b"00";

+        wait until pclk'event and pclk = '1';

+        dut_start <= '0';

+        dut_di_wr <= '1';

+        if dut_di_req = '0' then

+            wait until dut_di_req = '1';

+        end if;

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        dut_end <= '1';

+        dut_bytes <= b"11";

+        wait until pclk'event and pclk = '1';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        if dut_error /= '1' and dut_do_valid /= '1' then 

+            while dut_error /= '1' and dut_do_valid /= '1' loop

+                wait until pclk'event and pclk = '1';

+            end loop;

+        end if;

+        wait for CLK_PERIOD*20;

+

+        -- expected: 02779466 cdec1638 11d07881 5c633f21 90141308 1449002f 24aa3e80 f0b88ef7

+        assert dut_H0 = x"02779466" report "test #5 failed on H0" severity error;

+        assert dut_H1 = x"cdec1638" report "test #5 failed on H1" severity error;

+        assert dut_H2 = x"11d07881" report "test #5 failed on H2" severity error;

+        assert dut_H3 = x"5c633f21" report "test #5 failed on H3" severity error;

+        assert dut_H4 = x"90141308" report "test #5 failed on H4" severity error;

+        assert dut_H5 = x"1449002f" report "test #5 failed on H5" severity error;

+        assert dut_H6 = x"24aa3e80" report "test #5 failed on H6" severity error;

+        assert dut_H7 = x"f0b88ef7" report "test #5 failed on H7" severity error;

+        

+        -------------------------------------------------------------------------------------------

+        -- test vector 6

+        -- src: NIST-ADDITIONAL-SHA256

+        -- #4) 56 bytes of zeros

+        -- msg := 56 x"00"

+        -- hash:= d4817aa5 497628e7 c77e6b60 6107042b bba31308 88c5f47a 375e6179 be789fbb

+        test_case <= 6;

+        dut_ce <= '0';

+        dut_di <= (others => '0');

+        dut_bytes <= b"00";

+        dut_start <= '0';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        dut_ce <= '1';

+        dut_start <= '1';

+        dut_di <= x"00000000";

+        dut_bytes <= b"00";

+        wait until pclk'event and pclk = '1';

+        dut_start <= '0';

+        dut_di_wr <= '1';

+        if dut_di_req = '0' then

+            wait until dut_di_req = '1';

+        end if;

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        dut_end <= '1';

+        wait until pclk'event and pclk = '1';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        if dut_error /= '1' and dut_do_valid /= '1' then 

+            while dut_error /= '1' and dut_do_valid /= '1' loop

+                wait until pclk'event and pclk = '1';

+            end loop;

+        end if;

+        wait for CLK_PERIOD*20;

+

+        -- expected: d4817aa5 497628e7 c77e6b60 6107042b bba31308 88c5f47a 375e6179 be789fbb

+        assert dut_H0 = x"d4817aa5" report "test #6 failed on H0" severity error;

+        assert dut_H1 = x"497628e7" report "test #6 failed on H1" severity error;

+        assert dut_H2 = x"c77e6b60" report "test #6 failed on H2" severity error;

+        assert dut_H3 = x"6107042b" report "test #6 failed on H3" severity error;

+        assert dut_H4 = x"bba31308" report "test #6 failed on H4" severity error;

+        assert dut_H5 = x"88c5f47a" report "test #6 failed on H5" severity error;

+        assert dut_H6 = x"375e6179" report "test #6 failed on H6" severity error;

+        assert dut_H7 = x"be789fbb" report "test #6 failed on H7" severity error;

+        

+        -------------------------------------------------------------------------------------------

+        -- test vector 7

+        -- src: NIST-ADDITIONAL-SHA256

+        -- #5) 57 bytes of zeros

+        -- msg := 57 x"00"

+        -- hash:= 65a16cb7 861335d5 ace3c607 18b5052e 44660726 da4cd13b b745381b 235a1785

+        test_case <= 7;

+        dut_ce <= '0';

+        dut_di <= (others => '0');

+        dut_bytes <= b"00";

+        dut_start <= '0';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        dut_ce <= '1';

+        dut_start <= '1';

+        dut_di <= x"00000000";

+        dut_bytes <= b"00";

+        wait until pclk'event and pclk = '1';

+        dut_start <= '0';

+        dut_di_wr <= '1';

+        if dut_di_req = '0' then

+            wait until dut_di_req = '1';

+        end if;

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        dut_end <= '1';

+        dut_bytes <= b"01";

+        wait until pclk'event and pclk = '1';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        if dut_error /= '1' and dut_do_valid /= '1' then 

+            while dut_error /= '1' and dut_do_valid /= '1' loop

+                wait until pclk'event and pclk = '1';

+            end loop;

+        end if;

+        wait for CLK_PERIOD*20;

+

+        -- expected: 65a16cb7 861335d5 ace3c607 18b5052e 44660726 da4cd13b b745381b 235a1785

+        assert dut_H0 = x"65a16cb7" report "test #7 failed on H0" severity error;

+        assert dut_H1 = x"861335d5" report "test #7 failed on H1" severity error;

+        assert dut_H2 = x"ace3c607" report "test #7 failed on H2" severity error;

+        assert dut_H3 = x"18b5052e" report "test #7 failed on H3" severity error;

+        assert dut_H4 = x"44660726" report "test #7 failed on H4" severity error;

+        assert dut_H5 = x"da4cd13b" report "test #7 failed on H5" severity error;

+        assert dut_H6 = x"b745381b" report "test #7 failed on H6" severity error;

+        assert dut_H7 = x"235a1785" report "test #7 failed on H7" severity error;

+        

+        -------------------------------------------------------------------------------------------

+        -- test vector 8

+        -- src: NIST-ADDITIONAL-SHA256

+        -- #6) 64 bytes of zeros

+        -- msg := 64 x"00"

+        -- hash:= f5a5fd42 d16a2030 2798ef6e d309979b 43003d23 20d9f0e8 ea9831a9 2759fb4b

+        test_case <= 8;

+        dut_ce <= '0';

+        dut_di <= (others => '0');

+        dut_bytes <= b"00";

+        dut_start <= '0';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        dut_ce <= '1';

+        dut_start <= '1';

+        dut_di <= x"00000000";

+        dut_bytes <= b"00";

+        wait until pclk'event and pclk = '1';

+        dut_start <= '0';

+        dut_di_wr <= '1';

+        if dut_di_req = '0' then

+            wait until dut_di_req = '1';

+        end if;

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        wait until pclk'event and pclk = '1';

+        dut_end <= '1';

+        wait until pclk'event and pclk = '1';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        if dut_error /= '1' and dut_do_valid /= '1' then 

+            while dut_error /= '1' and dut_do_valid /= '1' loop

+                wait until pclk'event and pclk = '1';

+            end loop;

+        end if;

+        wait for CLK_PERIOD*20;

+

+        -- expected: f5a5fd42 d16a2030 2798ef6e d309979b 43003d23 20d9f0e8 ea9831a9 2759fb4b

+        assert dut_H0 = x"f5a5fd42" report "test #8 failed on H0" severity error;

+        assert dut_H1 = x"d16a2030" report "test #8 failed on H1" severity error;

+        assert dut_H2 = x"2798ef6e" report "test #8 failed on H2" severity error;

+        assert dut_H3 = x"d309979b" report "test #8 failed on H3" severity error;

+        assert dut_H4 = x"43003d23" report "test #8 failed on H4" severity error;

+        assert dut_H5 = x"20d9f0e8" report "test #8 failed on H5" severity error;

+        assert dut_H6 = x"ea9831a9" report "test #8 failed on H6" severity error;

+        assert dut_H7 = x"2759fb4b" report "test #8 failed on H7" severity error;

+        

+        -------------------------------------------------------------------------------------------

+        -- test vector 9

+        -- src: NIST-ADDITIONAL-SHA256

+        -- #7) 1000 bytes of zeros

+        -- msg := 1000 x"00"

+        -- hash:= 541b3e9d aa09b20b f85fa273 e5cbd3e8 0185aa4e c298e765 db87742b 70138a53

+        test_case <= 9;

+        dut_ce <= '0';

+        dut_di <= (others => '0');

+        dut_bytes <= b"00";

+        dut_start <= '0';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        dut_ce <= '1';

+        dut_start <= '1';

+        wait until pclk'event and pclk = '1';

+        dut_start <= '0';

+        dut_bytes <= b"00";

+        dut_di <= x"00000000";

+        count_words := 0;

+        words <= count_words;

+        count_blocks := 0;

+        blocks <= count_blocks;

+        loop

+            wait until dut_di_req = '1';

+            wait until pclk'event and pclk = '1';

+            dut_di_wr <= '1';

+            loop

+                wait until pclk'event and pclk = '1';

+                count_words := count_words + 1;

+                words <= count_words;

+                exit when words = 15;

+            end loop;

+            dut_di_wr <= '0';

+            count_words := 0;

+            words <= count_words;

+            count_blocks := count_blocks + 1;

+            blocks <= count_blocks;

+            exit when blocks = 14;

+        end loop;

+        count_words := 0;

+        words <= count_words;

+        wait until dut_di_req = '1';

+        wait until pclk'event and pclk = '1';

+        dut_di_wr <= '1';

+        loop

+            wait until pclk'event and pclk = '1';

+            count_words := count_words + 1;

+            words <= count_words;

+            exit when words = 8;

+        end loop;

+        dut_end <= '1';

+        wait until pclk'event and pclk = '1';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        if dut_error /= '1' and dut_do_valid /= '1' then 

+            while dut_error /= '1' and dut_do_valid /= '1' loop

+                wait until pclk'event and pclk = '1';

+            end loop;

+        end if;

+        wait for CLK_PERIOD*20;

+

+        -- expected: 541b3e9d aa09b20b f85fa273 e5cbd3e8 0185aa4e c298e765 db87742b 70138a53

+        assert dut_H0 = x"541b3e9d" report "test #9 failed on H0" severity error;

+        assert dut_H1 = x"aa09b20b" report "test #9 failed on H1" severity error;

+        assert dut_H2 = x"f85fa273" report "test #9 failed on H2" severity error;

+        assert dut_H3 = x"e5cbd3e8" report "test #9 failed on H3" severity error;

+        assert dut_H4 = x"0185aa4e" report "test #9 failed on H4" severity error;

+        assert dut_H5 = x"c298e765" report "test #9 failed on H5" severity error;

+        assert dut_H6 = x"db87742b" report "test #9 failed on H6" severity error;

+        assert dut_H7 = x"70138a53" report "test #9 failed on H7" severity error;

+        

+        -------------------------------------------------------------------------------------------

+        -- test vector 10

+        -- src: NIST-ADDITIONAL-SHA256

+        -- #8) 1000 bytes of 0x41 'A'

+        -- msg := 1000 x"41"

+        -- hash:= c2e68682 3489ced2 017f6059 b8b23931 8b6364f6 dcd835d0 a519105a 1eadd6e4

+        test_case <= 10;

+        dut_ce <= '0';

+        dut_di <= (others => '0');

+        dut_bytes <= b"00";

+        dut_start <= '0';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        dut_ce <= '1';

+        dut_start <= '1';

+        wait until pclk'event and pclk = '1';

+        dut_start <= '0';

+        dut_bytes <= b"00";

+        dut_di <= x"41414141";

+        count_words := 0;

+        words <= count_words;

+        count_blocks := 0;

+        blocks <= count_blocks;

+        loop

+            wait until dut_di_req = '1';

+            wait until pclk'event and pclk = '1';

+            dut_di_wr <= '1';

+            loop

+                wait until pclk'event and pclk = '1';

+                count_words := count_words + 1;

+                words <= count_words;

+                exit when words = 15;

+            end loop;

+            dut_di_wr <= '0';

+            count_words := 0;

+            words <= count_words;

+            count_blocks := count_blocks + 1;

+            blocks <= count_blocks;

+            exit when blocks = 14;

+        end loop;

+        count_words := 0;

+        words <= count_words;

+        wait until dut_di_req = '1';

+        wait until pclk'event and pclk = '1';

+        dut_di_wr <= '1';

+        loop

+            wait until pclk'event and pclk = '1';

+            count_words := count_words + 1;

+            words <= count_words;

+            exit when words = 8;

+        end loop;

+        dut_end <= '1';

+        wait until pclk'event and pclk = '1';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        if dut_error /= '1' and dut_do_valid /= '1' then 

+            while dut_error /= '1' and dut_do_valid /= '1' loop

+                wait until pclk'event and pclk = '1';

+            end loop;

+        end if;

+        wait for CLK_PERIOD*20;

+

+        -- expected: c2e68682 3489ced2 017f6059 b8b23931 8b6364f6 dcd835d0 a519105a 1eadd6e4

+        assert dut_H0 = x"c2e68682" report "test #10 failed on H0" severity error;

+        assert dut_H1 = x"3489ced2" report "test #10 failed on H1" severity error;

+        assert dut_H2 = x"017f6059" report "test #10 failed on H2" severity error;

+        assert dut_H3 = x"b8b23931" report "test #10 failed on H3" severity error;

+        assert dut_H4 = x"8b6364f6" report "test #10 failed on H4" severity error;

+        assert dut_H5 = x"dcd835d0" report "test #10 failed on H5" severity error;

+        assert dut_H6 = x"a519105a" report "test #10 failed on H6" severity error;

+        assert dut_H7 = x"1eadd6e4" report "test #10 failed on H7" severity error;

+        

+        -------------------------------------------------------------------------------------------

+        -- test vector 11

+        -- src: NIST-ADDITIONAL-SHA256

+        -- #9) 1005 bytes of 0x55 'U'

+        -- msg := 1000 x"55"

+        -- hash:= f4d62dde c0f3dd90 ea1380fa 16a5ff8d c4c54b21 740650f2 4afc4120 903552b0

+        test_case <= 11;

+        dut_ce <= '0';

+        dut_di <= (others => '0');

+        dut_bytes <= b"00";

+        dut_start <= '0';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        dut_ce <= '1';

+        dut_start <= '1';

+        wait until pclk'event and pclk = '1';

+        dut_start <= '0';

+        dut_bytes <= b"00";

+        dut_di <= x"55555555";

+        count_words := 0;

+        words <= count_words;

+        count_blocks := 0;

+        blocks <= count_blocks;

+        loop

+            wait until dut_di_req = '1';

+            wait until pclk'event and pclk = '1';

+            dut_di_wr <= '1';

+            loop

+                wait until pclk'event and pclk = '1';

+                count_words := count_words + 1;

+                words <= count_words;

+                exit when words = 15;

+            end loop;

+            dut_di_wr <= '0';

+            count_words := 0;

+            words <= count_words;

+            count_blocks := count_blocks + 1;

+            blocks <= count_blocks;

+            exit when blocks = 14;

+        end loop;

+        count_words := 0;

+        words <= count_words;

+        wait until dut_di_req = '1';

+        wait until pclk'event and pclk = '1';

+        dut_di_wr <= '1';

+        loop

+            wait until pclk'event and pclk = '1';

+            count_words := count_words + 1;

+            words <= count_words;

+            exit when words = 9;

+        end loop;

+        wait until pclk'event and pclk = '1';

+        dut_bytes <= b"01";

+        dut_end <= '1';

+        wait until pclk'event and pclk = '1';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        if dut_error /= '1' and dut_do_valid /= '1' then 

+            while dut_error /= '1' and dut_do_valid /= '1' loop

+                wait until pclk'event and pclk = '1';

+            end loop;

+        end if;

+        wait for CLK_PERIOD*20;

+

+        -- expected: f4d62dde c0f3dd90 ea1380fa 16a5ff8d c4c54b21 740650f2 4afc4120 903552b0

+        assert dut_H0 = x"f4d62dde" report "test #11 failed on H0" severity error;

+        assert dut_H1 = x"c0f3dd90" report "test #11 failed on H1" severity error;

+        assert dut_H2 = x"ea1380fa" report "test #11 failed on H2" severity error;

+        assert dut_H3 = x"16a5ff8d" report "test #11 failed on H3" severity error;

+        assert dut_H4 = x"c4c54b21" report "test #11 failed on H4" severity error;

+        assert dut_H5 = x"740650f2" report "test #11 failed on H5" severity error;

+        assert dut_H6 = x"4afc4120" report "test #11 failed on H6" severity error;

+        assert dut_H7 = x"903552b0" report "test #11 failed on H7" severity error;

+        

+        -------------------------------------------------------------------------------------------

+        -- test vector 12

+        -- src: NIST-ADDITIONAL-SHA256

+        -- #10) 1000000 bytes of zeros

+        -- msg := 1000000 x"00"

+        -- hash:= d29751f2 649b32ff 572b5e0a 9f541ea6 60a50f94 ff0beedf b0b692b9 24cc8025

+        test_case <= 12;

+        dut_ce <= '0';

+        dut_di <= (others => '0');

+        dut_bytes <= b"00";

+        dut_start <= '0';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        wait until pclk'event and pclk = '1';

+        dut_ce <= '1';

+        dut_start <= '1';

+        wait until pclk'event and pclk = '1';

+        dut_start <= '0';

+        dut_bytes <= b"00";

+        dut_di <= x"00000000";

+        count_words := 0;

+        words <= count_words;

+        count_blocks := 0;

+        blocks <= count_blocks;

+        loop

+            wait until dut_di_req = '1';

+            wait until pclk'event and pclk = '1';

+            dut_di_wr <= '1';

+            loop

+                wait until pclk'event and pclk = '1';

+                count_words := count_words + 1;

+                words <= count_words;

+                exit when words = 15;

+            end loop;

+            dut_di_wr <= '0';

+            count_words := 0;

+            words <= count_words;

+            count_blocks := count_blocks + 1;

+            blocks <= count_blocks;

+            exit when blocks = 15623;

+        end loop;

+        count_words := 0;

+        words <= count_words;

+        wait until dut_di_req = '1';

+        wait until pclk'event and pclk = '1';

+        dut_di_wr <= '1';

+        loop

+            wait until pclk'event and pclk = '1';

+            count_words := count_words + 1;

+            words <= count_words;

+            exit when words = 14;

+        end loop;

+        dut_end <= '1';

+        wait until pclk'event and pclk = '1';

+        dut_end <= '0';

+        dut_di_wr <= '0';

+        if dut_error /= '1' and dut_do_valid /= '1' then 

+            while dut_error /= '1' and dut_do_valid /= '1' loop

+                wait until pclk'event and pclk = '1';

+            end loop;

+        end if;

+        wait for CLK_PERIOD*20;

+

+        -- expected: d29751f2 649b32ff 572b5e0a 9f541ea6 60a50f94 ff0beedf b0b692b9 24cc8025

+        assert dut_H0 = x"d29751f2" report "test #12 failed on H0" severity error;

+        assert dut_H1 = x"649b32ff" report "test #12 failed on H1" severity error;

+        assert dut_H2 = x"572b5e0a" report "test #12 failed on H2" severity error;

+        assert dut_H3 = x"9f541ea6" report "test #12 failed on H3" severity error;

+        assert dut_H4 = x"60a50f94" report "test #12 failed on H4" severity error;

+        assert dut_H5 = x"ff0beedf" report "test #12 failed on H5" severity error;

+        assert dut_H6 = x"b0b692b9" report "test #12 failed on H6" severity error;

+        assert dut_H7 = x"24cc8025" report "test #12 failed on H7" severity error;

+

+

+        assert false report "End Simulation" severity failure; -- stop simulation

+    end process tb1;

+    --  End Test Bench 

+END;

diff --git a/verilog/rtl/opencore_hasher/wave.ghw b/verilog/rtl/opencore_hasher/wave.ghw
new file mode 100755
index 0000000..58c022f
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/wave.ghw
Binary files differ
diff --git a/verilog/rtl/opencore_hasher/work-obj93.cf b/verilog/rtl/opencore_hasher/work-obj93.cf
new file mode 100755
index 0000000..111e92e
--- /dev/null
+++ b/verilog/rtl/opencore_hasher/work-obj93.cf
@@ -0,0 +1,28 @@
+v 4
+file . "sha256_test.vhd" "f1efabeebed5214ce18ab6c6e5016693c442a5bb" "20220528165543.057":
+  entity testbench at 210( 24082) + 0 on 27;
+  architecture behavior of testbench at 221( 24411) + 0 on 28;
+file . "sha256_regs.vhd" "b9f2ad25b22857f96daf6074a22f73895c9d0d20" "20220528165501.808":
+  entity sha256_regs at 51( 3370) + 0 on 23;
+  architecture rtl of sha256_regs at 95( 6117) + 0 on 24;
+file . "sha256_msg_sch.vhd" "14439ed9b692d079a254ae432215955400927f55" "20220528165501.797":
+  entity sha256_msg_sch at 49( 3221) + 0 on 19;
+  architecture rtl of sha256_msg_sch at 64( 3945) + 0 on 20;
+file . "sha256_Ki_rom.vhd" "640ea588c8916859276a8d77b0cfa273b26dbe76" "20220528165501.786":
+  entity sha256_ki_rom at 52( 3300) + 0 on 15;
+  architecture behavioral of sha256_ki_rom at 69( 4032) + 0 on 16;
+file . "sha256_control.vhd" "d58a8fcfde113550506d450e680a97efc0f260da" "20220528163721.834":
+  entity sha256_control at 246( 27857) + 0 on 11;
+  architecture rtl of sha256_control at 278( 30388) + 0 on 12;
+file . "sha256_hash_core.vhd" "8b364f812d791f909883188c6b389ed7aa4546e7" "20220528165501.782":
+  entity sha256_hash_core at 55( 3844) + 0 on 13;
+  architecture rtl of sha256_hash_core at 86( 6066) + 0 on 14;
+file . "sha256_Kt_rom.vhd" "fdb82f96cf4686ca4d13e86d8c48bee201f6a801" "20220528165501.792":
+  entity sha256_kt_rom at 55( 3430) + 0 on 17;
+  architecture behavioral of sha256_kt_rom at 66( 3799) + 0 on 18;
+file . "sha256_padding.vhd" "c6095a0d6fe5dccb4df01cea1267c207baeede26" "20220528165501.803":
+  entity sha256_padding at 53( 3577) + 0 on 21;
+  architecture rtl of sha256_padding at 70( 4534) + 0 on 22;
+file . "gv_sha256.vhd" "342ab9df5eb4315826013f83389fbe934d0af809" "20220528165527.420":
+  entity gv_sha256 at 75( 5513) + 0 on 25;
+  architecture rtl of gv_sha256 at 108( 7292) + 0 on 26;