当前位置: 首页 > backend >正文

[实战] IRIG-B协议详解及Verilog实现(完整代码)

目录

  • IRIG-B(B码)协议详解及Verilog实现
    • 一、IRIG-B协议概述
    • 二、帧格式详细解析
      • 1. 码元类型与索引计数
      • 2. 时间编码字段
      • 3. 控制功能码元(CF)
      • 4. 纯二进制秒码(SBS)
    • 三、编码与信号特性
    • 四、时间编码实现
      • 1. 时间参数转换
      • 2. 帧数据填充规则
    • 五、从数字编码到物理信号
      • 1. 波形生成原理
      • 2. 示例波形分析(前20码元)
    • 六、协议特性与工程实践
      • 1. 直流(DC)与交流(AC)调制对比
      • 2. 扩展协议实践
    • 七、应用场景与优势
    • 八、总结
    • 补充说明

IRIG-B(B码)协议详解及Verilog实现

代码下载(含Verilog实现与python编码实现)

一、IRIG-B协议概述

IRIG-B(InterRange Instrumentation Group-B)是由美国靶场仪器组制定的时间同步标准,广泛应用于电力、通信、航空航天及军事领域。其核心特点为每秒传输一帧时间码(1帧/s),包含100个码元,每个码元持续10ms。协议支持直流(DC)和交流(AC)两种调制方式,其中:

  • IRIG-B(DC):采用脉宽调制,同步精度达几十纳秒,接口为TTL或RS422。
  • IRIG-B(AC):通过1kHz正弦波载波幅度调制,同步精度为10~20微秒,接口为平衡接口。

二、帧格式详细解析

IRIG-B的帧结构以秒为周期,每帧包含100个码元,通过脉宽和位置标识编码时间信息及控制功能。

1. 码元类型与索引计数

  • 码元类型
    • “0”码元:脉宽2ms(占索引计数间隔的20%)。
    • “1”码元:脉宽5ms(占索引计数间隔的50%)。
    • 位置识别标志“P”:脉宽8ms(占索引计数间隔的80%),每10个码元出现一次(P0~P9)。
  • 索引计数
    • 从帧参考点(Pr)开始,以10ms为间隔递增,范围0~99。
    • 帧参考点由连续两个“P”码元标识,第二个“P”码元前沿为“准时”参考点。

简单易懂的说法就是每个码元都是1个10ms的脉冲,占空比为20%表示0,站控比为50%表示1,占空比80%表示P。也就是每个0由2ms高和8ms低构成,1由5ms高和5ms低构成,P由8ms高和2ms低构成。

2. 时间编码字段

时间信息采用二进制编码十进制(BCD)格式,按“秒-分-时-天”顺序排列:
具体帧结构如下所示
IRIG-B帧结构分组表(0-99码元)

码元范围符号类型字段名称数据内容/功能说明
0PP0(帧头标识)帧起始位置标识(8ms高电平)
1-80/1二进制秒秒值的8位二进制编码(0-59,低位在前)
9PP1(字段分隔)二进制秒结束,BCD秒开始标识
10-130/1BCD秒个位秒个位的4位BCD码(0-9)
14-170/1BCD秒十位秒十位的4位BCD码(0-5,高位补0)
180/1备用位保留未使用
19PP2(字段分隔)BCD秒结束,BCD分开始标识
20-230/1BCD分个位分个位的4位BCD码(0-9)
24-270/1BCD分十位分十位的4位BCD码(0-5,高位补0)
280/1备用位保留未使用
29PP3(字段分隔)BCD分结束,BCD时开始标识
30-330/1BCD时个位时个位的4位BCD码(0-9)
34-370/1BCD时十位时十位的4位BCD码(0-2,高位补0)
380/1备用位保留未使用
39PP4(字段分隔)BCD时结束,BCD日(年积日)开始标识
40-430/1BCD日个位年积日个位的4位BCD码(0-9)
44-470/1BCD日十位年积日十位的4位BCD码(0-9)
480/1BCD日百位(低2位)年积日百位的2位BCD码(0-3)
49PP5(字段分隔)BCD日结束,BCD年开始标识
50-530/1BCD年个位年个位的4位BCD码(0-9)
54-570/1BCD年十位年十位的4位BCD码(0-9)
580/1控制字段1同步控制/闰秒标志(如1=下一分钟有闰秒)
59PP6(字段分隔)BCD年结束,控制字段开始标识
60-680/1控制/备用字段保留用于校验、扩展信息等
69PP7(字段分隔)控制字段分隔标识
70-780/1备用字段保留未使用
79PP8(字段分隔)备用字段分隔标识
80-880/1备用字段保留未使用
89PP9(字段分隔)备用字段分隔标识
90-980/1用户自定义/扩展字段可自定义(如校验码、设备ID、时区等)
99PP10(帧尾标识)帧结束标识

关键字段说明

  1. 位置标识符(P类型)

    • P0-P10:共11个位置标识符(码元0,9,19,29,39,49,59,69,79,89,99),用于同步和字段分隔,波形固定为8ms高电平+2ms低电平。
  2. 时间字段

    • 二进制秒(1-8):直接编码0-59的二进制值(低位在低码元,如Bit0在码元1)。
    • BCD时间:每个时间单位(秒、分、时、日、年)拆分为个位和十位的BCD码,例如:
      • 秒=23 → 个位=3(BCD 0011,码元10-13),十位=2(BCD 0010,码元14-17)。
  3. 年积日(DOY)

    • 由年、月、日计算得出(如2023年10月1日对应DOY=274),编码为3位BCD:
      • 274 → 百位=2(码元48),十位=7(码元44-47),个位=4(码元40-43)。
  4. 控制与扩展

    • 码元50~57
    • 码元58:关键控制位,通常用于闰秒指示。
    • 码元90-98:用户自定义,可加入CRC校验或扩展信息。

帧结构示意图

[P0] 1-8  [P1] 10-13 14-17 [P2] 20-23 24-27 [P3] ... [P10]
|-二进制秒-|------BCD秒-----|------BCD分-----| ...    |--帧尾--|

3. 控制功能码元(CF)

位于P5~P8之间,共27位,用于扩展功能或自定义协议,例如:

  • 状态标识、设备编号或特殊命令。
  • 码元50~57用做年的个位和十位
  • 无统一标准编码,由设备生产商自定义。

4. 纯二进制秒码(SBS)

从P8开始,占17位,表示从午夜开始的秒数(0~86399),每日重复。

三、编码与信号特性

  • 编码方式
    • 脉宽调制:通过脉宽差异区分“0”和“1”。
    • 载波调制(AC):1kHz正弦波,调制比10:3,正交过零点与码元前沿对齐。
  • 信号传输
    • DC码:抗干扰性强,适合短距离高精度同步。
    • AC码:支持远距离传输,但精度略低。

四、时间编码实现

以2025-12-03 01:03:04为例

1. 时间参数转换

  • 日期计算:2025年12月3日为第337天(非闰年)

    • 非闰年,12月3日对应年积日 337(计算方式:31天(1月)+28天(2月)+31天(3月)+30天(4月)+31天(5月)+30天(6月)+31天(7月)+31天(8月)+30天(9月) +31天 (10月)+30天(11)月 + 3天(12月3日)= 337)。
  • BCD编码表

字段十进制值7位BCD编码码元填充位置
秒(S)040000100十位 码元1-4(0000),个位 6-8(0100)
分(M)030000011十位 码元10-13(0000),个位 15-17(011)
时(H)01000001十位 码元20-23(0000),个位 25-27(01)
天(D)3370101010001百位 码元30-33(0101),35-38(0001),40-41(0001)

2. 帧数据填充规则

  1. 秒信息填充

    • 码元1-4:0000(低位)
    • 码元6-8:100(高位,补零至4位)
  2. 分信息填充

    • 码元10-13:0000(低位)
    • 码元15-17:011(高位,补零至4位)
  3. 时信息填充

    • 码元20-23:0000(低位)
    • 码元25-27:01(高位,补零至4位)
  4. 天信息填充

    • 码元30-33:0101(337的高4位)
    • 码元35-38:0001(337的中4位)
    • 码元40-41:0001(337的低4位,补零)

五、从数字编码到物理信号

1. 波形生成原理

每个码元由10ms周期构成,通过脉宽调制实现数字编码:

码元类型高电平持续时间低电平持续时间典型应用场景
“0”2ms8ms秒/分/时低位编码
“1”5ms5ms天信息高位编码
“P”8ms2ms帧同步与位置标识

使用python生成完成编码和波形生成,python代码如下:

# -*- coding: utf-8 -*-
"""
Created on Mon Apr 28 20:36:41 2025@author: Neol
"""import matplotlib.pyplot as plt  
import numpy as np  # 定义时间参数  
year = 2025  
month = 12  
day = 3  
hour = 1  
minute = 3  
second = 4  # 计算年积日(非闰年)  
days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]  
day_of_year = sum(days_in_month[:month-1]) + day  # 转换为BCD编码  
def to_bcd(value, bits):  return [int(b) for b in format(value, '0{}b'.format(bits)).zfill(bits)]  second_bcd = to_bcd(second, 7)  # 0-59需要7位  
minute_bcd = to_bcd(minute, 7)  
hour_bcd = to_bcd(hour, 6)     # 0-23需要6位  
day_bcd = to_bcd(day_of_year, 10)  # 1-366需要10位  # 构建帧结构(简化示例,仅包含时间字段)  
frame = [  *second_bcd, 0, *second_bcd[4:],  # 秒信息(码元1-4,6-8)  0,0,0,0,  # 填充位  *minute_bcd, 0, *minute_bcd[4:],  # 分信息(码元10-13,15-17)  0,0,0,0,  # 填充位  *hour_bcd, 0, *hour_bcd[4:],      # 时信息(码元20-23,25-27)  0,0,0,    # 填充位  *day_bcd[:4], 0, *day_bcd[4:8], 0, *day_bcd[8:],  # 天信息(码元30-33,35-38,40-41)  *[0]*27,   # 控制功能码元(CF)  *[0]*17    # 纯二进制秒码(SBS)  
]  # 生成波形(脉宽调制)  
time_points = []  
signal = []  
current_time = 0  for bit in frame:  # 每个码元周期10ms  if bit == 0:  pulse_width = 2  # 2ms高电平  elif bit == 1:  pulse_width = 5  # 5ms高电平  else:  # P码元  pulse_width = 8  # 8ms高电平  # 生成高电平  time_points.extend([current_time + i for i in range(pulse_width)])  signal.extend([1]*pulse_width)  # 生成低电平  time_points.extend([current_time + i for i in range(pulse_width, 10)])  signal.extend([0]*(10 - pulse_width))  current_time += 10  # 绘制前200ms波形(显示前20个码元)  
plt.figure(figsize=(12, 4))  
plt.step(time_points[:200], signal[:200], where='post')  
plt.title('IRIG-B(DC) Waveform Example (First 20 Code Elements)')  
plt.xlabel('Time (ms)')  
plt.ylabel('Amplitude')  
plt.yticks([0, 1], ['Low', 'High'])  
plt.grid(True)  
plt.show()

2. 示例波形分析(前20码元)

在这里插入图片描述

波形解析

  1. 帧同步建立(0-20ms):

    • 码元0(P9):8ms高电平(0-8ms)
    • 码元1(P0):8ms高电平(10-18ms)
    • 第二个P码元前沿(18ms)为时间基准点
  2. 秒信息编码(20-80ms):

    • 码元2-5:0000(2ms脉宽)
    • 码元6:1(5ms脉宽)
    • 码元7-8:00(2ms脉宽)
  3. 保留位填充(80-120ms):

    • 码元9-12:0000(2ms脉宽)
  4. 分信息编码(120-180ms):

    • 码元13-16:0000(2ms脉宽)
    • 码元17:1(5ms脉宽)
    • 码元18-19:11(5ms脉宽)

可综合Verilog模块
代码下载(含Verilog实现与python编码实现)

六、协议特性与工程实践

1. 直流(DC)与交流(AC)调制对比

特性DC码(TTL/RS422)AC码(1kHz载波)
同步精度20-50ns1-20μs
传输距离<10米(无中继)>1公里(需中继)
抗干扰性优(差分传输)良(载波调制)
典型应用发电厂保护装置、精密实验室广域时间网络、军事通信系统

2. 扩展协议实践

  • 年份信息嵌入

    • 通过控制功能码元(CF)扩展:
    • 码元50-57:8位BCD编码(2025年→25年→个位码元50-53,0010,十位码元54-57,0101
  • 北斗融合方案

    • 北斗终端输出TOD(Time Of Data)接口
    • 通过FPGA实现IRIG-B编码转换
    • 同步精度优于50ns(DC码)

七、应用场景与优势

  • 应用场景
    • 电力系统:同步发电厂、变电站设备时钟。
    • 通信网络:基站时间同步。
    • 航空航天:卫星发射、飞行器测控。
    • 工业自动化:生产线设备协同。
  • 优势
    • 高精度:DC码同步精度达纳秒级,AC码达微秒级。
    • 标准化:接口统一,兼容性强。
    • 可靠性:抗干扰设计,适应恶劣环境。

八、总结

IRIG-B协议通过每秒一帧的脉宽编码,实现了高精度时间同步。其帧格式严格定义了时间字段和控制功能,支持直流/交流两种调制方式,兼顾了短距离高精度和远距离传输需求。在电力、军事等关键领域,IRIG-B已成为不可或缺的时间同步标准。

IRIG-B(Inter-Range Instrumentation Group-B)是一种广泛应用于时间同步的标准协议,主要用于军事、航空航天、电力系统等领域。其核心功能是通过脉冲编码方式传输精确的时间信息(包含年积日、时分秒等),同时支持直流(DC电平移位)和幅度调制(AM载波调制)两种形式。以下是对其协议规范及帧格式的详细介绍:

补充说明

在网上查询资料时发现,有些文档对帧格式的描述如下:

    秒:7位BCD(码元1-4,6-8)分:7位BCD(码元10-13,15-17)时:6位BCD(码元20-23,25-27)天:10位BCD(码元30-33,35-38,40-41)

即没有二进制秒字段,之所以有差异,是因为使用的协议版本不一样,应该是参考 IRIG 200-4,本文定义参考官方文献IRIG-B000、B120。特此说明,请大家从自己的实际需求出发进行设计和应用。


http://www.xdnf.cn/news/2773.html

相关文章:

  • 第十三节:实战与工程化高频题-TypeScript集成要点
  • 香港科技大学广州|智能交通学域博士招生宣讲会—电子科技大学
  • css网格布局Grid
  • 在服务器中,搭建FusionCompute,实现集群管理
  • Qt/C++面试【速通笔记五】—子线程与GUI线程安全交互
  • AWS PrivateLink vs Lattice:深度解析两大网络服务的异同
  • 恰好边数限制的最短路(边的数量很大)
  • 《淘宝 API 数据湖构建:实时商品详情入湖 + Apache Kafka 流式处理指南》
  • MySQL最新版9.3.0安装教程
  • PyCharm 2023升级2024 版本
  • Linux:ftp 配置实验
  • terraform使用workspace管理多工作环境
  • List--链表
  • 【C++ 核心知识点面试攻略:从基础到实战(上位机开发视角)】
  • Linux调试器 - gdb使用指南
  • 【虚幻5蓝图Editor Utility Widget:创建高效模型材质自动匹配和资产管理工具,从3DMax到Unreal和Unity引擎_系列第二篇】
  • Rabbitmq下载和安装(Windows系统,百度网盘)
  • SQL Server 存储过程开发规范
  • 普通IT的股票交易成长史--20250428晚
  • InferType和_checked_type的区别?
  • 开发vue项目所需要安装的依赖包
  • leetcode128-最长连续序列
  • 聊天室系统:多任务版TCP服务端程序开发详细代码解释
  • Qt C++数据库实验
  • FPGA-数字时钟
  • whois为什么有时会返回两个不同的域名状态
  • 【Linux】Java 开发者的 Linux 常用命令指南
  • 2024ICPC成都题解
  • Golang实现函数默认参数
  • 人工智能数学基础(一):人工智能与数学