| 1概述 经过前期对HDMI传输原理的系统性解析及HDMI_TX输出端IP核的实现,本课程正式进入系统功能扩展阶段。 基于已构建的HDMI图像输入输出IP架构,本节将重点集成音频解析模块,通过分离复合数据流中的音频信号实现音视频同步处理。该功能扩展完整遵循HDMI多媒体传输协议,为构建全功能音视频传输系统奠定技术基础,后续将围绕系统级联调试与功能验证展开深入探讨。2数据拆分 在完成基于auto_delay_ctl.v IP核的通道数据对齐后,需依据视频前导码(Video Preamble)、数据岛前导码(Island Preamble)及其对应保护带(Guard Band)特征,从并行数据流中分离出island_data和video_data。 本设计采用通道2作为主时序基准,通过解析其前导码与保护带边界实现数据分类,通道0和通道1作为从属通道仅需保持与主通道的时序同步,通过延迟补偿确保跨通道数据相位一致性。该架构在降低多通道协同复杂度同时,保证了数据拆分的精确性和系统稳定性。2.1 island_data_decode_master.v模块代码 该模块作为HDMI数据岛周期解码核心,基于四级流水线结构实现输入数据对齐,并采用含空闲、前导码检测、保护带识别及有效数据周期等七状态有限状态机,精准划分视频与数据岛传输阶段。依据HDMI 1.4a协议规范,通过TERC4解码将10位控制字符映射为4位数据岛信息,同步分离视频原始数据流。 输出端通过O_island_data_valid与O_video_data_valid双效验标志实现数据类型精确区分,结合保护带检测逻辑识别特定字符序列,确保接收端时序同步精度及数据传输可靠性。2.2 island_data_decode_slave.v模块代码 该模块作为HDMI数据岛解码从属单元,基于三级流水线结构实现数据时序对齐。在数据岛有效周期(I_island_data_vaild)内,采用TERC4解码算法,依据HDMI 1.4a协议将10位TMDS编码实时解析为4位数据岛信息;视频有效周期(I_video_data_vaild)则通过O_video_data通道直通原始10位像素数据。非有效周期自动透传控制字符(前导码/保护带)至O_control_data通道,实现视频流、数据岛包及控制信号的三通道并行输出,可高效集成于多通道HDMI接收系统的解码子系统。 3模块仿真复制代码`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// 模块名称:island_data_decode_slave
// 功能描述:HDMI数据岛周期解码模块
// 主要功能:
//   1. 检测并解码HDMI数据岛周期中的TERC4编码数据
//   2. 分离视频数据流和数据岛控制数据流
//   3. 实现HDMI 1.4a协议第5章规定的数据周期转换
//////////////////////////////////////////////////////////////////////////////////
module island_data_decode_slave  (
    input  wire         I_pixel_clk,         // 像素时钟
    input  wire         I_reset_n,           // 异步复位,低有效
    input  wire [9:0]   I_hdmi_data_code,    // HDMI 10位编码数据输入
    input  wire         I_island_data_vaild, // 数据岛有效标志,高有效 
    input  wire         I_video_data_vaild,  // 视频数据有效标志,高有效  
    output reg  [3:0]   O_island_data,       // 解码后的4位数据岛数据
    output wire [9:0]   O_video_data,        // 视频数据输出
    output wire [9:0]   O_control_data       // 控制数据输出,包含前导码数据、保护带数据、空白数据 
);
// ====================== 寄存器声明 ======================
reg [9:0] r_input_pipeline_0d;    // 3级输入流水线寄存器
reg [9:0] r_input_pipeline_1d;    // 3级输入流水线寄存器
reg [9:0] r_input_pipeline_2d;    // 3级输入流水线寄存器
// ====================== 输入流水线处理 ======================
// 四级流水线用于时序对齐,补偿状态机检测延迟
always @(posedge I_pixel_clk) begin
    r_input_pipeline_0d <= I_hdmi_data_code;  // 第一级:原始输入
    r_input_pipeline_1d <= r_input_pipeline_0d;
    r_input_pipeline_2d <= r_input_pipeline_1d;
    end
// ====================== TERC4解码模块 ======================
always @(*) begin
    if (I_island_data_vaild) begin
        case (r_input_pipeline_2d)  // 使用流水线第3级数据进行解码
            // TERC4编码映射表
            10'b0011100101 : O_island_data = 4'b0000;  // 数据0
            10'b1100011001 : O_island_data = 4'b0001;  // 数据1
            10'b0010011101 : O_island_data = 4'b0010;  // 数据2
            10'b0100011101 : O_island_data = 4'b0011;  // 数据3
            10'b1000111010 : O_island_data = 4'b0100;  // 数据4
            10'b0111100010 : O_island_data = 4'b0101;  // 数据5
            10'b0111000110 : O_island_data = 4'b0110;  // 数据6
            10'b0011110010 : O_island_data = 4'b0111;  // 数据7
            10'b0011001101 : O_island_data = 4'b1000;  // 数据8
            10'b1001110010 : O_island_data = 4'b1001;  // 数据9
            10'b0011100110 : O_island_data = 4'b1010;  // 数据A
            10'b0110001101 : O_island_data = 4'b1011;  // 数据B
            10'b0111000101 : O_island_data = 4'b1100;  // 数据C
            10'b1000111001 : O_island_data = 4'b1101;  // 数据D
            10'b1100011010 : O_island_data = 4'b1110;  // 数据E
            10'b1100001101 : O_island_data = 4'b1111;  // 数据F
            default: O_island_data = 4'b0000;         // 无效编码默认处理
        endcase
    end else begin
        O_island_data = 4'h0;        // 非数据岛周期输出清零
    end
 end
assign O_video_data = I_video_data_vaild ? r_input_pipeline_2d: 10'h000;  // 视频数据输出连接
assign O_control_data = (!I_video_data_vaild && !I_island_data_vaild) ? r_input_pipeline_2d: 10'b0;
endmodule
3.1 island_data_decode_master.v模块仿真
 主模块根据输入的原始数据拆分出数据岛有效数据和视频数据有效数据,同时提取出保护带信号。保护带信号可以用于从通道0中恢复出控制信号。这部分后续恢复控制信号时候再详细讲解。   3.2 island_data_decode_slave.v模块仿真
 从模块根据从主模块输入的I_island_data_vaild和I_video_data_vaild信号,对原始数据进行拆分,同时进行TERC4解码输出4位数据岛数据。   
 
 
 |