HDMI/DVI____TMDS编码

2023-05-16

一.编码步骤:

基本方法:取第一位数据为初值,接下来输入的每一位与前一导出的位(根据判断条件)进行异或XOR或者同或XNOR(最小化传输,减少0/1翻转);最后选择性反转这9bit数据(DC平衡处理,平衡0和1的个数)。

①DE为高电平时,对8位RGB数据编码,第9bit表示采用了XOR / XNOR ,第10bit表示是否翻转。

②DE为低电平时,根据2bit的控制位(4种情况)输出10bit数据(固定4个值)。(直接使用查找表)。

知识点:一组数据中0的个数多,异或减少翻转次数

         一组数据中1的个数多,同或减少翻转次数

         例子如下:

         

二.编码流程:

         

 三.代码设计

  抛开流程图设计思想,只看图设计代码,这种类型的代码编码一般有一下流程:

①.先把输入的数据用寄存器打x拍,实现流水线对齐。

②.单独拎出所有三角形,用组合逻辑语句设计判决条件:

  condition1 = ( 三角形内部语句 ) ? 1 : 0 ;

  同理......

③.用时序逻辑按顺序根据条件编写输出。


//根据流程图写代码
//啥时候用组合啥时候用时序?判决条件用组合,打拍,输出用时序。输入经过打拍之后,后面其实可以根据需要使用组合逻辑

module TMDS_coder
(
    input clk ,
    input resetn ,
    input d_e ,
    input [7:0]d_in ,
    input c0 ,
    input c1 ,
    
    output reg[9:0]d_out

);

reg [4:0]cnt ;//极性寄存器,计数器差距统计:统计 1 和 0 是否过量发送,最高位(cnt[4])是符号位
reg [7:0]d_in_reg ;//输入数据寄存器
wire [8:0]d_m ;//9bit寄存器
reg [3:0]numd1 ;//计数8bit中1的个数
reg [3:0]numd0 ;//计数8bit中0的个数
reg [3:0]numd_m1 ;//计数8bit中1的个数
reg [3:0]numd_m0 ;//计数8bit中0的个数

//控制信号输出查找表
 parameter c1c0_00 = 10'b1101010100;
 parameter c1c0_01 = 10'b0010101011;
 parameter c1c0_10 = 10'b0101010100;
 parameter c1c0_11 = 10'b1010101011;

//输入数据打一拍,统计输入的数据0和1的个数
always@(posedge clk)
begin
    d_in_reg <= d_in ;
    numd1 <= d_in_reg[0] + d_in_reg[1] + d_in_reg[2] + d_in_reg[3] + d_in_reg[4] + d_in_reg[5] + d_in_reg[6] + d_in_reg[7] ;
    numd0 = 'd8 - ( d_in_reg[0] + d_in_reg[1] + d_in_reg[2] + d_in_reg[3] + d_in_reg[4] + d_in_reg[5] + d_in_reg[6] + d_in_reg[7] ) ;
end

//判定条件设计:
//知识点(经验):把流程图的判定条件用组合逻辑定义成一个变量(是/否 --> 1/0 ) (之前显示屏取范围亦是如此)
//状态机用的是时序逻辑,区别
wire condition1 ;//条件1
assign condition1 = (numd1 > 4 ) || ( (numd1 == 4 ) && ( d_in[0] == 0 ) ) ;

//这里用了组合逻辑赋值
assign d_m[0] = d_in_reg[0] ;
assign d_m[1] = (condition1) ? ~( d_m[0]^d_in_reg[1] ) : ( d_m[0]^d_in_reg[1] ) ;
assign d_m[2] = (condition1) ? ~( d_m[1]^d_in_reg[2] ) : ( d_m[1]^d_in_reg[2] ) ;
assign d_m[3] = (condition1) ? ~( d_m[2]^d_in_reg[3] ) : ( d_m[2]^d_in_reg[3] ) ;
assign d_m[4] = (condition1) ? ~( d_m[3]^d_in_reg[4] ) : ( d_m[3]^d_in_reg[4] ) ;
assign d_m[5] = (condition1) ? ~( d_m[4]^d_in_reg[5] ) : ( d_m[4]^d_in_reg[5] ) ;
assign d_m[6] = (condition1) ? ~( d_m[5]^d_in_reg[6] ) : ( d_m[5]^d_in_reg[6] ) ;
assign d_m[7] = (condition1) ? ~( d_m[6]^d_in_reg[7] ) : ( d_m[6]^d_in_reg[7] ) ;
assign d_m[8] = (condition1) ? 0 : 1 ;


//统计9bit寄存器中数据位0/1个数
always@(posedge clk)
begin
     numd_m1 = d_m[0] + d_m[1] + d_m[2] + d_m[3] + d_m[4] + d_m[5] + d_m[6] + d_m[7] ;
     numd_m0 = 'd8 - ( d_m[0] + d_m[1] + d_m[2] + d_m[3] + d_m[4] + d_m[5] + d_m[6] + d_m[7] ) ;
end

wire condition2 ;//条件2
assign condition2 = d_e ;

wire condition3 ;//条件3
assign condition3 = ( (cnt == 0 ) || ( (numd_m1) == ( numd_m0) ) ) ;

wire condition4 ;
assign condition4 = (d_m[8] == 0) ? 1 : 0 ;

wire condition5 ;//大于零小于零的问题怎么解决?教程用符号位解决,不知道cnt是怎么能算出来的。
assign condition5 = ( ((~cnt[4]) && (numd_m1 > numd_m0) ) || ( (cnt[4] ) && ( numd_m0 > numd_m1 ))) ;

/*如何统计1/0个数的多/少了几个,是设计角度的问题。为了D/C平衡(直流均衡),才做统计,流程处理,如果不做均衡可以不处理。
从代码的角度看,只需要知道cnt[4]是符号位就可以判断了。
*/

/*怎么样设计关联多次输入的变量cnt啊?
想法:设计一个输入一个输出,输出接到输入...
教程方法:本来就能存cnt值,只要不去刷新他
*/

reg [1:0]c0_reg ;
reg [1:0]c1_reg ;
reg [1:0]d_e_reg ;
reg [8:0]d_m_reg ;

//流水线对齐,打2拍,d_m输入时已经打一拍了,这里打一拍

always@(posedge clk)
begin
    c0_reg <= {c0_reg[0],c0};
    c1_reg <= {c1_reg[0],c1};
    d_e_reg <= {d_e_reg[0] , d_e } ;
    d_m_reg <= d_m ;
end

//设计输出
always@(posedge clk or negedge resetn )
if(!resetn)
    begin
        cnt <= 0 ;
        d_out <= 0 ;
    end
else
begin 
    if ( condition2 )
        begin
        if (condition3)
            begin
                d_out[9] <= ~d_m_reg[8] ;
                d_out[8] <= d_m_reg[8] ;
                d_out[7:0] <= (d_m_reg[8]) ? d_m_reg[7:0] : ~d_m_reg[7:0] ;
                if(condition4)
                    begin
                        cnt <= cnt + ( numd_m0 - numd_m1 ) ;
                    end
                else
                    begin
                        cnt <= cnt + ( numd_m1 - numd_m0 ) ;
                    end
            end
        else
            begin
                if(condition5)
                    begin
                        d_out[9] <= 1 ;
                        d_out[8] <= d_m_reg[8] ;
                        d_out[7:0] <= ~d_m_reg[7:0] ;
                        cnt <= cnt + ( d_m_reg[8] << 1 ) + ( numd_m0 - numd_m1 ) ;
                    end
                else
                    begin
                        d_out[9] <= 0 ;
                        d_out[8] <= d_m_reg[8] ;
                        d_out[7:0] <= d_m_reg[7:0] ;
                        cnt <= cnt -  ( d_m_reg[8] << 1 ) + ( numd_m1 - numd_m0 ) ;
                    end
            end
        end
    else
        begin
            cnt <= 0 ;
            case({c1_reg[0],c0_reg[0]})
            2'b00 : d_out <= c1c0_00 ;
            2'b01 : d_out <= c1c0_01 ;
            2'b10 : d_out <= c1c0_10 ;    
            2'b11 : d_out <= c1c0_11 ;
            endcase
        end
end
endmodule  

 仿真结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HDMI/DVI____TMDS编码 的相关文章

  • 解决MAC用HDMI连接显示器就没声音问题

    声明 xff1a 我的MAC装了Windows系统 xff0c 问题是在Windows系统出现的 xff1a 1 右键点击声音图标 xff0c 点击 播放设备 2 原本默认设备是S24F350的 xff0c 改为扬声器就有声音了
  • OpenCore黑苹果之拯救者14(HD4600)开启HDMI音频

    一般外接显示器用不到HDMI音频 xff0c 但是回家外接电视机有点用 我的型号 xff1a 联想 xff08 Lenovo xff09 拯救者 14 0英寸游戏本 xff08 i7 4720HQ 8G 128G SSD 43 1T GTX
  • 设备树之HDMI输出实例

    一 HDMI输出实例详解 图1 图2 图3 图1 xff0c 图2和图3构成了一个典型的HDMI输出链路 图1 xff1a HDMI接口设备结点 xff0c 该HDMI接口使用TYPE A接口 注意 xff1a HDMI接口结点名称为con
  • Nvidia Jetson nano 插卡插hdmi和电源无法开机显示器黑屏jetsonnano重置系统恢复

    Ensure smooth network 确保网络畅通 下载包 进下载页面下载对应NVIDIA SDK Manager NVIDIA Developer Upload deb to ubuntu vm 上传包 Install deb 安装
  • 树莓派 4B 配置两个 HDMI 显示不同分辨率

    在树莓派 4 之前 xff0c 都是一个 HDMI 接口 xff0c 所以没有这个问题 而树莓派 4B 有 2 个 HDMI 接口 xff0c 可以输出双 4K 在树莓派根目录下有一个文件 config txt 我们需要修改里面的参数 下面
  • HDMI是什么设备与计算机连接的接口类型,​hdmi接口有什么用?怎么连接电脑?vga和hdmi的区别...

    经常玩电脑 看电视的朋友或许知道电脑 电视上面都会有hdmi接口 xff0c hdmi接口是用来干什么的大家或许并不知道 xff0c 其实不单单只是电视电脑上面有 xff0c 像现在少见的DVD播放机 xff0c 还有常用的大音响 机顶盒等
  • odroid x2安装ubuntu系统,HDMI显示,说说折腾事儿。

    安装的是Lubuntu14 04 xff0c odroid官网有下载 xff0c 烧写软件用官网下载的win32disk imager for odroid 不要用通用的win32disk image 可能不行 write烧写完毕之后记得v
  • 解决odroid-XU3的HDMI输出问题

    odroid XU3的板子直接通过microHDMI口连接显示器 xff0c 并没有显示 解决方法是修改 media boot boot ini文件 xff0c 取消屏蔽与HDMI设置相关语句 重启之后 xff0c 解决问题 由于不同的显示
  • HDMI/DVI____串行发送器

    一 功能 xff1a 把10bit数据转化为串行数据在一个时钟周期全部输出 xff08 先输出高位 xff0c 再输出低位 xff09 二 框图 二 思路 对于TMDS编码器 xff0c 在每一个输入时钟周期 xff0c 输入一次数据到TM
  • DVI-A、DVI-D、DVI-I接口定义、DVI接口图和DVI接口标准介绍

    dvi接口义 DVI接口图片 DVI接口标准介绍 dvi hdmi接口定义 DVI 的定义 DVI A 就是与 VGA 规范一样的 包括 RGBHV 信号线的模拟接口 RGB 是什么不用赘述了吧 HV 分别是水平 和 垂直 扫描的 行同步
  • DP和HDMI区别

    转自 https www toutiao com i6877677362054595080 在目前市面上显示器接口中 VGA和DVI已经逐渐退出了历史舞台 Type C还算是小众 而DP DisplayPort 与HDMI则成为了主流产品的
  • LCD液晶屏接口和显示器接口介绍

    LCD液晶屏主流显示接口介绍 屏的接口类型种类以及接口定义分析 绝对收藏 I2C SPI UART RGB LVDS MIPI EDP和DP等显示屏接口简要总结 LCD主流显示接口介绍 这个ID洒家要了的博客 CSDN博客 lcd接口定义
  • HDMI的DDC是什么

    DDC 是什么 DDC Display Data Channel 显示数据通道 在 HDMI 协议中用于 Source 和 Sink 两端进行数据交换 通常是基于 I2C 标准的一套通讯机制 在实际使用过程中 Source 端的 HDMI
  • HDMI和DP线的等级和速度

    转自 4K 144Hz到底需要多少带宽
  • HDMI中的视频时序分析

    一 前言 建立层次观念 说到时序 我们首先想到的例子是IIC SPI 串口等接口的例子 以我们之前的理解 时序就是传输线上电平随时间变化的顺序 但是但是但是 在HDMI这里 我们应该建立一个新的观念 即时序不一定对应到物理层 即传输线上 这
  • 如何在不root的情况下禁用Android设备的hdmi端口?

    我想知道是否有一种方法可以在不root的情况下禁用android设备的hdmi端口 从 Android 4 2 SDK 级别 17 开始 DisplayManager API http developer android com refer
  • HDMI之数据岛

    概述 发送端在发送视频信号之前 将多媒体信息通过数据岛传输给接收端 接收端通过数据岛信息获取当前分辨率 VIC 编码信息 RGB YCR等 色彩空间 位深等等 然后对应将视频信息解码 与此同时 多余的带宽用于传输音频信息等 本文通过具体的包
  • Android 强制 HDMI 音频

    当我的 ADT 1 连接到电视时 无法通过 HDMI 播放声音 在该特定电视上 我必须在 Raspberry PI 上强制使用 HDMI 音频 因此我也尝试在 ADT 1 上强制使用它 我尝试制作一个具有许可的应用程序
  • 双屏 HDMI 输出编程

    在我的搜索中 我发现 Android SDK 目前不支持控制 HDMI 端口活动和处理 HDMI 输出 尽管像摩托罗拉这样的某些设备制造商 不知道是否还有其他制造商也这样做 提供了 API 以实现更好的控制 下面是其中两个的链接 其中双屏链
  • Android - 禁用 HDMI

    我的一个 Android 项目需要时不时地在 2 个 HDMI 输入之间切换 可能是一分钟一次 一根 HDMI 输入来自 Android 设备的 HDMI 输出 一根来自外部不可控源 我发现了一个 HDMI 开关 当信号可用时 它可以自动在

随机推荐

  • 22.11.22 TCP与UDP 客户端与服务器 协议搭建

    ubuntu 64 ubuntu yuyu yu 11 cat Tcp Cli c 客户端 include lt stdio h gt include lt sys types h gt include lt sys socket h gt
  • cmake交叉编译配置

    cmake交叉编译配置 很多时候 xff0c 我们在开发的时候是面对嵌入式平台 xff0c 因此由于资源的限制需要用到相关的交叉编译 即在你host宿主机上要生成target目标机的程序 里面牵扯到相关头文件的切换和编译器的选择以及环境变量
  • OS——gcc、g++、gdb、vim、vs code的基本使用

    文章目录 g 43 43 的使用gdb的使用vim的使用vscode的使用vs code的安装vs code中C 43 43 的编译运行配置 如果想要学习如何在CentOS 7中安装配置gcc g 43 43 gdb zhs和oh my z
  • make和cmake

    编程人员已经使用CMake和Make很长一段时间了 当你加入一家大公司或者开始在一个具有大量代码的工程上开展工作时 xff0c 你需要注意所有的构建 你需要看到处跳转的 CMakeLists txt 文件 你应该会在终端使用 cmake 和
  • ubuntu自带python与anaconda python环境的切换

    ubuntu的python可分为三大类 xff1a 1 ubuntu自带的python环境 一般安装在 usr bin 中python2和python3可以共存 2 anaconda自带的base环境 3 在anaconda中创建的虚拟py
  • 详细介绍如何在ubuntu20.04中安装ROS系统,以及安装过程中出现的常见错误的解决方法,填坑!!!

    本篇文章写于2020 10 xff0c 经过很多小伙伴的验证 xff0c 文章所介绍的步骤是可以正常完成安装的 xff0c 现在是2021 10 xff0c 经过近期的探索 xff0c 我将安装步骤进行了进一步的优化 xff0c 使安装变得
  • VScode进行python开发出现 No module named “XXX“的解决方法

    VScode进行python开发出现 No module named 34 XXX 34 的解决方法 最近从pycharm转向vscode的时候 xff0c 遇到了如下问题 span class token keyword import s
  • CM3寄存器简介

    Cortex M3基础 寄存器组 通用目的寄存器组R0 R7 也被称为低组寄存器 xff0c 所有指令都能访问字长32位 通用目的寄存器组R8 R12 高组寄存器 32位寄存器 复位后的初始值不可预料 堆栈指针R13 CM3中共有两个堆栈指
  • 基于亚博K210开发板的学习之旅(一)

    本文参考亚博智能官方K210开源课程 五月份购买了亚博的K210开发板 xff0c 但由于课程压力就搁置了 xff0c 最近暑假得空又恰逢电赛清单里有这个 芯片 xff0c 就抽空学习一下 xff0c 特写下这些 xff0c 以作记录 按照
  • STM32标准库通用软件模拟IIC

    STM32标准库通用软件模拟IIC 继上次通用可移植的矩阵键盘之后 xff0c 便继续寻找着下一个能够拿来只需改改引脚就可以使用的通用方案 恰好最近在研究PCA9685 xff0c 这是一片能够产生最多十六路PWM信号的芯片 xff0c 通
  • STM32F103控制PCA9685产生16路PWM波控制SG90舵机

    STM32控制PCA9685产生16路PWM波控制SG90舵机 如果你能点开这篇文章 xff0c 说明你已经知道PCA9685是多么强大 xff0c NXP公司原本做这片芯片是为了提供给LED使用 xff0c 在其官方文档里也能看到所有PW
  • 从源代码来看HAL库函数(一) HAL基础函数

    从源代码来看HAL库函数 xff08 一 xff09 HAL基础函数 全局变量 IO uint32 t uwtick 这个变量充当了一个运行时长计数的作用 xff0c 每发生一次SysTick中断就会加一 xff0c 直至溢出 xff0c
  • 使用TCP+串口与板子进行网络通信

    最近做了一个嵌入式的project xff0c 大概要求就是做一个client端 xff0c 一个sensor端 xff0c 两者通过TCP UDP进行通信 xff0c 然后在client端输入不同的命令sensor需做出不同的处理 xff
  • 毕业论文格式(图片题注引用,表格,公式格式)

    本科毕业论文差不多写完了 xff0c 记录一下一些格式 xff0c 以后写作可能会用到 xff0c 就可以翻起来看看 首先 xff0c 如果可以找到一篇格式符合要求的word文档的话 xff0c 最简单的方法就是在这个文档的基础上进行内容的
  • 图像处理——相位恢复(GS,TIE,改进型角谱迭代法)(已更新代码)

    利用GS xff0c TIE xff0c 改进型角谱迭代算法进行相位恢复 角谱传播理论 角谱传播理论可以翻阅傅里叶光学的书 xff0c 就能找到定量分析的计算公式 xff0c 可以分析某个平面的角谱垂直传播到另外一个平面的角谱 xff0c
  • 串口应用:遵循uart协议,发送多个字节的数据(状态机)

    上一节中 xff0c 我们遵循uart协议 xff0c 它发送一次只能发送6 7 8位数据 xff0c 我们不能随意更改位数 xff08 虽然在代码上可行 xff09 xff0c 不然就不遵循uart协议了 xff0c 会造成接收端无法接收
  • 数码管动态显示Verilog实现(参考小梅哥教程)(视觉暂留)

    一个数码管有八个引脚 xff0c 控制八段二极管的亮灭 xff0c 用以显示需要的数字 当有N个数码管时 xff0c 一个一个控制的话需要N x 8 个引脚 xff0c 消耗资源较多 因此可以利用动态显示的方案通过人眼的视觉暂留特性达到静态
  • 彻底理解DDS(信号发生器)的fpga实现(verilog设计代码)

    DDS xff08 Direct Digital Synthesis xff09 是一种把一系列数字信号通过D A转换器转换成模拟信号的数字合成技术 它有查表法和计算法两种基本合成方法 在这里主要记录DDS查表法的fpga实现 查表法 xf
  • HDMI/DVI

    一 基础知识 1 历史 早期在FPGA芯片上实现HDMI控制显示是使用HDMI发送芯片 xff0c eg xff1a ADV7513 sil9022 xff0c CH7301等 用之前VGA控制中输出的RGB信号 行场同步信号和使能信号输入
  • HDMI/DVI____TMDS编码

    一 编码步骤 xff1a 基本方法 xff1a 取第一位数据为初值 xff0c 接下来输入的每一位与前一导出的位 xff08 根据判断条件 xff09 进行异或XOR或者同或XNOR xff08 最小化传输 xff0c 减少0 1翻转 xf