基于FPGA的ELIS井下仪器总线控制器的设计
2021-04-13周建琼张菊茜
李 谦,周建琼,张菊茜
(中海油田服务有限公司油田事业部 河北 三河 065201)
0 引 言
在国内测井行业中,中海油田服务股份有限公司的 ELIS( Enhanced Logging Imaging System)成像测井系统从推出到现在,日趋完善,在业界获得很高的评价与认可。 ELIS系统的井下测井装备总线采用了4组信号线实现数据通讯的全双工操作,这4对信号线分别是 CMD、 M2、 M5和 M7通道,其中 CMD是下行命令通道,其传输速率为20.83 kbps; M2为上行数据通道,传输速率为41.67 kbps; M5和M7也是上行数据通道,其传输速率均为93.75 kbps。在具体实现时,采用成熟的编解码芯片设计,其中 CMD和 M2通道的采用 Intersil公司的 HD6408实现,M5和 M7通道则采用 Intersil公司的 HD6409实现[1]。
在实际工程中,采用成熟的编解码芯片来实现上述功能,电路设计复杂,电路板面积大,成本高,且灵活性不够。 随着技术的不断发展,可以将现场可编程门阵列(FPGA)技术应用于 ELIS系列井下仪器总线的编码解码中[2],以取代1片 HD6408和2片 HD6409。
1 ELIS井下仪器总线通道的帧格式及数据形式
CMD通道和M2通道采用标准的MIL-STD-1553B总线[3],只是传输速率不同,其帧格式的特点如下:
1)帧结构由命令或数据同步头、数据体和校验位组成;
2)命令同步字电平信号为先高后低,数据同步字电平信号为先低后高,其高低电平持续时间均为1.5个数据发送周期;
3)数据体由16位数据组成,高位在前,采用标准曼彻斯特码编码模式,数据‘1’电平信号由高到底的跳变,数据‘0’电平信号由低到高跳变;
4)帧结构的最后一位为校验位,ELIS的井下测井装备总线中为用奇校验。
M5和M7通道的传输格式相同,但与M2通道有所不同,其帧格式的特点如下:
1)每帧信息由8个同步头,1个命令/数据标识和数据体组成,没有校验位;其中8个同步头频率与数据体传送频率一致,命令/数据同步脉冲周期是1个同步脉冲周期的1.5倍,传送的数据采用曼彻斯特编码;
2)同步头为连续8个由高到低的电平;
3)命令同步字电平信号为先高后低,数据同步字电平信号为先低后高,其高低电平持续时间均为1.5个数据发送周期;
4)数据长度是16位宽的倍数,但长度不固定。
综上所述,ELIS井下仪器总线的通道可以分成三类:速率为20.83 Kb的标准的MIL-STD-1553B总线;速率为41.67 Kb的标准的MIL-STD-1553B总线;速率为93.75 Kb的自定义格式的总线。其中,自定义格式的总线,除了速率跟其他两种不同,其同步头和结束位部分也不相同,但是数据部分是相同的,都是曼彻斯特码传输。
曼彻斯特码在一个时钟周期内利用信号的边沿来表示二进制数据“0”和“1”,即由高电平跳变为低电平时为“1”,由低电平跳变为高电平时为“0”,如图1所示。这种码型的优点是因为正负电平出现的概率相等,无直流分量和低频分量,它在每个码元间隔的中心位置都有电平跳变,定时信息特别丰富,很容易提取位的定时信息,具有较强的抗干扰能力。
图1 曼彻斯特码
2 井下仪器总线的分析与FPGA设计
采用FPGA实现ELIS井下仪器总线的通讯,首先要把总线的各个通道分为发送和接收两部分,即各个通道数据的编码与解码。其中编码部分是比较简单的,只需要按照CMD、M2、M5和M7各自的帧格式、数据形式和速率依次发送,然后经过信号放大和变压器隔离部分即发到总线上[4]。
解码部分比较复杂,首先信号要经过隔离变压器和差分变单端的芯片变成单端信号,然后对各个通道分别进行解码。针对ELIS井下仪器总线命令与数据分开的全双工模式,在FPGA中分别建立CMD、M2、M5和M7四个模块,根据数据帧格式的特点,在FPGA编程中可以将这四个模块分成两类,分别是适用于CMD、M2模块的标准MIL-STD-1553B总线解码逻辑,与适用于M5、M7模块的自定义格式的总线解码模块。下面分别介绍两类解码模块的基本构成以及解码方式。
2.1 标准MIL-STD-1553B总线解码模块
图2所示为M2通道的解码模块的接口信号,左侧为输入接口,右侧为输出接口。其中 Clk为模块采样时钟,udi为模块的数据输入接口,reset为复位信号接口,en为解码输出使能信号,每完成16- bit数据解码产生一个时钟周期的高电平脉冲,dataout[15:0]为16位数据并行输出信号接口,DecodeCorrect为校验标识输出接口,表示数据校验是否正确[5]。
图2 曼彻斯特解码器模块图
解码首先要解决时钟恢复问题,本文采用倍频法,其原理为采用总线速率的整数倍(本文采用8倍速)对Udi数据进行采样,同时考虑到效率和功耗问题,直接采用特定位置的信息进行判断,而不采用对采样结果进行逻辑判断的方法,即如果判断到Udi信号发生改变,则产生跳变信号,这样省资源,效率高,延时少,功耗低。
标准MIL-STD-1553B总线解码模块分三部分[6]:判断同步头,曼彻斯特码解码,校验。
由于在 ELIS系列井下仪器总线中,命令与数据时分开的,所以解码时候,同步头或者是先低电平后高电平的数据同步,或者是先高电平再低电平的命令同步。本文在 FPGA前端电路中,设定初始电平,CMD通道初始电平为低,而 M2通道初始电平为高,这样,当 FPGA的 Udi引脚电平发生跳变的时候,程序认为 Udi信号来了,开始判断同步头。Cnt为采样周期计数器,从0开始计数,当下一次跳变出现的时候,cnt计数值应该是周期采样次数(8倍采样)的1.5倍,即12左后,同时Cnt清零,计数从新开始,当计数为12时,认为同步头结束,下面的 Udi信号是数据。延迟一个采样周期,确定同步信号结束后,进入解码状态机。
解码状态机针对曼彻斯特码很容易提取位的定时信息的特点,对Udi信号进行分析,获取有效数据。数据解码状态机如图3所示:
图3 数据解码状态机
该状态机从000状态开始,在000状态读取Udi的电平,该电平为第一个接收到的有效数据值,然后进入001状态,等待Udi信号的跳变,并开始Cnt计数;当Udi信号跳变的时候,对Cnt计数进行判断,如果Cnt<5,且是首次出现,那么返回到状态001继续等待Udi跳变,如果第二次出现,则进入011状态,写入相同的数据后返回001状态继续等待;如果4
最后对收到的16位数据和1位校验位进行校验分析,同时En输出跳变,Dataout[15..0]并行输出16位数据。如果校验成功,Decodecorrect输出跳变,否则Decodecorrect保持原电平不变。
2.2 自定义帧格式总线解码模块
图4所示为该模块的输入和输出接口,左侧为输入接口,右侧为输出接口。其中 Clk为模块工作时钟收入接口,UDI为 M5或 M7通道信号串行输入接口,reset为复位接口,en为解码输出使能接口,该接口默认为低电平,每完成16 bit数据解码,输出一个时钟周期高电平,由于 M5或 M7通道传送的数据长度不固定,且在未解码完之前是未知的,因此需要增加一个输出信号 decoderover,该信号表示一次 M5或 M7通道的数据解码完毕后的标记信号,高电平有效[7]。
图4 自定义帧格式总线解码模块
解码依然采用与标准MIL-STD-1553B总线解码模块相同的倍频法,本文采用8倍速对Udi信号进行采样。该解码模块分为三部分:检测8个0的同步脉冲;确认数据/命令同步头;曼彻斯特码解码。ELIS井下仪器总线规定M5和M7只传数据,故其Udi信号起始为8个上升沿,然后是1.5倍时钟周期高电平和1.5倍时钟周期低电平的标识位。
为了更好的判断8个上升沿跳变,本文在FPGA的Udi输入的前端电路进行设置,使Udi信号默认为高电平,如此以来当Udi信号出现第一个下降沿的时候,就是Udi数据帧的起始位置。图5所示带箭头下降沿处为同步头的起始位置,最后一个0后面是标识位。
图5 同步头数据格式图
检测同步脉冲,当采样信号发现第一个下降沿的时候开始启动状态机,同时采样计数器Cnt从0开始计数,判断是否从此次跳变后,能够出现连续15次周期相同的脉冲。当采到下一个Udi信号跳变的时候,记录Cnt的数值为CNTreg,同时Cnt清零,继续开始计数。每发生一次跳变,都将Cnt清零从新开始计数,并判断Cnt的值与CNTreg的相同,如果差别大则认为检测同步脉冲失败,跳出状态机;如果连续出现15次相同的Cnt计数,即15次周期相同的脉冲,则认为同步脉冲检测成功,进入确认标识位状态机。
确认标识位部分,直接采用标准MIL-STD-1553B总线解码模块中的同步头状态机。
数据体解码部分,跟标准 MIL- STD-1553 B总线解码模块中解码状态机方法类似,对 Udi信号进行解码同时串并转换,每接收16位数据 En发生跳变,同时 Dataout[15..0]并行输出数据。不同之处在于该帧格式中数据长度不固定,而且没有结束位,本文采用上述解码状态机循环运行,直到 Cnt采样时钟计数超过2倍的采样频率,即Cnt>16,认为此数据帧结束,decodeover信号发生一次跳变。
3 FPGA优化策略
对上述解码模块,本文采用同步设计的方法来实现。在同步系统中,所有触发器都由同一个公共时钟信号来同步,因此,可以很好的避免毛刺和一些竞争与冒险。但在实际应用中还存在一些障碍,比如时钟漂移,状态机亚稳态等[8]。下面针对这些问题提出一些解决方案。
3.1 时钟漂移
由于使用高倍时钟采样的方式对曼彻斯特码进行采样,容易引起时钟漂移,尤其是在自定义帧格式的解码过程中,由于数据量大,随着采样计数的大量累积,更容易引起时钟漂移。本文充分利用曼彻斯特码自带时钟的特点,分析得到两次相邻跳变的最小时间间隔是8个采样周期的一半,即4个采样周期;相邻两次跳变的最大时间间隔是8个采样周期。本文在每次采到Udi信号跳变的时候,都将Cnt采样计数器的数值清零,这样,采样计数器的最大值也就是8,不会出现大量计数累积的现象,从而大大降低时钟漂移的概率。
3.2 状态机的亚稳态
亚稳态是信号的一种不确定状态,对于FPGA而言,当时钟CLK跳变采样时,如果待采集输入信号D处于高低电平变化阶段,输出端Q则有可能将该信号错误的识别为0,也有可能识别为1,即该信号采样输出信号Q处于亚稳态,如图6所示。
图6 亚稳态信号
在异步信号采集过程中,由于时钟相位偏移未知,数据可能在任意时间到达异步时钟域接收端,随时可能产生亚稳态。本设计FPGA内部信号均使用系统同步时钟,有效避免了内部信号亚稳态的产生,但是外部输入信号接收端却很难避免产生亚稳态信号,尤其井下测井装备发出的总线数据信号各不相同,且工作环境恶劣,导致接收所有井下装备数据的总线主控制器接收端更是无法避免亚稳态信号的产生。
本文根据总线信号速率低、频率固定的特点,通过实际测试,发现接收端输出信号的亚稳态主要表现为跳变沿滞后一个时钟周期,或者在跳变沿附近一个时钟周期出现毛刺。对于跳变沿滞后一个时钟周期的问题,本文在8倍数据频率采样的基础上,将跳变沿之间的时钟计数范围放宽,不采用严格的4或者8个时钟周期,而设置为3~5个,或者7~9个时钟周期的逻辑,来判定宽窄跳变,从而解决跳变沿拖后一个周期的问题。对于毛刺问题,由于仅在跳变沿附近一个时钟周期产生,本文采用边沿检测的方式,并根据产生毛刺的时候会频繁出现跳变沿的规律,构建简单的低通滤波器将跳变沿的多次变化滤波为一次变化,即可解决毛刺问题。通过上述两种方案的结合,针对性的解决了现场应用中信号解码亚稳态干扰的问题,耗费资源少,稳定性高,适合在井下测井装备中应用。
4 测试平台
测试平台采用Altera系列的FPGA芯片,程序采用Verilog编写,先在Model—sim 软件下进行逻辑仿真,再在Altera提供的软件Quartus5.0下进行最后的时序仿真与综合[9]。
搭建一个模拟井下仪器发送接收数据,并对数据进行判断的测试平台,如图7所示。
图7 测试平台示意图
模拟平台1用来模拟发送CMD命令,接收M2、M5和M7数据。在FPGA1中搭建一个标准MIL-STD-1553B总线编码模块用于CMD通道发送命令;一个标准MIL-STD-1553B总线解码模块用于M2通道接收数据;两个自定义帧格式总线解码模块用于M5和M7通道接收数据;按键模块,用来控制CMD通道发送命令;LED指示模块,用来指示M2、M5和M7通道数据解码正确与否。
模拟平台2用来接收CMD命令,同时分别通过M2、M5和M7通道发送固定数据。在FPGA2中搭建一个标准MIL-STD-1553B总线解码模块用于CMD通道接收命令;一个标准MIL-STD-1553B总线编码模块,用于M2通道发送数据;两个自定义帧格式总线编码模块,用于M5和M7通道发送数据;LED指示模块,用来指示CMD通道是否接收到命令,以及M2、M5和M7通道是否发送数据。
当模拟平台1按键按下时,发送命令道模拟平台2,该平台解析到正确的命令后通过M2、M5和M7发送数据,同时LED指示灯指示状态;模拟平台1接收到模拟平台2传来的数据后,在FPGA内部进行比对,通过LED指示灯指示数据的正确与否。
另外,模拟平台1和模拟平台2还分别接测井仪器模拟盒(即用6408和6409芯片进行编码解码)进行测试,经过大量实验,证实该设计灵活、稳定、可靠。
5 结束语
本文提出的 ELIS井下仪器总线控制器的设计方案摒弃了市场上昂贵的协议处理芯片,而采用 FPGA来实现,大大提高了设计的灵活性,拓展了测试功能,并且通过测试 CMD/ M2/ M5/ M7三个通道的解码完全并行操作,相互不受影响。在测试、验证过程中,模拟了多种测井装备的命令与数据,各个通道均能成功编解码。经过长时间不间断测试,该设计表现稳定可靠,并成功应用于ELIS系列井下装备。