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;
|