Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Help required for CRC 16 in SS7 signaling

Status
Not open for further replies.

vijayanand_ME

Member level 1
Joined
Sep 28, 2006
Messages
37
Helped
2
Reputation
4
Reaction score
2
Trophy points
1,288
Activity points
1,511
Hi,
We have a processor which can support SS7 signaling and
I have captured some packets from the processor and following are the details
First packet FF FF 01 03 BC D4
second packet FF FF 01 00 27 E6

BC D4 are the CRC -16 field in the first packet and
27 E6 are the CRC-16 field in the second packet.

From the Processor data sheet i found "16-bit CRC-CCITT" is used for generating CRC.

If i calculate the CRC from the online tools i am not getting the right CRC (compare to my packets)

Can any one help me how to get this CRC and I am implementing this in FPGA (Verilog or VHDL)
Calulation steps are welcome for easy understanding..

With Regards,
Vijay
 

Dear All,
I have seen this in a C file .. I need to implement this in FPGA... Actually it is a CRC-16 generator and unsigned char crc_arr[6]={0xff, 0xff, 0x01, 0x03}; is the test data input for the generator. Actually there are some defined values in fcstab[256]. I cannot save all the values in FPGA which increase my logics. So can any one help me in terms of equation to generate the these defined bits.

Code:
#include <stdio.h>
#define PPP_FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
static unsigned short fcstab[256] =
{
        0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, /*0x00*/
        0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, /*0x08*/
        0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, /*0x10*/
        0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, /*0x18*/
        0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, /*0x20*/
        0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, /*0x28*/
        0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, /*0x30*/
        0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, /*0x38*/
        0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, /*0x40*/
        0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, /*0x48*/
        0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, /*0x50*/
        0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, /*0x58*/
        0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, /*0x60*/
        0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, /*0x68*/
        0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, /*0x70*/
        0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, /*0x78*/
        0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, /*0x80*/
        0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, /*0x88*/
        0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, /*0x90*/
        0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, /*0x98*/
        0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, /*0xA0*/
        0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, /*0xA8*/
        0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, /*0xb0*/
        0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, /*0xb8*/
        0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, /*0xc0*/
        0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, /*0xc8*/
        0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, /*0xd0*/
        0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, /*0xd8*/
        0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, /*0xe0*/
        0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, /*0xe8*/
        0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, /*0xf0*/
        0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78  /*0xf8*/
};

unsigned char crc_arr[6]={0xff, 0xff, 0x01, 0x03};

int main(void)
{
        unsigned short crc=0xffff;
        unsigned short tx_crc;
        int i=0;

        for(i=0; i < 4; i++){
                crc = PPP_FCS(crc, crc_arr[i]);
                       if(i==3)
                        tx_crc = crc;
        }
        
        printf("TX Crc: %4x\n", (tx_crc ^ 0xffff));
        return 0;
}

Added after 3 hours 24 minutes:

Adding to my above query..
If possible how the big array values derived.. May be one or two worked examples will be helpful..
Regards,
VJ
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top