1 |
42 |
lmaarsen |
--------------------------------------------------------------------------------
|
2 |
|
|
-- Object : Package work.package_crc32_8b
|
3 |
|
|
-- Last modified : Thu Oct 10 12:37:58 2013.
|
4 |
|
|
--------------------------------------------------------------------------------
|
5 |
|
|
|
6 |
|
|
|
7 |
|
|
|
8 |
|
|
library ieee, std;
|
9 |
|
|
use ieee.std_logic_1164.all;
|
10 |
|
|
use std.textio.all;
|
11 |
|
|
use ieee.numeric_std.all;
|
12 |
|
|
---------------------------------------------------------------------------------------------------------------
|
13 |
|
|
-- Package declaration
|
14 |
|
|
---------------------------------------------------------------------------------------------------------------
|
15 |
|
|
package package_crc32_8b is
|
16 |
|
|
|
17 |
|
|
-----------------------------------------------------------------------------------------
|
18 |
|
|
-- functions to invert data/CRC (data: only applicable for the first 32 bits of a packet)
|
19 |
|
|
-----------------------------------------------------------------------------------------
|
20 |
|
|
function INVERT_CRC32_DATA
|
21 |
|
|
(din : std_logic_vector(7 downto 0))
|
22 |
|
|
return std_logic_vector;
|
23 |
|
|
|
24 |
|
|
function INVERT_CRC32_RESULT
|
25 |
|
|
(din : std_logic_vector(31 downto 0))
|
26 |
|
|
return std_logic_vector;
|
27 |
|
|
|
28 |
|
|
-------------------------------------------------------------------------
|
29 |
|
|
-- functions to swap bit order due to bit order on physical interface
|
30 |
|
|
-------------------------------------------------------------------------
|
31 |
|
|
function SWAP_CRC32_DATA
|
32 |
|
|
(din : std_logic_vector(7 downto 0))
|
33 |
|
|
return std_logic_vector;
|
34 |
|
|
|
35 |
|
|
function SWAP_CRC32_RESULT
|
36 |
|
|
(din : std_logic_vector(31 downto 0))
|
37 |
|
|
return std_logic_vector;
|
38 |
|
|
|
39 |
|
|
-------------------------------------------------------------------------
|
40 |
|
|
-- functions to calculate CRC on the fly
|
41 |
|
|
-------------------------------------------------------------------------
|
42 |
|
|
function CALC_CRC32
|
43 |
|
|
(din : std_logic_vector(7 downto 0);
|
44 |
|
|
cin : std_logic_vector(31 downto 0))
|
45 |
|
|
return std_logic_vector;
|
46 |
|
|
end package_crc32_8b;
|
47 |
|
|
|
48 |
|
|
package body package_crc32_8b is
|
49 |
|
|
|
50 |
|
|
--=============================================================================================================
|
51 |
|
|
-- Process :
|
52 |
|
|
-- Description :
|
53 |
|
|
--=============================================================================================================
|
54 |
|
|
function INVERT_CRC32_DATA
|
55 |
|
|
(din : std_logic_vector(7 downto 0))
|
56 |
|
|
return std_logic_vector is
|
57 |
|
|
begin
|
58 |
|
|
return not(din);
|
59 |
|
|
end INVERT_CRC32_DATA;
|
60 |
|
|
|
61 |
|
|
--=============================================================================================================
|
62 |
|
|
-- Process :
|
63 |
|
|
-- Description :
|
64 |
|
|
--=============================================================================================================
|
65 |
|
|
function INVERT_CRC32_RESULT
|
66 |
|
|
(din : std_logic_vector(31 downto 0))
|
67 |
|
|
return std_logic_vector is
|
68 |
|
|
begin
|
69 |
|
|
return not(din);
|
70 |
|
|
end INVERT_CRC32_RESULT;
|
71 |
|
|
|
72 |
|
|
--=============================================================================================================
|
73 |
|
|
-- Process :
|
74 |
|
|
-- Description :
|
75 |
|
|
--=============================================================================================================
|
76 |
|
|
function SWAP_CRC32_DATA
|
77 |
|
|
(din : std_logic_vector(7 downto 0))
|
78 |
|
|
return std_logic_vector is
|
79 |
|
|
|
80 |
|
|
variable d : std_logic_vector(7 downto 0);
|
81 |
|
|
|
82 |
|
|
begin
|
83 |
|
|
d(7) := din(0);
|
84 |
|
|
d(6) := din(1);
|
85 |
|
|
d(5) := din(2);
|
86 |
|
|
d(4) := din(3);
|
87 |
|
|
d(3) := din(4);
|
88 |
|
|
d(2) := din(5);
|
89 |
|
|
d(1) := din(6);
|
90 |
|
|
d(0) := din(7);
|
91 |
|
|
|
92 |
|
|
return d;
|
93 |
|
|
end SWAP_CRC32_DATA;
|
94 |
|
|
|
95 |
|
|
--=============================================================================================================
|
96 |
|
|
-- Process :
|
97 |
|
|
-- Description :
|
98 |
|
|
--=============================================================================================================
|
99 |
|
|
function SWAP_CRC32_RESULT
|
100 |
|
|
(din : std_logic_vector(31 downto 0))
|
101 |
|
|
return std_logic_vector is
|
102 |
|
|
|
103 |
|
|
variable d : std_logic_vector(31 downto 0);
|
104 |
|
|
|
105 |
|
|
begin
|
106 |
|
|
for i in 3 downto 0 loop
|
107 |
|
|
d(i*8+7) := din(i*8);
|
108 |
|
|
d(i*8+6) := din(i*8+1);
|
109 |
|
|
d(i*8+5) := din(i*8+2);
|
110 |
|
|
d(i*8+4) := din(i*8+3);
|
111 |
|
|
d(i*8+3) := din(i*8+4);
|
112 |
|
|
d(i*8+2) := din(i*8+5);
|
113 |
|
|
d(i*8+1) := din(i*8+6);
|
114 |
|
|
d(i*8+0) := din(i*8+7);
|
115 |
|
|
end loop;
|
116 |
|
|
|
117 |
|
|
return d;
|
118 |
|
|
end SWAP_CRC32_RESULT;
|
119 |
|
|
|
120 |
|
|
--=============================================================================================================
|
121 |
|
|
-- Process :
|
122 |
|
|
-- Description :
|
123 |
|
|
--=============================================================================================================
|
124 |
|
|
function CALC_CRC32
|
125 |
|
|
(din : std_logic_vector(7 downto 0);
|
126 |
|
|
cin : std_logic_vector(31 downto 0))
|
127 |
|
|
return std_logic_vector is
|
128 |
|
|
|
129 |
|
|
variable d : std_logic_vector(7 downto 0);
|
130 |
|
|
variable c : std_logic_vector(31 downto 0);
|
131 |
|
|
variable cout: std_logic_vector(31 downto 0);
|
132 |
|
|
|
133 |
|
|
begin
|
134 |
|
|
d := din;
|
135 |
|
|
c := cin;
|
136 |
|
|
|
137 |
|
|
cout(0) := d(6) xor d(0) xor c(24) xor c(30);
|
138 |
|
|
cout(1) := d(7) xor d(6) xor d(1) xor d(0) xor c(24) xor c(25) xor c(30) xor c(31);
|
139 |
|
|
cout(2) := d(7) xor d(6) xor d(2) xor d(1) xor d(0) xor c(24) xor c(25) xor c(26) xor c(30) xor c(31);
|
140 |
|
|
cout(3) := d(7) xor d(3) xor d(2) xor d(1) xor c(25) xor c(26) xor c(27) xor c(31);
|
141 |
|
|
cout(4) := d(6) xor d(4) xor d(3) xor d(2) xor d(0) xor c(24) xor c(26) xor c(27) xor c(28) xor c(30);
|
142 |
|
|
cout(5) := d(7) xor d(6) xor d(5) xor d(4) xor d(3) xor d(1) xor d(0) xor c(24) xor c(25) xor c(27) xor c(28) xor c(29) xor c(30) xor c(31);
|
143 |
|
|
cout(6) := d(7) xor d(6) xor d(5) xor d(4) xor d(2) xor d(1) xor c(25) xor c(26) xor c(28) xor c(29) xor c(30) xor c(31);
|
144 |
|
|
cout(7) := d(7) xor d(5) xor d(3) xor d(2) xor d(0) xor c(24) xor c(26) xor c(27) xor c(29) xor c(31);
|
145 |
|
|
cout(8) := d(4) xor d(3) xor d(1) xor d(0) xor c(0) xor c(24) xor c(25) xor c(27) xor c(28);
|
146 |
|
|
cout(9) := d(5) xor d(4) xor d(2) xor d(1) xor c(1) xor c(25) xor c(26) xor c(28) xor c(29);
|
147 |
|
|
cout(10) := d(5) xor d(3) xor d(2) xor d(0) xor c(2) xor c(24) xor c(26) xor c(27) xor c(29);
|
148 |
|
|
cout(11) := d(4) xor d(3) xor d(1) xor d(0) xor c(3) xor c(24) xor c(25) xor c(27) xor c(28);
|
149 |
|
|
cout(12) := d(6) xor d(5) xor d(4) xor d(2) xor d(1) xor d(0) xor c(4) xor c(24) xor c(25) xor c(26) xor c(28) xor c(29) xor c(30);
|
150 |
|
|
cout(13) := d(7) xor d(6) xor d(5) xor d(3) xor d(2) xor d(1) xor c(5) xor c(25) xor c(26) xor c(27) xor c(29) xor c(30) xor c(31);
|
151 |
|
|
cout(14) := d(7) xor d(6) xor d(4) xor d(3) xor d(2) xor c(6) xor c(26) xor c(27) xor c(28) xor c(30) xor c(31);
|
152 |
|
|
cout(15) := d(7) xor d(5) xor d(4) xor d(3) xor c(7) xor c(27) xor c(28) xor c(29) xor c(31);
|
153 |
|
|
cout(16) := d(5) xor d(4) xor d(0) xor c(8) xor c(24) xor c(28) xor c(29);
|
154 |
|
|
cout(17) := d(6) xor d(5) xor d(1) xor c(9) xor c(25) xor c(29) xor c(30);
|
155 |
|
|
cout(18) := d(7) xor d(6) xor d(2) xor c(10) xor c(26) xor c(30) xor c(31);
|
156 |
|
|
cout(19) := d(7) xor d(3) xor c(11) xor c(27) xor c(31);
|
157 |
|
|
cout(20) := d(4) xor c(12) xor c(28);
|
158 |
|
|
cout(21) := d(5) xor c(13) xor c(29);
|
159 |
|
|
cout(22) := d(0) xor c(14) xor c(24);
|
160 |
|
|
cout(23) := d(6) xor d(1) xor d(0) xor c(15) xor c(24) xor c(25) xor c(30);
|
161 |
|
|
cout(24) := d(7) xor d(2) xor d(1) xor c(16) xor c(25) xor c(26) xor c(31);
|
162 |
|
|
cout(25) := d(3) xor d(2) xor c(17) xor c(26) xor c(27);
|
163 |
|
|
cout(26) := d(6) xor d(4) xor d(3) xor d(0) xor c(18) xor c(24) xor c(27) xor c(28) xor c(30);
|
164 |
|
|
cout(27) := d(7) xor d(5) xor d(4) xor d(1) xor c(19) xor c(25) xor c(28) xor c(29) xor c(31);
|
165 |
|
|
cout(28) := d(6) xor d(5) xor d(2) xor c(20) xor c(26) xor c(29) xor c(30);
|
166 |
|
|
cout(29) := d(7) xor d(6) xor d(3) xor c(21) xor c(27) xor c(30) xor c(31);
|
167 |
|
|
cout(30) := d(7) xor d(4) xor c(22) xor c(28) xor c(31);
|
168 |
|
|
cout(31) := d(5) xor c(23) xor c(29);
|
169 |
|
|
|
170 |
|
|
return cout;
|
171 |
|
|
end CALC_CRC32;
|
172 |
|
|
|
173 |
|
|
end package_crc32_8b;
|