[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [usb] crc algorithm
----- Original Message -----
From: "kw@nie" <kwanie@p... >
To: <usb@o... >
Date: Fri, 22 Feb 2002 11:03:23 +0800
Subject: Re: [usb] crc algorithm
>
>
> Hi Tambunan,
>
> > Do you know the explanation of algorithm below and
> > those modules ( e.g usbf_crc5.v)?
>
> usbf_crc5.v and usbf_crc16.v use parallel approach instead or
> bit-serial
> approach, i.e. CRC5 and CRC16 generators take one cycle to process
> 11 bits
> and 8 bits respectively. This is usually done for speed.
>
> Let say you want to process x bits at each clock, then the crc
> register's
> combination logic (based on input and crc register's present state)
> have to
> be worked out. The combination logic output will the equivalent of
> the crc
> register's value after x bits is shifted into a bit-serial crc
> generator. In
> this manner, you will have the result in 1 cycle instead of x
> cycle.
>
> cheers,
> kwanie
>
>
>
> ----- Original Message -----
> From: "RE Tambunan" <kebloo@m... >
> To: <usb@o... >
> Sent: Friday, February 22, 2002 8:12 AM
> Subject: Re: [usb] crc algorithm
>
>
> > Hallo Bo...
> >
> > Have you checked usb 2.0 core by Mr. Rudolf Usselman?
> > especially at usbf_crc5.v and usbf_crc16.v ?
> > Do you know the explanation of algorithm below and
> > those modules ( e.g usbf_crc5.v)?
> > Btw... algorithm I've shown you is based on Tom Coonan's
> > in verilog, please check at
> > ftp://www.mindspring.com/users/tcoonan/gencrc.v
> >
> >
> > Best Regard,
> >
> >
> >
> > RE Tambunan
> >
> > On 21 Feb 2002 at 11:55, Bo wrote:
> >
> > > Hi Tambunan,
> > > I don't think that's a right way to
> > > implement CRC check sum.
> > > There are two ways to implement it. Please
> > > refer to Kwanie's post and his recently corrected one.
> > > The second way is the prefer one in hardware design.
> > > Because it saves time and easier to implement for
> > > hardware acceleration.
> > >
> > > Assume you have M-bit input, and N-bit CRC,
> > > then you need M+N cycle to calculate CRC (without
> > > hardware acceleration). M for input, N for "one's
> > > complement of calculated CRC", then you can get the
> > > fix remainder which is 01100.
> > >
> > > datain for M is input, last N cycle is ~CRC.
> > >
> > >
> > > assign crc0 = datain ^ crc[4];
> > >
> > > crc[4] <= crc[3];
> > > crc[3] <= crc[2];
> > > crc[2] <= crc[4] ^ crc[1];
> > > crc[1] <= crc[0];
> > > crc[0] <= crc[4] ^ datain;
> > >
> > > Good Luck.
> > >
> > > bo
> > >
> > >
> > > --- RE Tambunan <kebloo@m... > wrote:
> > > > On 20 Feb 2002 at 16:16, Bo wrote:
> > > >
> > > > > Hi Tambunan,
> > > > > For my understanding, it really doesn't
> > > > > matter what pattern you should fill during the
> > > > > initialization. As far as you use the same
> > > > > pattern on both encode and decode part, it
> should
> > > > > come out the same result. You can check it use
> > > > > math calculation, C or even verilog.
> > > >
> > > > Hi Bo... I've checked the CRC calculation when CRC
> > > > register initial value filled with 0 and 1 with some
> > > > examples
> > > > and I found that the result are different.
> > > > I follow the rules from USB 1.1 specification and
> > > > here is
> > > > the algorithm for 5-bit CRC (CMIIW...):
> > > >
> > > > // from 2nd paragraph section 8.3.5
> > > > integer i;
> > > > reg [4..0] crc5out, crc5poly;
> > > > reg [11..0] data;
> > > >
> > > > crc5out = 'b11111; // or crc5out = 'b00000;
> > > > crc5poly = 'b00101;
> > > > for (i=0; i<12; i=i+1) begin
> > > > msb = crc5out[4];
> > > > crc5out = crc5out << 1;
> > > > if ( (msb XOR data[i]) = 1) then begin
> > > > crc5out = crc5out XOR crc5poly;
> > > > end
> > > > end
> > > >
> > > > // from 3rd paragraph section 8.3.5 for CRC
> > > > generator
> > > > crc5out = ~crc5out;
> > > >
> > > >
> > > > There are some examples in "CRC in USB" whitepaper
> > > > I used to check above algorithm.
> > > >
> > > > - setup addr 15 endp e
> > > > data = 'b10101000111
> > > > crc5out = 'b10111 ; for initial = 'b11111
> > > > crc5out = 'b00000 ; for initial = 'b00000
> > > >
> > > > - out addr 3a endp a
> > > > data = 'b01011100101
> > > > crc5out = 'b11100 ; for initial = 'b11111
> > > > crc5out = 'b10100 ; for initial = 'b00000
> > > >
> > > > - in addr 70 endp 4
> > > > data = 'b00001110010
> > > > crc5out = 'b01110 ; for initial = 'b11111
> > > > crc5out = 'b11001 ; for initial = 'b00000
> > > >
> > > > Also have you check Mr. Rudi's core ?
> > > > He also prefills crc5 and crc16 register with '1'
> > > > (check usbf_pa.v and usb_pd.v).
> > > > Btw... there is also an online document, which
> > > > is a thesis of Mr. Myilone Anandarajah, that
> > > > uses '0' to prefill CRC initial value.
> > > > Any comment for this :-)....
> > > >
> > > > Best regard,
> > > >
> > > >
> > > > RE Tambunan
> > > >
> > >
> > > __________________________________________________
> >
> >
>
--
To unsubscribe from usb mailing list please visit http://www.opencores.org/mailinglists.shtml