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

Subversion Repositories tcp_ip_core_w_dhcp

[/] [tcp_ip_core_w_dhcp/] [trunk/] [checksum_calc.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 craighaywo
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer: 
4
-- 
5
-- Create Date:    12:51:09 12/30/2014 
6
-- Design Name: 
7
-- Module Name:    checksum_calc - Behavioral 
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool versions: 
11
-- Description: 
12
--
13
-- Dependencies: 
14
--
15
-- Revision: 
16
-- Revision 0.01 - File Created
17
-- Additional Comments: 
18
--
19
----------------------------------------------------------------------------------
20
library IEEE;
21
use IEEE.STD_LOGIC_1164.ALL;
22
use IEEE.NUMERIC_STD.ALL;
23
 
24
-- Uncomment the following library declaration if instantiating
25
-- any Xilinx primitives in this code.
26
--library UNISIM;
27
--use UNISIM.VComponents.all;
28
 
29
entity checksum_calc is
30
    Port ( CLK_IN                                               : in  STD_LOGIC;
31
           RST_IN                                               : in  STD_LOGIC;
32
           CHECKSUM_CALC_IN                     : in  STD_LOGIC;
33
           START_ADDR_IN                                : in  STD_LOGIC_VECTOR (10 downto 0);
34
           COUNT_IN                                             : in  STD_LOGIC_VECTOR (10 downto 0);
35
           VALUE_IN                                             : in  STD_LOGIC_VECTOR (7 downto 0);
36
           VALUE_ADDR_OUT                               : out STD_LOGIC_VECTOR (10 downto 0);
37
                          CHECKSUM_INIT_IN                      : in  STD_LOGIC_VECTOR (15 downto 0);
38
                          CHECKSUM_SET_INIT_IN          : in  STD_LOGIC;
39
                          CHECKSUM_ODD_LENGTH_IN        : in  STD_LOGIC;
40
           CHECKSUM_OUT                                 : out STD_LOGIC_VECTOR (15 downto 0);
41
           CHECKSUM_DONE_OUT                    : out STD_LOGIC);
42
end checksum_calc;
43
 
44
architecture Behavioral of checksum_calc is
45
 
46
type CC_ST is ( IDLE,
47
                                                SET_INITIAL_VALUE0,
48
                                                SET_INITIAL_VALUE1,
49
                                                LOAD_START_ADDR,
50
                                                INC_ADDR0,
51
                                                INC_ADDR1,
52
                                                LOAD_VALUE_LSB,
53
                                                ADD_VALUE,
54
                                                CHECK_COUNT,
55
                                                CHECK_REMAINDER,
56
                                                ADD_REMAINDER,
57
                                                ONES_COMPLEMENT,
58
                                                COMPLETE
59
                                                );
60
 
61
signal cc_state, cc_next_state : CC_ST := IDLE;
62
 
63
signal rd_addr                                                          : unsigned(10 downto 0);
64
signal value, checksum_reg_inv                  : unsigned(15 downto 0);
65
signal checksum_reg                                                     : unsigned(31 downto 0);
66
signal count                                                                    : unsigned(10 downto 0);
67
signal checksum_odd                                                     : std_logic;
68
 
69
begin
70
 
71
        VALUE_ADDR_OUT <= std_logic_vector(rd_addr);
72
        CHECKSUM_OUT <= std_logic_vector(checksum_reg_inv);
73
        CHECKSUM_DONE_OUT <= '1' when cc_state = COMPLETE else '0';
74
 
75
        SYNC_PROC: process(CLK_IN)
76
   begin
77
      if rising_edge(CLK_IN) then
78
                        cc_state <= cc_next_state;
79
      end if;
80
   end process;
81
 
82
        NEXT_STATE_DECODE: process (cc_state, CHECKSUM_CALC_IN, count, CHECKSUM_SET_INIT_IN)
83
   begin
84
      cc_next_state <= cc_state;  --default is to stay in current state
85
      case (cc_state) is
86
         when IDLE =>
87
                                if CHECKSUM_CALC_IN = '1' then
88
                                        cc_next_state <= LOAD_START_ADDR;
89
                                elsif CHECKSUM_SET_INIT_IN = '1' then
90
                                        cc_next_state <= SET_INITIAL_VALUE0;
91
                                end if;
92
                        when SET_INITIAL_VALUE0 =>
93
                                cc_next_state <= SET_INITIAL_VALUE1;
94
                        when SET_INITIAL_VALUE1 =>
95
                                if CHECKSUM_CALC_IN = '1' then
96
                                        cc_next_state <= LOAD_START_ADDR;
97
                                end if;
98
                        when LOAD_START_ADDR =>
99
                                cc_next_state <= INC_ADDR0;
100
                        when INC_ADDR0 =>
101
                                cc_next_state <= INC_ADDR1;
102
                        when INC_ADDR1 =>
103
                                cc_next_state <= LOAD_VALUE_LSB;
104
                        when LOAD_VALUE_LSB =>
105
                                cc_next_state <= ADD_VALUE;
106
                        when ADD_VALUE =>
107
                                cc_next_state <= CHECK_COUNT;
108
                        when CHECK_COUNT =>
109
                                if count = "00000000000" then
110
                                        cc_next_state <= CHECK_REMAINDER;
111
                                else
112
                                        cc_next_state <= INC_ADDR0;
113
                                end if;
114
 
115
                        when CHECK_REMAINDER =>
116
                                if checksum_reg(31 downto 16) = X"0000" then
117
                                        cc_next_state <= ONES_COMPLEMENT;
118
                                else
119
                                        cc_next_state <= ADD_REMAINDER;
120
                                end if;
121
                        when ADD_REMAINDER =>
122
                                cc_next_state <= CHECK_REMAINDER;
123
 
124
 
125
                        when ONES_COMPLEMENT =>
126
                                cc_next_state <= COMPLETE;
127
 
128
                        when COMPLETE =>
129
                                cc_next_state <= IDLE;
130
 
131
                end case;
132
        end process;
133
 
134
        RD_ADDR_PROC: process(CLK_IN)
135
   begin
136
      if rising_edge(CLK_IN) then
137
                        if cc_state = LOAD_START_ADDR then
138
                                rd_addr <= unsigned(START_ADDR_IN);
139
                        elsif cc_state = INC_ADDR0 then
140
                                rd_addr <= rd_addr + 1;
141
                        elsif cc_state = INC_ADDR1 then
142
                                rd_addr <= rd_addr + 1;
143
                        end if;
144
                        if CHECKSUM_CALC_IN = '1' then
145
                                checksum_odd <= CHECKSUM_ODD_LENGTH_IN;
146
                        end if;
147
      end if;
148
   end process;
149
 
150
        LOAD_VALUE_PROC: process(CLK_IN)
151
   begin
152
      if rising_edge(CLK_IN) then
153
                        if cc_state = INC_ADDR1 then
154
                                value(15 downto 8) <= unsigned(VALUE_IN);
155
                        end if;
156
                        if cc_state = LOAD_VALUE_LSB then
157
                                if checksum_odd = '1' and count = "00000000001" then
158
                                        value(7 downto 0) <= X"00";
159
                                else
160
                                        value(7 downto 0) <= unsigned(VALUE_IN);
161
                                end if;
162
                        end if;
163
      end if;
164
   end process;
165
 
166
        ADD_VALUE_TO_CHECKSUM: process(CLK_IN)
167
        begin
168
      if rising_edge(CLK_IN) then
169
                        if cc_state = IDLE then
170
                                checksum_reg <= (others => '0');
171
                        elsif cc_state = SET_INITIAL_VALUE0 then
172
                                checksum_reg(15 downto 0) <= unsigned(CHECKSUM_INIT_IN);
173
                                checksum_reg(31 downto 16) <= (others => '0');
174
                        elsif cc_state = ADD_VALUE then
175
                                checksum_reg <= checksum_reg + unsigned(X"0000" & value);
176
                        elsif cc_state = ADD_REMAINDER then
177
                                checksum_reg <= unsigned(X"0000" & checksum_reg(15 downto 0)) + unsigned(X"0000" & checksum_reg(31 downto 16));
178
                        end if;
179
                        if cc_state = ONES_COMPLEMENT then
180
                                checksum_reg_inv <= not(checksum_reg(15 downto 0));
181
                        end if;
182
                end if;
183
        end process;
184
 
185
        COUNT_PROC: process(CLK_IN)
186
        begin
187
      if rising_edge(CLK_IN) then
188
                        if (cc_state = IDLE or cc_state = SET_INITIAL_VALUE1) and CHECKSUM_CALC_IN = '1' then
189
                                count <= unsigned(COUNT_IN);
190
                        elsif cc_state = ADD_VALUE then
191
                                count <= count - 1;
192
                        end if;
193
                end if;
194
        end process;
195
 
196
end Behavioral;
197
 

powered by: WebSVN 2.1.0

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