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

Subversion Repositories gigabit_udp_mac

[/] [gigabit_udp_mac/] [trunk/] [MAC/] [crc32_8b.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 boa_a_m
-------------------------------------------------------------
2
--      Filename:  CRC32_8b.VHD
3
--      Version: 1
4
--      Date last modified: 2-20-04
5
-- Inheritance:         CRC16.VHD, 2-20-04
6
--
7
-- description:  CRC32 verification for incoming data packets. 
8
-- + CRC32 generation for outgoing data packets.  
9
-- Data is entered one byte at a time.
10
-- The CRC is computed iteratively. The Initial CRC32 value for the first message
11
-- byte is all 1's. The final CRC32 value when the message is error-free is the residue below.
12
-- Generator polynomial: x^32 + x^26 + x^23+ x^22+ x^16+ x^12+ x^11+ x^10+ x^8+ x^7+ x^5+ x^4+ x^2+ x + 1
13
-- as per 802.3 standard. 
14
-- The residue = 0xC704DD7B
15
--
16
-- Validated by comparison with outputlogic.com
17
---------------------------------------------------------------
18
 
19
library IEEE;
20
use IEEE.STD_LOGIC_1164.ALL;
21
use IEEE.STD_LOGIC_ARITH.ALL;
22
use IEEE.STD_LOGIC_UNSIGNED.ALL;
23
 
24
entity CRC32_8B is
25
    port (
26
                --// Clocks Resets
27
                SYNC_RESET: in std_logic;
28
                CLK: in std_logic;      -- reference clock
29
 
30
                --// Inputs
31
                CRC32_IN: in std_logic_vector(31 downto 0);
32
                        -- Initialize to all 1's for the first byte in the data packet 
33
                        -- (or use the SYNC_RESET PRIOR to the first input byte).
34
                        -- For subsequent bytes use the previous CRC32_OUT value, as the 
35
                        -- CRC32 computation is iterative, byte by byte.
36
                DATA_IN: in std_logic_vector(7 downto 0);
37
                        -- message from which the CRC32 is computed and/or checked. 
38
                        -- Entered byte by byte. 
39
                SAMPLE_CLK_IN: in std_logic;
40
                        -- 1 CLK wide pulse to indicate that DATA_IN and CRC32_IN are ready to be
41
                   -- processed.
42
 
43
                --// Outputs
44
                CRC32_OUT: out std_logic_vector(31 downto 0);
45
                        -- Computed CRC32. 
46
                        -- Latency: 1 CLK after SAMPLE_CLK_IN.
47
                        -- If all bits are received without error, the 32-bit residual at
48
                        -- the receiver will be 0.
49
                CRC32_VALID: out std_logic
50
                        -- '1' when computed CRC32 = 0. 
51
                   -- valid only once the entire data packet is read.
52
                        -- Latency: 1 CLK after SAMPLE_CLK_IN.
53
                        -- Stays until start (first byte) of next message.
54
                        );
55
end entity;
56
 
57
architecture behavioral of CRC32_8B is
58
--------------------------------------------------------
59
--      COMPONENTS
60
--------------------------------------------------------
61
--------------------------------------------------------
62
--     SIGNALS
63
--------------------------------------------------------
64
signal CRC32_OUT_LOCAL: std_logic_vector(31 downto 0);
65
signal DATA0: std_logic_vector(7 downto 0);
66
-------------------------------------------------------
67
--      IMPLEMENTATION
68
--------------------------------------------------------
69
begin
70
 
71
-- IMPORTANT: the CRC computation below is designed for DATA_IN(0) transmitted first.
72
-- When re-using the code, please verify which bit is sent first into the CRC. Flip bit/byte order otherwise.
73
 
74
-- Flip input byte
75
--DATA0(7) <= DATA_IN(0);
76
--DATA0(6) <= DATA_IN(1);
77
--DATA0(5) <= DATA_IN(2);
78
--DATA0(4) <= DATA_IN(3);
79
--DATA0(3) <= DATA_IN(4);
80
--DATA0(2) <= DATA_IN(5);
81
--DATA0(1) <= DATA_IN(6);
82
--DATA0(0) <= DATA_IN(7);
83
DATA0 <= DATA_IN;
84
 
85
 
86
CRC_COMPUTE_001: process(CLK, DATA0, SAMPLE_CLK_IN)
87
begin
88
        if rising_edge(CLK) then
89
                if(SYNC_RESET = '1') then
90
                        CRC32_OUT_LOCAL <= (others => '1');
91
                elsif(SAMPLE_CLK_IN = '1') then
92
                        -- new incoming byte
93
                        CRC32_OUT_LOCAL(0) <=    DATA0(1) xor DATA0(7) xor
94
                                                                                CRC32_IN(24) xor CRC32_IN(30);
95
 
96
                        CRC32_OUT_LOCAL(1) <=   DATA0(0) xor DATA0(1) xor DATA0(6) xor DATA0(7) xor
97
                                                                                CRC32_IN(24) xor CRC32_IN(25) xor CRC32_IN(30) xor CRC32_IN(31);
98
 
99
                        CRC32_OUT_LOCAL(2) <=   DATA0(0) xor DATA0(1) xor DATA0(5) xor DATA0(6) xor
100
                                                                                DATA0(7) xor
101
                                                                                CRC32_IN(24) xor CRC32_IN(25) xor CRC32_IN(26) xor CRC32_IN(30) xor
102
                                                                                CRC32_IN(31);
103
 
104
                        CRC32_OUT_LOCAL(3) <=   DATA0(0) xor DATA0(4) xor DATA0(5) xor DATA0(6) xor
105
                                                                                CRC32_IN(25) xor CRC32_IN(26) xor CRC32_IN(27) xor CRC32_IN(31);
106
 
107
                        CRC32_OUT_LOCAL(4) <=   DATA0(1) xor DATA0(3) xor DATA0(4) xor DATA0(5) xor
108
                                                                                DATA0(7) xor
109
                                                                                CRC32_IN(24) xor CRC32_IN(26) xor CRC32_IN(27) xor CRC32_IN(28) xor
110
                                                                                CRC32_IN(30);
111
 
112
                        CRC32_OUT_LOCAL(5) <=   DATA0(0) xor DATA0(1) xor DATA0(2) xor DATA0(3) xor
113
                                                                                DATA0(4) xor DATA0(6) xor DATA0(7) xor
114
                                                                                CRC32_IN(24) xor CRC32_IN(25) xor CRC32_IN(27) xor CRC32_IN(28) xor
115
                                                                                CRC32_IN(29) xor CRC32_IN(30) xor CRC32_IN(31);
116
 
117
                        CRC32_OUT_LOCAL(6) <=   DATA0(0) xor DATA0(1) xor DATA0(2) xor DATA0(3) xor
118
                                                                                DATA0(5) xor DATA0(6) xor
119
                                                                                CRC32_IN(25) xor CRC32_IN(26) xor CRC32_IN(28) xor CRC32_IN(29) xor
120
                                                                                CRC32_IN(30) xor CRC32_IN(31);
121
 
122
                        CRC32_OUT_LOCAL(7) <=   DATA0(0) xor DATA0(2) xor DATA0(4) xor DATA0(5) xor
123
                                                                                DATA0(7) xor
124
                                                                                CRC32_IN(24) xor CRC32_IN(26) xor CRC32_IN(27) xor CRC32_IN(29) xor
125
                                                                                CRC32_IN(31);
126
 
127
                        CRC32_OUT_LOCAL(8) <=   DATA0(3) xor DATA0(4) xor DATA0(6) xor DATA0(7) xor
128
                                                                                CRC32_IN(0) xor CRC32_IN(24) xor CRC32_IN(25) xor CRC32_IN(27) xor
129
                                                                                CRC32_IN(28);
130
 
131
                        CRC32_OUT_LOCAL(9) <=   DATA0(2) xor DATA0(3) xor DATA0(5) xor DATA0(6) xor
132
                                                                                CRC32_IN(1) xor CRC32_IN(25) xor CRC32_IN(26) xor CRC32_IN(28) xor
133
                                                                                CRC32_IN(29);
134
 
135
                        CRC32_OUT_LOCAL(10) <=  DATA0(2) xor DATA0(4) xor DATA0(5) xor DATA0(7) xor
136
                                                                                CRC32_IN(2) xor CRC32_IN(24) xor CRC32_IN(26) xor CRC32_IN(27) xor
137
                                                                                CRC32_IN(29);
138
 
139
                        CRC32_OUT_LOCAL(11) <=  DATA0(3) xor DATA0(4) xor DATA0(6) xor DATA0(7) xor
140
                                                                                CRC32_IN(3) xor CRC32_IN(24) xor CRC32_IN(25) xor CRC32_IN(27) xor
141
                                                                                CRC32_IN(28);
142
 
143
                        CRC32_OUT_LOCAL(12) <=  DATA0(1) xor DATA0(2) xor DATA0(3) xor DATA0(5) xor
144
                                                                                DATA0(6) xor DATA0(7) xor
145
                                                                                CRC32_IN(4) xor CRC32_IN(24) xor CRC32_IN(25) xor CRC32_IN(26) xor
146
                                                                                CRC32_IN(28) xor CRC32_IN(29) xor CRC32_IN(30);
147
 
148
                        CRC32_OUT_LOCAL(13) <=  DATA0(0) xor DATA0(1) xor DATA0(2) xor DATA0(4) xor
149
                                                                                DATA0(5) xor DATA0(6) xor
150
                                                                                CRC32_IN(5) xor CRC32_IN(25) xor CRC32_IN(26) xor CRC32_IN(27) xor
151
                                                                                CRC32_IN(29) xor CRC32_IN(30) xor CRC32_IN(31);
152
 
153
                        CRC32_OUT_LOCAL(14) <=  DATA0(0) xor DATA0(1) xor DATA0(3) xor DATA0(4) xor
154
                                                                                DATA0(5) xor
155
                                                                                CRC32_IN(6) xor CRC32_IN(26) xor CRC32_IN(27) xor CRC32_IN(28) xor
156
                                                                                CRC32_IN(30) xor CRC32_IN(31);
157
 
158
                        CRC32_OUT_LOCAL(15) <=  DATA0(0) xor DATA0(2) xor DATA0(3) xor DATA0(4) xor
159
                                                                                CRC32_IN(7) xor CRC32_IN(27) xor CRC32_IN(28) xor CRC32_IN(29) xor
160
                                                                                CRC32_IN(31);
161
 
162
                        CRC32_OUT_LOCAL(16) <=  DATA0(2) xor DATA0(3) xor DATA0(7) xor
163
                                                                                CRC32_IN(8) xor CRC32_IN(24) xor CRC32_IN(28) xor CRC32_IN(29);
164
 
165
                        CRC32_OUT_LOCAL(17) <=  DATA0(1) xor DATA0(2) xor DATA0(6) xor
166
                                                                                CRC32_IN(9) xor CRC32_IN(25) xor CRC32_IN(29) xor CRC32_IN(30);
167
 
168
                        CRC32_OUT_LOCAL(18) <=  DATA0(0) xor DATA0(1) xor DATA0(5) xor
169
                                                                                CRC32_IN(10) xor CRC32_IN(26) xor CRC32_IN(30) xor CRC32_IN(31);
170
 
171
                        CRC32_OUT_LOCAL(19) <=  DATA0(0) xor DATA0(4) xor
172
                                                                                CRC32_IN(11) xor CRC32_IN(27) xor CRC32_IN(31);
173
 
174
                        CRC32_OUT_LOCAL(20) <=  DATA0(3) xor
175
                                                                                CRC32_IN(12) xor CRC32_IN(28);
176
 
177
                        CRC32_OUT_LOCAL(21) <=  DATA0(2) xor
178
                                                                                CRC32_IN(13) xor CRC32_IN(29);
179
 
180
                        CRC32_OUT_LOCAL(22) <=  DATA0(7) xor
181
                                                                                CRC32_IN(14) xor CRC32_IN(24);
182
 
183
                        CRC32_OUT_LOCAL(23) <=  DATA0(1) xor DATA0(6) xor DATA0(7) xor
184
                                                                                CRC32_IN(15) xor CRC32_IN(24) xor CRC32_IN(25) xor CRC32_IN(30);
185
 
186
                        CRC32_OUT_LOCAL(24) <=  DATA0(0) xor DATA0(5) xor DATA0(6) xor
187
                                                                                CRC32_IN(16) xor CRC32_IN(25) xor CRC32_IN(26) xor CRC32_IN(31);
188
 
189
                        CRC32_OUT_LOCAL(25) <=  DATA0(4) xor DATA0(5) xor
190
                                                                                CRC32_IN(17) xor CRC32_IN(26) xor CRC32_IN(27);
191
 
192
                        CRC32_OUT_LOCAL(26) <=  DATA0(1) xor DATA0(3) xor DATA0(4) xor DATA0(7) xor
193
                                                                                CRC32_IN(18) xor CRC32_IN(24) xor CRC32_IN(27) xor CRC32_IN(28) xor
194
                                                                                CRC32_IN(30);
195
 
196
                        CRC32_OUT_LOCAL(27) <=  DATA0(0) xor DATA0(2) xor DATA0(3) xor DATA0(6) xor
197
                                                                                CRC32_IN(19) xor CRC32_IN(25) xor CRC32_IN(28) xor CRC32_IN(29) xor
198
                                                                                CRC32_IN(31);
199
 
200
                        CRC32_OUT_LOCAL(28) <=  DATA0(1) xor DATA0(2) xor DATA0(5) xor
201
                                                                                CRC32_IN(20) xor CRC32_IN(26) xor CRC32_IN(29) xor CRC32_IN(30);
202
 
203
                        CRC32_OUT_LOCAL(29) <=  DATA0(0) xor DATA0(1) xor DATA0(4) xor
204
                                                                                CRC32_IN(21) xor CRC32_IN(27) xor CRC32_IN(30) xor CRC32_IN(31);
205
 
206
                        CRC32_OUT_LOCAL(30) <=  DATA0(0) xor DATA0(3) xor
207
                                                                                CRC32_IN(22) xor CRC32_IN(28) xor CRC32_IN(31);
208
 
209
                        CRC32_OUT_LOCAL(31) <=  DATA0(2) xor
210
                                                                                CRC32_IN(23) xor CRC32_IN(29);
211
 
212
                end if;
213
        end if;
214
end process;
215
 
216
CRC32_OUT <= CRC32_OUT_LOCAL;
217
 
218
CRC32_VALID <= '1' when (CRC32_OUT_LOCAL = x"C704DD7B") else '0';
219
 
220
end behavioral;

powered by: WebSVN 2.1.0

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