CRC-CCITT算法生成多相式为:x 16+x 12+x 5+1[4]。计算CRC实际上是将数据通过线性反馈移位寄存器,所有数据移入后CRC寄存器的值即为16位CRC值。并行CRC运算模块每次输入8位数据,相当于一次并行运算就得到了串行移位运算时需要8位移位所得的结束。由表1~表4可以知道并行CRC实现的原理:每个时钟到来时完成8bit数据 CRC值计算;下一个8bit数据到来时,把上一个8bit数据的CRC值C15~C0作为初值,继续完成并行CRC计算。即每次处理一个字节。
表1 移位前CRC寄存器值(初值)
R15 | R14 | R13 | R12 | R11 | R10 | R9 | R8 | R7 | R6 | R5 | R4 | R3 | R2 | R1 | R0 |
C15 | C14 | C13 | C12 | C11 | C10 | C9 | C8 | C7 | C6 | C5 | C4 | C3 | C2 | C1 | C0 |
表2 1次移位后CRC寄存器值
R15 | R14 | R13 | R12 | R11 | R10 | R9 | R8 | R7 | R6 | R5 | R4 | R3 | R2 | R1 | R0 |
X0 | C15 | C14 | C13 | C12 | C11 X0 | C10 | C9 | C8 | C7 | C6 | C5 | C4 X0 | C3 | C2 | C1 |
表3 2次移位后CRC寄存器
R15 | R14 | R13 | R12 | R11 | R10 | R9 | R8 | R7 | R6 | R5 | R4 | R3 | R2 | R1 | R0 |
X1 | X0 | C15 | C14 | C13 | C12 X1 | C11 X0 | C10 | C9 | C8 | C7 | C6 | C5 X1 | C4 X0 | C3 | C2 |
表4 8次移位后CRC寄存器值
R15 | R14 | R13 | R12 | R11 | R10 | R9 | R8 | R7 | R6 | R5 | R4 | R3 | R2 | R1 | R0 |
X7 X3 | X6 X2 | X5 X1 | X4 X0 | X3 | X7 X2 | X6 X1 | X5 X0 | C15 X4 | C14 X3 | C13 X2 | C12 X1 | C11 X7 X0 | C10 X6 | C9 X5 | C8 X4 |
表中参数说明:Ri为CRC移位寄存器值(R0为低位),Ci为CRC移位寄存器初值(C0为低位),Di为输入数据(D0为低位),Xi=Di XDR Ci,同一栏中数据的运算关系是异或(XOR)。
每次并行数据到来时,各CRC寄存器值按表4运算关系更新。最后一个字节数据输入后CRC寄存器的值(R0~R15)即为该数据组的CRC值。模块设计采用了VHDL语言,同步更新R0~R15寄存器的值,从表中看出,一次CRC计算最多完成4组XOR运算。如:R3<=C11 XOFR D7 XOR C7 XOR D0 XOR X0;R15<=D7XOR C7 XOR D3 XOR C3。
3 控制模块
单片机扩展了RAM后,P2口只有P2.5~P2.7可以用来提供控制信号,不能满足需要,因而在CPLD内部将3路信号扩展为8路控制信号,以实现对各部分进行协调控制。主要有编码器和译码器的启动信号、复位信号、指令标志信号、CRC输出信号等控制信号。
4 性能分析
这里选用1片XILINX XC95144实现整个数据处理模块的功能,使用软件平台是Xilinx Foundation 3.1i。XC95144内部有144个宏单元、3200可用门。图5和图6分别给出了编码器和译码器的部分时序仿真结果及其说明。可以看到,二者均实现了协议要求,编码器在准确的位置实现脉冲位置调制,译码器能准确地对曼彻斯特码数据进行译码,并计算出输入数据的CRC值。
用AT89C51单片机提供编码数据以及模拟待译码曼码数据流对模块功能进行实测,用示波器观察各测试点信号,结果基本上与时序仿真的波形图相同,达到了预期设计的目标。
本文较系统地介绍了一类远距离射频卡读写器数字处理模块的设计,特别在于:(1)采用单片CPLD实现了射频卡读写器数字模块功能,采用了原理图和VHDL 相结合自顶向下的设计方法[2][5],样机PCB版面积小,开发周期短,性能稳定。其设计方案和思路对其他类别射频卡读写器设计具有一定的参考价值。(2)提出了一种快速实现CRC-CCITT的并行运算方法,该方法适用于高速数据传输场合。
为了提高系统的安全性,可以对对写入卡中的数据进行加密处理,即引入数据加密模块,并将整个设计配置到一片容量更大的CPLD或FPGA中。