HDMI字符显示实验
FPGA教程学习
第十五章 HDMI字符显示实验
文章目录
- FPGA教程学习
- 前言
- 实验原理
- 程序设计
- 像素点坐标模块
- 字符叠加模块
- 实验结果
- 知识点
- 总结
前言
在HDMI输出彩条的基础上输出osd叠加信息。
实验原理
实验通过字符转换工具将字符转换为 16 进制 coe 文件存放到单端口的 ROM IP 核中,再从
ROM 中把转换后的数据读取出来显示到 HDMI 上。
大致过程是将视频时序再经过一次处理模块,替换其中特定位置的数据,除了数据其余均不发生变化。
程序设计
与之前的彩条显示多了一个osd叠加模块。
像素点坐标模块
该模块输入信号和输出信号一致,主要是为了计数像素的坐标。
module timing_gen_xy(input rst_n, input clk,input i_hs, input i_vs, input i_de, input[23:0] i_data, output o_hs, output o_vs, output o_de, output[23:0] o_data, output[11:0] x, // video position Xoutput[11:0] y // video position y
);
计数的原理:
场信号在前肩到同步时是上升沿,表示是一副图像的开始,可以根据场信号的上升沿(或者下降沿,一个就行)来将行计数清零,即第零行。行递增计数的话使用DE信号的下降沿进行计数,当DE变为无效时,说明已经输出了一行像素点。
而行信号表示是一行的开始,这里没有用到,直接使用了DE信号,DE信号表示像素点有效,即有效像素点的开始,跳过行前肩+行同步+行后肩,用来计数一行的像素点。
注意数据也需要进行两次延时。
字符叠加模块
由上面的模块已经获取到了当前的坐标,接下来只要知道字符起始位置和需要叠加的字符,将输出的数据进行替换即可。如果当前坐标(像素点)需要叠加,就设置为需要的颜色,否则保持不变即可。
确定区域位置,使用一个寄存器表示,坐标在叠加区域的话就设置为有效。
//OSD区域设置,起始坐标为(9,9),区域大小根据生成的字符长宽设置
always@(posedge pclk)
beginif(pos_y >= 12'd9 && pos_y <= 12'd9 + OSD_HEGIHT - 12'd1 && pos_x >= 12'd9 && pos_x <= 12'd9 + OSD_WIDTH - 12'd1)region_active <= 1'b1;elseregion_active <= 1'b0;
end
rom读取,在叠加区域内开始计数,实际计数的是像素点,但是一次读取数据为8bit,所以将低三位去掉即可。
//产生ROM的读地址,在region_active有效时,地址加1
always@(posedge pclk)
beginif(pos_vs_d1 == 1'b1 && pos_vs_d0 == 1'b0)osd_ram_addr <= 16'd0;else if(region_active == 1'b1)osd_ram_addr <= osd_ram_addr + 16'd1;
endosd_rom osd_rom_m0 (.clka (pclk ), .ena (1'b1 ), .addra (osd_ram_addr[15:3] ), //生成的字符一个点为1bit,由于数据宽度为8bit,因此8个周期检查一次数据.douta (q )
);
有了字符叠加区域和字符值,可以进行数据替换,注意这里是依次将8位数据替换,osd_x是像素的横坐标,取低三位作为像素点的计数下标即可。
always@(posedge pclk)
beginif(region_active_d0 == 1'b1)if(q[osd_x[2:0]] == 1'b1) //检查bit位是否是1,如果是1,将此像素设为红色v_data <= 24'hff0000;elsev_data <= pos_data; //否则保持原来的值elsev_data <= pos_data;
end
实验结果
直接跑的demo,这里截个官方的图放在这里。
知识点
- rom的创建和初始数据(coe文件设置)的设置。
- rom的读时序。
- 视频时序。
- 边沿检测。
当前一状态和当前状态不同的时候,可认为采样到了边沿信号。
当前一状态为高电平,当前状态为低电平时,说明是下降沿。
当前一状态为低电平,当前状态为高电平时,说明是下降沿。
i_vs,vs_d0 ,vs_d1三个信号去分析的话,要把整个过程理解成并行的,vs_d0 、vs_d1是两个记录状态的寄存器,理解成串行vs->d0->d1是错的。d0是vs的上一个状态,d1是d0上一个状态的记录,或者说,d0是vs延时一个周期的信号,d1是d0延时一个周期的信号。d0可以看作最新的状态,d1是上一个状态,d0&~d1是上升沿。同理可以分析DE的边沿。
assign vs_edge = vs_d0 & ~vs_d1; //VS posedge
assign de_falling = ~de_d0 & de_d1; //DE negedge
always@(posedge clk)
beginde_d0 <= i_de;de_d1 <= de_d0;vs_d0 <= i_vs;vs_d1 <= vs_d0;hs_d0 <= i_hs;hs_d1 <= hs_d0;
end
总结
本实验在HDMI显示彩条的基础上,通过对视频时序的处理以及像素数据的替换,将rom中的字模叠加到画面中,实现了OSD信息的叠加。
相关文章:

HDMI字符显示实验
FPGA教程学习 第十五章 HDMI字符显示实验 文章目录 FPGA教程学习前言实验原理程序设计像素点坐标模块字符叠加模块 实验结果知识点总结 前言 在HDMI输出彩条的基础上输出osd叠加信息。 实验原理 实验通过字符转换工具将字符转换为 16 进制 coe 文件存放到单端口的 ROM IP 核…...

Spring Cloud 框架搭建
Spring Cloud 框架搭建之一基础框架 创建父项目创建子项目 创建父项目 第一步:新建项目,填写基础信息 第二步:这里不需要其他组件直接点next即可。 第三步:pom文件添加下述代码,将父项目设置为pom文件形式打包&#…...
20个非常有用的单行Python代码片段
1. 写在前面 继上篇,继续在本文分享 20 个 Python 单行代码,可以在 30 秒或更短时间内轻松学会。这些单行代码不仅可以提高效率,同时使代码看起来更整洁、更易读。:) 个人博客: https://jianpengzhang.git…...
【LangChain系列 9】Prompt模版——MessagePromptTemplate
原文地址:【LangChain系列 9】Prompt模版——MessagePromptTemplate 本文速读: MessagePromptTemplate MessagesPlaceholder 在对话模型(chat model) 中, prompt主要是封装在Message中,LangChain提供了一些MessagePromptTemplat…...
ROS2的学习路径
学习ROS2的建议学习路径: 理解基础知识: 熟悉机器人操作系统(ROS)的概念及其架构。了解ROS2相对于ROS1的优势以及其提供的关键功能。 安装和配置: 在你选择的操作系统上安装ROS2(如Ubuntu、Windows、macOS…...
Maintaining leader role through timed lease mechanism
Continuous understanding of distributed systems design On the one hand 基于定时的租约机制来保持leader角色 基于定时的租约机制来保持leader角色的设计思想是一种在分布式系统中确保高可用性和系统一致性的解决方法。 在分布式系统中,通常会有一个角色被选举…...

Mysql InnoDB引擎 的hash索引
Mysql InnoDB引擎不支持hash索引,但是在内存结构中有一个自适应hash索引,来提高查询性能 当设置hash索引时会自动转换成btree索引 查一下mysql官方文档:https://dev.mysql.com/doc/refman/5.7/en/create-index.html innodb_adaptive_hash_i…...

23年PMP考试如何备考?
接下来我要分享的备考建议分为三个部分,考试相关、备考期间注意和刷题建议。 1、PMP考试相关 PMP考试时间一定不能忘记,要密切关注,或许会出现延期的情况。考试教材现在是第七版教材,建议买一本或者用pdf电子版打印出来…...
mysql数据库增量备份方案、备份计划(InsCode AI 创作助手)
一、备份计划 以下是MySQL数据库增量备份的一般计划: 创建完整备份:在自动备份计划开始前,先创建一次完整备份。这个备份将包含所有数据和表结构。保存增量备份:在每次备份计划完成后,保存增量备份。这个备份将包含从…...

【Flink】FlinkCDC获取mysql数据时间类型差8小时时区解决方案
1、背景: 在我们使用FlinkCDC采集mysql数据的时候,日期类型是我们很常见的类型,但是FlinkCDC读取出来会和数据库的日期时间不一致,情况如下 FlinkCDC获取的数据中create_time字段1694597238000转换为时间戳2023-09-13 17:27:18 而数据库中原始数据如下,并没有到下午5点…...
Javas | DecimalFormat类、BigDecimal类、Random类
目录: 1.DecimalFormat类2.BigDecimal类3.Random类4.需求:编写程序,生成5个不重复的随机数 1.DecimalFormat类 DecimalFormat 是 NumberFormat 的一个具体子类,用于格式十进制数字。 /*** 关于数字的格式化*/ public class Decima…...
机器学习 实战系列 总目录
1、机器学习实战-系列教程1:线性回归入门教程(项目实战、原理解读、源码解读) 机器学习实战-系列教程1:线性回归入门教程(项目实战、原理解读、源码解读) 2、机器学习实战-系列教程2:手撕线性回…...

机器学习——贝叶斯(三种分布)/鸢尾花分类分界图/文本分类应用
0、前言: 机器学习中的贝叶斯的理论基础是数学当中的贝叶斯公式。这篇博客强调使用方法,至于理论未作深究。机器学习中三种类型的贝叶斯公式:高斯分布(多分类)、多项式分布(文本分类)、伯努利分…...

SOLIDWORKS Composer位置关键帧的使用
SOLIDWORKS Composer是专业的SOLIDWORKS及3D文件处理的动画制作软件,作为SOLIDWORKS 产品线下的一个明星存在。 SOLIDWORKS Composer几乎可以处理任何SOLIDWORKS的模型文件并将之转化成可以动作的机械动画,可以引用在企业的网站、产品说明书以及工作指导…...
PostgreSQL 流复制搭建与维护
文章目录 前言1. 配置环境1.1 环境介绍1.2 主库白名单1.3 主库参数配置 2. 流复制搭建2.1 备份恢复2.2 创建复制用户2.3 参数修改2.4 启动并检查2.5 同步流复制2.6 同步复制级别 3. 流复制监控3.1 角色判断3.2 主库查看流复制3.3 延迟监控3.4 备库查询复制信息 前言 PostgreSQ…...
【Redis】关于过期数据清除的一些策略
这里要讨论的为过期的数据是如何被清除的,也就是网上常常讨论的过期清除策略。 需要注意的是,redis除了会对过期的数据进行淘汰,也可以通过对内存大小进行限制,并对超出内存限制后进行数据淘汰。此时淘汰的数据未必是过期的&…...
动态SQL
Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。 1、if if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签…...

uniapp:OCR识别身份证上传原图失败,问题解决
1、上传普通图片成功 2、上传>4M | >5M图片失败检查:1、uni.uploadFile自身没有文件大小限制。然而,这仍然取决于你的应用程序所在的平台和存储空间容量。 2、上传照片后不在fail,在sucess 提交照片-3 {"data": "<h…...
shell循环和函数
目录 1.for循环2.while循环3.until循环4.函数 1.for循环 for循环是固定循环,也就是在循环时就已经知道需要进行几次的循环,有事也把for循环成为计数循环。for的语法如下两种: 语法一 for 变量 in 值1 值2 值3 …(可以是一个文件等)do程序do…...
京东详情api
简要描述 根据商品id获取详情数据 请求URL http://xxx.xxx.xxx.xxx:xxxx/jd.get.item 请求方式 get 请求Query参数 参数名示例值必选类型说明itemid100016034386是string商品idtokenadmin.api是string权限token 成功返回示例 部分数据展示: {"data&qu…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...