fpga 驱动hdmi
1、原理:
2、码源(感觉有点水 copy过来的 感觉自己像个裁缝不会自己写代码)
首先我是调用了hdmi的驱动ip核在github下载
hdmi_display
更多的ip核可以在ip核下载
本人实现完全参考该博客:hdmi_fpga
3、补充一部分:如何添加下载的ip核到工程:
就完成了添加下载的IP 接着就是例化(可以进入IP source 进行查看.veo文件)
效果:
4、补充一下
- 关于原语:在看正点原子驱动正点原子有个oddr困扰了许久 因为他的平台有直接的ip vivado没有 我想着自己写时序 写出来了 但是不能保证稳定 后面找资料 了解到原语实现
对于原语我的理解:类似底层实现 属于verilog的汇编
下面是oddr的原语实现:
ODDR #(
.DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
.INIT(1'b0), // Initial value of Q: 1'b0 or 1'b1
.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
) ODDR_clk (
.Q(Q), // 1-bit DDR output
.C(C), // 1-bit clock input
.CE(CE), // 1-bit clock enable input
.D1(D1), // 1-bit data input (positive edge)
.D2(D2), // 1-bit data input (negative edge)
.R(R), // 1-bit reset
.S(S) // 1-bit set
);
然后就是一个博主自己码的hdmi驱动 hdmi驱动_不用ip
原本参考的 上述正点原子的文章 但是他在quartus II实现的 但是移植到vivado会有很多错误 其中一个就是oddr 另一个就是oddr实现后 差分信号是用的module实现生成的 但是vivado并不知道这是一个差分信号 所以还要用另一个原语实现差分信号的生成:
//转换差分信号
OBUFDS #(
.IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS
) TMDS0 (
.I (tmds_data_serial[0]),//输入信号
.O (tmds_data_p[0]),//输出两个差分信号
.OB (tmds_data_n[0])
);
但是这个问题我一直没想打困扰了7个多小时
2. 还有就是约束文件时钟生成:
set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { sys_clk }];
create_clock -add -name sys_clk_pin -period 20.00 -waveform {0 10} [get_ports { sys_clk }];
//20ns时钟周期 0-10ns高电平(占空比为50%)
//这些是好像因为电平不确定 可能会损害硬件 加上这个就可以生成bitstream
set_property SEVERITY {Warning} [get_drc_checks NSTD-1]
set_property SEVERITY {Warning} [get_drc_checks RTSTAT-1]
set_property SEVERITY {Warning} [get_drc_checks UCIO-1]
- 我觉得还是要自己写代码 得找网站进行训练 然后多看多练 下面这个老哥说的就很不错: