从实验室借了块ZC706,好久没玩FPGA了,跟着官方例程,做了个IBERT,居然没LINK,时钟也没LOCK,百思不得其解。
- 由于ZC706的GTX没有板载时钟(从SI5324配置那个另说),我的时钟是从PCIE金手指那里输入的,用示波器看过,100MHz波形妥妥的。
- 用万用表测了下GTX的三路电压,一测正常真吓我一跳,1.0V和1.2V均正常,唯独MGTVCCAUX居然是1.5V,看了下原理图,确实是按1.8V设计的,况且在下也见过几十块7系列的FPGA板子,而且手册上也是白纸黑字写的MGTVCCAUX=1.8V,无奈之下,找了另一块ZC706,测了下MGTVCCAUX也是1.5V,而且该板子号称GTX是没问题的,好吧,我服了
- 按原理图把ZC706的电阻换一下,先将MGTVCCAUX调成1.8V再说,电压调成1.8V,再用IBERT,还是不通,并且,我将金手指输入的100MHz时钟,通过IBUFDS_GTE2引进来,再输出到USER_SMA_CLOCK_P/N,上示波器,没输出
- 准备放弃了,使出最后一招,把156.25MHz的USERCLK_P/N输出到USER_SMA_CLOCK_P/N,然后,在外部用两根差不多等长的线,把USER_SMA_CLOCK_P/N和SMA_MGT_REFCLK_P/N连接起来,然后IBERT终于迎来了久违的LOCK和LINK。
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 13:58:09 02/02/2012
// Design Name:
// Module Name: gtxe2_top
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module gtxe2_top(
input user_clock_p,
input user_clock_n,
output user_sma_clk_o_p,
output user_sma_clk_o_n
);
wire clk_out;
wire clock_bufg;
reg q;
IBUFDS IBUFDS_inst_user_clock(
.O(clock_out), // Buffer output
.I(user_clock_p), // Diff_p buffer input (connect directly to top-level port)
.IB(user_clock_n) // Diff_n buffer input (connect directly to top-level port)
);
BUFG BUFG_inst_user_clock (
.O(clock_bufg), // 1-bit output: Clock output
.I(clock_out)
);
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_out_clock_inst_user_clock (
.Q(clock_out_ddr), // 1-bit DDR output
.C(clock_bufg), // 1-bit clock input
.CE(1'b1), // 1-bit clock enable input
.D1(1'b1), // 1-bit data input (positive edge)
.D2(1'b0), // 1-bit data input (negative edge)
.R(), // 1-bit reset
.S() // 1-bit set
);
OBUFDS OBUFDS_inst_user_clock (
.O (user_sma_clk_o_p), // Diff_p output (connect directly to top-level port)
.OB(user_sma_clk_o_n), // Diff_n output (connect directly to top-level port)
.I (clock_out_ddr) // Buffer input
);
endmodule