BT1120数据格式分析

本文深入解析BT1120数据格式,通过SMPTE标准协议分析图像的基本格式、同步头、行列数以及校验。针对1080p/25Hz视频,详细阐述了数据结构,包括EAV、SAV、EIV和SIV,并提供了实际数据验证。同时,介绍了CRC校验的实现和应用。

1. 概述

本文将利用LMH0341所采集到的实际数据,对照SMPTE 292M和SMPTE 274M标准协议,对数据进行解析,以加深对于BT1120数据格式的理解。

2. 图像的基本格式

根据协议,图像数据基本格式如下:
BT1120图像基本格式
注:EAV = End of Active Video EIV = End of Inactive Video
SAV = Startof Active Video SIV = Start of Inactive Video

其中区域1,3,5为行消隐区,区域2,6为空白行,区域4为有效的图像数据

每一行数据以EAV/EIV为消隐区的开始 ,以SAV/SIV为数据区的开始,EAV/EIV和SAV/SIV的格式如下图
EAV格式SAV格式
LN0和LN1用于指示行数,YCR0和YCR1是CRC校验值,XYZ用于指示这一行所代表的数据。EAV/EIV,SAV/SIV分别对应不同XYZ数据,具体可以参考下表:

同步头数据说明
LMH0341输出数据采用Interleaved data stream格式,如下图所示
Interleaved data stream格式

3. 同步头分析

对照以上数据的基本格式,对于1080p/25Hz视频,同步头分别为:
EAV:0xFFFFF 0x00000 0x00000 0x9D274
SAV: 0xFFFFF 0x00000 0x00000 0x80200
EIV: 0xFFFFF 0x00000 0x00000 0xB62D8
SIV: 0xFFFFF 0x00000 0x00000 0xAB2AC

4.行列数分析

根据SMPTE 274M协议,对于1080p/25Hz视频,行列数规定如下:
不同图像的行列数
1080p/25Hz视频单帧图像的总列数为2640列,行数为1125行;其中有效的列数为1920列,行数为1080行;

从第1行到第41行,第1122行到1125行为消隐行,无有效图像数据;从第42行到1121行包含有效的图像数据;
对于每一行中各部分的word(1word = 20bits)数如下表

EAVLNCRC消隐区SAV图像数据
42270841920

本文所采用的数据:
https://download.youkuaiyun.com/download/Cesaroy/87240373?spm=1001.2014.3001.5503
https://download.youkuaiyun.com/download/Cesaroy/87315970?spm=1001.2014.3001.5503

从data21的数据来看:EIV(0xFFFFF 0x00000 0x00000 0xB62D8)到EAV(0xFFFFF 0x00000 0x00000 0x9D274)共有2640个数据,验证了单帧图像共有2640列。

data21中是连续的两行数据,刚好位于行消隐和行有效的交界处,由上面分析,EIV应该是第41行,而EAV应该是第42行。
data21中第一组EIV中的行数为:0xA92A4,0x80200,解析出来行数为41,第二组EAV中的行数为:0xAA2A8,0x80200,解析出来行数为42。

data31中同样是连续的两行数据,刚好位于行有效和行消隐的交界处,由上面分析,EAV应该是第1121行,而EIV应该是第1122行。
data31中第一组EAV中的行数为:0x61184,0x88220,解析出来行数为1121,第二组EIV中的行数为:0x62188,0x88220,解析出来行数为1122。

data32中同样是连续两行数据,前一帧图像最后一行EIV和下一帧图像第一行EIV,由上面分析,第一组EIV应该是第1125行,第二组EIV应该是第1行。
data32中第一组EIV中的行数为:0x65194,0x88220,解析出来行数为1125,第二组EIV中的行数为:0x81204,0x80200,解析出来行数为1。

5. 校验分析

根据SMPTE 292M协议,进行CRC校验数据包括:图像数据+EAV+LN;CRC校验使用的公式为 C R C ( X ) = X 18 + X 5 + X 4 + 1 CRC\left( X \right) =X^{18}+X^5+X^4+1 CRC(X)=X18+X5+X4+1。数据所含的两个CRC校验分别对应Y数据校验和U/V数据校验。

CRC校验可以利用CRC-GEN小工具生成,CRC-GEN可以自动生成VHDL或者Verilog代码。
CRC-GEN小工具地址:https://download.youkuaiyun.com/download/Cesaroy/87315972

SMPTE 292M协议是从高位开始生成,而CRC-GEN是从低位生成,所以在程序里面需要对高低位进行互换。利用CRC-GEN生成代码并转化为C代码如下

// data: 图像数据 + EAV + LN, length:1920 + 4 + 2 = 1926
uint32_t crc18_cal2(uint16_t *data, uint16_t length)
{
	uint32_t i;
	uint32_t crc = 0;
	uint32_t lfsr_q_u32 = 0x00000000;

	uint8_t lfsr_q[18] = {0};
	uint8_t lfsr_c[18] = {0};

	uint8_t data_in[10] = {0};

	for (i = 0; i < 18; i++) {
		lfsr_q[i] = (lfsr_q_u32 >> i) & 0x1;
	}

	while (length--) {
	
		for (i = 0; i < 10; i++) {	// 高低位互换
			data_in[i] = ((*data) >> (9 - i)) & 0x1;
		}
		data++;

		lfsr_c[0] = lfsr_q[8] ^ data_in[0];
		lfsr_c[1] = lfsr_q[9] ^ data_in[1];
		lfsr_c[2] = lfsr_q[10] ^ data_in[2];
		lfsr_c[3] = lfsr_q[11] ^ data_in[3];
		lfsr_c[4] = lfsr_q[8] ^ lfsr_q[12] ^ data_in[0] ^ data_in[4];
		lfsr_c[5] = lfsr_q[8] ^ lfsr_q[9] ^ lfsr_q[13] ^ data_in[0] ^ data_in[1] ^ data_in[5];
		lfsr_c[6] = lfsr_q[9] ^ lfsr_q[10] ^ lfsr_q[14] ^ data_in[1] ^ data_in[2] ^ data_in[6];
		lfsr_c[7] = lfsr_q[10] ^ lfsr_q[11] ^ lfsr_q[15] ^ data_in[2] ^ data_in[3] ^ data_in[7];
		lfsr_c[8] = lfsr_q[11] ^ lfsr_q[12] ^ lfsr_q[16] ^ data_in[3] ^ data_in[4] ^ data_in[8];
		lfsr_c[9] = lfsr_q[12] ^ lfsr_q[13] ^ lfsr_q[17] ^ data_in[4] ^ data_in[5] ^ data_in[9];
		lfsr_c[10] = lfsr_q[0] ^ lfsr_q[13] ^ lfsr_q[14] ^ data_in[5] ^ data_in[6];
		lfsr_c[11] = lfsr_q[1] ^ lfsr_q[14] ^ lfsr_q[15] ^ data_in[6] ^ data_in[7];
		lfsr_c[12] = lfsr_q[2] ^ lfsr_q[15] ^ lfsr_q[16] ^ data_in[7] ^ data_in[8];
		lfsr_c[13] = lfsr_q[3] ^ lfsr_q[16] ^ lfsr_q[17] ^ data_in[8] ^ data_in[9];
		lfsr_c[14] = lfsr_q[4] ^ lfsr_q[17] ^ data_in[9];
		lfsr_c[15] = lfsr_q[5];
		lfsr_c[16] = lfsr_q[6];
		lfsr_c[17] = lfsr_q[7];

		for (i = 0; i < 18; i++) { 
			lfsr_q[i] = lfsr_c[i];
		}
	}

	crc = 0;
	for (i = 0; i < 18; i++) {	// 高低位互换
		crc |= ((lfsr_q[17 - i] << i) & (0x1 << i));
	}

	return crc;
}

对于data31中的数据,Y分量计算出来的CRC为0x6de4,解码出来的CRC校验数据也是0x6de4。

6. 结束

本文旨在利用实际采集的数据反向理解BT1120数据格式。如有错误,欢迎指正。

### FPGA实现BT1120数据传输至RK3588的解决方案 #### 硬件设计 在硬件设计方面,确保FPGA与BT1120模块之间的接口配置正确。通常情况下,BT1120通过UART接口与FPGA进行通信[^1]。因此,需要设计相应的UART控制器逻辑以处理数据的发送和接收。此外,FPGA与RK3588之间的数据传输可以通过PCIe、USB或千兆以太网等高速接口实现[^2]。 ```verilog module uart_controller ( input wire clk, input wire reset_n, input wire rx, output reg tx, input wire [7:0] data_in, output reg ready, output reg [7:0] data_out ); // UART逻辑实现 endmodule ``` #### 数据流管理 为了保证数据从BT1120到RK3588的高效传输,需在FPGA内部实现数据缓冲和流量控制机制。例如,使用FIFO结构来暂存从BT1120接收到的数据,并根据RK3588的处理能力调整发送速率[^3]。 ```verilog module fifo_buffer #( parameter WIDTH = 8, parameter DEPTH = 16 ) ( input wire clk, input wire reset_n, input wire wr_en, input wire rd_en, input wire [WIDTH-1:0] data_in, output reg [WIDTH-1:0] data_out, output reg full, output reg empty ); // FIFO逻辑实现 endmodule ``` #### 软件驱动开发 在RK3588端,需要开发相应的Linux驱动程序以支持与FPGA的通信。如果选择PCIe作为传输通道,则需编写PCIe驱动程序,初始化设备并配置DMA引擎以加速数据传输[^4]。 ```c #include <linux/pci.h> #include <linux/dma-mapping.h> static int pci_example_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { int ret; ret = pci_enable_device(pdev); if (ret) return ret; // 配置DMA dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)); return 0; } ``` #### 协议栈适配 针对BT1120的蓝牙协议栈,需要在FPGA侧实现HCI层的基本功能,包括命令解析、事件处理及数据包转发等操作[^5]。这一步骤确保了蓝牙数据能够被正确地封装并传递给RK3588。 #### 测试与验证 完成上述设计后,应进行全面的功能测试和性能评估。重点关注数据传输的稳定性、延迟以及吞吐量指标,确保系统满足实际应用需求[^6]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值