Zynq |
您所在的位置:网站首页 › zynq引脚图 › Zynq |
目录 1、Schematic 2、TMDS IP 3、Clock Generator 4、Timing Generator 5、Data Generator 6、HDMI top design 7、Top design 8、XDC design
有了 《HDMI 1.4 协议浅析》的加持,那么使用 ZYNQ 搞一个 HDMI 输出来玩玩; 工程已上传 gitee: https://gitee.com/stephenzhou-tech/Zynq7020_PL 1、Schematic首先,在硬件上,HDMI Connector 信号直接从 PL 端引出来,根据 HDMI 1.4 的协议呢,传输需要以 TMDS 差分信号进行传输 所以呢,在物理上,我们需要关注的管脚有: HDMI DATA[2:0] 的 TMDS 差分信号对; HDMI CLK 的 TMDS 差分信号对;
2、TMDS IP 这里,集成了 TMDS 信号生成的 IP,他是由 Digilent 设计的,针对 Zynq-7000 可快速集成的到 Vivado 环境的 IP:RGB-to-DVI: https://github.com/Digilent/vivado-library 上面的 github 链接中,有他的最新发布的 IP;这里,我们选择的是 rgb2dvi 的 IP,因为 HDMI 的输出和 DVI 一样,都是 TMDS 差分信号和时钟; 下载到他的 IP 后,里面有个针对 RGB2DVI 的 Doc 文档,里面有对这个 IP 的描述: 再 Vivado 中,IP Catalog 中新增 rgb2dvi 的 IP,并进行配置: 我们可以看到,他的输入有 : vid_pData[23:0]:RGB888 数据的串行表达; vid_pHSync:HSync 同步信号; vid_pVSync:VSync 同步信号; vid_pVDE:Video 有效信号; aRst_n:异步复位信号; PixelClk:像素时钟信号; SerialClk:5x像素时钟信号; 输出包含: TMDS_Clk_p:差分时钟 p 端; TMDS_Clk_n:差分时钟 n 端; TMDS_Data_p[2:0]:3路差分数据 p 端; TMDS_Data_n[2:0]:3路差分数据 n 端; oen:输出有效端; 现在知道这个 IP 的输入输出信号,那么接下来就是例化并使用这个 IP 输出差分信号; 所以,这里我们需要根据具体情况造就这个 IP 的输入信号; 3、Clock Generator 首先是造就时钟信号,这里有两个时钟信号:PixelClk 和 SerialClk;其中后者是前者的 5 倍关系(IP指定的);那么这个 PixelClk 是怎么确定的呢?每一种不同的视频格式输出,都有不同的像素时钟,我们以 720p 为例(1280x720p@60Hz); 首先查阅官方的手册:CEA861D(自行下载); 首先可以看到的是,720p 的视频: 每一行:一共 1650 个像素,有效像素 1280 个,370 个 blank 像素; 每一列:一共 750 个像素,有效像素 720 个,30 个 blank 像素; 像素时钟为 74.250MHz,他的计算由来为:1650x750x60Hz; 什么叫 blank 像素呢?就是无效像素,因为每一帧图像中,行和列都存在消隐,如下所示: 根据 rgb2dvi IP 的要求,我们需要提供两路时钟。我们使用 MMCM/PLL 来倍频得到: 板载时钟 50MHz: 倍频出来两路时钟,74.250MHz 和 5x74.250MHz=371.25MHz: 自此,时钟生成完成; 4、Timing Generator 上面完成了时钟生成,下面来做时序的生成,需要造就一组 vid_pHSync 和 vid_pVSync,以及 vid_pVDE Video数据有效信号; 而这些信号又和具体的视频的格式相关,这里依然查阅 CEA861D 手册; 每一行:一共 1650 个像素,有效像素 1280 个,HSYNC前有110个像素时钟,HSYNC高有效(有的是低有效)并且维持 40 像素时钟,接着有 220 个像素时钟; 每一列:一共 750 个像素,有效像素 720 个,VSYNC前有 5 个像素时钟,VSYNC高有效(有的是低有效)并且维持 5 像素时钟,接着 20 个像素时钟; 由此,我们定义了一个 hdmi_timing_gen 模块,来描述他的时序: `timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2021/01/20 21:04:26 // Design Name: // Module Name: hdmi_timing_gen // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // `include "video_format.v" module hdmi_timing_gen( clk, rst_n, vsync, hsync, video_valid ); // video timing parameter definition // 1280x720 74.250MHz `ifdef VIDEO_1280_720 parameter H_ACTIVE = 16'd1280; //horizontal active time (pixels) parameter H_FP = 16'd110; //horizontal front porch (pixels) parameter H_SYNC = 16'd40; //horizontal sync time(pixels) parameter H_BP = 16'd220; //horizontal back porch (pixels) parameter V_ACTIVE = 16'd720; //vertical active Time (lines) parameter V_FP = 16'd5; //vertical front porch (lines) parameter V_SYNC = 16'd5; //vertical sync time (lines) parameter V_BP = 16'd20; //vertical back porch (lines) parameter HS_POL = 1'b1; //horizontal sync polarity, 1 : POSITIVE,0 : NEGATIVE; parameter VS_POL = 1'b1; //vertical sync polarity, 1 : POSITIVE,0 : NEGATIVE; `endif // 1920x1080 148.5Mhz `ifdef VIDEO_1920_1080 parameter H_ACTIVE = 16'd1920; parameter H_FP = 16'd88; parameter H_SYNC = 16'd44; parameter H_BP = 16'd148; parameter V_ACTIVE = 16'd1080; parameter V_FP = 16'd4; parameter V_SYNC = 16'd5; parameter V_BP = 16'd36; parameter HS_POL = 1'b1; parameter VS_POL = 1'b1; `endif parameter H_TOTAL = H_ACTIVE + H_FP + H_SYNC + H_BP; //horizontal total time (pixels) parameter V_TOTAL = V_ACTIVE + V_FP + V_SYNC + V_BP; //vertical total time (lines) input clk ; input rst_n ; output vsync ; output hsync ; output video_valid ; wire clk ; wire rst_n ; wire vsync ; wire hsync ; wire video_valid ; // Internal registers define reg [11:0] h_total_cnt ; reg [11:0] v_total_cnt ; reg hs_reg ; reg hs_reg_d0 ; reg vs_reg ; reg vs_reg_d0 ; reg h_valid ; reg v_valid ; wire video_vaild_reg ; reg video_vaild_reg_d0 ; // Generate the horizontal total counter always @(posedge clk or negedge rst_n) begin if(~rst_n) begin h_total_cnt |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |