PYNQ(三)HDMI学习&彩条

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 / 1ps

module 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 begin
    sys_clk = 1'b0;
    sys_rst = 1'b1;
    #200
    sys_rst = 1'b0;
end

top 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;
else
    b <= 2;

din[0]+din[1]+din[2]+din[3]+din[4]+din[5]+din[6]+din[7]所得二进制数换成十进制即为数据din[7:0]中1的个数

`timescale 1 ps / 1ps
  always @ (posedge clkin) begin
    n1d <=#1 din[0]+din[1]+din[2]+din[3]+din[4]+din[5]+din[6]+din[7];
     //延时1ns后,将右边相加结果赋值给n1d
    din_q <=#1 din;
  end

注意:

点击界面Flow Navigator的Open Hardware Manager,连接开发板,Program Device下载程序

有时序警告:
在这里插入图片描述
解决:将dvi_encoder例化程序中的信号“ .rstin (~rst_n ) ” 改为 “ .rstin (~rst_n ) ” ,即把复位信号高电平有效改为复位信号低电平有效

小结:

做一个实验,看工程,要从每个module逐个理解,不然只会事倍功半!

项目工程: hdmi_colorbar_pynq.

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值