RFID 防碰撞算法的FPGA 仿真实现
( Radio Frequency Identification) 是利用无线信道实现双向通信的一种识别技术, 可识别远距离的贴有标签的目标,,并读写相关数据。RFID系统可识别高速运动的物体并可同时识别多个目标,操作快捷方便。本文基于RFID系统,解决了同一时间识别多个目标的冲突问题。
1 概述
RFID系统主要由射频通信和计算机信息系统两部分组成,其中,射频通信部分主要包括读写器和标签(射频卡)。其间存在两种通信形式:从读写器到电子标签的数据传输,即读写器发送的数据流被其覆盖范围内的多个标签所接收,这种通信形式也被称为无线电广播;在读写器的作用范围内有多个标签同时应答,这种形式被称为多路存取。在后一种通信形式中,标签数据的混叠问题被称为碰撞问题。为了防止由于多个电子标签的数据在读写器的接收机中相互碰撞而不能准确被读出, 必须采用防碰撞算法[2]来加以克服。
1 .1 防碰撞算法
ISO 14443- 3[3]规定了TYPE A和TYPE B两种防冲撞机制。二者防碰撞机制的原理不同, 前者是基于位碰撞检测协议, 而TYPE B则通过系列命令序列完成防碰撞。ISO15693采用轮询机制、分时查询的方式完成防碰撞机制,这在标准的第三部分有详细规定。基于此的现存防碰撞算法有ALOHA[4]算法、分隙 ALOHA算法和二进制树形搜索算法等,前两者的信道最佳利用率分别为18.4%和36.8%,但随着标签数量的增大,性能将急剧恶化。二进制树形搜索算法在一次性读取标签的数目和速度上有了极大的提高。
1 .2 二进制树形搜索防碰撞算法原理
二进制树形搜索防碰撞算法[5]适用于TYPE A。A型标签采用Manchester编码方式,这使得准确地判断出碰撞位成为可能。图1所示为利用Manchester编码识别碰撞位。
当读写器接收到发送的标签信号时,首先判断是否发生碰撞以及发生碰撞的具体位置,然后根据碰撞的具体位置确定下一次发送的请求命令中的参数,再次发送,直到确定其中的一张标签为止。为了便于说明,假定标签的数据为 8bit,并定义命令call ( epc ,m),其含义为:读写器向其覆盖范围内的标签发送召唤指令, 如果标签数据[7]与call命令中epc参数的前m位相等,则满足这个条件的标签做出应答。设在某时刻有四个标签同时进入读写器的作用范围内,它们的EPC码分别为tag1 =10100011, tag2=10011011, tag3=00010001, tag4=11101100。其算法流程示意图如图2所示。
从图2可以看出,call命令的epc参数由碰撞位判断得出, 而call命令中的m参数又由相应的epc参数求得,这样就使得算法在执行过程中跳过了空闲的节点,提高了算法的执行效率。又因为算法可以形象地用二进制树来描述, 故称为 “二进制树形防碰撞算法”。
2 碰撞算法的 FPGA 仿真实现
目前使用的防碰撞算法大多通过软件方式实现,容易造成应用软件非常复杂而且多张卡片应用时速度慢。因此, 对其采用软硬件结合的方式,用 FPGA[6]实现防碰撞算法,可达到速度快、成本低的要求。
2 .1 总体设计方案
EPC标签模块可以抽象为一个 Manchester 编码器模块,RFID 读写器内部包含三个基本的功能模块::Manch-ester 解码器模块、LIFO 模块和控制整个算法的状态机模块。其基本模块连接关系如图 3 所示。
具体工作流程如下:
(1) RFID 读写器内部的状态机每隔一段时间发送一次 call 命令;
(2) 读写器覆盖范围内的标签收到 call 命令后判断是否满足 call 命令的条件, 若满足则发送 epc 码给读写器, 否则不作反应;
(3) 读写器收到标签发来的数据进行Manchester 解码。如果无碰撞发生则存储数据后强制该标签进入睡眠状态; 如果产生碰撞, 则根据解出的数据和碰撞位标志进行下一次call命令。如此循环执行直到读写器范围内的所有标签都被识别出来。
本文采用Verilog HDL 语言作为设计输入,仿真工具采用 Quartus II 5.1 build 216 03/06/2006 SJ Full Version;FPGA 器件为 EP2C5T144C6。
2 .2 RFID 读写器各模块设计及仿真
2 .2 .1 Manches ter 编码器
Manchester 编码器即为 RFID 标签, 它的主要数据输入包括该标签的数据、call或 sleep命令标志以及相应的epc参数和m参数。当接收到RFID读写器也就是算法控制状态机的控制信号后做出相应的判断,如果满足call命令的条件则开始对标签数据进行 Manchester 编码, 编码完成后将编码后的数据发送给Manchester 解码器, Manchester 解码器接收到数据后开始进行解码工作。如果满足sleep命令的条件,标签则进入睡眠状态,对以后的call命令不作应答。
2 .2 .2 Manches ter 解码器
Manchester 解码及碰撞位判断是整个跳跃式二进制树形防碰撞算法的关键。解码和碰 撞位的判断均由Manchester 解码器模块完成。首先, Manchester 解码器模块中定义了一个两位的移位寄存器, 用来检测标签发送的Manchester 码的同步头,以便断出编码的到来。一旦移位寄存器检测到标签发送过来的信号的同步头, Manchester 解码器便开始解码工作。采样信号的产生可以利用循环计数的计数器来实现。该计数器在高频时钟的边沿到来时自动加 1, 其循环周期与 Manchester 编码时钟周期相等。为防止延迟干扰, 在计数器循环周期的 1/4、3/4 处令采样信号为高电平。 当解码完成后解码器将向控制状态机发送一个data_ready 脉冲信号, 表明已经解码完毕, 可以向状态机传送数据。
图 4 为接收到的数据在[7]、 [5]、 [1]位存在碰撞现象时解码器的时序仿真结果。图中圆圈圈出部分为解码后的碰撞位,由图可以看出标识碰撞位的flag_out的输出数据为 10100010,可知,接收到的数据的[7]、[5]、[1]位发生了碰撞。
2 .2 .3 存储节点的 LIFO 栈
LIFO(Last In First Out)栈用来存储算法执行过程中所经过的节点的信息。为了协调 LIFO内部的工作状态, 在LIFO栈的模块中定义了一个小型的状态机。其工作状态及转换条件流程图如图 5所示。
对LIFO栈穿插写入和读取数据, 以验证LIFO模块功能。第一次写入两个数据 10100011、11100010, 进行一次读取操 作;然后连续写入两个数据10101010、01011011,再连续进行四次读取操作。其仿真结果如图 6所示。
由图6可看出,第一次写入两数据后,LIFO栈的栈内数据为10100011、11100010, 栈顶数据为11100010,,进行一次读操作,栈顶数据变为10100011;第二次连续写入两数据 10101010、01011011后,栈顶数据变为01011011,连续进行三次读取操作后,根据empty标志信号可以看出此时LIFO已经为空,,所以在第四次读取时并没有读出数据。
2 .3 综合仿真
将Manchester编码模块、Manchester解码模块、LIF模块和算法控制状态机模块连接起来进行算法的综合仿真。测试中设定读写器作用范围内共有四个RFID标签,标签的 EPC码为8位二进制码。四个标签的数据信息分别为:tag1=10100011,tag2=10011011,tag3=00010001,tag4=11101100。其仿真结果如图7所示。
3 仿真结果分析
3 .1 一次性最大读取标签数
通过LIFO栈的仿真和分析可得到如下结论: 如果LIFO的大小为N个单元, 则算法一次最多可以处理的标签数目即为 N+1。这表明系统防碰撞算法一次性最大读取标签数由 LIFO 栈的设计大小决定。不同的FPGA器件可用的存储器空间大小不同,使得基于其上设计的算法的该项性能指标也不同目前的FPGA器件大都内置了较大的存储器,例如Altera公司的低成本Cyclone II系列产品,最大提供1.1Mbit 的存储容量。可以估算,存储器的 1/4 用于存储节点信息的参数, 1/4 用于存储节点信息的碰撞位标志, 1/4 用来存储解出的标签数据, 1/4作为系统保留。由于标签数据信息长度为 64bit,用CycloneII系列FPGA器件实现算法,设一次性可读取标签的最大数目为Nmax,可以计算出:Nmax≈ 1.1× 1064×64=4296。
3 .2 算法识别速度
ISO 14443定义了 TYPE A、TYPE B两种类型协议,其通信速率均为106kbps。以此标准来计算算法的识别速度。算法执行过程中以 all命令和sleep 命令为单元,,每次命令的执行都要发送64bit的参数,8bit的m参数, 接收标签返回的 64bit 数据,共传送136bit的数据。另外call 命令中读写器与标签对数据的处理也要占用一定的时间。可以等价为传送小于 8bit 的数据。这样每次命令的执行共有 144bit 的数据传送。所以,每秒钟可执行call命令次数n为:n≈ 106× 1024144=753。由算法可知, 当区域内存在的标签数为 L 时, 则全部被识别出所执行的 call 命令的次数约为 2L。