物联传媒 旗下网站
登录 注册
RFID世界网 >  解决方案  >  防伪  >  正文

RFID 防碰撞算法的FPGA 仿真实现

作者:宁焕生, 郭旭峰, 丛 玉, 刘文明, 薛明华
来源:RFID世界网
日期:2012-11-29 14:18:20
摘要:研究无线射频身份识别(RFID)系统中的防碰撞算法的硬件仿真设计。在介绍防碰撞算法原理的基础上,基于曼彻斯特编码(Manchester ) 方式, 实现了多标签识读过程中的解码和防碰撞算法。利用 FPGA 对算法进行了仿真, 结果表明本方法具有速度上的优越性和技术上的可行性。

  ( Radio Frequency Identification) 是利用无线信道实现双向通信的一种识别技术可识别远距离的贴有标签的目标,并读写相关数据RFID系统可识别高速运动的物体并可同时识别多个目标操作快捷方便。本文基于RFID系统解决了同一时间识别多个目标的冲突问题。 

概述

  RFID系统主要由射频通信和计算机信息系统两部分组成其中射频通信部分主要包括读写器和标签(射频卡)其间存在两种通信形式从读写器到电子标签的数据传输即读写器发送的数据流被其覆盖范围内的多个标签所接收这种通信形式也被称为无线电广播在读写器的作用范围内有多个标签同时应答这种形式被称为多路存取。在后一种通信形式中标签数据的混叠问题被称为碰撞问题。为了防止由于多个电子标签的数据在读写器的接收机中相互碰撞而不能准确被读出必须采用防碰撞算法[2]来加以克服。

1 .1 防碰撞算法

  ISO 14443- 3[3]规定了TYPE ATYPE B两种防冲撞机制。二者防碰撞机制的原理不同前者是基于位碰撞检测协议TYPE B则通过系列命令序列完成防碰撞。ISO15693采用轮询机制分时查询的方式完成防碰撞机制这在标准的第三部分有详细规定。基于此的现存防碰撞算法有ALOHA[4]算法、分隙 ALOHA算法和二进制树形搜索算法等前两者的信道最佳利用率分别为18.4%36.8%但随着标签数量的增大性能将急剧恶化。二进制树形搜索算法在一次性读取标签的数目和速度上有了极大的提高。

1 .2 二进制树形搜索防碰撞算法原理

  二进制树形搜索防碰撞算法[5]适用于TYPE AA型标签采用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参数求得这样就使得算法在执行过程中跳过了空闲的节点,提高了算法的执行效率。又因为算法可以形象地用二进制树来描述故称为 二进制树形防碰撞算法

碰撞算法的 FPGA 仿真实现

  目前使用的防碰撞算法大多通过软件方式实现容易造成应用软件非常复杂而且多张卡片应用时速度慢。因此对其采用软硬件结合的方式用 FPGA[6]实现防碰撞算法可达到速度快、成本低的要求。

2 .1 总体设计方案

  EPC标签模块可以抽象为一个 Manchester 编码器模块RFID 读写器内部包含三个基本的功能模块:Manch-ester 解码器模块LIFO 模块和控制整个算法的状态机模块。其基本模块连接关系如图 所示。

  具体工作流程如下:

  (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/43/4 处令采样信号为高电平。 当解码完成后解码器将向控制状态机发送一个data_ready 脉冲信号表明已经解码完毕可以向状态机传送数据。

  图 为接收到的数据在[7]、 [5]、 [1]位存在碰撞现象时解码器的时序仿真结果。图中圆圈圈出部分为解码后的碰撞位由图可以看出标识碰撞位的flag_out的输出数据为 10100010可知接收到的数据的[7][5][1]位发生了碰撞。

2 .2 .3 存储节点的 LIFO 

  LIFOLast In First Out栈用来存储算法执行过程中所经过的节点的信息。为了协调 LIFO内部的工作状态LIFO栈的模块中定义了一个小型的状态机。其工作状态及转换条件流程图如图 5所示。

 

  LIFO栈穿插写入和读取数据以验证LIFO模块功能。第一次写入两个数据 1010001111100010, 进行一次读取操 作然后连续写入两个数据1010101001011011再连续进行四次读取操作其仿真结果如图 6所示。

 

  由图6可看出第一次写入两数据后LIFO栈的栈内数据为1010001111100010, 栈顶数据为11100010,进行一次读操作栈顶数据变为10100011第二次连续写入两数据 1010101001011011栈顶数据变为01011011,连续进行三次读取操作后根据empty标志信号可以看出此时LIFO已经为空,所以在第四次读取时并没有读出数据。

2 .3 综合仿真

  Manchester编码模块、Manchester解码模块、LIF模块和算法控制状态机模块连接起来进行算法的综合仿真。测试中设定读写器作用范围内共有四个RFID标签标签的 EPC码为8位二进制码。四个标签的数据信息分别为tag1=10100011tag2=10011011tag3=00010001tag4=11101100。其仿真结果如图7所示。

 

仿真结果分析

3 .1 一次性最大读取标签数  

  通过LIFO栈的仿真和分析可得到如下结论如果LIFO的大小为N个单元则算法一次最多可以处理的标签数目即为 N+1。这表明系统防碰撞算法一次性最大读取标签数由 LIFO 栈的设计大小决定。不同的FPGA器件可用的存储器空间大小不同使得基于其上设计的算法的该项性能指标也不同目前的FPGA器件大都内置了较大的存储器例如Altera公司的低成本Cyclone II系列产品最大提供11Mbit 的存储容量。可以估算存储器的 1/4 用于存储节点信息的参数, 1/4 用于存储节点信息的碰撞位标志, 1/4 用来存储解出的标签数据, 1/4作为系统保留。由于标签数据信息长度为 64bitCycloneII系列FPGA器件实现算法设一次性可读取标签的最大数目为Nmax可以计算出Nmax≈ 1.1× 1064×64=4296 

3 .2 算法识别速度 

  ISO 14443定义了 TYPE ATYPE B两种类型协议其通信速率均为106kbps。以此标准来计算算法的识别速度。算法执行过程中以 all命令和sleep 命令为单元,每次命令的执行都要发送64bit的参数8bitm参数接收标签返回的 64bit 数据共传送136bit的数据。另外call 命令中读写器与标签对数据的处理也要占用一定的时间。可以等价为传送小于 8bit 的数据。这样每次命令的执行共有 144bit 的数据传送。所以,每秒钟可执行call命令次数nn≈ 106× 1024144=753。由算法可知当区域内存在的标签数为 则全部被识别出所执行的 call 命令的次数约为 2L