ZC706 GTX折腾记

从实验室借了块ZC706,好久没玩FPGA了,跟着官方例程,做了个IBERT,居然没LINK,时钟也没LOCK,百思不得其解。

  1. 由于ZC706的GTX没有板载时钟(从SI5324配置那个另说),我的时钟是从PCIE金手指那里输入的,用示波器看过,100MHz波形妥妥的。
  2. 用万用表测了下GTX的三路电压,一测正常真吓我一跳,1.0V和1.2V均正常,唯独MGTVCCAUX居然是1.5V,看了下原理图,确实是按1.8V设计的,况且在下也见过几十块7系列的FPGA板子,而且手册上也是白纸黑字写的MGTVCCAUX=1.8V,无奈之下,找了另一块ZC706,测了下MGTVCCAUX也是1.5V,而且该板子号称GTX是没问题的,好吧,我服了
  3. 按原理图把ZC706的电阻换一下,先将MGTVCCAUX调成1.8V再说,电压调成1.8V,再用IBERT,还是不通,并且,我将金手指输入的100MHz时钟,通过IBUFDS_GTE2引进来,再输出到USER_SMA_CLOCK_P/N,上示波器,没输出
  4. 准备放弃了,使出最后一招,把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

猜你喜欢

转载自blog.csdn.net/zkf0100007/article/details/82559250