HDMI/DVI____TMDS编码

news/2024/4/30 5:00:14/文章来源:https://www.cnblogs.com/fbur/p/16726583.html

一.编码步骤:

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

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

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

二.编码流程:

 

 

 三.代码设计

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

①.先把输入的数据用寄存器打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)
begind_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)
beginnumd_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] ) ;
endwire 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)
beginc0_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)begincnt <= 0 ;d_out <= 0 ;end
else
begin if ( condition2 )beginif (condition3)begind_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)begincnt <= cnt + ( numd_m0 - numd_m1 ) ;endelsebegincnt <= cnt + ( numd_m1 - numd_m0 ) ;endendelsebeginif(condition5)begind_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 ) ;endelsebegind_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 ) ;endendendelsebegincnt <= 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 ;endcaseend
end
endmodule

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_13296.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04代码

import datetime #定义一个列表 mot=["今天星期一:\n坚持下去不是因为我很坚强,而是因为我别无选择。","今天星期二:\n含泪播种的人一定能笑着收获。","今天星期三:\n作对的事情比把事情做对更重要。","今天星期四:\n命运给予我们的不是失…

【NLP】自然语言处理的序列建模

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Teams Bot App 初探

上一篇文章深入讲了incoming webhook。这篇文章我们来看一个稍微复杂点的&#xff0c;正式点的 teams app&#xff1a;bot。 我们先来和之前一样&#xff0c;通过teams toolkit 的 sample gallery来创建一个 Teams bot app。 创建之后我们先来看一下目录结构和生成的文件。 一…

二叉树中求最大路径和

题目来自LeetCode中&#xff0c;链接为124. 二叉树中的最大路径和 一棵树的最大路径和可能存在于哪里&#xff1a; 单纯的存在于以左子树为根节点的子树中单纯的存在于以右子树为根节点的子树中根节点到达左子树B中某节点的路径根节点到达右子树C中某节点的路径左子树中某节…

Android日志分析02-am篇

Android日志分析02-am篇 在日常分析bug时&#xff0c;免不了和系统ActivityManagerService打交道&#xff0c;根据日志去查看各个Activity的生命周期&#xff0c;从而判断是否出现Activity生命周期异常。 先使用adb logcat和adb bugreport再pixel2的模拟器抓取一份从开机到打开…

代码随想录4——链表: 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07链表相交、142.环形链表II

文章目录1.24两两交换链表中的节点1.1.题目1.2.思路1.3.代码实现1.3.1.对next指针的理解1.3.2.编程中要备份哪些节点的指针&#xff1f;1.3.3.代码实现2.19删除链表的倒数第N个节点2.1.题目2.2.思路3.面试题02.07链表相交3.1.题目3.2.解答4.142.环形链表II4.1.题目4.2.思路1.24…

JavaEE——No.1 多线程案例

JavaEE传送门JavaEE JavaEE——No.1 线程安全问题 JavaEE——No.2 线程安全问题 目录多线程案例1. 单例模式饿汉模式懒汉模式2. 阻塞队列阻塞队列的使用阻塞队列的实现多线程案例 1. 单例模式 单例模式是一种常见的设计模式. 设计模式: 软件开发时, 会遇到一些常见的 “问…

存储系统基本概念

内容框图 存储器的层次化结构 由于cpu运行太快&#xff0c;所以中间需要主存&#xff0c;Cache&#xff0c;寄存器去传递。 主存–辅存&#xff08;硬件操作系统&#xff09;&#xff1a;实现虚拟存贮系统&#xff0c;解决了主存容量不够的问题。 Cache–主存&#xff08;硬件自…

测试用例设计专栏

哈喽大家好哎呀&#xff0c;今天给大家普及一下测试用例如何设计&#xff0c;看牛逼的大佬们是如何测试的。 测试用例笔试题 出题&#xff1a;在一个页面上有一个输入框&#xff0c;一个计数器(count)按钮&#xff0c;用于计算一个文本字符串中字母a出现的次数&#xff0c;请…

Linux 逻辑卷精简卷报错问题解决

一、 故障描述 现象1:oraclelog目录提示坏道信息,进行修复后执行删除文件操作,目录不可使用。 现象2:lsblk看到目录出现重复,并且有tmeta,tdata卷出现(图一) 现象3:message日志出现多目录报错,持续写入(图二) 图一 检查lv #lvs -a 看到多出的pmspare,tdata,tmeta…

VSCode 使用教程-9.Node运行js出现 Cannot use import statement outside a module的问题

前言 js中导入公共模块&#xff0c;使用import的方式导入&#xff0c;用node运行js文件会出现Cannot use import statement outside a module的问题 问题描述 目录结构 └─src└─js└─ext.js└─main.js └─index.html在ext.js 文件写一些公共方法 export const m (f…

vue3 ts vite 项目快速构建

1.安装nodejs(建议装14版本稳定) 下载 | Node.js 中文网 装完之后会有一个命令叫 npm 可以在终端输入npm -v 来检查是否安装成功2.构建vite项目官方文档开始 {#getting-started} | Vite中文网 vite 的优势冷服务 默认的构建目标浏览器是能 在 script 标签上支持原生 ESM 和…

Java操作HDFS

1. 创建maven项目 New Project 2. 添加依赖 <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client --><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.…

steam搬砖汇率差项目详解

很久没有分享赚钱项目了&#xff0c;今天这里给大家介绍一个游戏搬砖的项目&#xff1a;steam游戏汇率差赚钱项目。 项目原理&#xff1a; Steam平台是一个国外游戏及装备售卖平台。而我们所谓的Steam游戏装备搬砖就是利用steam平台和网易的BUFF平台来操作。steam汇率差赚钱原…

十大经典排序算法综述(Java代码实现,思想通用)

关于十大排序的文章也有不少了&#xff0c;但感觉大部分在各个排序算法的适用场景、如何实现外排等细节方面没怎么讲&#xff0c;故总结了这篇文章&#xff0c;欢迎浏览 一、前言 内部排序是指排序时将待排序数据全部加载到内存的算法。 外部排序是指在处理海量数据排序时&…

什么是C语言?

什么是C语言&#xff1f; 文章目录什么是C语言&#xff1f;1.C语言的起源2.C语言的使用领域3. 为什么要学习C语言4.C语言的学习境界5.如何学习C语言6.学习C语言的推荐书籍1.C语言的起源 C语言之父是丹尼斯里奇&#xff1a;丹尼斯里奇&#xff08;1941年9月9日-2011年10月12日&…

Linux 简单命令 - cron 计划任务 、NTP

Linux 简单命令 - cron NTP cronNTP 一、cron 计划任务就是按照系统的时间(时刻、周期)执行指定的任务 系统服务&#xff1a; crond。 配置文件&#xff1a; /etc/crontab /var/spool/cron/用户名 配置记录格式&#xff1a; 分 时 日 月 周 任务操作命令 (用绝对路径、必要时…

集成学习详解

入门小菜鸟&#xff0c;希望像做笔记记录自己学的东西&#xff0c;也希望能帮助到同样入门的人&#xff0c;更希望大佬们帮忙纠错啦~侵权立删。 目录 一、集成学习的产生原因与相关定义 1、产生原因 2、相关定义 &#xff08;1&#xff09;同质集成 &#xff08;2&#xf…

第三章 学校与班级管理

01 学校组织与管理 02 班级与班集体 03 班主任与班主任工作 04 班级活动与班队活动 05 课外活动 02 班级与班集体 一、班级与班集体 二、班级管理 三、班级突发事件的处理 一、班级与班集体 &#xff08;一&#xff09;班级 了解 年龄、知识程度相近&#xff0c;有共同的学…

python学习—第一步—Python小白逆袭大神(第二天)

python进阶python语法继续学习数据结构数字字符串列表元组字典面向对象继承JSON异常处理try except finallyLinux命令作业来啦&#xff01;问题python语法继续学习 数据结构 数字 Number类型用于存储数值。 1、数学运算math模块及常用函数 菜鸟教程 导入math 代码示例&#…