(昆明船舶设备研究试验中心,昆明 650051)
多节点传感器的数据采集传输系统有着广泛的应用,在具体的实现技术上,物理层实现方式主要分为并行传输和串行传输[1]。如图1所示,图(a)中每个节点都有独占的有线信道与主机直接相连,并行传输的数据传输速率只与节点本身的传输速率有关,与节点数无关;节点控制程序设计简单,各节点间相对独立[2]。图(b)中每个节点与下级节点相连,各节点共用信道与主机相连,在总线带宽相同的情况下,串行传输速率与节点数量负相关,节点间有数据或命令交互。
图1 多节点数据传输物理层实现方式
相比并行传输,串行传输的优势主要在于电缆长度较短、直径较小、重量较轻。式(1)、式(2)分别为并行传输与串行传输方式下,电缆长度与节点数量的关系为:
(1)
Ds=d0+N*Δd
(2)
式(1)~(2)中,N为节点数量;n=1,2,…,N,为每个节点序号;Δd为节点间距,d0为主机与最近一个节点间距。
在某些应用场景中,对电缆的重量及直径较为敏感[3]。针对这些应用场景,本文选用串行传输的方式,使用Verilog语言实现了水下拖缆多节点传感器数据同步采集与传输的RTL代码设计,并在Modelsim中进行了功能仿真验证。
在串行传输方式的物理层设计上,为了进一步减小电缆重量及直径,节点间采用半双工的工作模式,为保证较高的传输信噪比,节点间使用双绞线连接,数据以差分信号的形式传输。具体各节点使用Intel公司的Cyclone系列EP4CE15 FPGA为主控芯片,主机使用了硬件资源更丰富的EP4CE75 FPGA作为主控芯片,FPGA控制TI sn65hvd23芯片将3.3 V TTL单端逻辑电平转换为符合TIA/EIA-485协议的差分信号,驱动节点间的双绞线进行通讯,sn65hvd23芯片最高支持100 m传输距离内高达25 Mbps的传输速率。图2展示了各节点与主机的连接关系,图中只画出了两个节点,实际项目中使用了1个主机和4个节点,主机与最近节点间距d0≈18 m,各节点间距Δd≈17 m。以主机为起始,编号为0#,各节点由近及远,分别编号为1#、2#、3#、4#。
图2 各节点与主机间的连接关系
不同的链路层传输方式,对应着不同的链路层传输模型,逐级交付模型是最常见的一种。逐级交递模型中,数据传输的单位是帧,一帧数据为单个节点单次采集的数据,本项目中,每个节点的AD单次采集得到的数据总长度为48 bit,48 bit即为一个数据帧。
逐级交递模型传输方法是,从4#节点开始,将本节点数据帧传输到3#节点,3#节点将4#节点的数据域与本节点数据一起打包,再往2#节点传输。以此类推,直到所有数据交付给主机。整个过程中,从4#节点到1#节点,节点间传输的数据越来越多,每个节点包含该节点及该节点之前所有节点的数据[4]。图3展示了逐级交付传输模型的工作流程,图中为了简明只画了3个节点,Dx代表第x个节点采集的数据。
图3 逐级交付传输模型
在流水线模型中,传输数据的单位是帧,帧的定义与上文2.1节定义相同。流水线模型传输方法是,在第一个时刻,各节点将本节点采集到的数据装帧传输到下一节点,各节点在传输本节点数据帧的同时,接收并缓存上一节点发送来的数据帧;在第二个时刻,每个节点将上一时刻接收到的数据帧传输到下一节点;在第三个时刻,各节点重复第二时刻动作,直到上一节点无数据交付,且本节点已将缓存区数据交付到下一节点,则当前节点停止工作。当所有数据交付到主机时,整个过程中所有节点并行执行接收发送的操作,就像工厂的流水线作业。图4展示了流水线传输模型的工作流程。
图4 流水线传输模型
在总线模型中,数据传输的单位是比特。总线模型传输方法是,首先在每个数据采样周期内,为每个节点分配时间片,各节点在自己的时间片内才可传输数据,不在自己时间片内的节点,使用寄存器锁存端口信号并直接转发到下级节点。时间片内的节点数据在其他节点中逐级转发,形成数据直达主机的信号通路,数据以比特流的形式直接交付给主机。总线模型传输的方法是,在第一个时间片内,4#节点首先占用信道,3#、2#、1#节点使用寄存器在节点间形成类似物理上的连通,使得4#节点数据可直接交付给主机;在第二个时间片内,已完成数据传输的4#节点停止工作,3#节点开始占用信道并将数据交付给主机;以此类推,直到所有节点都将数据交付给主机。这种传输模式类似于在一条总线上挂了1个主机和4个节点,各节点按顺序分时占用总线资源与主机通讯。图5展示了总线传输模型的工作流程。
图5 总线传输模型
三种模型均可实现多节点数据传输的功能需求,表1描述了各链路层传输模型的优缺点。
多节点的数据传输还需要考虑节点间的同步问题,同步是保证各节点协调工作的基础[5]。本文中,各节点采用误差为20 ppm(part per million)的晶振作为系统时钟源,各节点的数据采样率(AD采样周期)为20 kHz,若节点间
表1 各链路层传输模型对比
为了避免增加额外的同步信号线,同步信号与数据传输共用物理信道。具体方法是,将某个节点或主机设置为同步源,负责为其他节点发送同步命令,节点在收到同步命令后,同时启动AD采集,多节点数据传输完成后,再等待下一次同步命令。同步源在节点内实现称为节点同步源,在主机内实现称为主机同步源。
节点同步源是将同步源放置在数据传输的起始节点内,本项目中在4#节点内以20 kHz的频率发送同步命令。该方法同步命令与数据传输的方向相同,在半双工的工作模式中,无需考虑数据传输方向的切换控制逻辑,代码实现简单。但是存在可靠性较低的问题,如果同步源节点损坏,系统将无法正常工作。另外,同步源逻辑在节点内实现,功能划分模糊,因为其他节点依赖同步源节点的同步命令工作,同步源节点与其他节点形成一种主从关系,而非原本的等同关系。
主机同步源的方法是将同步源放置在主机内,这种方法克服了节点同步源的可靠性低、功能划分模糊的缺点,但是同步命令与数据传输的方向相反,各节点及主机需要额外的半双工传输控制逻辑切换传输方向。表2是这两种实现方式的对比。
表2 同步实现方式对比表
本文选用“总线模型-主机同步”的方式实现多节点数据采集与传输系统,系统由4个节点和1个主机组成,各节点及主机使用PLL(phase locking loop)生成100 MHz的系统时钟,数据采样率为20 kHz,每个采样周期对应5 000个系统时钟,令每个节点时间片占用1 000个系统时钟,另外1 000个系统时钟分配给主机用于发送同步命令等工作。图6为各节点工作流程图,图中"等待路径延迟"是为了等待所有节点都收到同步命令后再同时开始AD采集,路径延迟时间为:
Tpath=(Ntotal-Nself)×Tnode
Tpath的单位为系统时钟个数。其中Ntotal=4,表示总节点数;Nself=1,2,3,4表示各节点序号;Tnode=4表示节点之间数据传输的延迟,因为使用了两级寄存器消除亚稳态,再加上接收端与发送端寄存器,共有4个周期的时钟延迟。
“等待所有节点传输完毕”是为了各节点能同时转换数据传输方向为接收,等待时间为:
Tw=(Nself-1)×Tslice
Tw单位为系统时钟个数。Tslice=1 000,表示时间片占多少个系统时钟。
主机工作流程与节点工作流程类似,篇幅有限,不在赘述。
图6 节点工作流程图
本文使用Verilog硬件描述语言实现系统代码设计。所有节点功能相同,采用宏定义及条件编译等手段保证各节点代码的高复用性,不同节点的代码仅仅是节点号的宏定义不同,这样极大的提高了系统的维护性和扩展性。主机数据接收模块与节点的数据接收模块相同,另外还负责同步源的实现及同步命令的产生,需要单独设计。为了增加代码可靠性,在设计中还有以下几种手段。
数字电路设计中,除了逻辑设计外,还要考虑时序设计,在时序分析满足的情况下,另一个较重要的问题是亚稳态。上文所述的节点同步只是保证各节点同步启动AD采集。在微观上,各节点的时钟信号不可能严格同步,属于不同的时钟域,当节点间数据传输信号跳变沿刚好处于采样时钟沿时,会导致采样信号的建立保持时间不满足,此时用于锁存数据的触发器输出端会在比较长时间内处于不确定状态,这个状态称为亚稳态。亚稳态将导致逻辑误判,严重情况下输出的不稳定导致下一级寄存器也产生亚稳态,称为亚稳态传播,使得故障面扩大。使用两级寄存器采样,可有效减少亚稳态传播的概率[7]。图7为两级寄存器采样的代码,图中p1_rx为接收端口的异步信号,经两级采样后得到同步信号p1_rx_syn。
图7 亚稳态消除代码
另外,AD芯片使用ad_busy信号表示转换状态,FPGA在每个时钟沿读取该信号的值判断AD是否转换完成,该信号的跳变时间由器件的转换时间特性决定,对于FPGA而言是异步信号,同样需要考虑亚稳态问题。与图7相同,在FPGA中使用两级寄存器采样ad_busy信号,得到同步信号ad_busy_syn,消除亚稳态。
根据应用场景,使用10 Mbps的数据传输速率可满足应用需求,FPGA内部使用100 MHz系统时钟,则每个数据位占用10个系统时钟。拖缆中,除了本系统的数据传输线缆外,还有其他用于高功率信号传输的线缆,与本系统线缆编制在同一条主电缆内,线缆间可能相互干扰引起的信号电平误动。为了增加传输可靠性,选取数据位传输的10个系统时钟中部的5个时钟做为数据位检测点,统计5个检测点的电平,若高电平占多数,则该信号为逻辑“1”,若低电平占多数,则该信号为逻辑“0”,这种方法避免了单点采样因扰动引起的数据检测错误。图8的RTL代码实现了5个采样点统计和的数据位检测,图中clk_cnt为系统时钟计数器,p2_rx_syn为时钟域同步后的端口信号。
图8 数据位检测代码
为了防止系统进入异常锁死状态,在等待判断等关键位置处设置超时处理逻辑。例如在AD采样流程中,启动AD后,代码逻辑一直处于等待状态,直到“ad_busy”信号为逻辑低,表示AD转换完成,代码才会进入下一步执行。在此处设置超时处理逻辑,时间上限为AD使用手册标注的转换时间,文本使用的AD7606芯片转换时间为4 μs,超时发生时,将状态机强制转换至AD转换完成状态,并设置超时标志位。
使用半双工的工作方式,在设计时,需要注意传输方向切换时的总线状态,在总线无驱动的状态下,总线极易受到外界干扰。为增强总线抗干扰能力,一种方式是硬件层片,在RS485芯片端口处设计上拉或下拉电阻,在总线无驱动的状态下保持稳定的电平。另一种方法是代码逻辑设计层面,设计代码使得总线总是处于有驱动的状态。
代码设计完成后,使用Modelsim进行功能验证,也称为前仿真。图9为系统代码在Modelsim中的仿真波形,图中m0p1_tx表示主机向节点1#发送的信号,p1p2_tx表示节点1#向节点2#发送的信号。m0p1_rx表示主机接收节点1#发送的信号,p1p2_rx表示节点1#接收节点2#发送的信号,其他信号以此类推。图中可以看出个各节点首先逐级转发主机发出的同步命令,之后各节点逐次在自己的时间片内占用总线向主机发送数据,某节点发送数据时,
图9 系统仿真波形
位于该节点与主机中间的所有节点对数据进行转发。
对于某些对电缆重量及直径较为敏感的多节点数据采集传输系统,本文提出了分析了多种可行的传输方式后,选取了“总线模型-主机同步源”的方式,使用Verilog硬件描述语言设计RTL代码并在Modelsim中完成功能仿真验证。该方式代码设计简单,维护性强,可靠性高,占用芯片资源少。目前已研制出搭载本文所设计代码的系统样机,并通过试验验证,具有一定的工程应用价值。