彩条实验之FPGA开发
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 位的字符流。 并串转换阶段:将上述的字符流转换成串行数据流, 并将其从三个差分输出通道发送出去。
时钟分频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.