PYNQ(三)HDMI学习彩条
彩条实验之FPGA开发
- HDMI与DVI
- 时钟分频IP核Clock Wizard的使用
- hdmi_color_bar 模块
- dvi_encoder模块
- serdes_4b_10to1 模块
- simulink(尝试)
- 实验效果
- verilog语言学习
- 注意:
- 小结:
HDMI与DVI
HDMI 向下兼容 DVI,最主要差别在于: DVI(数字视频接口)只能用来传输视频,而不能同时传输音频。
DVI 和 HDMI 接口协议在物理层使用 TMDS(Transition Minimized Differential Signaling,最小化传输差分信号)标准传输音视频数据,TMDS 差分传输技术使用两个引脚(如下图“数据 2+”和“数据 2-”) 来传输一路信号,利用这两个引脚间的电压差的正负极性和大小来决定传输数据的数值(0 或 1)。
TMDS 传输系统分为、:发送端和接收端。
1:TMDS 发送端收到HDMI 接口传来的表示 RGB 信号的24 位并行数据(TMDS 对每个像素的 RGB 三原色分别按 8bit 编码,即 R信号有 8 位,G 信号有 8 位,B 信号有 8 位),然后对这些数据进行编码和并/串转换,再将表示 3 个 RGB 信号的数据分别分配到独立的传输通道发送出去。
2:接收端接收来自发送端的串行信号,对其进行解码和串/并转换,然后发送到显示器的控制端。与此同时也接收时钟信号,以实现同步。
其中,编码阶段: 编码器将视频源中的像素数据、 HDMI 的音频/附加数据, 以及行同步和场同步信号分别编码成10 位的字符流。 并串转换阶段:将上述的字符流转换成串行数据流, 并将其从三个差分输出通道发送出去。
参考:基于FPGA的HDMI高清显示接口驱动
时钟分频IP核Clock Wizard的使用
决定从一个已经实现的工程的各个模块来剖析
参考: FPGA之使用clk_wiz的IP核.
说明其中一步,如图:
时钟分频IP核的例化代码:
module top(input sys_clk,input rst_n,//hdmi output output tmds_clk_p,output tmds_clk_n,output[2:0] tmds_data_p, output[2:0] tmds_data_n);wire video_clk;
wire video_clk5x;clk_wiz_0 video_pll_m0(//Clock in ports.clk_in1(sys_clk),//Clock out ports.clk_out1(video_clk),.clk_out2(video_clk5x),// Status and control signals.reset(1'b0), //该行代码将reset引脚接地.locked());endmodule
注意,在top module内没有定义sys_clk引脚,所以该引脚需要PL引脚约束,下图为Schematic:
hdmi_color_bar 模块
1.行有效信号H_ACTIVE:表示行有效时间长(像素)horizontal active time (pixels);
2.行显示前沿H_FP :行显示前沿;
3.行消隐脉冲H_SYNC :各行之间的低电平时间; DVI 传输的消隐期都用来传输控制字符,HDMI的消隐期用来传输控制字符、音频和其他附加数据(比如字幕信息等)
4.行显示后沿H_BP :行显示前沿。
HDMI中的视频时序分析.
ssign hdmi_hs = hs;
assign hdmi_vs = vs;
assign hdmi_de = de; //51-56语句使两个module信号线相连
assign hdmi_r = video_r;
assign hdmi_g = video_g;
assign hdmi_b = video_b;
以上代码将下图圈起的信号线(两个module)相连:
dvi_encoder模块
DVI驱动由Encoder(编码器)和Serializer(并串转换器)组成,先对数据进行编码,再对编码后的数据进行并串转换,最后通过 OBUFDS(差分输出缓冲器),差分输出缓冲器用于将来自 FPGA 内部逻辑的信号转换成差分信号输出, 支持 TMDS 电平标准。
serdes_4b_10to1 模块
例化程序:
serdes_4b_10to1 serdes_4b_10to1_m0(.clk (pixelclk ),// clock input.clkx5 (pixelclk5x ),// 5x clock input.datain_0 (blue ),// input data for serialisation.datain_1 (green ),// input data for serialisation.datain_2 (red ),// input data for serialisation.datain_3 (10'b1111100000 ),// input data for serialisation.dataout_0_p (tmds_data_p[0] ),// out DDR data.dataout_0_n (tmds_data_n[0] ),// out DDR data.dataout_1_p (tmds_data_p[1] ),// out DDR data.dataout_1_n (tmds_data_n[1] ),// out DDR data.dataout_2_p (tmds_data_p[2] ),// out DDR data.dataout_2_n (tmds_data_n[2] ),// out DDR data.dataout_3_p (tmds_clk_p ),// out DDR data.dataout_3_n (tmds_clk_n ) // out DDR data) ;
其中,datain_3端口传输的是HDMI的音频和其他附加数据(比如字幕信息等),实验只是传输视频(DVI驱动)。
dvi_encoder例化程序:
dvi_encoder dvi_encoder_m0(.pixelclk (video_clk ),// system clock.pixelclk5x (video_clk5x ),// system clock x5.rstin (~rst_n ),// reset.blue_din (hdmi_b ),// Blue data in.green_din (hdmi_g ),// Green data in.red_din (hdmi_r ),// Red data in.hsync (hdmi_hs ),// hsync data.vsync (hdmi_vs ),// vsync data.de (hdmi_de ),// data enable.tmds_clk_p (tmds_clk_p ),.tmds_clk_n (tmds_clk_n ),.tmds_data_p (tmds_data_p ),//rgb.tmds_data_n (tmds_data_n ) //rgb);
该程序中第5行是对复位信号的例化,将“ ~rst_n ”改为“ rst ",则复位信号由低电平有效,改为高电平有效。
simulink(尝试)
`timescale 1ns / 1psmodule top_sim();reg sys_clk;
reg sys_rst;//输出信号
wire tmds_clk_p;
wire tmds_clk_n;
wire[2:0] tmds_data_p;
wire[2:0] tmds_data_n; always #10 sys_clk = ~sys_clk; //时钟信号10ns翻转一次initial beginsys_clk = 1'b0;sys_rst = 1'b1;#200sys_rst = 1'b0;
endtop u_top(.sys_clk (sys_clk),.rst (sys_rst),.tmds_clk_p (tmds_clk_p),.tmds_clk_n (tmds_clk_n),.tmds_data_p (tmds_data_p),.tmds_data_n (tmds_data_p)
);endmodule
输出不正常
close simulink
实验效果
只需要通过 HDMI 接口显示图像,因此将其当成 DVI 接口进行驱动。
verilog语言学习
阻塞赋值(“=”);非阻塞赋值(“<=”)。注意在“表达式”中,"<=“作为bai逻辑比较运算符;在“语句”中,”<="作为非阻塞赋值的一部分,如下:
// 括号中是表达式,其余为赋值
if (a <= 1)b <= 1;
elseb <= 2;
din[0]+din[1]+din[2]+din[3]+din[4]+din[5]+din[6]+din[7]所得二进制数换成十进制即为数据din[7:0]中1的个数
`timescale 1 ps / 1psalways @ (posedge clkin) beginn1d <=#1 din[0]+din[1]+din[2]+din[3]+din[4]+din[5]+din[6]+din[7];//延时1ns后,将右边相加结果赋值给n1ddin_q <=#1 din;end
注意:
点击界面Flow Navigator的Open Hardware Manager,连接开发板,Program Device下载程序
有时序警告:
解决:将dvi_encoder例化程序中的信号“ .rstin (~rst_n ) ” 改为 “ .rstin (~rst_n ) ” ,即把复位信号高电平有效改为复位信号低电平有效。
小结:
做一个实验,看工程,要从每个module逐个理解,不然只会事倍功半!
项目工程: hdmi_colorbar_pynq.
PYNQ(三)HDMI学习彩条相关推荐
- 二元学习法3.0:三把学习大剑,打通学习的底层密码_学习方法
单纯靠机会赚钱的时代已经过去,未来是认知赚钱的时代. 前两天还跟朋友聊到这个话题,未来的机会将会不断涌现,人工智能.5G.万物互联.虚拟现实-- 而这些东西,都跟知识挂钩.以前那种胆大就能挣钱,站在风 ...
- 深度学习未来发展的三种学习范式:混合学习,成分学习和简化学习
深度学习是一个很大的领域,其核心是一个神经网络的算法,神经网络的尺寸由数百万甚至数十亿个不断改变的参数决定.似乎每隔几天就有大量的新方法提出. 然而,一般来说,现在的深度学习算法可以分为三个基础的学习 ...
- 学号 20172326 《程序设计与数据结构》第三周学习总结
学号 20172326 <程序设计与数据结构>第三周学习总结 教材学习内容总结 队列是先进先出的数据结构(FIFO)与栈不同,队列的两端可分别进行操作 first与front相同,返回首段 ...
- 20165206 2017-2018-2 《Java程序设计》第三周学习总结
20165206 2017-2018-2 <Java程序设计>第三周学习总结 教材学习内容总结 类:class是关键字,用来定义类. 类声明:例如class People. 对象的声明:类 ...
- 20155117 王震宇 2006-2007-2 《Java程序设计》第三周学习总结
20155117 王震宇 2006-2007-2 <Java程序设计>第三周学习总结 教材学习内容总结 在JAVA程序编写中,常常要用到对象(Object),要产生对象首先要定义类(Cla ...
- 2017-2018-1 20155338 《信息安全系统设计基础》 第三周学习总结
2017-2018-1 20155338 <信息安全系统设计基础>第三周学习总结 教材学习内容总结 一.三种重要的数字表示 (1)无符号数.有符号数.浮点数 无符号编码是基于传统的二进制表 ...
- 【杂谈】从学员到参与书籍写作,我在有三AI学习与成长的故事
初识有三 认识言有三大人物,是在苏州的某分享会上,在深圳这头的我通过直播窗口第一次知道"言有三"及有三AI公众号,加了有三的微信,当时忙于写毕业论文,并没有主动接触这位大佬,但是在 ...
- 【杂谈】从学员到专栏作者、讲师,我在有三AI学习与名利双收的故事
有志者,事竟成,百二秦关终属楚: 苦心人,天不负,三千越甲可吞吴. 初识有三 2019年1月3日,我完成了自己学生阶段的最后一门考试.已经研究生入学半年的自己,在实验室师兄的指导下,在各类知识号的轰炸 ...
- 20162316刘诚昊 《程序设计与数据结构》 第三周学习总结
20162316刘诚昊 2017-2018-2 <Java程序设计>第三周学习总结 教材学习内容总结 1. 查找是在一组数据中找到指定的目标元素或判定组内不存在目标的过程,常用方法为线性查 ...
最新文章
- 360数科张家兴:如何突破三大瓶颈,破解金融科技发展难题?
- 史上最强iPhone越狱工具诞生,而且是开源!
- 《jQuery UI 开发指南》——1.3 什么是CSS主题
- 两个姐姐嫁人了~~~~~~~~~~`
- android+rom+bootloader+flash,Android ROM开发(4) bootloader 三种启动模式
- ASP.NET.CORE发布后启动网站出现500.19-0x8007000d错误解决方法
- Linux管理文件和目录
- 用命令导入导出MS SQL数据
- 面向对象之反射和其他内置方法
- BZOJ4001[TJOI2015]概率论(数学、期望、生成函数、卡特兰数)
- matlab slope函数,Matlab常用函数汇总
- 如何更优雅地使用微博
- java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager acti
- CorelDRAW2022中文正式版特色功能介绍
- 又涨了?2021年4月程序员工资新鲜出炉!
- ppt在线转换成pdf
- Unity3D教程:播放视频的两种方式
- awk 处理反算日志流量
- 【王道】今晚7:30 浙江大学专场,学长学姐帮你指引ZJUCS/SE考研!
- arm linux驱动 知乎_学习linux驱动开发的方法?
热门文章
- 索引 ---- 最左前缀的解释
- 解决Oracle的CLOB数据类型大于4000时的数据太大的问题ORA-01704: string literal too long
- 用postman快速学习ElasticSearch的搜索功能
- 【Android双屏异显】如何真正的实现Android双屏异显
- pycharm使用debug的时候遇到断点不停的问题
- 学习数码相框1.1.0.0数码相框之系统框架
- Immersion 签署通过 IC 合作伙伴 Dongwoon Anatech 提供触感技术的协议
- 中英文说明书丨艾美捷卡那霉素ELISA试剂盒方案
- vuex到底是什么?什么情况下使用?
- django安装指定版本