[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [ethmac] got my CRC running(mine is not)



9-May-02

   Waman Hi,

       You function is fine , enclosed for you an example how to operate it.

Once again as in the crc4 and crc32 first run I see what crc need to be append thasn I put it and in the next run +define+second_run you can see the same data with the crc this time and Walla you get your megic number.

Two comments :
1.
your crc_out might show the megic number during the calculation of the data so be carefull when you check it meaning chek it only one clock after sending the last data.

Also in this particular code you don;t allow "holed" in the data which is ok for this particular Mac but keep this in mind incase later you want to re-use this code and pass data that come in fragment you should not "re-load" all 1's when Crc_En=0 but rather after the packet end, this way you can do the calcuation also if the packet come piece by piece and not as a whole.


2.
you might want to consider instead of writing :

---------

always @(posedge RxClk or negedge Reset)
            begin
        if (CrcBuffer == 32'h c704dd7b) //magic number
          begin
          CrcOut <= 1'b1;
          end
        else
          begin
          CrcOut <= 1'b0;
          end 
       end       
     //end

always @(posedge RxClk or negedge Reset)
      begin
        if(!Reset)
          begin
          CrcBuffer <= 32'h FFFFFFFF;
          end
        else
        begin  
			  if(CrcEn==1'b1)
           begin
           CrcBuffer <= CountCrc (RxDI,CrcBuffer);
           end   
         else 
            begin	
            CrcBuffer <= 32'h FFFFFFFF;
            end
        end 
      end

------

to simple write soemthing like 

----

always @(posedge RxClk or negedge Reset)
if(~Reset)
    begin
    CrcBuffer <= #1 {32{1'b1}};
    CrcOut    <= #1 1'b0;
    end
else
    begin  
    CrcBuffer <= #1 (CrcEn) ? CountCrc (RxDI,CrcBuffer) : {32{1'b1}};
    CrcOut    <= #1 (CrcBuffer == 32'h c704dd7b);
    end

-----

Hope I didn;t made to many typo but as you can see much less lines and so easier to debug.

have a nice day

   Illan


-----Original Message-----
From: waman mainkar [mailto:waman_m@yahoo.com]
Sent: Tuesday, May 07, 2002 5:51 PM
To: ethmac@opencores.org
Subject: RE: [ethmac] got my CRC running(mine is not)


Hi,
Thnaks for the suggestions. I am posting my code here.
So if any of you guys can have a look at it and
suggest me something. I'll appriciate that.

Thanks,

Waman.


module rxfcs
(RxClk,Reset,CrcEn,RxDI,CrcOut,CrcBuffer);

input RxClk, Reset, CrcEn;
input [7:0]RxDI;
output CrcOut;
output [31:0] CrcBuffer;
wire [7:0] RxDI;
wire RxClk, Reset, CrcEn;
reg CrcOut;
reg [31:0] CrcBuffer;


  // polynomial: (0 1 2 4 5 7 8 10 11 12 16 22 23 26
32)
  // data width: 8
  // convention: the first serial data bit is D[7]
  function [31:0] CountCrc;

    input [7:0] Data;
    input [31:0] CRC;

    reg [7:0] D;
    reg [31:0] C;
    reg [31:0] NewCRC;

  begin

    D = Data;
    C = CRC;

    NewCRC[0] = D[6] ^ D[0] ^ C[24] ^ C[30];
    NewCRC[1] = D[7] ^ D[6] ^ D[1] ^ D[0] ^ C[24] ^
C[25] ^ C[30] ^ 
                C[31];
    NewCRC[2] = D[7] ^ D[6] ^ D[2] ^ D[1] ^ D[0] ^
C[24] ^ C[25] ^ 
                C[26] ^ C[30] ^ C[31];
    NewCRC[3] = D[7] ^ D[3] ^ D[2] ^ D[1] ^ C[25] ^
C[26] ^ C[27] ^ 
                C[31];
    NewCRC[4] = D[6] ^ D[4] ^ D[3] ^ D[2] ^ D[0] ^
C[24] ^ C[26] ^ 
                C[27] ^ C[28] ^ C[30];
    NewCRC[5] = D[7] ^ D[6] ^ D[5] ^ D[4] ^ D[3] ^
D[1] ^ D[0] ^ C[24] ^ 
                C[25] ^ C[27] ^ C[28] ^ C[29] ^ C[30]
^ C[31];
    NewCRC[6] = D[7] ^ D[6] ^ D[5] ^ D[4] ^ D[2] ^
D[1] ^ C[25] ^ C[26] ^ 
                C[28] ^ C[29] ^ C[30] ^ C[31];
    NewCRC[7] = D[7] ^ D[5] ^ D[3] ^ D[2] ^ D[0] ^
C[24] ^ C[26] ^ 
                C[27] ^ C[29] ^ C[31];
    NewCRC[8] = D[4] ^ D[3] ^ D[1] ^ D[0] ^ C[0] ^
C[24] ^ C[25] ^ 
                C[27] ^ C[28];
    NewCRC[9] = D[5] ^ D[4] ^ D[2] ^ D[1] ^ C[1] ^
C[25] ^ C[26] ^ 
                C[28] ^ C[29];
    NewCRC[10] = D[5] ^ D[3] ^ D[2] ^ D[0] ^ C[2] ^
C[24] ^ C[26] ^ 
                 C[27] ^ C[29];
    NewCRC[11] = D[4] ^ D[3] ^ D[1] ^ D[0] ^ C[3] ^
C[24] ^ C[25] ^ 
                 C[27] ^ C[28];
    NewCRC[12] = D[6] ^ D[5] ^ D[4] ^ D[2] ^ D[1] ^
D[0] ^ C[4] ^ C[24] ^ 
                 C[25] ^ C[26] ^ C[28] ^ C[29] ^
C[30];
    NewCRC[13] = D[7] ^ D[6] ^ D[5] ^ D[3] ^ D[2] ^
D[1] ^ C[5] ^ C[25] ^ 
                 C[26] ^ C[27] ^ C[29] ^ C[30] ^
C[31];
    NewCRC[14] = D[7] ^ D[6] ^ D[4] ^ D[3] ^ D[2] ^
C[6] ^ C[26] ^ C[27] ^ 
                 C[28] ^ C[30] ^ C[31];
    NewCRC[15] = D[7] ^ D[5] ^ D[4] ^ D[3] ^ C[7] ^
C[27] ^ C[28] ^ 
                 C[29] ^ C[31];
    NewCRC[16] = D[5] ^ D[4] ^ D[0] ^ C[8] ^ C[24] ^
C[28] ^ C[29];
    NewCRC[17] = D[6] ^ D[5] ^ D[1] ^ C[9] ^ C[25] ^
C[29] ^ C[30];
    NewCRC[18] = D[7] ^ D[6] ^ D[2] ^ C[10] ^ C[26] ^
C[30] ^ C[31];
    NewCRC[19] = D[7] ^ D[3] ^ C[11] ^ C[27] ^ C[31];
    NewCRC[20] = D[4] ^ C[12] ^ C[28];
    NewCRC[21] = D[5] ^ C[13] ^ C[29];
    NewCRC[22] = D[0] ^ C[14] ^ C[24];
    NewCRC[23] = D[6] ^ D[1] ^ D[0] ^ C[15] ^ C[24] ^
C[25] ^ C[30];
    NewCRC[24] = D[7] ^ D[2] ^ D[1] ^ C[16] ^ C[25] ^
C[26] ^ C[31];
    NewCRC[25] = D[3] ^ D[2] ^ C[17] ^ C[26] ^ C[27];
    NewCRC[26] = D[6] ^ D[4] ^ D[3] ^ D[0] ^ C[18] ^
C[24] ^ C[27] ^ 
                 C[28] ^ C[30];
    NewCRC[27] = D[7] ^ D[5] ^ D[4] ^ D[1] ^ C[19] ^
C[25] ^ C[28] ^ 
                 C[29] ^ C[31];
    NewCRC[28] = D[6] ^ D[5] ^ D[2] ^ C[20] ^ C[26] ^
C[29] ^ C[30];
    NewCRC[29] = D[7] ^ D[6] ^ D[3] ^ C[21] ^ C[27] ^
C[30] ^ C[31];
    NewCRC[30] = D[7] ^ D[4] ^ C[22] ^ C[28] ^ C[31];
    NewCRC[31] = D[5] ^ C[23] ^ C[29];

   CountCrc = NewCRC;

  end

  endfunction

always @(posedge RxClk or negedge Reset)
            begin
        if (CrcBuffer == 32'h c704dd7b) //magic number
          begin
          CrcOut <= 1'b1;
          end
        else
          begin
          CrcOut <= 1'b0;
          end 
       end       
     //end

always @(posedge RxClk or negedge Reset)
      begin
        if(!Reset)
          begin
          CrcBuffer <= 32'h FFFFFFFF;
          end
        else
        begin  
			  if(CrcEn==1'b1)
           begin
           CrcBuffer <= CountCrc (RxDI,CrcBuffer);
           end   
         else 
            begin	
            CrcBuffer <= 32'h FFFFFFFF;
            end
        end 
      end


endmodule



--- Illan Glasner <iglasner@zumanetworks.com> wrote:
> Hi,
> 
>    Most likely you either append the crc wrongly or
> the data bit are put wrongly in the formula.
> 
> a short suggestion, look on the 4 bit file I Email
> and see how I append the data and the crc to the
> equation and how the equation compare to the one
> given in asics site.
> 
> that see that your do similar of course with 8 bit
> and equation different BUT the order should be the
> same.
> 
> I enclose an example for the 32 bit which I did the
> same as I did the 4 bit, again the first run is to
> generate the crc than I took the crc value put it as
> data and than in the second run where you need to
> use +define+second_run you will get the magic
> number. this should help you get on the right track.
> 
> have a nice day
> 
>    Illan
> 
> 
> -----Original Message-----
> From: waman mainkar [mailto:waman_m@yahoo.com]
> Sent: Monday, May 06, 2002 5:52 PM
> To: ethmac@opencores.org
> Subject: Re: [ethmac] got my CRC running(mine is
> not)
> 
> 
> HI,
> i have got the equation from www.easic.be for 8 bit
> data path and CRC-32....
> and then for this function i am providing input 8
> bit
> data and a updating value of buffer like:
> 
> crcbuffer = countcrc [this is function]
> (RxDI[data],crcbuffer);
> 
> and then on the positive edge of clk i am comparing
> it
> with the magic no. and if it is equal then CRCOK in
> 1....
> 
> i believe this logic is correct. but, i am not able
> to
> test it. so can anybody help me. i'll really
> appriciate that.
> 
> waiting for replies.
> 
> Thanks,
> 
> Waman.
> 
> 
> 
> 
> --- "Christian R. Brecht" <Brecht@cbedv.com> wrote:
> > Hi all!
> > 
> > Thank you very much for your help! Finally I have
> a
> > running version of my
> > CRC (which in fact was never wrong, I just used it
> > the wrong way )-:  )...
> > 
> > You've bee a big help! Thx!
> > 
> > Christian
> > 
> > 
> >
>
-------------------------------------------------------
> > Christian R. Brecht
> > Brecht@cbEDV.com
> >
>
-------------------------------------------------------
> > 
> > ----- Original Message -----
> > From: "Illan Glasner" <iglasner@zumanetworks.com>
> > To: <ethmac@opencores.org>
> > Sent: Monday, May 06, 2002 7:47 PM
> > Subject: FW: [ethmac] CRC question
> > 
> > 
> > 
> > Hi,
> > 
> >        From some reason my replay Email didn;t
> > appear till now so I will
> > re-send it in hope this time it will pass the
> > barrier.
> > 
> > have a nice day
> > 
> >    Illan
> > 
> > -----Original Message-----
> > From: Illan Glasner
> > Sent: Friday, May 03, 2002 9:59 AM
> > To: 'ethmac@opencores.org'
> > Subject: RE: [ethmac] CRC question
> > 
> > 
> > 
> > Hi,
> > 
> >       Hope the following files will help you and
> any
> > other who might be
> > struggling with this crc as well as anyone who use
> > crc RTL code in his
> > behavoral instead of using task.
> > 
> > crc4.v :
> > basicly the first run you simple compile it and it
> > calculate crc for few
> > data.
> > 
> > than I took this data which have the crc value and
> > push it back and got the
> > magic number.
> > 
> > for the second run you need to use th
> > +define+second_run
> > 
> > of course the second run 8 extra data are
> determine
> > from the first run so it
> > is not "general" solution but it should help yu
> see
> > why you don;t get the
> > right value in your crc
> > 
> > crc_calc_task.v
> > to make your simulation more effective I also
> added
> > a task that you should
> > use in any behavioral test bench which will
> > calcualte the crc in zero time.
> > 
> > if you are intrested in how the crc equation are
> > constract this task is the
> > starting point as it have the basic single bit
> > formula and than you can
> > expand it for using it for any width as well as
> > using De-Morgan rules you
> > can get the equation for any width. (or simple go
> to
> > asics site and get it
> > done more quickly).
> > 
> > have a nice day
> > 
> >    Illan
> > 
> > 
> > 
> > -----Original Message-----
> > From: Christian R. Brecht
> [mailto:Brecht@cbedv.com]
> > Sent: Friday, May 03, 2002 3:42 AM
> > To: ethmac@opencores.org
> > Subject: [ethmac] CRC question
> > 
> > 
> > 
> > Dear All!
> > 
> > I know this is not an ethmac question but for you
> > this will be an easy one:
> > I am working on my diploma work right now and for
> > some reasons I cannot use
> > your ethernetcore as we need some special things
> > implemented. But one thing
> > is similar: the CRC in general.
> > I guess I understood the CRC itself but for me it
> > seems the CRC-32 for
> > ethernet needs some weird extras like inverting
> the
> > 32 bits and reflecting
> > them as well. I will have to initialize the
> register
> > with "F"s as the first
> > step.
> > 
> > Q: After all, usually I have to put zeros into the
> > CRCC. Do I have to put 0s
> > into this CRC-32C as well, or do I need to put Fs
> to
> > get it run (I need
> > nibbles for input). The problem is I have two
> > "testpatterns", one does the
> > job (60 Bytes of zeros work with mine) the other
> > doesn't. I used the CRC-32
> 
=== message truncated ===

> ATTACHMENT part 2 application/octet-stream
name=crc32.v



__________________________________________________
Do You Yahoo!?
Yahoo! Health - your guide to health and wellness
http://health.yahoo.com
--
To unsubscribe from ethmac mailing list please visit http://www.opencores.org/mailinglists.shtml

crc8.v

rxfcs.v