代码下载(含Verilog实现与python编码实现)
IRIG-B(InterRange Instrumentation Group-B)是由美国靶场仪器组制定的时间同步标准,广泛应用于电力、通信、航空航天及军事领域。其核心特点为每秒传输一帧时间码(1帧/s),包含100个码元,每个码元持续10ms。协议支持直流(DC)和交流(AC)两种调制方式,其中:
IRIG-B的帧结构以秒为周期,每帧包含100个码元,通过脉宽和位置标识编码时间信息及控制功能。
简单易懂的说法就是每个码元都是1个10ms的脉冲,占空比为20%表示0,站控比为50%表示1,占空比80%表示P。也就是每个0由2ms高和8ms低构成,1由5ms高和5ms低构成,P由8ms高和2ms低构成。
时间信息采用二进制编码十进制(BCD)格式,按“秒-分-时-天”顺序排列:
具体帧结构如下所示
IRIG-B帧结构分组表(0-99码元)
码元范围 | 字段名称 | 编码内容 | 说明 |
---|---|---|---|
0 | P0(帧头标识) | 8ms高电平 + 2ms低电平 | 帧起始标志 |
1-4 | BCD秒个位 | 秒个位(0-9) | 权重1、2、4、8 |
6-8 | BCD秒十位 | 秒十位(0-5) | 权重1、2、4(高位补0) |
10-13 | BCD分个位 | 分个位(0-9) | 权重1、2、4、8 |
15-17 | BCD分十位 | 分十位(0-5) | 权重1、2、4(高位补0) |
20-23 | BCD时个位 | 时个位(0-9) | 权重1、2、4、8 |
25-26 | BCD时十位 | 时十位(0-2) | 权重1、2(高位补0) |
30-33 | BCD日个位 | 年积日个位(0-9) | 权重1、2、4、8 |
35-38 | BCD日十位 | 年积日十位(0-9) | 权重1、2、4、8 |
40-41 | BCD日百位 | 年积日百位(0-3) | 权重1、2(高位补0) |
50-58 | BCD年信息 | 年个位/十位(00-99) | 控制字段扩展 |
60-78 | 控制/备用字段 | 闰秒标志、校验位、自定义用途 | 用户可编程 |
80-97 | 二进制天内秒 | 一天以内的秒技术,二进制表示 | 标准二进制 |
关键字段说明
位置标识符(P类型):
时间字段:
0011
,码元1-4),十位=2(BCD 0010
,码元6-8)。年积日(DOY):
控制与扩展:
帧结构示意图
[P0] 1-8 [P1] 10-13 14-17 [P2] 20-23 24-27 [P3] ... [P10]
|-二进制秒-|------BCD秒-----|------BCD分-----| ... |--帧尾--|
位于P5~P8之间,共27位,用于扩展功能或自定义协议,例如:
从P8开始,占17位,表示从午夜开始的秒数(0~86399),每日重复。
以2025-12-03 01:03:04为例
日期计算:2025年12月3日为第337天(非闰年)
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) | 04 | 0000100 | 十位 码元1-4(0000),个位 6-8(0100) |
分(M) | 03 | 0000011 | 十位 码元10-13(0000),个位 15-17(011) |
时(H) | 01 | 000001 | 十位 码元20-23(0000),个位 25-27(01) |
天(D) | 337 | 0101010001 | 百位 码元30-33(0101),35-38(0001),40-41(0001) |
秒信息填充:
分信息填充:
时信息填充:
天信息填充:
每个码元由10ms周期构成,通过脉宽调制实现数字编码:
码元类型 | 高电平持续时间 | 低电平持续时间 | 典型应用场景 |
---|---|---|---|
“0” | 2ms | 8ms | 秒/分/时低位编码 |
“1” | 5ms | 5ms | 天信息高位编码 |
“P” | 8ms | 2ms | 帧同步与位置标识 |
使用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()
波形解析:
帧同步建立(0-20ms):
秒信息编码(20-80ms):
保留位填充(80-120ms):
分信息编码(120-180ms):
可综合Verilog模块
代码下载(含Verilog实现与python编码实现)
特性 | DC码(TTL/RS422) | AC码(1kHz载波) |
---|---|---|
同步精度 | 20-50ns | 1-20μs |
传输距离 | <10米(无中继) | >1公里(需中继) |
抗干扰性 | 优(差分传输) | 良(载波调制) |
典型应用 | 发电厂保护装置、精密实验室 | 广域时间网络、军事通信系统 |
年份信息嵌入:
0010
,十位码元54-57,0101
)北斗融合方案:
IRIG-B协议通过每秒一帧的脉宽编码,实现了高精度时间同步。其帧格式严格定义了时间字段和控制功能,支持直流/交流两种调制方式,兼顾了短距离高精度和远距离传输需求。在电力、军事等关键领域,IRIG-B已成为不可或缺的时间同步标准。
研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)