在RFID系统中,通常会遇到在读写器范围内存在多个电子标签的情况。多标签同时应答时产生的标签数据混叠问题就是我们通常所说的碰撞。即当在读写器的作用范围内有多个标签的时候,如果它们同时发送信号,这些信号就会相互干扰而产生信道争夺的情况,处理不当就会妨碍读写器对标签信号的处理,进而影响整个系统的正常运转。为了防止由于多个电子标签的数据在读写器的接收机中相互碰撞而不能准确识读的情况出现,必须采用有效的防碰撞算法来加以克服。
目前,关于防碰撞算法的原理及分类,有很多文献可以参考,其中关于RFID系统的防碰撞算法,国内外已有很多学者对其进行相关的研究,并研究出了很多算法原理及其实现过程。如ALOHA防碰撞算法和符合ISO 14443—3TYPE A标准的二进制树形搜索算法等。本书根据二进制树形搜索防碰撞算法,利用FPGA进行仿真,给出一个参考示例。
1.二进制树形搜索防碰撞算法
这里的二进制树形搜索防碰撞算法的标签采用Manchester编码方式进行仿真。依据这种编码方式,可以按位判断,这使得准确地判断出碰撞位成为可能。当读写器接收到发送的标签信号时,首先判断是否发生碰撞以及发生碰撞的具体位置,然后根据碰撞的具体位置确定下一次发送的请求命令中的参数,再次发送,直到确定其中的一张标签为止。这就是二进制树形算法的基本原理。
2.碰撞算法的FPGA仿真实现
很多防碰撞算法都是通过软件实现的,这容易造成应用软件非常复杂而且多标签应用时速度很慢。这里采用软硬件结合的方式,用FPGA实现防碰撞算法,可实现速度快、成本低的要求。
(1)防碰撞算法仿真的总体设计方案
这里将标签抽象为一个Manchester编码器模块,RFID读写器内部包含着3个基本的功能模块:Manchester解码器模块、LIFO模块和控制整个算法的状态机模块。其基本功能模块的连接关系如图2-14所示。
具体的工作流程描述如下:
RFID读写器内部的状态机每隔一段时间发送一次call命令。
读写器覆盖范围内的标签收到call命令后判断是否满足call命令的条件,若满足则发送ID码给读写器,如果不满足条件则不做反应。
读写器收到标签发来的数据进行Manchester解码。如果无碰撞发生则存储数据后强制该标签进入睡眠状态;如果产生碰撞,则根据解出的数据和碰撞位标志进行下一次call命令。如此循环执行直到读写器范围内的所有标签被识别出来。

图2-14 RFID防碰撞算法基本功能模块的连接示意图
设计中,采用Verilog HDL语言作为设计输入,仿真工具采用Quartus II 5.1build 21603/06/2006 SJ Full Version;FPGA器件采用EP2C5T144C6。
(2)Manchester编码器的设计及仿真
RFID标签可以模型化为一个Manchester编码器,它的主要数据输入包括RFID标签的数据,call或sleep命令标志以及相应的ID参数和m参数。当编码器接收到RFID读写器也就是算法控制状态机的控制信号后做出相应的判断,如果满足call命令的条件则开始对标签数据进行Manchester编码,编码完成后将编码后的数据发送给Manchester解码器,Manchester解码器接收到数据后开始进行解码工作;如果满足sleep命令的条件,标签则进入睡眠状态,对以后的call命令不做应答。
(3)Manchester解码器的设计及仿真
Manchester解码及碰撞位判断是整个算法的关键。解码和碰撞位的判断均由Manchester解码器模块完成。
Manchester解码器模块中定义了一个两位的移位寄存器,用来检测标签发送的Manchester码的同步头,以便判断出编码的到来。一旦移位寄存器检测到标签发送过来的信号的同步头,Manchester解码器开始解码工作。采样信号的产生可以利用循环计数的计数器来实现。该计数器在高频时钟的边沿到来时自动加1,其循环周期与Manchester编码时钟周期相等。与Manchester编码位1/4,3/4处对应的计数器数值时令采样信号为高电平即可。当解码完成后,解码器将向控制状态机发送一个data_ready脉冲信号,表明已经解码完毕,可以向状态机传送数据。
(4)存储节点的LIFO栈的设计及仿真
LIFO(Last In First Out)栈用来存储算法执行过程中所经过的节点的信息。为了协调LIFO栈内部的工作状态,在LIFO栈的模块中定义了一个小型的状态机。(https://www.xing528.com)
对LIFO栈穿插写入和读取数据,以验证LIFO模块功能。第一次写入两个数据10100011、11100010,进行一次读取操作;然后连续写入两个数据10101010、01011011,再连续进行四次读取操作。其读写功能仿真结果如图2-15所示。

图2-15 LIFO栈读写功能仿真结果
由图2-15可以看出,第一次写入两个数据后,LIFO栈的栈内数据为10100011、11100010,栈顶数据为11100010,进行一次读操作,栈顶数据变为10100011;第二次连续写入两个数据10101010、01011011后,栈顶数据变为01011011;连续进行三次读取操作后,根据empty标志信号可以看出此时LIFO栈已经为空,所以在第四次读取时并没有读出数据。
3.综合仿真
将Manchester编码模块、Manchester解码模块、LIFO模块和算法控制状态机模块连接起来进行算法的综合仿真。
测试中,设定读写器作用范围内共有4个RFID标签,标签的ID号为8位二进制码,分别为ID1=10100011,ID2=10011011,ID3=00010001,ID4=11101100。其仿真结果如图2-16所示。
仿真结果分析:
(1)一次性最大读取标签数
通过对LIFO栈的仿真和分析可获得如下结论:如果LIFO栈的大小为N个单元,算法一次最多可以处理的标签数目即为N+1。这表明系统防碰撞算法一次性最大读取标签数由LIFO栈的大小决定。不同的FPGA器件可用的存储器空间大小不同,这使得基于其上设计的算法的该项性能指标也不同。目前的FPGA器件大都内置了较大的存储器,例如Altera公司的低成本Cyclone II系列产品,最大可提供1.1Mbits的存储容量。可以估算出,存储器的1/4用于存储节点信息的参数,1/4用于存储节点信息的碰撞位标志,1/4用来存储解出的标签数据,1/4作为系统保留。由于标签数据信息长度为64bits,用Cyclone II系列FPGA器件实现算法,设一次性可读取标签的最大数目为Nmax,可以计算出


图2-16 综合时序仿真测试结果
(2)算法识别速度
ISO 14443定义了TYPE A、TYPE B两种类型的协议,其通信速率均为106kbit/s。以此标准来计算算法的识别速度。
算法执行过程中以call命令和sleep命令为单元,每次命令的执行都要发送64bits的参数,8bits的m参数,接受标签返回的64bits的数据。共传送136bits的数据。另外,call命令中读写器与标签对数据的处理也要占用一定的时间,可以等价为传送小于8bits的数据。这样每次命令的执行共有144bits的数据传送。所以,每秒钟可执行call命令的次数n为

由以上的算法可知,当区域内存在的标签数为L时,则全部标签被识别出时所执行的call命令的次数约为2L,因此本文中实现的跳跃式二进制树形防碰撞算法的最大识别速度约为376个标签/s。
(3)算法执行效率
算法的执行效率在不同的场合有不同的定义,本书仿真时采用如下定义:算法执行时识别出标签的数目与总的call命令时隙数的比值。仿真结果表明,随着标签数目的增多,执行效率趋近于50%。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
