OpenCores
URL https://opencores.org/ocsvn/sha256_hash_core/sha256_hash_core/trunk

Subversion Repositories sha256_hash_core

[/] [sha256_hash_core/] [trunk/] [syn/] [sha256/] [sha256_regs.vhd] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jdoin
-----------------------------------------------------------------------------------------------------------------------
2
-- Author:          Jonny Doin, jdoin@opencores.org, jonnydoin@gmail.com
3
-- 
4
-- Create Date:     09:56:30 07/06/2011  
5
-- Module Name:     sha256_regs - RTL
6
-- Project Name:    sha256 processor
7
-- Target Devices:  Spartan-6
8
-- Tool versions:   ISE 14.7
9
-- Description: 
10
--
11
--      The regs block has the output result registers for the SHA256 processor.
12
--      It is a single-cycle 256bit Accumulator for the block hash results, and can be implemented
13
--      as a 32bit MUX and a 32bit carry chain for each register.
14
--
15
------------------------------ COPYRIGHT NOTICE -----------------------------------------------------------------------
16
--                                                                   
17
--                                                                   
18
--      Author(s):      Jonny Doin, jonnydoin@gridvortex.com, jonnydoin@gmail.com
19
--                                                                   
20
--      Copyright (C) 2016 GridVortex, All Rights Reserved
21
--      --------------------------------------------------
22
--                                                                   
23
------------------------------ REVISION HISTORY -----------------------------------------------------------------------
24
--
25
-- 2016/05/22   v0.01.0010  [JD]    started development. design of blocks and port interfaces.
26
-- 2016/06/05   v0.01.0090  [JD]    all modules integrated. testbench for basic test vectors verification.
27
-- 2016/06/05   v0.01.0095  [JD]    verification failed. misalignment of words in the datapath. 
28
-- 2016/06/06   v0.01.0100  [JD]    first simulation verification against NIST-FIPS-180-4 test vectors passed.
29
--
30
-----------------------------------------------------------------------------------------------------------------------
31
--  TODO
32
--  ====
33
--
34
-----------------------------------------------------------------------------------------------------------------------
35
library ieee;
36
use ieee.std_logic_1164.all;
37
use ieee.numeric_std.all;
38
 
39
entity sha256_regs is
40
    port (
41
        clk_i : in std_logic := 'X';                                            -- system clock
42
        ce_i : in std_logic := 'X';                                             -- clock enable from control logic
43
        ld_i : in std_logic := 'X';                                             -- internal mux selection from control logic
44
        A_i : in std_logic_vector (31 downto 0) := (others => 'X');
45
        B_i : in std_logic_vector (31 downto 0) := (others => 'X');
46
        C_i : in std_logic_vector (31 downto 0) := (others => 'X');
47
        D_i : in std_logic_vector (31 downto 0) := (others => 'X');
48
        E_i : in std_logic_vector (31 downto 0) := (others => 'X');
49
        F_i : in std_logic_vector (31 downto 0) := (others => 'X');
50
        G_i : in std_logic_vector (31 downto 0) := (others => 'X');
51
        H_i : in std_logic_vector (31 downto 0) := (others => 'X');
52
        K0_i : in std_logic_vector (31 downto 0) := (others => 'X');
53
        K1_i : in std_logic_vector (31 downto 0) := (others => 'X');
54
        K2_i : in std_logic_vector (31 downto 0) := (others => 'X');
55
        K3_i : in std_logic_vector (31 downto 0) := (others => 'X');
56
        K4_i : in std_logic_vector (31 downto 0) := (others => 'X');
57
        K5_i : in std_logic_vector (31 downto 0) := (others => 'X');
58
        K6_i : in std_logic_vector (31 downto 0) := (others => 'X');
59
        K7_i : in std_logic_vector (31 downto 0) := (others => 'X');
60
        N0_o : out std_logic_vector (31 downto 0) := (others => 'X');
61
        N1_o : out std_logic_vector (31 downto 0) := (others => 'X');
62
        N2_o : out std_logic_vector (31 downto 0) := (others => 'X');
63
        N3_o : out std_logic_vector (31 downto 0) := (others => 'X');
64
        N4_o : out std_logic_vector (31 downto 0) := (others => 'X');
65
        N5_o : out std_logic_vector (31 downto 0) := (others => 'X');
66
        N6_o : out std_logic_vector (31 downto 0) := (others => 'X');
67
        N7_o : out std_logic_vector (31 downto 0) := (others => 'X');
68
        H0_o : out std_logic_vector (31 downto 0) := (others => 'X');
69
        H1_o : out std_logic_vector (31 downto 0) := (others => 'X');
70
        H2_o : out std_logic_vector (31 downto 0) := (others => 'X');
71
        H3_o : out std_logic_vector (31 downto 0) := (others => 'X');
72
        H4_o : out std_logic_vector (31 downto 0) := (others => 'X');
73
        H5_o : out std_logic_vector (31 downto 0) := (others => 'X');
74
        H6_o : out std_logic_vector (31 downto 0) := (others => 'X');
75
        H7_o : out std_logic_vector (31 downto 0) := (others => 'X')
76
    );
77
end sha256_regs;
78
 
79
architecture rtl of sha256_regs is
80
    -- output result registers 
81
    signal reg_H0 : unsigned (31 downto 0) := (others => '0');
82
    signal reg_H1 : unsigned (31 downto 0) := (others => '0');
83
    signal reg_H2 : unsigned (31 downto 0) := (others => '0');
84
    signal reg_H3 : unsigned (31 downto 0) := (others => '0');
85
    signal reg_H4 : unsigned (31 downto 0) := (others => '0');
86
    signal reg_H5 : unsigned (31 downto 0) := (others => '0');
87
    signal reg_H6 : unsigned (31 downto 0) := (others => '0');
88
    signal reg_H7 : unsigned (31 downto 0) := (others => '0');
89
    -- word shifter wires
90
    signal next_reg_H0 : unsigned (31 downto 0) := (others => '0');
91
    signal next_reg_H1 : unsigned (31 downto 0) := (others => '0');
92
    signal next_reg_H2 : unsigned (31 downto 0) := (others => '0');
93
    signal next_reg_H3 : unsigned (31 downto 0) := (others => '0');
94
    signal next_reg_H4 : unsigned (31 downto 0) := (others => '0');
95
    signal next_reg_H5 : unsigned (31 downto 0) := (others => '0');
96
    signal next_reg_H6 : unsigned (31 downto 0) := (others => '0');
97
    signal next_reg_H7 : unsigned (31 downto 0) := (others => '0');
98
    -- internal modulo adders
99
    signal sum0 : unsigned (31 downto 0) := (others => '0');
100
    signal sum1 : unsigned (31 downto 0) := (others => '0');
101
    signal sum2 : unsigned (31 downto 0) := (others => '0');
102
    signal sum3 : unsigned (31 downto 0) := (others => '0');
103
    signal sum4 : unsigned (31 downto 0) := (others => '0');
104
    signal sum5 : unsigned (31 downto 0) := (others => '0');
105
    signal sum6 : unsigned (31 downto 0) := (others => '0');
106
    signal sum7 : unsigned (31 downto 0) := (others => '0');
107
begin
108
    --=============================================================================================
109
    -- OUTPUT RESULT REGISTERS LOGIC
110
    --=============================================================================================
111
    -- The output result registers hold the intermediate values for the hash update blocks, and also the final 256bit hash value. 
112
    --
113
 
114
    -- output register transfer logic
115
    out_regs_proc: process (clk_i, ce_i) is
116
    begin
117
        if clk_i'event and clk_i = '1' then
118
            if ce_i = '1' then
119
                reg_H0 <= next_reg_H0;
120
                reg_H1 <= next_reg_H1;
121
                reg_H2 <= next_reg_H2;
122
                reg_H3 <= next_reg_H3;
123
                reg_H4 <= next_reg_H4;
124
                reg_H5 <= next_reg_H5;
125
                reg_H6 <= next_reg_H6;
126
                reg_H7 <= next_reg_H7;
127
            end if;
128
        end if;
129
    end process out_regs_proc;
130
 
131
    -- input muxes
132
    next_reg_H0_proc: next_reg_H0 <= unsigned(K0_i) when ld_i = '1' else sum0;
133
    next_reg_H1_proc: next_reg_H1 <= unsigned(K1_i) when ld_i = '1' else sum1;
134
    next_reg_H2_proc: next_reg_H2 <= unsigned(K2_i) when ld_i = '1' else sum2;
135
    next_reg_H3_proc: next_reg_H3 <= unsigned(K3_i) when ld_i = '1' else sum3;
136
    next_reg_H4_proc: next_reg_H4 <= unsigned(K4_i) when ld_i = '1' else sum4;
137
    next_reg_H5_proc: next_reg_H5 <= unsigned(K5_i) when ld_i = '1' else sum5;
138
    next_reg_H6_proc: next_reg_H6 <= unsigned(K6_i) when ld_i = '1' else sum6;
139
    next_reg_H7_proc: next_reg_H7 <= unsigned(K7_i) when ld_i = '1' else sum7;
140
 
141
    -- adders 
142
    sum0_proc: sum0 <= reg_H0 + unsigned(A_i);
143
    sum1_proc: sum1 <= reg_H1 + unsigned(B_i);
144
    sum2_proc: sum2 <= reg_H2 + unsigned(C_i);
145
    sum3_proc: sum3 <= reg_H3 + unsigned(D_i);
146
    sum4_proc: sum4 <= reg_H4 + unsigned(E_i);
147
    sum5_proc: sum5 <= reg_H5 + unsigned(F_i);
148
    sum6_proc: sum6 <= reg_H6 + unsigned(G_i);
149
    sum7_proc: sum7 <= reg_H7 + unsigned(H_i);
150
 
151
    --=============================================================================================
152
    -- OUTPUT LOGIC
153
    --=============================================================================================
154
    -- connect output ports
155
    H0_o_proc:      H0_o <= std_logic_vector(reg_H0);
156
    H1_o_proc:      H1_o <= std_logic_vector(reg_H1);
157
    H2_o_proc:      H2_o <= std_logic_vector(reg_H2);
158
    H3_o_proc:      H3_o <= std_logic_vector(reg_H3);
159
    H4_o_proc:      H4_o <= std_logic_vector(reg_H4);
160
    H5_o_proc:      H5_o <= std_logic_vector(reg_H5);
161
    H6_o_proc:      H6_o <= std_logic_vector(reg_H6);
162
    H7_o_proc:      H7_o <= std_logic_vector(reg_H7);
163
 
164
    N0_o_proc:      N0_o <= std_logic_vector(next_reg_H0);
165
    N1_o_proc:      N1_o <= std_logic_vector(next_reg_H1);
166
    N2_o_proc:      N2_o <= std_logic_vector(next_reg_H2);
167
    N3_o_proc:      N3_o <= std_logic_vector(next_reg_H3);
168
    N4_o_proc:      N4_o <= std_logic_vector(next_reg_H4);
169
    N5_o_proc:      N5_o <= std_logic_vector(next_reg_H5);
170
    N6_o_proc:      N6_o <= std_logic_vector(next_reg_H6);
171
    N7_o_proc:      N7_o <= std_logic_vector(next_reg_H7);
172
end rtl;
173
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.