您的位置首页>互联网>

基于ARM+FPGA的开发平台实现了基于CSMA/CA的MAC协议

导读大家好,我是极客范的本期栏目编辑小友,现在为大家讲解基于ARM+FPGA的开发平台实现了基于CSMA/CA的MAC协议问题。0简介基于CSMA/认证中心的...

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解基于ARM+FPGA的开发平台实现了基于CSMA/CA的MAC协议问题。

0简介

基于CSMA/认证中心的媒体访问控制协议的优点在于简单和鲁棒性,适用于分布式网络。每个节点可以独立决定何时接入信道,而无需维护和动态更新相邻节点的状态信息。只要上层有数据要传输,MAC层就会争夺信道,所以这个协议的应用也是相当广泛的。嵌入式技术的发展也为MAC协议的实现提供了良好的技术支持。本文构建了一个基于ARM和FPGA相结合的嵌入式开发平台,设计并实现了基于CSMA/CA的MAC协议。由于ARM和FPGA都是可重构设备,FPGA中的一些协议参数是由ARM设置的,因此可以通过修改ARM的代码来实现FPGA中协议功能的调整,方便快捷,无需重新生成位文件进行下载,有利于可重构MAC协议的实现。

1协议功能描述

1.1消息结构

本设计实现了基于CSMA/认证中心的媒体访问控制协议的基本访问模式。节点之间的通信只有数据帧(DATA)和确认帧(ACK)。图1示出了消息结构,其中ACK没有网络数据部分。考虑到一跳范围内的无线通信,没有中继节点,因此只有源节点号和目的节点号。

1.2网络设计

本文设计的媒体访问控制协议不仅满足物理载波侦听和虚拟载波侦听相结合检测信道繁忙的基本机制,还包括帧间间隔、随机退避、确认和重传机制。

有数据要发送的节点会先监听媒体,如果忙,会继续等待,如果空闲时间超过或等于DIFS或EIFS,会进入退避过程。在退避过程中,节点会随机生成一个退避时间来设置退避定时器,并继续监控介质。如果空闲时间达到一个时隙,退避定时器将减去一个时隙。如果介质在此期间变得繁忙,退避过程将暂停,直到介质的空闲时间再次到达DIFS或EIFS。当退避定时器变为0时,允许节点开始发送数据,同时启动超时重传机制。如果在指定的时间内没有收到想要的确认,数据帧将被重传,当节点的重传次数超过重传阈值或者超过数据帧的最大允许发送时间时,数据帧将被丢弃。当节点收到确认时,它将开始准备下一次数据传输。

当接收节点收到发送到该节点的正确数据帧时,它将立即回复源节点确认。如果节点没有接收到正确的数据帧,它将使用EIFS;如果接收到正确的数据帧,但它不是针对该节点的,则该节点将分析持续时间,更新导航并认为该信道已被占用。

1.3职能划分

该设计充分利用ARM的灵活性和便利性,实现了随机退避算法和协议参数的管理,如重传次数和帧间间隔的设置。随机退避算法采用在2i个时隙中随机选择一个值作为节点在第一次退避时需要退避的值。协议的参数设置由ARM完成,主要考虑FPGA不利于参数修改,也可以增强协议的可重构性。FPGA凭借其出色的实时信号处理优势,用于管理MAC帧的发送和接收控制。

2协议设计

媒体访问控制层的工作状态主要由物理载波侦听和虚拟载波侦听决定(即媒体访问控制标志=控制标志或导航标志)。当两者都显示为空闲时,MAC层将进入发送数据帧的状态。同时,协议还需要时钟计数。IFS_TIme是每个节点进入退避过程前需要等待的时间,实现了帧间间隔的功能。Backoff _ TIme是撤退过程中每个节点撤退的时间;NAV_TIme是在通信节点没有保留信道的时间。这三次也关系到整个协议的状态。图2为具体实现流程图,具体实现过程步骤如下:

(1)如果MAC_flag为false,则表示信道空闲,然后转到(2);如果MAC_flag为真,则表示信道现在被占用。这时,无论节点已经处于什么状态,都会进入第七步。除了正在发送数据的节点之外,由于正在发送的节点无法侦听信道,也无法从其他节点接收数据,因此载波侦听机制在这种状态下是无效的,因此正在发送数据的节点不会突然从发送状态变为接收状态。

(2)执行帧间间隔过程,将IFS_TIme的大小减小到0,然后输入(3)。IFS_time的初始值是DIFS。

(3)撤退过程。退避时间的大小主要由ARM提供。当节点经历一个时隙时,退避时隙的数量减少1,但是当节点没有完全经历一个时隙时,退避时隙的数量不会改变。撤退过程结束后,将进入(4)。

(4)确定传动类型。在设计中,传输类型Tx_tpye的初始值为1。如果Tx_tpye为0,则向节点发送ACK,根据接收到的数据帧中的源/目的节点号和序列号组装并回复发送节点ACK,初始化节点发送数据帧的IFS_time和Backoff _ time,将NAV_flag设置为true,更新NAV_time的值,并继续虚拟载波侦听,避免发送ACK的节点先占用信道的情况;如果Tx_tpye不为0,则表明该节点可以

以开始发送数据帧,转入(5)。(5)发送数据帧前首先判断是否超过最大允许发送的时间,若超过了就丢弃该数据帧,将IFS_time设置为EIFS,Backof_time初始化,超时计时器停止;若没有超过最大允许发送时间,则节点正式发送数据帧,并启动单次超时计时,发送完毕后就等待ACK,此时进入(6)。(6)在等待ACK到来的同时判断是否超时单次允许发送的时间,若超过了,则重传次数递加;然后判断是否超过重传门限,如果超过了门限,则丢弃该数据帧;如果没有超过,则将IFS_time设置为EIFS,而且还需要ARM的随机退避算法根据重传次数重新给一个退避时隙数,同时修改数据帧中的重传位以便接收节点识别。(7)保存当前退避进程中的Backoff_time和刚刚结束的帧间间隔的大小IFS_time,接收MAC帧并解析其中相关的数据,为后续的组装ACK做准备,然后进入(8),同时将NAV_flag设置为true,保证MAC层能处理完数据。(8)校验接收到的MAC帧是否正确,若不正确,则将IFS_time设置为EIFS,NAV_flag设置为false,NAV_time设置为0,这样节点就进入执行帧间间隔进程。若校验正确,则进入(9)。(9)将FPGA解析出来的目的节点号与本节点的比较,判断是否是发送给本节点的。如果不是发送给本节点的,那么就再比较本节点现在的NAV_time值是否大于接收到的MAC帧内的NAV,若大于则本节点继续按照现有的NAV_time值执行下去;若小于接收到的MAC帧内的NAV,则使用MAC帧内的NAV来更新本节点的NAV_time值,然后以最新的NAV_time值递减下去直到为0,虚拟载波侦听显示空闲。但是在执行NAV_time递减过程中随时都有可能收到新MAC帧,而且也不是发送给本节点的,照样要执行本步骤,并不是等到NAV_time变为0后再更新。如果是发送给本节点的,则会进入(10)。(10)若节点接收到的是数据帧。即Rx_type为1,FPGA将接收到的数据帧上传ARM;同时将IFS_time更新为SIFS,Backoff_time设置为0,这样使得接收到数据帧到发送ACK之间的时间间隔为SIFS,并将Tx_tpye设置为0,NAV_flag变为false,进入(2),开始准备发送ACK。如果Rx_type为0,则节点接收到的是ACK,说明一次数据收发过程结束,节点将初始化相关参数,计时停止等,FPGA释放空间,表明该数据帧已发送成功。

12下一页全文
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。