1概述 在第三讲课程中已系统阐述TMDS编码协议的基础原理及视频传输机制。鉴于本系统新增音频功能需求,需在原有协议框架下扩展控制编码模块以实现音视频同步传输。本章节将聚焦控制编码协议的技术实现,包括数据包结构设计、时钟域协调及错误校验机制,视频编码部分沿用既有标准不再赘述。 2控制编码原理首先回顾一下完整的HDMI传输系统框图。
之前编写的TMDS编码模块,由于不需要考虑数据岛数据和音频采集,所以我们编码的重点在于每个通道8位的视频数据以及Channel 0中的2位控制信号(H,VSYNC),但是忽视了Channel 1和Channel 2的CTL0、CTL1、CTL2、CTL3四个控制信号,还有Channel 0 ~ Channel 2的辅助数据(Auxiliary Data),本节课结合HDMI 协议完善之前的TMDS编码模块。 开始之前我们需要知道一个重要的信息就是每种信号的编码方式。
视频数据周期采用过渡最小编码技术,每个通道传输8位数据,即每个像素共24位。 数据岛周期使用类似的过渡最小编码技术——TMDS错误减少编码(TERC4),每个TMDS时钟周期内每个通道传输4位数据,共12位。 在控制周期中,采用过渡最大化编码,每个通道传输2位数据,每个TMDS时钟周期共6位,包括HSYNC、VSYNC、CTL0、CTL1、CTL2和CTL3信号。 每个控制周期接近结束时,通过CTLx信号发送前导信号,用于指示下一个数据周期是视频数据周期还是数据岛周期。 每个视频数据周期和数据岛周期均以“前导保护带”开始,旨在可靠判断从控制周期到数据周期的切换。该前导保护带由两个特殊字符组成。 数据岛周期还受“后导保护带”保护,用于可靠判断向控制周期的切换。 下面结合数据岛时序图,只要搞清楚下面6种信号所需要发送的10bit编码即可。
Video Guardband:通道0发送1011001100;通道1发送0100110011;通道2发送1011001100。 Data Island Guardband :通道0:在数据岛保护频带期间,通道0被编码为四个TERC4值之一。这些TERC4值(D[3:0])为0xC、0xD、0xE和0xF,具体取决于HSYNC和VSYNC的值。通道1发送0100110011;通道2发送0100110011。 Active Video Data:视频数据采用和 DVI 相同的 8b/10b 编码 方式。 Active Aux/Audio Data:包括音频数据和辅助控制数据。音频数据编码方式为10bit TERC4(TMDS 降错码)。TERC4 编码方式包括 16 个特定的4b/10b 编码。
Control Period Coding (Video Preamble/Data Island Preamble/{HSYNC,VSYNC}):
三个TMDS通道中每一个通道的两个控制信号编码如下:
3 代码部分
3.1 hdmi_data_distribution.v该模块实现HDMI多通道控制信号生成,通道0直接传输VSYNC/HSYNC组合信号,通道1/2通过两级优先级逻辑(视频前导>数据岛前导)生成差异化控制码,通道1在两种前导期均输出01,通道2仅在数据岛前导期输出01,形成01+01(数据岛)或01+00(视频)的规范编码组合,精确标识数据传输阶段边界。
- ///////////////////////////////////////////////////////////////////////////////
- // HDMI数据同步分发模块
- // 功能:实现跨时钟域同步,生成符合HDMI 1.4b规范的输出数据
- ///////////////////////////////////////////////////////////////////////////////
-
- module hdmi_data_distribution (
- //======================== 时钟与复位 ========================//
- input wire I_pixel_clk, // 主像素时钟(74.25MHz)
- input wire I_reset_n, // 异步复位(低有效)
-
- //======================== 视频域输入 ========================//
- input wire I_video_vsync, // 视频场同步
- input wire I_video_hsync, // 视频行同步
- input wire I_video_period, // 视频有效周期
- input wire I_video_preamble, // 视频前导码
- input wire I_video_guard_band,// 视频保护带
- input wire [7:0] I_video_data_ch0, // 视频通道0数据
- input wire [7:0] I_video_data_ch1, // 视频通道1数据
- input wire [7:0] I_video_data_ch2, // 视频通道2数据
-
- //======================== 数据岛域输入 ========================//
- input wire I_island_preamble, // 数据岛前导码
- input wire I_island_guard_band,// 数据岛保护带
- input wire I_island_period, // 数据岛有效周期
- input wire [3:0] I_island_data_ch0, // 数据岛通道0数据
- input wire [3:0] I_island_data_ch1, // 数据岛通道1数据
- input wire [3:0] I_island_data_ch2, // 数据岛通道2数据
-
- //======================== 同步后输出 ========================//
- output reg O_video_valid, // 视频有效标志
- output reg O_video_guard_band_valid, // 视频保护带标志
- output reg O_island_valid, // 数据岛有效标志
- output reg O_island_preamble, // 数据岛前导码标志
- output reg O_island_guard_band_valid,// 数据岛保护带标志
-
- // 通道0输出
- output reg [7:0] O_ch0_video_data, // 视频数据
- output reg [1:0] O_ch0_control_data,// 控制数据
- output reg [3:0] O_ch0_island_data, // 数据岛数据
-
- // 通道1输出
- output reg [7:0] O_ch1_video_data,
- output reg [1:0] O_ch1_control_data,
- output reg [3:0] O_ch1_island_data,
-
- // 通道2输出
- output reg [7:0] O_ch2_video_data,
- output reg [1:0] O_ch2_control_data,
- output reg [3:0] O_ch2_island_data
- );
-
- //======================== 寄存器声明 ========================//
- // 视频信号同步链
- reg sync_video_vsync_0 ;
- reg sync_video_hsync_0 ;
- reg sync_video_period_0 ;
- reg sync_video_preamble_0;
- reg sync_video_guard_0;
-
- // 数据岛信号同步链
- reg sync_island_preamble_0;
- reg sync_island_guard_0;
- reg sync_island_period_0;
-
- // 数据缓冲
- reg [7:0] buf_video_ch0, buf_video_ch1, buf_video_ch2;
- reg [3:0] buf_island_ch0, buf_island_ch1, buf_island_ch2;
-
- //====================================================================
- // 视频信号三级同步(完整实现示例)
- //====================================================================
-
- //----------- 视频场同步同步链 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) begin
- sync_video_vsync_0 <= 1'b0;
- end
- else begin
- sync_video_vsync_0 <= I_video_vsync;
- end
- end
-
- //----------- 视频行同步同步链 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) begin
- sync_video_hsync_0 <= 1'b0;
- end
- else begin
- sync_video_hsync_0 <= I_video_hsync;
- end
- end
-
- //----------- 视频有效周期同步链 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n)begin
- sync_video_period_0 <= 1'b0;
- end
- else begin
- sync_video_period_0 <= I_video_period;
- end
- end
-
- //----------- 视频前导码同步链 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n)begin
- sync_video_preamble_0 <= 1'b0;
- end
- else begin
- sync_video_preamble_0 <= I_video_preamble;
- end
- end
-
- //----------- 视频保护带同步链 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) begin
- sync_video_guard_0 <= 1'b0;
- end
- else begin
- sync_video_guard_0 <= I_video_guard_band;
- end
- end
-
- //====================================================================
- // 数据岛信号三级同步(完整实现)
- //====================================================================
-
- //----------- 数据岛前导码同步链 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n)begin
- sync_island_preamble_0 <= 1'b0;
- end
- else begin
- sync_island_preamble_0 <= I_island_preamble;
- end
- end
-
- //----------- 数据岛保护带同步链 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n)begin
- sync_island_guard_0 <= 1'b0;
- end
- else begin
- sync_island_guard_0 <= I_island_guard_band;
- end
- end
-
- //----------- 数据岛周期同步链 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n)begin
- sync_island_period_0 <= 1'b0;
- end
- else begin
- sync_island_period_0 <= I_island_period;
- end
- end
-
- //====================================================================
- // 数据通道缓冲(单级缓冲对齐时序)
- //====================================================================
-
- //----------- 视频通道缓冲 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) begin
- buf_video_ch0 <= 8'h00;
- buf_video_ch1 <= 8'h00;
- buf_video_ch2 <= 8'h00;
- end
- else begin
- buf_video_ch0 <= I_video_data_ch0;
- buf_video_ch1 <= I_video_data_ch1;
- buf_video_ch2 <= I_video_data_ch2;
- end
- end
-
- //----------- 数据岛通道缓冲 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) begin
- buf_island_ch0 <= 8'h00;
- buf_island_ch1 <= 8'h00;
- buf_island_ch2 <= 8'h00;
- end
- else begin
- buf_island_ch0 <= I_island_data_ch0;
- buf_island_ch1 <= I_island_data_ch1;
- buf_island_ch2 <= I_island_data_ch2;
- end
- end
-
- //====================================================================
- // 控制信号生成(符合HDMI 1.4b规范)
- //====================================================================
-
- //----------- 通道0控制信号(VSYNC+HSYNC) -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) O_ch0_control_data <= 2'b00;
- else O_ch0_control_data <= {sync_video_vsync_0, sync_video_hsync_0};
- end
-
- //----------- 通道1控制信号(前导码优先级) -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) begin
- O_ch1_control_data <= 2'b00;
- end else begin
- if (sync_video_preamble_0) begin
- O_ch1_control_data <= 2'b01; // 视频前导码优先
- end else if (sync_island_preamble_0) begin
- O_ch1_control_data <= 2'b01; // 数据岛前导码次之
- end else begin
- O_ch1_control_data <= 2'b00; // 正常数据周期
- end
- end
- end
-
- //----------- 通道2控制信号(固定值) -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) begin
- O_ch2_control_data <= 2'b00;
- end else begin
- if (sync_video_preamble_0) begin
- O_ch2_control_data <= 2'b00; // 视频前导码优先
- end else if (sync_island_preamble_0) begin
- O_ch2_control_data <= 2'b01; // 数据岛前导码次之
- end else begin
- O_ch2_control_data <= 2'b00; // 正常数据周期
- end
- end
- end
-
- //====================================================================
- // 输出标志生成
- //====================================================================
-
- //----------- 视频有效标志 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) O_video_valid <= 1'b0;
- else O_video_valid <= sync_video_period_0;
- end
-
- //----------- 视频保护带标志 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) O_video_guard_band_valid <= 1'b0;
- else O_video_guard_band_valid <= sync_video_guard_0;
- end
-
- //----------- 数据岛有效标志 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) O_island_valid <= 1'b0;
- else O_island_valid <= sync_island_period_0;
- end
-
- //----------- 数据岛前导码标志 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) O_island_preamble <= 1'b0;
- else O_island_preamble <= sync_island_preamble_0;
- end
-
- //----------- 数据岛保护带标志 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) O_island_guard_band_valid <= 1'b0;
- else O_island_guard_band_valid <= sync_island_guard_0;
- end
-
- //====================================================================
- // 数据输出通道(全通道实现)
- //====================================================================
-
- //----------- 通道0视频数据输出 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) O_ch0_video_data <= 8'h00;
- else O_ch0_video_data <= buf_video_ch0;
- end
-
- //----------- 通道0数据岛数据输出 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) O_ch0_island_data <= 4'h0;
- else O_ch0_island_data <= buf_island_ch0;
- end
-
- //----------- 通道1视频数据输出 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) O_ch1_video_data <= 8'h00;
- else O_ch1_video_data <= buf_video_ch1;
- end
-
- //----------- 通道1数据岛数据输出 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) O_ch1_island_data <= 4'h0;
- else O_ch1_island_data <= buf_island_ch1;
- end
-
- //----------- 通道2视频数据输出 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) O_ch2_video_data <= 8'h00;
- else O_ch2_video_data <= buf_video_ch2;
- end
-
- //----------- 通道2数据岛数据输出 -----------
- always @(posedge I_pixel_clk or negedge I_reset_n) begin
- if (!I_reset_n) O_ch2_island_data <= 4'h0;
- else O_ch2_island_data <= buf_island_ch2;
- end
-
- endmodule
复制代码
3.2HDMI_TMDSEncoder.v该HDMI 1.4a编码模块实现视频、控制信号及数据岛的TMDS编码,支持蓝/绿/红三通道独立处理。核心采用四级流水线结构,通过同步延迟链对齐视频数据、保护带和数据岛时序,多路仲裁器按优先级(视频>保护带>数据岛>控制)输出,严格满足消隐期和前导码插入的HDMI协议要求。 动态编码算法(XNOR/XOR逻辑+直流平衡)优化信号完整性,数据岛集成TERC4纠错编码。蓝通道保护带支持动态切换,绿/红通道固定模式,全路径通过流水线寄存器和相位补偿实现4周期固定延迟,符合HDMI CTS时序规范。 - //////////////////////////////////////////////////////////////////////////////////
- // HDMI TMDS编码器模块(HDMI 1.4a规范兼容)
- // 功能说明:
- // 1. 实现视频数据、控制信号、数据岛数据的TMDS编码
- // 2. 支持三通道独立编码(通道0=蓝,1=绿,2=红)
- // 3. 集成视频保护带和数据岛保护带生成
- // 4. 严格遵循HDMI CTS测试规范时序要求
- //////////////////////////////////////////////////////////////////////////////////
-
- module HDMI_TMDSEncoder #(
- /// TMDS通道编号(0-蓝,1-绿,2-红)
- /// HDMI 1.4a规范限定取值范围:0/1/2
- parameter CHANNEL_NUM = 0
- )(
- input wire I_clk, // 系统时钟(像素时钟)
- input wire I_reset_n, // 异步复位(低有效)
-
- // 时序控制信号
- input wire I_video_valid, // 视频数据有效
- input wire I_video_guard_valid, // 视频保护带有效
- input wire I_island_valid, // 数据岛有效
- input wire I_island_guard_valid,// 数据岛保护带有效
-
- // 数据输入
- input wire[7:0] I_video_data, // 视频像素数据(8位)
- input wire[1:0] I_control_data, // 控制信号(HSYNC/VSYNC)
- input wire[3:0] I_island_data, // 数据岛数据(音频/信息帧)
-
- // 编码输出
- output reg[9:0] O_tmds_code_data // TMDS编码结果(10位)
- );
-
- //=======================================================================
- // 视频数据流水线寄存器组(4级延迟结构)
- // 设计目的:
- // 1. 同步视频数据通道各处理阶段的时序
- // 2. 补偿编码处理流水线延迟(总计4个时钟周期)
- // 3. 对齐视频数据与相关控制信号的时序关系
- //=======================================================================
- reg[7:0] r_video_data_1d; // 视频数据输入缓冲(第1级延迟)
- reg r_video_valid_1d; // 视频有效信号延迟链(第1级)
- reg r_video_valid_2d; // 视频有效信号延迟链(第2级)
- reg r_video_valid_3d; // 视频有效信号延迟链(第3级)
- reg r_video_valid_4d; // 视频有效信号延迟链(第4级,最终输出使能)
-
- // 视频保护带有效信号延迟链(同步4周期处理延迟)
- reg r_video_guard_valid_1d; // 第1级延迟
- reg r_video_guard_valid_2d; // 第2级延迟
- reg r_video_guard_valid_3d; // 第3级延迟
- reg r_video_guard_valid_4d; // 第4级延迟(输出使能)
-
- // 数据岛有效信号延迟链(与视频通道保持相同延迟)
- reg r_island_valid_1d; // 第1级延迟
- reg r_island_valid_2d; // 第2级延迟
- reg r_island_valid_3d; // 第3级延迟
- reg r_island_valid_4d; // 第4级延迟(输出使能)
-
- // 数据岛保护带有效信号延迟链(同步控制逻辑)
- reg r_island_guard_valid_1d; // 第1级延迟
- reg r_island_guard_valid_2d; // 第2级延迟
- reg r_island_guard_valid_3d; // 第3级延迟
- reg r_island_guard_valid_4d; // 第4级延迟(输出使能)
-
-
- //=======================================================================
- // TMDS编码核心参数(规范图5-7变量命名)
- //=======================================================================
- reg[3:0] r_N_1_D; // 输入数据中'1'的数量(规范步骤1)
- wire[8:0] r_q_m_comb; // 中间符号组合逻辑
- reg[8:0] r_q_m; // 差分编码中间结果(规范步骤2-3)
- reg[8:0] r_q_m_1d; // 中间符号延迟寄存器
- reg[3:0] r_N_1_q_m_0_7; // q_m[0:7]中'1'的数量(规范步骤4)
- reg[3:0] r_N_0_q_m_0_7; // q_m[0:7]中'0'的数量
- reg[9:0] r_video_data_code; // 最终视频编码结果(规范步骤5-7)
- reg signed [4:0] r_cnt_t_1; // DC平衡计数器(规范步骤8)
-
- reg[9:0] r_control_signal_code;
- reg[9:0] r_control_signal_code_1d;
- reg[9:0] r_control_signal_code_2d;
- reg[9:0] r_control_signal_code_3d;
-
- reg[9:0] r_data_island_code;
- reg[9:0] r_data_island_code_1d;
- reg[9:0] r_data_island_code_2d;
- reg[9:0] r_data_island_code_3d;
-
- reg[9:0] r_video_data_guard_band_code;
- reg[9:0] r_video_data_guard_band_code_1d;
- reg[9:0] r_video_data_guard_band_code_2d;
- reg[9:0] r_video_data_guard_band_code_3d;
-
- reg[9:0] r_data_island_guard_band_code;
- reg[9:0] r_data_island_guard_band_code_1d;
- reg[9:0] r_data_island_guard_band_code_2d;
- reg[9:0] r_data_island_guard_band_code_3d;
-
- //=======================================================================
- // 时序同步控制块
- // 功能:
- // 1. 生成各使能信号的延迟版本
- // 2. 保持视频数据与相关控制信号的相位对齐
- // 3. 补偿TMDS编码器处理流水线的固有延迟
- //=======================================================================
- always @(posedge I_clk) begin
- // 视频有效信号四级延迟链(每个时钟推进一级)
- r_video_valid_1d <= I_video_valid; // 输入信号采样
- r_video_valid_2d <= r_video_valid_1d; // 第1级寄存器输出
- r_video_valid_3d <= r_video_valid_2d; // 第2级寄存器输出
- r_video_valid_4d <= r_video_valid_3d; // 第3级寄存器输出
-
- // 视频保护带有效信号同步延迟
- r_video_guard_valid_1d <= I_video_guard_valid;
- r_video_guard_valid_2d <= r_video_guard_valid_1d;
- r_video_guard_valid_3d <= r_video_guard_valid_2d;
- r_video_guard_valid_4d <= r_video_guard_valid_3d;
-
- // 数据岛有效信号同步延迟
- r_island_valid_1d <= I_island_valid;
- r_island_valid_2d <= r_island_valid_1d;
- r_island_valid_3d <= r_island_valid_2d;
- r_island_valid_4d <= r_island_valid_3d;
-
- // 数据岛保护带有效信号同步延迟
- r_island_guard_valid_1d <= I_island_guard_valid;
- r_island_guard_valid_2d <= r_island_guard_valid_1d;
- r_island_guard_valid_3d <= r_island_guard_valid_2d;
- r_island_guard_valid_4d <= r_island_guard_valid_3d;
-
- // 视频数据输入缓冲(补偿1个时钟周期延迟)
- r_video_data_1d <= I_video_data; // 原始数据缓存用于后续编码处理
- end
- //=======================================================================
- // 视频数据编码阶段1:计算输入数据'1'的数量
- // 对应规范:图5-7步骤1
- //=======================================================================
- always @(posedge I_clk) begin
- r_N_1_D <= I_video_data[0] + I_video_data[1] + I_video_data[2] + I_video_data[3] +
- I_video_data[4] + I_video_data[5] + I_video_data[6] + I_video_data[7];
- end
-
- //=======================================================================
- // 视频数据编码阶段2:生成中间符号q_m
- // 编码规则:
- // - 当N1{D}>4或N1{D}=4且D[0]=0时使用XNOR,否则用XOR
- // 对应规范:图5-7步骤2-3
- //=======================================================================
- assign r_q_m_comb[0] = r_video_data_1d[0]; // 最低位直接传递
- assign r_q_m_comb[1] = (r_N_1_D > 'd4) || (r_N_1_D == 'd4 && r_video_data_1d[0] == 1'b0) ? (r_q_m_comb[0] ^~ r_video_data_1d[1]) : (r_q_m_comb[0] ^ r_video_data_1d[1]);
- assign r_q_m_comb[2] = (r_N_1_D > 'd4) || (r_N_1_D == 'd4 && r_video_data_1d[0] == 1'b0) ? (r_q_m_comb[1] ^~ r_video_data_1d[2]) : (r_q_m_comb[1] ^ r_video_data_1d[2]);
- assign r_q_m_comb[3] = (r_N_1_D > 'd4) || (r_N_1_D == 'd4 && r_video_data_1d[0] == 1'b0) ? (r_q_m_comb[2] ^~ r_video_data_1d[3]) : (r_q_m_comb[2] ^ r_video_data_1d[3]);
- assign r_q_m_comb[4] = (r_N_1_D > 'd4) || (r_N_1_D == 'd4 && r_video_data_1d[0] == 1'b0) ? (r_q_m_comb[3] ^~ r_video_data_1d[4]) : (r_q_m_comb[3] ^ r_video_data_1d[4]);
- assign r_q_m_comb[5] = (r_N_1_D > 'd4) || (r_N_1_D == 'd4 && r_video_data_1d[0] == 1'b0) ? (r_q_m_comb[4] ^~ r_video_data_1d[5]) : (r_q_m_comb[4] ^ r_video_data_1d[5]);
- assign r_q_m_comb[6] = (r_N_1_D > 'd4) || (r_N_1_D == 'd4 && r_video_data_1d[0] == 1'b0) ? (r_q_m_comb[5] ^~ r_video_data_1d[6]) : (r_q_m_comb[5] ^ r_video_data_1d[6]);
- assign r_q_m_comb[7] = (r_N_1_D > 'd4) || (r_N_1_D == 'd4 && r_video_data_1d[0] == 1'b0) ? (r_q_m_comb[6] ^~ r_video_data_1d[7]) : (r_q_m_comb[6] ^ r_video_data_1d[7]);
- assign r_q_m_comb[8] = (r_N_1_D > 'd4) || (r_N_1_D == 'd4 && r_video_data_1d[0] == 1'b0) ? 1'b0 : 1'b1;
-
- //=======================================================================
- // 中间符号寄存器(2级流水)
- // 作用:保证时序收敛
- //=======================================================================
- always @(posedge I_clk ) begin
- r_q_m <= r_q_m_comb; // 组合逻辑结果寄存
- r_q_m_1d <= r_q_m; // 增加1级延迟对齐时序
- end
-
- //=======================================================================
- // 视频数据编码阶段3:统计中间符号的01数量
- // 对应规范:图5-7步骤4
- //=======================================================================
- always @(posedge I_clk) begin
- r_N_1_q_m_0_7 <= r_q_m[0] + r_q_m[1] + r_q_m[2] + r_q_m[3] +
- r_q_m[4] + r_q_m[5] + r_q_m[6] + r_q_m[7];
- r_N_0_q_m_0_7 <= (~r_q_m[0]) + (~r_q_m[1]) + (~r_q_m[2]) + (~r_q_m[3]) +
- (~r_q_m[4]) + (~r_q_m[5]) + (~r_q_m[6]) + (~r_q_m[7]);
- end
-
- //=======================================================================
- // 视频数据编码阶段4:生成最终编码
- // 对应规范:图5-7步骤5-7
- //=======================================================================
- always @(posedge I_clk or negedge I_reset_n) begin
- if(!I_reset_n) begin
- r_video_data_code <= 'd0; // 复位时清零
- end else begin
- // 平衡状态处理
- if((r_cnt_t_1 == 0) || (r_N_1_q_m_0_7 == r_N_0_q_m_0_7)) begin
- r_video_data_code[9] <= ~r_q_m_1d[8]; // 反转第9位
- r_video_data_code[8] <= r_q_m_1d[8]; // 直接传递第8位
- r_video_data_code[7:0] <= r_q_m_1d[8] ? r_q_m_1d[7:0] : ~r_q_m_1d[7:0];
- end
- // 需要减少'1'数量
- else if((r_cnt_t_1 > 0 && r_N_1_q_m_0_7 > r_N_0_q_m_0_7) ||
- (r_cnt_t_1 < 0 && r_N_0_q_m_0_7 > r_N_1_q_m_0_7)) begin
- r_video_data_code <= {1'b1, r_q_m_1d[8], ~r_q_m_1d[7:0]};
- end
- // 需要增加'1'数量
- else begin
- r_video_data_code <= {1'b0, r_q_m_1d[8], r_q_m_1d[7:0]};
- end
- end
- end
-
- //=======================================================================
- // 视频数据编码阶段5:更新DC平衡计数器
- // 对应规范:图5-7步骤8
- //=======================================================================
- always @(posedge I_clk or negedge I_reset_n) begin
- if(!I_reset_n) begin
- r_cnt_t_1 <= 0; // 复位计数器
- end else if(r_video_valid_2d) begin
- // 平衡状态更新
- if((r_cnt_t_1 == 0) || (r_N_1_q_m_0_7 == r_N_0_q_m_0_7)) begin
- r_cnt_t_1 <= r_cnt_t_1 + (r_q_m_1d[8] ?
- (r_N_1_q_m_0_7 - r_N_0_q_m_0_7) :
- (r_N_0_q_m_0_7 - r_N_1_q_m_0_7));
- end
- // 非平衡状态调整
- else begin
- r_cnt_t_1 <= r_cnt_t_1 + ((r_cnt_t_1 > 0) ?
- (2*r_q_m_1d[8] + r_N_0_q_m_0_7 - r_N_1_q_m_0_7) :
- (-2*~r_q_m_1d[8] + r_N_1_q_m_0_7 - r_N_0_q_m_0_7));
- end
- end else begin
- r_cnt_t_1 <= 0; // 非视频期重置
- end
- end
-
- //=======================================================================
- // 控制信号编码(规范表5-2)
- // 编码映射:
- // 00->1101010100(水平同步)
- // 01->0010101011(垂直同步)
- // 10->0101010100(视频前导)
- // 11->1010101011(数据岛前导)
- //=======================================================================
- always @(posedge I_clk or negedge I_reset_n) begin
- if(!I_reset_n) begin
- r_control_signal_code <= 'd0;
- end else begin
- case(I_control_data)
- 2'b00: r_control_signal_code <= 10'b1101010100; // HSYNC
- 2'b01: r_control_signal_code <= 10'b0010101011; // VSYNC
- 2'b10: r_control_signal_code <= 10'b0101010100; // 视频前导
- 2'b11: r_control_signal_code <= 10'b1010101011; // 数据岛前导
- endcase
- end
- end
-
- // 控制信号流水线对齐(3级延迟)
- always @(posedge I_clk) begin
- r_control_signal_code_1d <= r_control_signal_code;
- r_control_signal_code_2d <= r_control_signal_code_1d;
- r_control_signal_code_3d <= r_control_signal_code_2d;
- end
-
- //=======================================================================
- // 数据岛TERC4编码(规范表5-3)
- // 4位数据映射为10位符号,支持BCH纠错
- //=======================================================================
- always @(posedge I_clk or negedge I_reset_n) begin
- if(!I_reset_n) begin
- r_data_island_code <= 'd0;
- end else begin
- case(I_island_data)
- 4'b0000 : r_data_island_code <= 10'b1010011100; // 数据0
- 4'b0001 : r_data_island_code <= 10'b1001100011; // 数据1
- 4'b0010 : r_data_island_code <= 10'b1011100100; // 数据2
- 4'b0011 : r_data_island_code <= 10'b1011100010; // 数据3
- 4'b0100 : r_data_island_code <= 10'b0101110001; // 数据4
- 4'b0101 : r_data_island_code <= 10'b0100011110; // 数据5
- 4'b0110 : r_data_island_code <= 10'b0110001110; // 数据6
- 4'b0111 : r_data_island_code <= 10'b0100111100; // 数据7
- 4'b1000 : r_data_island_code <= 10'b1011001100; // 数据8
- 4'b1001 : r_data_island_code <= 10'b0100111001; // 数据9
- 4'b1010 : r_data_island_code <= 10'b0110011100; // 数据10
- 4'b1011 : r_data_island_code <= 10'b1011000110; // 数据11
- 4'b1100 : r_data_island_code <= 10'b1010001110; // 数据12
- 4'b1101 : r_data_island_code <= 10'b1001110001; // 数据13
- 4'b1110 : r_data_island_code <= 10'b0101100011; // 数据14
- 4'b1111 : r_data_island_code <= 10'b1011000011; // 数据15
- endcase
- end
- end
-
- // 数据岛流水线对齐(3级延迟)
- always @(posedge I_clk) begin
- r_data_island_code_1d <= r_data_island_code;
- r_data_island_code_2d <= r_data_island_code_1d;
- r_data_island_code_3d <= r_data_island_code_2d;
- end
-
- //=======================================================================
- // 视频保护带生成(规范5.2.1)
- // 通道0/2:1011001100,通道1:0100110011
- //=======================================================================
- always @(posedge I_clk or negedge I_reset_n) begin
- if(!I_reset_n) begin
- r_video_data_guard_band_code <= 'd0;
- end else begin
- case(CHANNEL_NUM)
- 0: r_video_data_guard_band_code <= 10'b1011001100; // 蓝通道
- 1: r_video_data_guard_band_code <= 10'b0100110011; // 绿通道
- 2: r_video_data_guard_band_code <= 10'b1011001100; // 红通道
- endcase
- end
- end
-
- // 视频保护带流水线对齐(3级延迟)
- always @(posedge I_clk) begin
- r_video_data_guard_band_code_1d <= r_video_data_guard_band_code;
- r_video_data_guard_band_code_2d <= r_video_data_guard_band_code_1d;
- r_video_data_guard_band_code_3d <= r_video_data_guard_band_code_2d;
- end
-
- //=======================================================================
- // 数据岛保护带生成(规范5.2.3.3)
- // 通道0根据控制信号动态选择,通道1/2固定模式
- //=======================================================================
- always @(posedge I_clk or negedge I_reset_n) begin
- if(!I_reset_n) begin
- r_data_island_guard_band_code <= 'd0;
- end else begin
- case(CHANNEL_NUM)
- 0: // 蓝通道动态选择
- r_data_island_guard_band_code <=
- I_control_data == 2'b00 ? 10'b1010001110 : // 视频前导保护
- I_control_data == 2'b01 ? 10'b1001110001 : // 数据岛前导保护
- I_control_data == 2'b10 ? 10'b0101100011 : // 保留模式1
- I_control_data == 2'b11 ? 10'b1011000011 : // 保留模式2
- 'd0;
- 1: r_data_island_guard_band_code <= 10'b0100110011; // 绿通道固定
- 2: r_data_island_guard_band_code <= 10'b0100110011; // 红通道固定
- endcase
- end
- end
-
- // 数据岛保护带流水线对齐
- always @(posedge I_clk) begin
- r_data_island_guard_band_code_1d <= r_data_island_guard_band_code;
- r_data_island_guard_band_code_2d <= r_data_island_guard_band_code_1d;
- r_data_island_guard_band_code_3d <= r_data_island_guard_band_code_2d;
- end
-
- //=======================================================================
- // 最终输出多路选择器
- // 优先级:视频数据 > 视频保护带 > 数据岛 > 数据岛保护带 > 控制信号
- // 所有信号经过4个时钟周期延迟保持相位对齐
- //=======================================================================
- always @(posedge I_clk or negedge I_reset_n) begin
- if(!I_reset_n) begin
- O_tmds_code_data <= 'd0;
- end else begin
- case(1'b1) // 优先级译码器
- r_video_valid_4d: // 最高优先级:有效视频数据
- O_tmds_code_data <= r_video_data_code;
- r_video_guard_valid_4d: // 视频保护带周期
- O_tmds_code_data <= r_video_data_guard_band_code_3d;
- r_island_valid_4d: // 数据岛传输周期
- O_tmds_code_data <= r_data_island_code_3d;
- r_island_guard_valid_4d:// 数据岛保护带周期
- O_tmds_code_data <= r_data_island_guard_band_code_3d;
- default: // 控制信号周期
- O_tmds_code_data <= r_control_signal_code_3d;
- endcase
- end
- end
-
- endmodule
复制代码
4 仿真部分
4.1 hdmi_data_distribution.v模块仿真该模块仿真首先看输出时序有没有对齐,检查O_video_guard_band_valid、O_island_guard_band_valid没有问题
检查O_island_preamble、O_island_guard_band_valid信号,没有问题,其实这里已经不需要O_island_preamble信号了,因为前导数据作为控制信号已经转化为control_data了。但是没有关系,可以用来校对control_data位置是否正确。
确认O_ch0_control_data[1:0]、O_ch1_control_data[1:0]、O_ch2_control_data[1:0]信号。 island_preamble转换成的O_ch1_control_data[1:0]、O_ch2_control_data[1:0]信号:
HSYNC、VSYNC信号转换成的O_ch0_control_data[1:0]信号:
video_preamble信号转换成的O_ch1_control_data[1:0]、O_ch2_control_data[1:0]信号:
4.2 HDMI_TMDSEncoder.v模块仿真观察生成的控制数据,同时校对一下保持的像素时钟周期
|