Ethernet 32b CRC with 1 byte data - VHDL code 
Author Message
 Ethernet 32b CRC with 1 byte data - VHDL code

(Posted again with a new subject title - comp.lang.vhdl is getting a bit full
of CRC stuff !!)

I am trying to implement an 'Ethernet' 32 bit CRC coder with 8 bit parallel
data, using the 'm term' shorthand for the first XOR terms which are shifted
into the LSFR array. My VHDL code for the 8 bit shift is shown below (ip is
the data input, msb, bit0 first, d is the FF ip, q1 is the FF op)
 I think it is 'nearly right', but my simulation shows that it doesn't quite
give the expected results. ( I compared the result after 1 cycle i.e. 8 bits,
with those achieved using the same scheme (of course different shift terms),
but with 2 and 4 bit input data). I know that the data from the x26 tap
'shifts back around again' after more than 5 shifts, but I think I have taken
this into account with the 'M3' terms on the taps, or extra M2..M0 terms on
other bits. Could anyone point out the mistake here ?

m0 <= ip(0) XOR q1(0); -- 1st bit to be input
m1 <= ip(1) XOR q1(1);
m2 <= ip(2) XOR q1(2);
m3 <= ip(3) XOR q1(3);
m4 <= ip(4) XOR q1(4);
m5 <= ip(5) XOR q1(5);
m6 <= ip(6) XOR q1(6);
m7 <= ip(7) XOR q1(7);

-- result after 8 shifts
-- shift DOWN, from d(31) -> d(0)

d(31) <= m3 XOR m7;  -- tap 1 d(30) <= m3 XOR m7 XOR m6;  -- tap x1 d(29) <=
m3 XOR m7 XOR m6 XOR m5;  -- tap x2 d(28) <= m2 XOR m6 XOR m5 XOR m4; d(27)
<= m3 XOR m7 XOR m5 XOR m4 XOR m3;  -- tap x4 d(26) <= m3 XOR m7 XOR m6 XOR
m4 XOR m3 XOR m2;  --tap x5 d(25) <= m2 XOR m6 XOR m5 XOR m3 XOR m2 XOR m1;
d(24) <= m3 XOR m7 XOR m5 XOR m4 XOR m2 XOR m1 XOR m0;       --tap x7 d(23) <= m3
XOR m7 XOR m6 XOR m4 XOR m3 XOR m1 XOR m0 XOR q1(31); -- tap x8 d(22) <= m2
XOR m6 XOR m5 XOR m3 XOR m2 XOR m0 XOR q1(30); d(21) <= m3 XOR m7 XOR m5 XOR
m4 XOR m2 XOR m1 XOR q1(29);  -- tap x10 d(20) <= m3 XOR m7 XOR m6 XOR m4 XOR
m3 XOR m1 XOR m0 XOR q1(28); -- tap x11 d(19) <= m3 XOR m7 XOR m6 XOR m5 XOR
m3 XOR m2 XOR m0 XOR q1(27); -- tap x12 d(18) <= m2 XOR m6 XOR m5 XOR m4 XOR
m2 XOR m1 XOR q1(26); d(17) <= m1 XOR m5 XOR m4 XOR m3 XOR m1 XOR m0 XOR
q1(25); d(16) <= m0 XOR m4 XOR m3 XOR m2 XOR m0 XOR q1(24); d(15) <= m3 XOR
m7 XOR m3 XOR m2 XOR m1 XOR q1(23);  -- tap x16 d(14) <= m2 XOR m6 XOR m2 XOR
m1 XOR m0 XOR q1(22); d(13) <= m1 XOR m5 XOR m1 XOR m0 XOR q1(21); d(12) <=
m0 XOR m4 XOR m0 XOR q1(20); d(11) <= m3 XOR q1(19); d(10) <= m2 XOR q1(18);
d(9) <= m3 XOR m7 XOR m1 XOR q1(17);  -- tap x22 d(8) <= m3 XOR m7 XOR m6 XOR
m0 XOR q1(16);  -- tap x23 d(7) <= m2 XOR m6 XOR m5 XOR q1(15); d(6) <= m1
XOR m5 XOR m4 XOR q1(14); d(5) <= m3 XOR m7 XOR m4 XOR m3 XOR q1(13);  -- tap
x26 d(4) <= m2 XOR m6 XOR m3 XOR m2 XOR q1(12); d(3) <= m1 XOR m5 XOR m2 XOR
m1 XOR q1(11); d(2) <= m0 XOR m4 XOR m1 XOR m0 XOR q1(10); d(1) <= m3 XOR m0
XOR q1(9); d(0) <= m2 XOR q1(8);

-----== Posted via Deja News, The Leader in Internet Discussion ==-----
http://www.*-*-*.com/ ; Now offering spam-free web-based newsreading



Sun, 01 Oct 2000 03:00:00 GMT  
 Ethernet 32b CRC with 1 byte data - VHDL code


Quote:

> (Posted again with a new subject title - comp.lang.vhdl is getting a bit full
> of CRC stuff !!)

> I am trying to implement an 'Ethernet' 32 bit CRC coder with 8 bit parallel
> data, using the 'm term' shorthand for the first XOR terms which are shifted
> into the LSFR array. My VHDL code for the 8 bit shift is shown below (ip is
> the data input, msb, bit0 first, d is the FF ip, q1 is the FF op)
>  I think it is 'nearly right', but my simulation shows that it doesn't quite
> give the expected results. ( I compared the result after 1 cycle i.e. 8 bits,
> with those achieved using the same scheme (of course different shift terms),
> but with 2 and 4 bit input data). I know that the data from the x26 tap
> 'shifts back around again' after more than 5 shifts, but I think I have taken
> this into account with the 'M3' terms on the taps, or extra M2..M0 terms on
> other bits. Could anyone point out the mistake here ?

> m0 <= ip(0) XOR q1(0); -- 1st bit to be input
> m1 <= ip(1) XOR q1(1);
> m2 <= ip(2) XOR q1(2);
> m3 <= ip(3) XOR q1(3);
> m4 <= ip(4) XOR q1(4);
> m5 <= ip(5) XOR q1(5);
> m6 <= ip(6) XOR q1(6);
> m7 <= ip(7) XOR q1(7);

> -- result after 8 shifts
> -- shift DOWN, from d(31) -> d(0)

> d(31) <= m3 XOR m7;  -- tap 1 d(30) <= m3 XOR m7 XOR m6;  -- tap x1 d(29) <=
> m3 XOR m7 XOR m6 XOR m5;  -- tap x2 d(28) <= m2 XOR m6 XOR m5 XOR m4; d(27)
> <= m3 XOR m7 XOR m5 XOR m4 XOR m3;  -- tap x4 d(26) <= m3 XOR m7 XOR m6 XOR
> m4 XOR m3 XOR m2;  --tap x5 d(25) <= m2 XOR m6 XOR m5 XOR m3 XOR m2 XOR m1;
> d(24) <= m3 XOR m7 XOR m5 XOR m4 XOR m2 XOR m1 XOR m0;  --tap x7 d(23) <= m3
> XOR m7 XOR m6 XOR m4 XOR m3 XOR m1 XOR m0 XOR q1(31); -- tap x8 d(22) <= m2
> XOR m6 XOR m5 XOR m3 XOR m2 XOR m0 XOR q1(30); d(21) <= m3 XOR m7 XOR m5 XOR
> m4 XOR m2 XOR m1 XOR q1(29);  -- tap x10 d(20) <= m3 XOR m7 XOR m6 XOR m4 XOR
> m3 XOR m1 XOR m0 XOR q1(28); -- tap x11 d(19) <= m3 XOR m7 XOR m6 XOR m5 XOR
> m3 XOR m2 XOR m0 XOR q1(27); -- tap x12 d(18) <= m2 XOR m6 XOR m5 XOR m4 XOR
> m2 XOR m1 XOR q1(26); d(17) <= m1 XOR m5 XOR m4 XOR m3 XOR m1 XOR m0 XOR
> q1(25); d(16) <= m0 XOR m4 XOR m3 XOR m2 XOR m0 XOR q1(24); d(15) <= m3 XOR
> m7 XOR m3 XOR m2 XOR m1 XOR q1(23);  -- tap x16 d(14) <= m2 XOR m6 XOR m2 XOR
> m1 XOR m0 XOR q1(22); d(13) <= m1 XOR m5 XOR m1 XOR m0 XOR q1(21); d(12) <=
> m0 XOR m4 XOR m0 XOR q1(20); d(11) <= m3 XOR q1(19); d(10) <= m2 XOR q1(18);
> d(9) <= m3 XOR m7 XOR m1 XOR q1(17);  -- tap x22 d(8) <= m3 XOR m7 XOR m6 XOR
> m0 XOR q1(16);     -- tap x23 d(7) <= m2 XOR m6 XOR m5 XOR q1(15); d(6) <= m1
> XOR m5 XOR m4 XOR q1(14); d(5) <= m3 XOR m7 XOR m4 XOR m3 XOR q1(13);  -- tap
> x26 d(4) <= m2 XOR m6 XOR m3 XOR m2 XOR q1(12); d(3) <= m1 XOR m5 XOR m2 XOR
> m1 XOR q1(11); d(2) <= m0 XOR m4 XOR m1 XOR m0 XOR q1(10); d(1) <= m3 XOR m0
> XOR q1(9); d(0) <= m2 XOR q1(8);

> I found the bug,

I was feeding back the M3 term to the taps for the shift back round again
option, and it should have been the M1!

A VHDL code block to do this function can be downloaded free at
www.vautomation.com

-----== Posted via Deja News, The Leader in Internet Discussion ==-----
http://www.dejanews.com/   Now offering spam-free web-based newsreading



Fri, 06 Oct 2000 03:00:00 GMT  
 
 [ 3 post ] 

 Relevant Pages 

1. I want to generate a CRC (2 bytes) and I have 31 bytes in my frame

2. Need PL1 CRC-16 or CRC-32 code

3. 32 bit parallel CRC VHDL code

4. CRC-10 code for VHDL

5. Help: CRC-32 encode/decode vhdl source code wanted

6. Ethernet CRC-32

7. Ethernet CRC

8. need help in byte stuffing vhdl code

9. Synthesizable byte wide CRC Core for FREE

10. Data Recovery SOURCE CODE ( SOURCE CODES of Professional Data Recovery Software )

11. LabVIEW and EtherNet Drivers for PCI Ethernet cards ?

12. Embedded Ethernet in VHDL?

 

 
Powered by phpBB® Forum Software