TMDS视频编解码算法

news/2025/2/25 18:00:58

因为使用的是DDR进行传输,即双倍频率采样,故时钟只用是并行数据数据的5倍,而不是10倍。

  TMDS算法流程:

视频编码TMDS算法流程实现: 

`timescale 1 ps / 1ps
//DVI编码通常用于视频传输,将并行数据转换为适合串行传输的格式。
module dvi_encoder (
  input            clkin,    // pixel clock input
  input            rstin,    // async. reset input (active high)
  input      [7:0] din,      // data inputs: expect registered
  input            c0,       // c0 input
  input            c1,       // c1 input;c0 和 c1 用于指示视频的**水平同步(HSYNC)和垂直同步(VSYNC)**信号。
  input            de,       // de input
  output reg [9:0] dout      // data outputs
);


// Counting number of 1s and 0s for each incoming pixel
// component. Pipe line the result.
// Register Data Input so it matches the pipe lined adder
// output

reg [3:0] n1d; //number of 1s in din
reg [7:0] din_q;

//计算像素数据中“1”的个数
always @ (posedge clkin) begin
  n1d <=#1 din[0] + din[1] + din[2] + din[3] + din[4] + din[5] + din[6] + din[7];

  din_q <=#1 din;
end

///
// Stage 1: 8 bit -> 9 bit
// Refer to DVI 1.0 Specification, page 29, Figure 3-5
///
wire decision1;

//decision1 为真,表示需要反转数据。
assign decision1 = (n1d > 4'h4) | ((n1d == 4'h4) & (din_q[0] == 1'b0));

wire [8:0] q_m;
assign q_m[0] = din_q[0];
assign q_m[1] = (decision1) ? (q_m[0] ^~ din_q[1]) : (q_m[0] ^ din_q[1]);
assign q_m[2] = (decision1) ? (q_m[1] ^~ din_q[2]) : (q_m[1] ^ din_q[2]);
assign q_m[3] = (decision1) ? (q_m[2] ^~ din_q[3]) : (q_m[2] ^ din_q[3]);
assign q_m[4] = (decision1) ? (q_m[3] ^~ din_q[4]) : (q_m[3] ^ din_q[4]);
assign q_m[5] = (decision1) ? (q_m[4] ^~ din_q[5]) : (q_m[4] ^ din_q[5]);
assign q_m[6] = (decision1) ? (q_m[5] ^~ din_q[6]) : (q_m[5] ^ din_q[6]);
assign q_m[7] = (decision1) ? (q_m[6] ^~ din_q[7]) : (q_m[6] ^ din_q[7]);
assign q_m[8] = (decision1) ? 1'b0 : 1'b1;   //第9位 q_m[8] 用于指示数据是否被反转,0是数据被反转

/
// Stage 2: 9 bit -> 10 bit
// Refer to DVI 1.0 Specification, page 29, Figure 3-5
/
//计算1和0的个数
reg [3:0] n1q_m, n0q_m; // number of 1s and 0s for q_m
always @ (posedge clkin) begin
  n1q_m  <=#1 q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7];
  n0q_m  <=#1 4'h8 - (q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7]);
end

//控制令牌(Control Tokens),用于在视频的消隐期(Blanking Period)传输同步信息。
//这些控制令牌是10位的固定编码值,用于表示视频的**水平同步(HSYNC)和垂直同步(VSYNC)**信号
parameter CTRLTOKEN0 = 10'b1101010100;
parameter CTRLTOKEN1 = 10'b0010101011;
parameter CTRLTOKEN2 = 10'b0101010100;
parameter CTRLTOKEN3 = 10'b1010101011;

/*
差异计数器(Disparity Counter):
    在TMDS编码中,差异计数器用于跟踪当前信号的直流偏差(DC Disparity)。
    直流偏差是指信号中"1"和"0"的数量之差。
    通过调整编码方式(如反转数据),差异计数器可以帮助实现直流平衡,减少信号的直流分量。
    最高位是符号位(MSB is the sign bit):
差异计数器的最高位(MSB)表示偏差的方向:
    如果最高位为 0,表示偏差为负(即"0"的数量多于"1")。
    如果最高位为 1,表示偏差为正(即"1"的数量多于"0")。
    其余位表示偏差的大小。
*/
reg [4:0] cnt; //disparity counter, MSB is the sign bit
wire decision2, decision3;

assign decision2 = (cnt == 5'h0) | (n1q_m == n0q_m);  //1和0的数量相等
/
// [(cnt > 0) and (N1q_m > N0q_m)] or [(cnt < 0) and (N0q_m > N1q_m)]
/
assign decision3 = (~cnt[4] & (n1q_m > n0q_m)) | (cnt[4] & (n0q_m > n1q_m));
                  //即cnt[4]=0                    cnt[4]=1


// pipe line alignment

reg       de_q, de_reg;
reg       c0_q, c1_q;
reg       c0_reg, c1_reg;
reg [8:0] q_m_reg;

always @ (posedge clkin) begin
  de_q    <=#1 de;
  de_reg  <=#1 de_q;
  
  c0_q    <=#1 c0;
  c0_reg  <=#1 c0_q;
  
  c1_q    <=#1 c1;
  c1_reg  <=#1 c1_q;

  q_m_reg <=#1 q_m;
end

///
// 10-bit out
// disparity counter
///
always @ (posedge clkin or posedge rstin) begin
  if(rstin) begin
    dout <= 10'h0;
    cnt <= 5'h0;
  end else begin
    if (de_reg) begin
      if(decision2) begin
        dout[9]   <=#1 ~q_m_reg[8]; 
        dout[8]   <=#1 q_m_reg[8]; 
        dout[7:0] <=#1 (q_m_reg[8]) ? q_m_reg[7:0] : ~q_m_reg[7:0];

        cnt <=#1 (~q_m_reg[8]) ? (cnt + n0q_m - n1q_m) : (cnt + n1q_m - n0q_m);  //第一个cnt代表当前cnt值,后面两个cnt代表上一次执行时的值
      end else begin
        if(decision3) begin
          dout[9]   <=#1 1'b1;
          dout[8]   <=#1 q_m_reg[8];
          dout[7:0] <=#1 ~q_m_reg[7:0];

          cnt <=#1 cnt + {q_m_reg[8], 1'b0} + (n0q_m - n1q_m);
        end else begin
          dout[9]   <=#1 1'b0;
          dout[8]   <=#1 q_m_reg[8];
          dout[7:0] <=#1 q_m_reg[7:0];

          cnt <=#1 cnt - {~q_m_reg[8], 1'b0} + (n1q_m - n0q_m);
        end
      end
    end else begin
      case ({c1_reg, c0_reg})  //进入消隐期
        2'b00:   dout <=#1 CTRLTOKEN0;
        2'b01:   dout <=#1 CTRLTOKEN1;
        2'b10:   dout <=#1 CTRLTOKEN2;
        default: dout <=#1 CTRLTOKEN3;
      endcase

      cnt <=#1 5'h0;
    end
  end
end
  
endmodule 

解码:使用xilinx原语serdes进行并转串,serdes分为master和slave模式,其中的master使用的是8bit数据,另外带两个bit的扩展位放在了slave中。

参考:正点原子 


http://www.niftyadmin.cn/n/5865802.html

相关文章

基于 SpringBoot 的 “电影交流平台小程序” 系统的设计与实现

大家好&#xff0c;今天要和大家聊的是一款基于 SpringBoot 的 “电影交流平台小程序” 系统的设计与实现。项目源码以及部署相关事宜请联系我&#xff0c;文末附上联系方式。 项目简介 基于 SpringBoot 的 “电影交流平台小程序” 系统设计与实现的主要使用者分为 管理员 和…

nginx代理后502

直接访问 ​https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions正常 使用nginx代理后访问出现502 server {listen 9999;server_name 172.21.3.78;location ^~ /compatible-mode {proxy_pass https://dashscope.aliyuncs.com;}location / {proxy_pass…

再论Spring MVC中Filter和HandlerInterceptor的优先级

在Spring MVC中&#xff0c;Filter和HandlerInterceptor的执行顺序及优先级如下&#xff1a; 1. 执行顺序与优先级 Filter&#xff08;Servlet规范&#xff09;的优先级高于 HandlerInterceptor&#xff08;Spring MVC框架&#xff09;。 请求处理流程&#xff1a; Filter链&a…

从0-1学习Mysql第三章: 数据类型

第三章&#xff1a;数据类型 在本章中&#xff0c;我们将学习 MySQL 中的常用数据类型&#xff0c;以及如何根据不同的需求选择合适的数据类型。同时&#xff0c;我们也会讲解 NULL 值和默认值的使用方式&#xff0c;以及一些常见的错误示例和面试题。通过本章的学习&#xff…

设计模式-(单例,简单工厂,工厂,抽象工厂)

单例模式 概念&#xff1a; 确保一个类只有一个实例&#xff0c;而且自行实例化并向震哥哥系统提供这个实例 应用&#xff1a; 无状态的&#xff0c;一般以工具类形式&#xff0c;进行提供 代码&#xff1a; 懒汉式&#xff0c;双重检查锁 class Singleton {private sta…

FutureTask 和 CompletableFuture

FutureTask 和 CompletableFuture 是 Java 并发编程中用于处理异步任务的两种工具&#xff0c;但它们在功能和使用场景上有显著区别。以下是两者的主要对比&#xff1a; 1. FutureTask 定义&#xff1a;FutureTask 是 Future 接口的一个实现类&#xff0c;表示一个异步计算任务…

java23种设计模式-建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;学习笔记 1. 模式定义 建造者模式是一种创建型设计模式&#xff0c;通过分步构建复杂对象的方式&#xff0c;将对象的构建过程与表示分离。允许使用相同的构建过程创建不同的对象表示。 2. 适用场景 ✅ 需要创建包含多个…

2025年信息科学与工程学院科协机器学习介绍——机器学习基本模型介绍

机器学习 目录 机器学习一.安装基本环境conda/miniconda环境 二.数据操作数据预处理一维数组二维数组以及多维数组的认识访问元素的方法torch中tenson的应用张量的运算张量的广播 三.线性代数相关知识四.线性回归SoftMax回归问题&#xff08;分类问题&#xff09;什么是分类问题…