library ieee; library std; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use ieee.std_logic_textio.all; use std.textio.all; entity sha512_hu_unit is port ( clk,reset,enable_hu : in std_logic; a,b,c,d,e,f,g,h : in unsigned(63 downto 0); h0,h1,h2,h3,h4,h5,h6,h7 : out unsigned(63 downto 0); output_hash : in std_logic; hash_output : out unsigned(511 downto 0) ); end entity; architecture struct of sha512_hu_unit is signal current_hash : unsigned(511 downto 0); alias ht is current_hash( 63 downto 0); alias gt is current_hash(127 downto 64); alias ft is current_hash(191 downto 128); alias et is current_hash(255 downto 192); alias dt is current_hash(319 downto 256); alias ct is current_hash(383 downto 320); alias bt is current_hash(447 downto 384); alias at is current_hash(511 downto 448); begin process (clk,reset, enable_hu, output_hash,current_hash) begin if( reset = '0' ) then at <= x"6a09e667f3bcc908"; bt <= x"bb67ae8584caa73b"; ct <= x"3c6ef372fe94f82b"; dt <= x"a54ff53a5f1d36f1"; et <= x"510e527fade682d1"; ft <= x"9b05688c2b3e6c1f"; gt <= x"1f83d9abfb41bd6b"; ht <= x"5be0cd19137e2179"; elsif (clk'event and clk= '1') then if ( enable_hu = '1') then ht <= ht + h; gt <= gt + g; ft <= ft + f; et <= et + e; dt <= dt + d; ct <= ct + c; bt <= bt + b; at <= at + a; elsif( output_hash = '1' ) then --current_hash <= current_hash(447 downto 0) & x"0000000000000000"; hash_output <= current_hash; end if; end if; end process; --hash_output <= current_hash(511 downto 448); h7 <= ht; h6 <= gt; h5 <= ft; h4 <= et; h3 <= dt; h2 <= ct; h1 <= bt; h0 <= at; end architecture;