问答 店铺
热搜: ZYNQ FPGA discuz

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

微信扫一扫 分享朋友圈

已有 59 人浏览分享

开启左侧

HDMI-IP项目-主讲TMDS编码(音频信号)-连载九

[复制链接]
59 0
1概述

在第三讲课程中已系统阐述TMDS编码协议的基础原理及视频传输机制。鉴于本系统新增音频功能需求,需在原有协议框架下扩展控制编码模块以实现音视频同步传输。本章节将聚焦控制编码协议的技术实现,包括数据包结构设计、时钟域协调及错误校验机制,视频编码部分沿用既有标准不再赘述。

2控制编码原理

首先回顾一下完整的HDMI传输系统框图。

640?wx_fmt=png&from=appmsg

之前编写的TMDS编码模块,由于不需要考虑数据岛数据和音频采集,所以我们编码的重点在于每个通道8位的视频数据以及Channel 0中的2位控制信号(H,VSYNC),但是忽视了Channel 1Channel 2CTL0CTL1CTL2CTL3四个控制信号,还有Channel 0 ~ Channel 2的辅助数据(Auxiliary Data),本节课结合HDMI 协议完善之前的TMDS编码模块。

开始之前我们需要知道一个重要的信息就是每种信号的编码方式。

640?wx_fmt=png&from=appmsg

视频数据周期采用过渡最小编码技术,每个通道传输8位数据,即每个像素共24位。

数据岛周期使用类似的过渡最小编码技术——TMDS错误减少编码(TERC4),每个TMDS时钟周期内每个通道传输4位数据,共12位。

在控制周期中,采用过渡最大化编码,每个通道传输2位数据,每个TMDS时钟周期共6位,包括HSYNCVSYNCCTL0CTL1CTL2CTL3信号。

每个控制周期接近结束时,通过CTLx信号发送前导信号,用于指示下一个数据周期是视频数据周期还是数据岛周期。

每个视频数据周期和数据岛周期均以前导保护带开始,旨在可靠判断从控制周期到数据周期的切换。该前导保护带由两个特殊字符组成。

数据岛周期还受后导保护带保护,用于可靠判断向控制周期的切换。 下面结合数据岛时序图,只要搞清楚下面6种信号所需要发送的10bit编码即可。

640?wx_fmt=png&from=appmsg

Video Guardband:通道0发送1011001100;通道1发送0100110011;通道2发送1011001100

Data Island Guardband :通道0:在数据岛保护频带期间,通道0被编码为四个TERC4值之一。这些TERC4(D[3:0])0xC0xD0xE0xF,具体取决于HSYNCVSYNC的值。通道1发送0100110011;通道2发送0100110011

Active Video Data视频数据采用和 DVI 相同的 8b/10b 编码 方式。

Active Aux/Audio Data:包括音频数据和辅助控制数据。音频数据编码方式为10bit TERC4(TMDS 降错码)TERC4 编码方式包括 16 个特定的4b/10b 编码。

640?wx_fmt=png&from=appmsg

Control Period Coding (Video Preamble/Data Island Preamble/{HSYNC,VSYNC})

640?wx_fmt=png&from=appmsg

三个TMDS通道中每一个通道的两个控制信号编码如下:

640?wx_fmt=png&from=appmsg
3 代码部分
3.1 hdmi_data_distribution.v

该模块实现HDMI多通道控制信号生成,通道0直接传输VSYNC/HSYNC组合信号,通道1/2通过两级优先级逻辑(视频前导>数据岛前导)生成差异化控制码,通道1在两种前导期均输出01,通道2仅在数据岛前导期输出01,形成01+01(数据岛)或01+00(视频)的规范编码组合,精确标识数据传输阶段边界。

  1. ///////////////////////////////////////////////////////////////////////////////  
  2. // HDMI数据同步分发模块  
  3. // 功能:实现跨时钟域同步,生成符合HDMI 1.4b规范的输出数据  
  4. ///////////////////////////////////////////////////////////////////////////////  
  5. module hdmi_data_distribution (  
  6.     //======================== 时钟与复位 ========================//  
  7.     input  wire        I_pixel_clk,      // 主像素时钟(74.25MHz)  
  8.     input  wire        I_reset_n,        // 异步复位(低有效)  
  9.    
  10.     //======================== 视频域输入 ========================//  
  11.     input  wire        I_video_vsync,    // 视频场同步
  12.     input  wire        I_video_hsync,    // 视频行同步
  13.     input  wire        I_video_period,   // 视频有效周期
  14.     input  wire        I_video_preamble, // 视频前导码
  15.     input  wire        I_video_guard_band,// 视频保护带
  16.     input  wire [7:0]  I_video_data_ch0, // 视频通道0数据  
  17.     input  wire [7:0]  I_video_data_ch1, // 视频通道1数据  
  18.     input  wire [7:0]  I_video_data_ch2, // 视频通道2数据  
  19.    
  20.     //======================== 数据岛域输入 ========================//  
  21.     input  wire        I_island_preamble,  // 数据岛前导码  
  22.     input  wire        I_island_guard_band,// 数据岛保护带
  23.     input  wire        I_island_period,    // 数据岛有效周期
  24.     input  wire [3:0]  I_island_data_ch0, // 数据岛通道0数据  
  25.     input  wire [3:0]  I_island_data_ch1, // 数据岛通道1数据  
  26.     input  wire [3:0]  I_island_data_ch2, // 数据岛通道2数据  
  27.    
  28.     //======================== 同步后输出 ========================//  
  29.     output reg         O_video_valid,     // 视频有效标志  
  30.     output reg         O_video_guard_band_valid, // 视频保护带标志  
  31.     output reg         O_island_valid,    // 数据岛有效标志  
  32.     output reg         O_island_preamble, // 数据岛前导码标志  
  33.     output reg         O_island_guard_band_valid,// 数据岛保护带标志  
  34.    
  35.     // 通道0输出  
  36.     output reg  [7:0]  O_ch0_video_data,  // 视频数据  
  37.     output reg  [1:0]  O_ch0_control_data,// 控制数据  
  38.     output reg  [3:0]  O_ch0_island_data, // 数据岛数据  
  39.    
  40.     // 通道1输出  
  41.     output reg  [7:0]  O_ch1_video_data,  
  42.     output reg  [1:0]  O_ch1_control_data,  
  43.     output reg  [3:0]  O_ch1_island_data,  
  44.    
  45.     // 通道2输出  
  46.     output reg  [7:0]  O_ch2_video_data,  
  47.     output reg  [1:0]  O_ch2_control_data,  
  48.     output reg  [3:0]  O_ch2_island_data  
  49. );  
  50.     //======================== 寄存器声明 ========================//  
  51.     // 视频信号同步链  
  52.     reg sync_video_vsync_0 ;  
  53.     reg sync_video_hsync_0 ;  
  54.     reg sync_video_period_0 ;  
  55.     reg sync_video_preamble_0;  
  56.     reg sync_video_guard_0;  
  57.    
  58.     // 数据岛信号同步链  
  59.     reg sync_island_preamble_0;  
  60.     reg sync_island_guard_0;  
  61.     reg sync_island_period_0;  
  62.    
  63.     // 数据缓冲  
  64.     reg [7:0] buf_video_ch0, buf_video_ch1, buf_video_ch2;  
  65.     reg [3:0] buf_island_ch0, buf_island_ch1, buf_island_ch2;  
  66.     //====================================================================  
  67.     // 视频信号三级同步(完整实现示例)  
  68.     //====================================================================  
  69.    
  70.     //----------- 视频场同步同步链 -----------  
  71.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  72.         if (!I_reset_n) begin
  73.             sync_video_vsync_0 <= 1'b0;
  74.         end
  75.         else begin
  76.             sync_video_vsync_0 <= I_video_vsync;
  77.         end         
  78.     end   
  79.     //----------- 视频行同步同步链 -----------  
  80.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  81.         if (!I_reset_n) begin
  82.             sync_video_hsync_0 <= 1'b0;
  83.         end
  84.         else begin
  85.             sync_video_hsync_0 <= I_video_hsync;
  86.         end        
  87.     end  
  88.     //----------- 视频有效周期同步链 -----------  
  89.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  90.         if (!I_reset_n)begin
  91.             sync_video_period_0 <= 1'b0;
  92.         end
  93.         else  begin
  94.             sync_video_period_0 <= I_video_period;
  95.         end           
  96.     end  
  97.     //----------- 视频前导码同步链 -----------  
  98.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  99.         if (!I_reset_n)begin
  100.             sync_video_preamble_0 <= 1'b0;
  101.         end
  102.         else  begin
  103.             sync_video_preamble_0 <= I_video_preamble;
  104.         end           
  105.     end  
  106.     //----------- 视频保护带同步链 -----------  
  107.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  108.         if (!I_reset_n) begin
  109.             sync_video_guard_0 <= 1'b0;
  110.         end
  111.         else  begin
  112.             sync_video_guard_0 <= I_video_guard_band;
  113.         end         
  114.     end  
  115.     //====================================================================  
  116.     // 数据岛信号三级同步(完整实现)  
  117.     //====================================================================  
  118.    
  119.     //----------- 数据岛前导码同步链 -----------  
  120.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  121.         if (!I_reset_n)begin
  122.             sync_island_preamble_0 <= 1'b0;
  123.         end  
  124.         else begin
  125.             sync_island_preamble_0 <= I_island_preamble;
  126.         end           
  127.     end  
  128.     //----------- 数据岛保护带同步链 -----------  
  129.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  130.         if (!I_reset_n)begin
  131.             sync_island_guard_0 <= 1'b0;
  132.         end   
  133.         else begin
  134.             sync_island_guard_0 <= I_island_guard_band;
  135.         end         
  136.     end  
  137.   
  138.     //----------- 数据岛周期同步链 -----------  
  139.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  140.         if (!I_reset_n)begin
  141.             sync_island_period_0 <= 1'b0;
  142.         end   
  143.         else begin
  144.             sync_island_period_0 <= I_island_period;
  145.         end            
  146.     end  
  147.     //====================================================================  
  148.     // 数据通道缓冲(单级缓冲对齐时序)  
  149.     //====================================================================  
  150.    
  151.     //----------- 视频通道缓冲 -----------  
  152.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  153.         if (!I_reset_n) begin
  154.             buf_video_ch0 <= 8'h00;
  155.             buf_video_ch1 <= 8'h00;
  156.             buf_video_ch2 <= 8'h00;   
  157.         end  
  158.         else begin
  159.             buf_video_ch0 <= I_video_data_ch0;
  160.             buf_video_ch1 <= I_video_data_ch1;
  161.             buf_video_ch2 <= I_video_data_ch2;
  162.         end            
  163.     end  
  164.     //----------- 数据岛通道缓冲 -----------  
  165.    always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  166.         if (!I_reset_n) begin
  167.             buf_island_ch0 <= 8'h00;
  168.             buf_island_ch1 <= 8'h00;
  169.             buf_island_ch2 <= 8'h00;   
  170.         end  
  171.         else begin
  172.             buf_island_ch0 <= I_island_data_ch0;
  173.             buf_island_ch1 <= I_island_data_ch1;
  174.             buf_island_ch2 <= I_island_data_ch2;
  175.         end            
  176.     end  
  177.     //====================================================================  
  178.     // 控制信号生成(符合HDMI 1.4b规范)  
  179.     //====================================================================  
  180.    
  181.     //----------- 通道0控制信号(VSYNC+HSYNC) -----------  
  182.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  183.         if (!I_reset_n) O_ch0_control_data <= 2'b00;  
  184.         else            O_ch0_control_data <= {sync_video_vsync_0, sync_video_hsync_0};  
  185.     end  
  186.     //----------- 通道1控制信号(前导码优先级) -----------  
  187.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  188.         if (!I_reset_n) begin  
  189.             O_ch1_control_data <= 2'b00;  
  190.         end else begin  
  191.             if (sync_video_preamble_0) begin  
  192.                 O_ch1_control_data <= 2'b01;  // 视频前导码优先  
  193.             end else if (sync_island_preamble_0) begin  
  194.                 O_ch1_control_data <= 2'b01;  // 数据岛前导码次之  
  195.             end else begin  
  196.                 O_ch1_control_data <= 2'b00;  // 正常数据周期  
  197.             end  
  198.         end  
  199.     end  
  200.     //----------- 通道2控制信号(固定值) -----------  
  201.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  202.         if (!I_reset_n) begin
  203.             O_ch2_control_data <= 2'b00;
  204.         end else begin  
  205.             if (sync_video_preamble_0) begin  
  206.                 O_ch2_control_data <= 2'b00;  // 视频前导码优先  
  207.             end else if (sync_island_preamble_0) begin  
  208.                 O_ch2_control_data <= 2'b01;  // 数据岛前导码次之  
  209.             end else begin  
  210.                 O_ch2_control_data <= 2'b00;  // 正常数据周期  
  211.             end  
  212.         end  
  213.     end  
  214.     //====================================================================  
  215.     // 输出标志生成  
  216.     //====================================================================  
  217.    
  218.     //----------- 视频有效标志 -----------  
  219.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  220.         if (!I_reset_n) O_video_valid <= 1'b0;  
  221.         else            O_video_valid <= sync_video_period_0;  
  222.     end  
  223.     //----------- 视频保护带标志 -----------  
  224.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  225.         if (!I_reset_n) O_video_guard_band_valid <= 1'b0;  
  226.         else            O_video_guard_band_valid <= sync_video_guard_0;  
  227.     end  
  228.     //----------- 数据岛有效标志 -----------  
  229.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  230.         if (!I_reset_n) O_island_valid <= 1'b0;  
  231.         else            O_island_valid <= sync_island_period_0;  
  232.     end  
  233.     //----------- 数据岛前导码标志 -----------  
  234.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  235.         if (!I_reset_n) O_island_preamble <= 1'b0;  
  236.         else            O_island_preamble <= sync_island_preamble_0;  
  237.     end  
  238.     //----------- 数据岛保护带标志 -----------  
  239.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  240.         if (!I_reset_n) O_island_guard_band_valid <= 1'b0;  
  241.         else            O_island_guard_band_valid <= sync_island_guard_0;  
  242.     end  
  243.     //====================================================================  
  244.     // 数据输出通道(全通道实现)  
  245.     //====================================================================  
  246.    
  247.     //----------- 通道0视频数据输出 -----------  
  248.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  249.         if (!I_reset_n) O_ch0_video_data <= 8'h00;  
  250.         else            O_ch0_video_data <= buf_video_ch0;  
  251.     end  
  252.     //----------- 通道0数据岛数据输出 -----------  
  253.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  254.         if (!I_reset_n) O_ch0_island_data <= 4'h0;  
  255.         else            O_ch0_island_data <= buf_island_ch0;  
  256.     end  
  257.     //----------- 通道1视频数据输出 -----------  
  258.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  259.         if (!I_reset_n) O_ch1_video_data <= 8'h00;  
  260.         else            O_ch1_video_data <= buf_video_ch1;  
  261.     end  
  262.     //----------- 通道1数据岛数据输出 -----------  
  263.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  264.         if (!I_reset_n) O_ch1_island_data <= 4'h0;  
  265.         else            O_ch1_island_data <= buf_island_ch1;  
  266.     end  
  267.     //----------- 通道2视频数据输出 -----------  
  268.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  269.         if (!I_reset_n) O_ch2_video_data <= 8'h00;  
  270.         else            O_ch2_video_data <= buf_video_ch2;  
  271.     end  
  272.     //----------- 通道2数据岛数据输出 -----------  
  273.     always @(posedge I_pixel_clk or negedge I_reset_n) begin  
  274.         if (!I_reset_n) O_ch2_island_data <= 4'h0;  
  275.         else            O_ch2_island_data <= buf_island_ch2;  
  276.     end  
  277. endmodule
复制代码
3.2HDMI_TMDSEncoder.v

HDMI 1.4a编码模块实现视频、控制信号及数据岛的TMDS编码,支持蓝/绿/红三通道独立处理。核心采用四级流水线结构,通过同步延迟链对齐视频数据、保护带和数据岛时序,多路仲裁器按优先级(视频>保护带>数据岛>控制)输出,严格满足消隐期和前导码插入的HDMI协议要求。

动态编码算法(XNOR/XOR逻辑+直流平衡)优化信号完整性,数据岛集成TERC4纠错编码。蓝通道保护带支持动态切换,绿/红通道固定模式,全路径通过流水线寄存器和相位补偿实现4周期固定延迟,符合HDMI CTS时序规范。

  1. //////////////////////////////////////////////////////////////////////////////////  
  2. // HDMI TMDS编码器模块(HDMI 1.4a规范兼容)  
  3. // 功能说明:  
  4. // 1. 实现视频数据、控制信号、数据岛数据的TMDS编码  
  5. // 2. 支持三通道独立编码(通道0=蓝,1=绿,2=红)  
  6. // 3. 集成视频保护带和数据岛保护带生成  
  7. // 4. 严格遵循HDMI CTS测试规范时序要求  
  8. //////////////////////////////////////////////////////////////////////////////////  
  9. module HDMI_TMDSEncoder #(  
  10.     /// TMDS通道编号(0-蓝,1-绿,2-红)  
  11.     /// HDMI 1.4a规范限定取值范围:0/1/2  
  12.     parameter CHANNEL_NUM = 0  
  13. )(  
  14.     input wire       I_clk,          // 系统时钟(像素时钟)  
  15.     input wire       I_reset_n,      // 异步复位(低有效)  
  16.     // 时序控制信号  
  17.     input wire       I_video_valid,       // 视频数据有效  
  18.     input wire       I_video_guard_valid, // 视频保护带有效  
  19.     input wire       I_island_valid,      // 数据岛有效  
  20.     input wire       I_island_guard_valid,// 数据岛保护带有效  
  21.     // 数据输入  
  22.     input wire[7:0]  I_video_data,   // 视频像素数据(8位)  
  23.     input wire[1:0]  I_control_data, // 控制信号(HSYNC/VSYNC)  
  24.     input wire[3:0]  I_island_data,  // 数据岛数据(音频/信息帧)  
  25.     // 编码输出  
  26.     output reg[9:0]  O_tmds_code_data // TMDS编码结果(10位)  
  27. );  
  28.     //=======================================================================  
  29.     // 视频数据流水线寄存器组(4级延迟结构)  
  30.     // 设计目的:  
  31.     // 1. 同步视频数据通道各处理阶段的时序  
  32.     // 2. 补偿编码处理流水线延迟(总计4个时钟周期)  
  33.     // 3. 对齐视频数据与相关控制信号的时序关系  
  34.     //=======================================================================  
  35.     reg[7:0]  r_video_data_1d;       // 视频数据输入缓冲(第1级延迟)  
  36.     reg       r_video_valid_1d;      // 视频有效信号延迟链(第1级)  
  37.     reg       r_video_valid_2d;      // 视频有效信号延迟链(第2级)  
  38.     reg       r_video_valid_3d;      // 视频有效信号延迟链(第3级)  
  39.     reg       r_video_valid_4d;      // 视频有效信号延迟链(第4级,最终输出使能)  
  40.     // 视频保护带有效信号延迟链(同步4周期处理延迟)  
  41.     reg       r_video_guard_valid_1d;  // 第1级延迟  
  42.     reg       r_video_guard_valid_2d;  // 第2级延迟  
  43.     reg       r_video_guard_valid_3d;  // 第3级延迟  
  44.     reg       r_video_guard_valid_4d;  // 第4级延迟(输出使能)  
  45.     // 数据岛有效信号延迟链(与视频通道保持相同延迟)  
  46.     reg       r_island_valid_1d;     // 第1级延迟  
  47.     reg       r_island_valid_2d;     // 第2级延迟  
  48.     reg       r_island_valid_3d;     // 第3级延迟  
  49.     reg       r_island_valid_4d;     // 第4级延迟(输出使能)  
  50.     // 数据岛保护带有效信号延迟链(同步控制逻辑)  
  51.     reg       r_island_guard_valid_1d;  // 第1级延迟  
  52.     reg       r_island_guard_valid_2d;  // 第2级延迟  
  53.     reg       r_island_guard_valid_3d;  // 第3级延迟  
  54.     reg       r_island_guard_valid_4d;  // 第4级延迟(输出使能)  
  55.    
  56.     //=======================================================================  
  57.     // TMDS编码核心参数(规范图5-7变量命名)  
  58.     //=======================================================================  
  59.     reg[3:0]  r_N_1_D;              // 输入数据中'1'的数量(规范步骤1)  
  60.     wire[8:0] r_q_m_comb;           // 中间符号组合逻辑  
  61.     reg[8:0]  r_q_m;                // 差分编码中间结果(规范步骤2-3)  
  62.     reg[8:0]  r_q_m_1d;             // 中间符号延迟寄存器  
  63.     reg[3:0]  r_N_1_q_m_0_7;        // q_m[0:7]中'1'的数量(规范步骤4)  
  64.     reg[3:0]  r_N_0_q_m_0_7;        // q_m[0:7]中'0'的数量  
  65.     reg[9:0]  r_video_data_code;    // 最终视频编码结果(规范步骤5-7)  
  66.     reg signed [4:0] r_cnt_t_1;    // DC平衡计数器(规范步骤8)
  67.     reg[9:0]         r_control_signal_code;
  68.     reg[9:0]         r_control_signal_code_1d;
  69.     reg[9:0]         r_control_signal_code_2d;
  70.     reg[9:0]         r_control_signal_code_3d;
  71.     reg[9:0]         r_data_island_code;
  72.     reg[9:0]         r_data_island_code_1d;
  73.     reg[9:0]         r_data_island_code_2d;
  74.     reg[9:0]         r_data_island_code_3d;
  75.     reg[9:0]         r_video_data_guard_band_code;
  76.     reg[9:0]         r_video_data_guard_band_code_1d;
  77.     reg[9:0]         r_video_data_guard_band_code_2d;
  78.     reg[9:0]         r_video_data_guard_band_code_3d;
  79.     reg[9:0]         r_data_island_guard_band_code;
  80.     reg[9:0]         r_data_island_guard_band_code_1d;
  81.     reg[9:0]         r_data_island_guard_band_code_2d;
  82.     reg[9:0]         r_data_island_guard_band_code_3d;
  83.     //=======================================================================  
  84.     // 时序同步控制块  
  85.     // 功能:  
  86.     // 1. 生成各使能信号的延迟版本  
  87.     // 2. 保持视频数据与相关控制信号的相位对齐  
  88.     // 3. 补偿TMDS编码器处理流水线的固有延迟  
  89.     //=======================================================================  
  90.     always @(posedge I_clk) begin  
  91.         // 视频有效信号四级延迟链(每个时钟推进一级)  
  92.         r_video_valid_1d <= I_video_valid;     // 输入信号采样  
  93.         r_video_valid_2d <= r_video_valid_1d;  // 第1级寄存器输出  
  94.         r_video_valid_3d <= r_video_valid_2d;  // 第2级寄存器输出  
  95.         r_video_valid_4d <= r_video_valid_3d;  // 第3级寄存器输出  
  96.         // 视频保护带有效信号同步延迟  
  97.         r_video_guard_valid_1d <= I_video_guard_valid;  
  98.         r_video_guard_valid_2d <= r_video_guard_valid_1d;  
  99.         r_video_guard_valid_3d <= r_video_guard_valid_2d;  
  100.         r_video_guard_valid_4d <= r_video_guard_valid_3d;  
  101.         // 数据岛有效信号同步延迟  
  102.         r_island_valid_1d <= I_island_valid;  
  103.         r_island_valid_2d <= r_island_valid_1d;  
  104.         r_island_valid_3d <= r_island_valid_2d;  
  105.         r_island_valid_4d <= r_island_valid_3d;  
  106.         // 数据岛保护带有效信号同步延迟  
  107.         r_island_guard_valid_1d <= I_island_guard_valid;  
  108.         r_island_guard_valid_2d <= r_island_guard_valid_1d;  
  109.         r_island_guard_valid_3d <= r_island_guard_valid_2d;  
  110.         r_island_guard_valid_4d <= r_island_guard_valid_3d;  
  111.         // 视频数据输入缓冲(补偿1个时钟周期延迟)  
  112.         r_video_data_1d <= I_video_data;  // 原始数据缓存用于后续编码处理  
  113.     end
  114.     //=======================================================================  
  115.     // 视频数据编码阶段1:计算输入数据'1'的数量  
  116.     // 对应规范:图5-7步骤1  
  117.     //=======================================================================  
  118.     always @(posedge I_clk) begin  
  119.         r_N_1_D <= I_video_data[0] + I_video_data[1] + I_video_data[2] + I_video_data[3] +   
  120.                    I_video_data[4] + I_video_data[5] + I_video_data[6] + I_video_data[7];  
  121.     end  
  122.     //=======================================================================  
  123.     // 视频数据编码阶段2:生成中间符号q_m  
  124.     // 编码规则:  
  125.     // - 当N1{D}>4或N1{D}=4且D[0]=0时使用XNOR,否则用XOR  
  126.     // 对应规范:图5-7步骤2-3  
  127.     //=======================================================================  
  128.     assign r_q_m_comb[0] = r_video_data_1d[0];  // 最低位直接传递  
  129.     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]);  
  130.     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]);
  131.     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]);
  132.     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]);
  133.     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]);
  134.     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]);
  135.     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]);
  136.     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;  
  137.     //=======================================================================  
  138.     // 中间符号寄存器(2级流水)  
  139.     // 作用:保证时序收敛  
  140.     //=======================================================================  
  141.     always @(posedge I_clk ) begin  
  142.          r_q_m    <= r_q_m_comb;    // 组合逻辑结果寄存  
  143.          r_q_m_1d <= r_q_m;         // 增加1级延迟对齐时序  
  144.     end  
  145.     //=======================================================================  
  146.     // 视频数据编码阶段3:统计中间符号的01数量  
  147.     // 对应规范:图5-7步骤4  
  148.     //=======================================================================  
  149.     always @(posedge I_clk) begin  
  150.         r_N_1_q_m_0_7 <= r_q_m[0] + r_q_m[1] + r_q_m[2] + r_q_m[3] +   
  151.                          r_q_m[4] + r_q_m[5] + r_q_m[6] + r_q_m[7];  
  152.         r_N_0_q_m_0_7 <= (~r_q_m[0]) + (~r_q_m[1]) + (~r_q_m[2]) + (~r_q_m[3]) +   
  153.                          (~r_q_m[4]) + (~r_q_m[5]) + (~r_q_m[6]) + (~r_q_m[7]);  
  154.     end  
  155.     //=======================================================================  
  156.     // 视频数据编码阶段4:生成最终编码  
  157.     // 对应规范:图5-7步骤5-7  
  158.     //=======================================================================  
  159.     always @(posedge I_clk or negedge I_reset_n) begin  
  160.         if(!I_reset_n) begin  
  161.             r_video_data_code <= 'd0;  // 复位时清零  
  162.         end else begin  
  163.             // 平衡状态处理  
  164.             if((r_cnt_t_1 == 0) || (r_N_1_q_m_0_7 == r_N_0_q_m_0_7)) begin  
  165.                 r_video_data_code[9]   <= ~r_q_m_1d[8];  // 反转第9位  
  166.                 r_video_data_code[8]   <= r_q_m_1d[8];    // 直接传递第8位  
  167.                 r_video_data_code[7:0] <= r_q_m_1d[8] ? r_q_m_1d[7:0] : ~r_q_m_1d[7:0];   
  168.             end  
  169.             // 需要减少'1'数量  
  170.             else if((r_cnt_t_1 > 0 && r_N_1_q_m_0_7 > r_N_0_q_m_0_7) ||   
  171.                     (r_cnt_t_1 < 0 && r_N_0_q_m_0_7 > r_N_1_q_m_0_7)) begin  
  172.                 r_video_data_code <= {1'b1, r_q_m_1d[8], ~r_q_m_1d[7:0]};  
  173.             end   
  174.             // 需要增加'1'数量  
  175.             else begin  
  176.                 r_video_data_code <= {1'b0, r_q_m_1d[8], r_q_m_1d[7:0]};  
  177.             end  
  178.         end  
  179.     end  
  180.     //=======================================================================  
  181.     // 视频数据编码阶段5:更新DC平衡计数器  
  182.     // 对应规范:图5-7步骤8  
  183.     //=======================================================================  
  184.     always @(posedge I_clk or negedge I_reset_n) begin  
  185.         if(!I_reset_n) begin  
  186.             r_cnt_t_1 <= 0;  // 复位计数器  
  187.         end else if(r_video_valid_2d) begin  
  188.             // 平衡状态更新  
  189.             if((r_cnt_t_1 == 0) || (r_N_1_q_m_0_7 == r_N_0_q_m_0_7)) begin  
  190.                 r_cnt_t_1 <= r_cnt_t_1 + (r_q_m_1d[8] ?   
  191.                     (r_N_1_q_m_0_7 - r_N_0_q_m_0_7) :   
  192.                     (r_N_0_q_m_0_7 - r_N_1_q_m_0_7));  
  193.             end  
  194.             // 非平衡状态调整  
  195.             else begin  
  196.                 r_cnt_t_1 <= r_cnt_t_1 + ((r_cnt_t_1 > 0) ?  
  197.                     (2*r_q_m_1d[8] + r_N_0_q_m_0_7 - r_N_1_q_m_0_7) :  
  198.                     (-2*~r_q_m_1d[8] + r_N_1_q_m_0_7 - r_N_0_q_m_0_7));  
  199.             end  
  200.         end else begin  
  201.             r_cnt_t_1 <= 0;  // 非视频期重置  
  202.         end  
  203.     end  
  204.     //=======================================================================  
  205.     // 控制信号编码(规范表5-2)  
  206.     // 编码映射:  
  207.     // 00->1101010100(水平同步)  
  208.     // 01->0010101011(垂直同步)  
  209.     // 10->0101010100(视频前导)  
  210.     // 11->1010101011(数据岛前导)  
  211.     //=======================================================================  
  212.     always @(posedge I_clk or negedge I_reset_n) begin  
  213.         if(!I_reset_n) begin  
  214.             r_control_signal_code <= 'd0;  
  215.         end else begin  
  216.             case(I_control_data)  
  217.                 2'b00:  r_control_signal_code <= 10'b1101010100;  // HSYNC  
  218.                 2'b01:  r_control_signal_code <= 10'b0010101011;  // VSYNC  
  219.                 2'b10:  r_control_signal_code <= 10'b0101010100;  // 视频前导  
  220.                 2'b11:  r_control_signal_code <= 10'b1010101011;  // 数据岛前导  
  221.             endcase  
  222.         end  
  223.     end  
  224.     // 控制信号流水线对齐(3级延迟)  
  225.     always @(posedge I_clk) begin  
  226.         r_control_signal_code_1d <= r_control_signal_code;  
  227.         r_control_signal_code_2d <= r_control_signal_code_1d;  
  228.         r_control_signal_code_3d <= r_control_signal_code_2d;  
  229.     end  
  230.     //=======================================================================  
  231.     // 数据岛TERC4编码(规范表5-3)  
  232.     // 4位数据映射为10位符号,支持BCH纠错  
  233.     //=======================================================================  
  234.     always @(posedge I_clk or negedge I_reset_n) begin  
  235.         if(!I_reset_n) begin  
  236.             r_data_island_code <= 'd0;  
  237.         end else begin  
  238.             case(I_island_data)  
  239.                 4'b0000 : r_data_island_code <= 10'b1010011100;  // 数据0  
  240.                 4'b0001 : r_data_island_code <= 10'b1001100011;  // 数据1  
  241.                 4'b0010 : r_data_island_code <= 10'b1011100100;  // 数据2
  242.                 4'b0011 : r_data_island_code <= 10'b1011100010;  // 数据3   
  243.                 4'b0100 : r_data_island_code <= 10'b0101110001;  // 数据4   
  244.                 4'b0101 : r_data_island_code <= 10'b0100011110;  // 数据5   
  245.                 4'b0110 : r_data_island_code <= 10'b0110001110;  // 数据6   
  246.                 4'b0111 : r_data_island_code <= 10'b0100111100;  // 数据7   
  247.                 4'b1000 : r_data_island_code <= 10'b1011001100;  // 数据8   
  248.                 4'b1001 : r_data_island_code <= 10'b0100111001;  // 数据9   
  249.                 4'b1010 : r_data_island_code <= 10'b0110011100;  // 数据10   
  250.                 4'b1011 : r_data_island_code <= 10'b1011000110;  // 数据11  
  251.                 4'b1100 : r_data_island_code <= 10'b1010001110;  // 数据12   
  252.                 4'b1101 : r_data_island_code <= 10'b1001110001;  // 数据13   
  253.                 4'b1110 : r_data_island_code <= 10'b0101100011;  // 数据14   
  254.                 4'b1111 : r_data_island_code <= 10'b1011000011;  // 数据15  
  255.             endcase  
  256.         end  
  257.     end  
  258.     // 数据岛流水线对齐(3级延迟)  
  259.     always @(posedge I_clk) begin  
  260.         r_data_island_code_1d <= r_data_island_code;  
  261.         r_data_island_code_2d <= r_data_island_code_1d;  
  262.         r_data_island_code_3d <= r_data_island_code_2d;  
  263.     end  
  264.     //=======================================================================  
  265.     // 视频保护带生成(规范5.2.1)  
  266.     // 通道0/2:1011001100,通道1:0100110011  
  267.     //=======================================================================  
  268.     always @(posedge I_clk or negedge I_reset_n) begin  
  269.         if(!I_reset_n) begin  
  270.             r_video_data_guard_band_code <= 'd0;  
  271.         end else begin  
  272.             case(CHANNEL_NUM)  
  273.                 0:  r_video_data_guard_band_code <= 10'b1011001100;  // 蓝通道  
  274.                 1:  r_video_data_guard_band_code <= 10'b0100110011;  // 绿通道  
  275.                 2:  r_video_data_guard_band_code <= 10'b1011001100;  // 红通道  
  276.             endcase  
  277.         end  
  278.     end  
  279.     // 视频保护带流水线对齐(3级延迟)  
  280.     always @(posedge I_clk) begin  
  281.         r_video_data_guard_band_code_1d <= r_video_data_guard_band_code;  
  282.         r_video_data_guard_band_code_2d <= r_video_data_guard_band_code_1d;  
  283.         r_video_data_guard_band_code_3d <= r_video_data_guard_band_code_2d;  
  284.     end  
  285.     //=======================================================================  
  286.     // 数据岛保护带生成(规范5.2.3.3)  
  287.     // 通道0根据控制信号动态选择,通道1/2固定模式  
  288.     //=======================================================================  
  289.     always @(posedge I_clk or negedge I_reset_n) begin  
  290.         if(!I_reset_n) begin  
  291.             r_data_island_guard_band_code <= 'd0;  
  292.         end else begin  
  293.             case(CHANNEL_NUM)  
  294.                 0:  // 蓝通道动态选择  
  295.                     r_data_island_guard_band_code <=   
  296.                         I_control_data == 2'b00 ? 10'b1010001110 :  // 视频前导保护  
  297.                         I_control_data == 2'b01 ? 10'b1001110001 :  // 数据岛前导保护  
  298.                         I_control_data == 2'b10 ? 10'b0101100011 :  // 保留模式1  
  299.                         I_control_data == 2'b11 ? 10'b1011000011 :  // 保留模式2  
  300.                         'd0;  
  301.                 1:  r_data_island_guard_band_code <= 10'b0100110011;  // 绿通道固定  
  302.                 2:  r_data_island_guard_band_code <= 10'b0100110011;  // 红通道固定  
  303.             endcase  
  304.         end  
  305.     end  
  306.     // 数据岛保护带流水线对齐  
  307.     always @(posedge I_clk) begin  
  308.         r_data_island_guard_band_code_1d <= r_data_island_guard_band_code;  
  309.         r_data_island_guard_band_code_2d <= r_data_island_guard_band_code_1d;  
  310.         r_data_island_guard_band_code_3d <= r_data_island_guard_band_code_2d;  
  311.     end  
  312.     //=======================================================================  
  313.     // 最终输出多路选择器  
  314.     // 优先级:视频数据 > 视频保护带 > 数据岛 > 数据岛保护带 > 控制信号  
  315.     // 所有信号经过4个时钟周期延迟保持相位对齐  
  316.     //=======================================================================  
  317.     always @(posedge I_clk or negedge I_reset_n) begin  
  318.         if(!I_reset_n) begin  
  319.             O_tmds_code_data <= 'd0;  
  320.         end else begin  
  321.             case(1'b1)  // 优先级译码器  
  322.                 r_video_valid_4d:       // 最高优先级:有效视频数据  
  323.                     O_tmds_code_data <= r_video_data_code;  
  324.                 r_video_guard_valid_4d: // 视频保护带周期  
  325.                     O_tmds_code_data <= r_video_data_guard_band_code_3d;  
  326.                 r_island_valid_4d:      // 数据岛传输周期  
  327.                     O_tmds_code_data <= r_data_island_code_3d;  
  328.                 r_island_guard_valid_4d:// 数据岛保护带周期  
  329.                     O_tmds_code_data <= r_data_island_guard_band_code_3d;  
  330.                 default:                // 控制信号周期  
  331.                     O_tmds_code_data <= r_control_signal_code_3d;  
  332.             endcase  
  333.         end  
  334.     end  
  335. endmodule
复制代码
4 仿真部分
4.1 hdmi_data_distribution.v模块仿真

该模块仿真首先看输出时序有没有对齐,检查O_video_guard_band_validO_island_guard_band_valid没有问题

640?wx_fmt=png&from=appmsg

检查O_island_preambleO_island_guard_band_valid信号,没有问题,其实这里已经不需要O_island_preamble信号了,因为前导数据作为控制信号已经转化为control_data了。但是没有关系,可以用来校对control_data位置是否正确。

640?wx_fmt=png&from=appmsg

确认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]信号:

640?wx_fmt=png&from=appmsg

HSYNCVSYNC信号转换成的O_ch0_control_data[1:0]信号:

640?wx_fmt=png&from=appmsg
640?wx_fmt=png&from=appmsg

video_preamble信号转换成的O_ch1_control_data[1:0]O_ch2_control_data[1:0]信号:

640?wx_fmt=png&from=appmsg
4.2 HDMI_TMDSEncoder.v模块仿真

观察生成的控制数据,同时校对一下保持的像素时钟周期

640?wx_fmt=png&from=appmsg
640?wx_fmt=png&from=appmsg




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

303

主题
精彩推荐
热门资讯
网友晒图
图文推荐

  • 微信公众平台

  • 扫描访问手机版