基于XILINX Vivado平台的GTX收发器的开发
参考资料:《ug476_7Series_Transceivers》此项目包含开发源码,各位同学要是有地方需要改进,敬请指出!
参考资料:《ug476_7Series_Transceivers》
此项目包含开发源码,各位同学要是有地方需要改进,敬请指出!
1. GTX IP核的创建
此选项根据你所用的FPGA型号确定GT类型,我所用的是7k325t系列,故GT类型为GTX

接下来,开始配置IP

首先,这里的时钟频率是连接FPGA高速bank上的差分时钟,根据自己项目实际需求进行配置即可
再者,强调一下,因为我的项目中对应的是光纤收发,线速率根据实际光口的不同进行适配选择即可!
还有,估计有和我当时一样的初学者看本篇文章,所以我就本着我当时初学时复杂且全是问号?的心情补充一下。开始废话(高手跳过):我这里是两个高速收发器,亦就是两路光纤收发,怎么来的呢,当然是选的,怎么选的呢,好问题,用你的鼠标选中左侧灰色的收发器框图,然后点击选择我用小红框标记的选项“Use GTX X0Y6”,然后框图从灰色变成黄色了,这个时候神奇的事情就发生了,艾~突然就又增加了一个,聪明的你就以此类推了,哈哈哈哈,这个框图你得对照你项目中实际原理图看仔细,你用的高速收发器是在哪个FPGAbank上的哪个坐标就行,不过也没关系,就算这里你选错了,到时候你约束引脚约束对了就可以了,不影响的。
好了,接着选
这里就开始配置收发器了,外部数据宽度,也就是咱们逻辑里面最终要用到的数据位宽,这里我用的是32位,根据你项目需求用就行了,就算其他位宽的,你用异步fifo转不就行了,这能难倒咱们逻辑工程师吗?开玩笑呢!好,编码一般8B/10B,内部数据位宽就得注意了,这个地方还与最终咱们使用的userclk有关,在ug476手册里面第100页有具体讲解(广子:上xianyu搜麻酱就烧饼,获取xilinx全系列文档手册),可以自己查查,我就简单赘述两句: TXUSRCLK Rate=Line Rate/Internal Datapath Width,如果这里你的内部位宽是20的时候,你最终的TXUSERCLK2=TXUSERCLK/2,具体细节深耕数据手册!
然后就是本页其他配置都是默认的,不用管(如果有特殊需求除外)


接着选,Comma Value我用的K28.5(BC码),具体看我源码中如何使用,其他配置默认!


接着来,不用管,继续默认


继续来,勾选USE CLOCK CORRECTION,其余默认

最后检查所配置结束的IP参数,强调:最后我们在逻辑里面发送用的时钟域是TXUSRCLK2,以此类推,接收用RXUSRCLK2!!!

2. 搭建工程且编码
好了,咱们开始爆改啊啊啊啊啊啊啊!
生成例程,完了只需修改例程顶层模块gtx_aurora_x2_exdes.v文件即可

工程结构:
我在编码模块中用到了状态机,而在解码模块中没有用到,原则是:怎么简明怎么来

顶层:
描述:顶层当中的sys_on_sim在实际使用时换成sys_on即可!
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: FPGA NXH
//
// Create Date: 2025/06/09 10:56:46
// Design Name:
// Module Name: SFP_TR
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module SFP_TR(
input CLK_i,
input SFP_CLK_IN_P,
input SFP_CLK_IN_N,
input [1:0] SFP_2X_IN_P,
input [1:0] SFP_2X_IN_N,
output [1:0] SFP_2X_OUT_P,
output [1:0] SFP_2X_OUT_N,
output [3:0] state_led
);
//---------------clk and reset-----------------
wire sys_clk;
wire sys_rstn;
//---------------user rx-----------------------
wire user_rx0_clk;
wire [31:0] user_rx0_data;
wire [3:0] user_rx0_kdata;
wire user_rx0_link;
wire user_rx1_clk;
wire [31:0] user_rx1_data;
wire [3:0] user_rx1_kdata;
wire user_rx1_link;
wire [31:0] rX0_data;
wire rX0_data_vld;
wire [31:0] rX1_data;
wire rX1_data_vld;
//---------------user tx-----------------------
wire user_tx0_clk;
wire [31:0] tx0_data;
wire [3:0] tx0_kdata;
wire user_tx0_link;
wire user_tx1_clk;
wire [31:0] tx1_data;
wire [3:0] tx1_kdata;
wire user_tx1_link;
//---------------vio-------------------------------
wire sys_on_sim;
wire soft_vld;
wire soft_rst_tx_vio;
wire soft_rst_rx_vio;
wire [2:0] gt_loopback_vio;
wire soft_rst_tx_vio_r;
wire soft_rst_rx_vio_r;
wire [2:0] gt_loopback_vio_r;
vio_1 INST_gt_soft (
.clk (sys_clk ), // input wire clk
.probe_out0 (soft_vld ), // output wire [0 : 0] probe_out0
.probe_out1 (soft_rst_tx_vio_r ), // output wire [0 : 0] probe_out1
.probe_out2 (soft_rst_rx_vio_r ), // output wire [0 : 0] probe_out2
.probe_out3 (gt_loopback_vio_r ), // output wire [2 : 0] probe_out3
.probe_out4 (sys_on_sim ) // output wire [0 : 0] probe_out4
);
assign soft_rst_tx_vio = soft_vld ? soft_rst_tx_vio_r : 'h0;
assign soft_rst_rx_vio = soft_vld ? soft_rst_rx_vio_r : 'h0;
assign gt_loopback_vio = soft_vld ? gt_loopback_vio_r : 'h0;
//-------------------sys_on-----------------------------
wire sys_on;
reg [4:0] user_tx0_link_r='h0;
reg [4:0] user_tx1_link_r='h0;
always @ (posedge user_tx0_clk) user_tx0_link_r <= {user_tx0_link_r[3:0], user_tx0_link};
always @ (posedge user_tx1_clk) user_tx1_link_r <= {user_tx1_link_r[3:0], user_tx1_link};
assign sys_on = (user_tx0_link_r[4] && user_tx1_link_r[4]) ? 'h1 : 'h0;
//-------------------CLK--------------------------------
clk_wiz_0 INST_clk_wiz_0(
// Clock out ports
.clk_out1 (sys_clk), // output clk_out1
// Status and control signals
.reset (1'b0), // input reset
.locked (sys_rstn), // output locked
// Clock in ports
.clk_in1 (CLK_i) // input clk_in1
);
//-----------------USER RX------------------------------
user_gtx_rx #
(
.DATA_WIDTH (32),
.KCHAR_WIDTH (4)
)
INST_user_gtx_rx (
.clk (sys_clk),
.rstn (sys_rstn),
.rx0_clk (user_rx0_clk),
.rx0_link (user_rx0_link),
.rx0_data (user_rx0_data),
.rx0_kdata (user_rx0_kdata),
.rx1_clk (user_rx1_clk),
.rx1_link (user_rx1_link),
.rx1_data (user_rx1_data),
.rx1_kdata (user_rx1_kdata),
.user_rx0_data (rx0_data),
.user_rx0_data_vld (rx0_data_vld),
.user_rx1_data (rx1_data),
.user_rx1_data_vld (rx1_data_vld)
);
//-----------------USER TX------------------------------
user_gtx_tx #
(
.DATA_WIDTH (32),
.KCHAR_WIDTH (4)
)
INST_user_gtx_tx(
.clk (sys_clk),
.rstn (sys_rstn),
.sys_on (sys_on_sim),
.tx0_clk (user_tx0_clk),
.tx0_link (user_tx0_link),
.tx0_data (tx0_data),
.tx0_kdata (tx0_kdata),
.tx1_clk (user_tx1_clk),
.tx1_link (user_tx1_link),
.tx1_data (tx1_data),
.tx1_kdata (tx1_kdata)
);
//-----------------GTX-----------------------------------
gtx_aurora_x2_exdes INST_gtx_aurora_x2_exdes(
.Q1_CLK1_GTREFCLK_PAD_N_IN (SFP_CLK_IN_N),
.Q1_CLK1_GTREFCLK_PAD_P_IN (SFP_CLK_IN_P),
.DRP_CLK_IN (sys_clk),
.RXN_IN (SFP_2X_IN_N),
.RXP_IN (SFP_2X_IN_P),
.TXN_OUT (SFP_2X_OUT_N),
.TXP_OUT (SFP_2X_OUT_P),
//-------------user interface-------------------------
.soft_rst_tx (soft_rst_tx_vio),
.soft_rst_rx (soft_rst_rx_vio),
.gt_loopback (gt_loopback_vio_r),
.user_rx0_clk (user_rx0_clk),
.user_rx0_data (user_rx0_data),
.user_rx0_kdata (user_rx0_kdata),
.user_rx0_link (user_rx0_link),
.user_rx1_clk (user_rx1_clk),
.user_rx1_data (user_rx1_data),
.user_rx1_kdata (user_rx1_kdata),
.user_rx1_link (user_rx1_link),
.user_tx0_clk (user_tx0_clk),
.user_tx0_data (tx0_data),
.user_tx0_kdata (tx0_kdata),
.user_tx0_link (user_tx0_link),
.user_tx1_clk (user_tx1_clk),
.user_tx1_data (tx1_data),
.user_tx1_kdata (tx1_kdata),
.user_tx1_link (user_tx1_link)
);
//-----------------PORT-----------------------------------
assign state_led = {user_tx0_link, user_tx1_link, user_rx0_link, user_rx1_link};
//-----------------DEBUG-----------------------------------
endmodule
打包编码:
编码选用8b/10b,comma值用k28.5(BC码),有同学就好奇,k28.5为啥就是BC码,好吧,我当时也不懂艾,好在去取经了,现在就给你道来:0XBC=0B1011 1100,好,重点来了,0D28=0B11100,0D5=0B101,聪明的你已经发现了,BC=5和28相结合,K28.5分别把28和5换成二进制,然后放一起,再重新组合,低三位101放前面,高五位放后面,那不就成8‘b10111100即8’hBC了吗,以此类推,其他的k码怎么算你就知道了。关于k码换算,你得去看文章,我这里只是让你简单了解一下,别迷糊了,BC是怎么来的不知道!!!
我的编码顺序:
1.等待有效数据的到来,这个过程一直向链路发送空闲码,训练链路
2.等有效数据来了发送帧头,进行编码
3.开始发送有效数据(此项目我发送的是顺序数据,但是我在代码中预留了关键握手信号vld和rdy,有需要的同学后期自己在我的代码上面改就行了)
4.有效数据发送完成,进行编码
5.发送帧尾进行编码
6.接着发送空闲码进行编码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: FPGA NXH
//
// Create Date: 2025/06/09 11:06:10
// Design Name:
// Module Name: user_gtx_tx
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module user_gtx_tx#
(
parameter DATA_WIDTH = 32,
parameter KCHAR_WIDTH = 4
)
(
input clk,
input rstn,
input sys_on,
input tx0_clk,
input tx0_link,
output [DATA_WIDTH-1:0] tx0_data,
output [KCHAR_WIDTH-1:0] tx0_kdata,
input tx1_clk,
input tx1_link,
output [DATA_WIDTH-1:0] tx1_data,
output [KCHAR_WIDTH-1:0] tx1_kdata
);
//------------parameter------------------------------
localparam K_CHAR_VLD = 4'h0001;
localparam K_CHAR_NVLD = 4'h0000;
localparam FRAM_IDLE = 32'h55_AA_00_BC; //空闲码
localparam FRAM_SOF = 32'h55_AA_FF_BC; //帧头
localparam FRAM_COM = 32'h55_AA_DD_BC; //有效数据发送完毕
localparam FRAM_EOF = 32'h55_AA_EE_BC; //帧尾
//------------register-------------------------------
reg [DATA_WIDTH-1:0] cnt_data;
reg [DATA_WIDTH-1:0] cnt_data_r=16'h0;
reg cnt_data_vld;
//-----------------预留------------------------------
wire rx_data_rdy;
reg tx0_data_r_vld;
//---------------------------------------------------
reg [DATA_WIDTH-1:0] tx0_data_r;
reg [DATA_WIDTH-1:0] tx1_data_r;
reg [KCHAR_WIDTH-1:0] tx0_kdata_r;
reg [KCHAR_WIDTH-1:0] tx1_kdata_r;
reg [3:0] tx0_link_r;
reg [3:0] tx1_link_r;
//------------status----------------------------------
reg [3:0] state_cur;
reg [3:0] state_next;
//------------------link_r-----------------------------
always @ (posedge tx0_clk) tx0_link_r <= {tx0_link_r[2:0], tx0_link};
always @ (posedge tx1_clk) tx1_link_r <= {tx1_link_r[2:0], tx1_link};
//---------------------预留-----------------------------
assign rx_data_rdy = (state_cur == 'h1|| state_cur == 'h2) ? 1'h1 : 1'h0;
//------------------------------------------------------
always @ (posedge tx0_clk) begin
if (!tx0_link_r[3]) begin
cnt_data <= 'h0;
cnt_data_vld <= 'h0;
end else if ((state_cur == 'h1|| state_cur == 'h2) && state_next != 'h3 && cnt_data <= 32'h0000_00FF) begin
cnt_data <= cnt_data + 'h1;
cnt_data_vld <= 'h1;
end else begin
cnt_data <= 'h0;
cnt_data_vld <= 'h0;
end
end
always @ (posedge tx0_clk) cnt_data_r <= cnt_data;
//------------------status------------------------------
always @ (posedge tx0_clk) begin
if (!tx0_link_r[3])
state_cur <= 'h0;
else
state_cur <= state_next;
end
always @ (*) begin
state_next = state_cur;
case (state_cur)
'h0 : begin
if (sys_on)
if (tx0_link_r[3])
state_next = 'h1;
else
state_next = 'h0;
else
state_next = 'h0;
end
'h1 : state_next = 'h2;
'h2 : begin
if (cnt_data_vld) begin
state_next = 'h2;
end else begin
state_next = 'h3;
end
end
'h3 : state_next = 'h4;
'h4 : state_next = 'h0;
default : state_next = 'h4;
endcase
end
always @ (posedge tx0_clk) begin
if (!tx0_link_r[3]) begin
tx0_data_r <= 'h0;
tx0_kdata_r <= 'h0;
end else begin
case (state_cur)
'h0 : begin
tx0_data_r <= FRAM_IDLE; //发送空闲码
tx0_kdata_r <= 4'b0001;
end
'h1 : begin
tx0_data_r <= FRAM_SOF; //发送帧头
tx0_kdata_r <= K_CHAR_VLD;
end
'h2 : begin
if (cnt_data_vld) begin //发送有效数据包
tx0_data_r <= cnt_data_r;
tx0_kdata_r <= K_CHAR_NVLD;
end else begin
tx0_data_r <= FRAM_COM; //有效数据包发送完毕
tx0_kdata_r <= K_CHAR_VLD;
end
end
'h3 : begin
tx0_data_r <= FRAM_EOF; //发送帧尾
tx0_kdata_r <= K_CHAR_VLD;
end
'h4 : begin //发送空闲码
tx0_data_r <= FRAM_IDLE;
tx0_kdata_r <= K_CHAR_VLD;
end
default : ;
endcase
end
end
//------------------预留-------------------------------
always @ (posedge tx0_clk) begin
if (!tx0_link_r[3])
tx0_data_r_vld <= 'h0;
else if (state_cur == 'h2 && cnt_data_vld) //这个地方的cnt_data_vld最后可以换成实际的data_vld即可
tx0_data_r_vld <= 'h1;
else
tx0_data_r_vld <= 'h0;
end
//------------------output port------------------------
assign tx0_data = tx0_data_r;
assign tx0_kdata = tx0_kdata_r;
assign tx1_data = tx1_link_r[3] ? tx0_data_r : 'h0;
assign tx1_kdata = tx1_link_r[3] ? tx0_kdata_r : 'h0;
//----------------------DEBUG-----------------------
ila_0 ILA_user_tx (
.clk (tx0_clk), // input wire clk
.probe0 ({
'h0,
sys_on,
sys_on_r,
cnt_data[31:0], //32
cnt_data_r,
cnt_data_vld,
tx0_data_r_vld,
state_cur, //4
state_next, //4
tx0_link_r, //4
tx1_link_r, //4
tx0_data_r, //32
tx0_kdata_r //32
}) // input wire [255:0] probe0
);
endmodule
解包解码:
心善的我再提示一下:解码出来的时钟域最后你得换成你自己的系统时钟域,不太明白的同学就又问了,怎么换时钟域啊啊啊啊啊,还能怎么换,异步fifo,用爆FPGA芯片资源,用就行了。此项目我没转换红红火火恍恍惚惚
解码思路:
根据自己定制的编码协议进行解码
1.先解数据帧头
2.得到有效数据
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: FPGA NXH
//
// Create Date: 2025/06/09 11:06:47
// Design Name:
// Module Name: user_gtx_rx
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module user_gtx_rx #
(
parameter DATA_WIDTH = 32,
parameter KCHAR_WIDTH = 4
)
(
input clk,
input rstn,
input rx0_clk,
input rx0_link,
input [DATA_WIDTH-1:0] rx0_data,
input [KCHAR_WIDTH-1:0] rx0_kdata,
input rx1_clk,
input rx1_link,
input [DATA_WIDTH-1:0] rx1_data,
input [KCHAR_WIDTH-1:0] rx1_kdata,
output [DATA_WIDTH-1:0] user_rx0_data,
output user_rx0_data_vld,
output [DATA_WIDTH-1:0] user_rx1_data,
output user_rx1_data_vld
);
//------------paramerter-----------------------------
localparam FRAM_SOF = 32'h55_AA_FF_BC; //帧头
localparam FRAM_EOF = 32'h55_AA_EE_BC; //帧尾
//------------register-------------------------------
reg [DATA_WIDTH-1:0] rx0_data_r =0;
reg [DATA_WIDTH-1:0] rx1_data_r =0;
reg [DATA_WIDTH-1:0] rx0_data_1r=0;
reg [DATA_WIDTH-1:0] rx1_data_1r=0;
reg [DATA_WIDTH-1:0] rx0_data_2r=0;
reg [DATA_WIDTH-1:0] rx1_data_2r=0;
reg [KCHAR_WIDTH-1:0] rx0_kdata_r ='h0;
reg [KCHAR_WIDTH-1:0] rx1_kdata_r ='h0;
reg [KCHAR_WIDTH-1:0] rx0_kdata_1r='h0;
reg [KCHAR_WIDTH-1:0] rx1_kdata_1r='h0;
reg [KCHAR_WIDTH-1:0] rx0_kdata_2r='h0;
reg [KCHAR_WIDTH-1:0] rx1_kdata_2r='h0;
reg [3:0] rx0_link_r;
reg [3:0] rx1_link_r;
reg [DATA_WIDTH-1:0] user_data;
reg user_data_vld;
reg sof_vld;
reg eof_vld;
reg frame_vld;
reg [2:0] state_cur;
reg [2:0] state_next;
//------------------link_r buffer---------------------------
always @ (posedge rx0_clk) rx0_link_r <= {rx0_link_r[2:0], rx0_link};
always @ (posedge rx1_clk) rx1_link_r <= {rx1_link_r[2:0], rx1_link};
//------------------data buffer-----------------------------
always @ (posedge rx0_clk) begin
rx0_data_r <= rx0_data;
rx0_data_1r <= rx0_data_r;
rx0_data_2r <= rx0_data_1r;
rx1_data_r <= rx1_data;
rx1_data_1r <= rx1_data_r;
rx1_data_2r <= rx1_data_1r;
end
always @ (posedge rx0_clk) begin
rx0_kdata_r <= rx0_kdata;
rx0_kdata_1r <= rx0_kdata_r;
rx0_kdata_2r <= rx0_kdata_1r;
rx1_kdata_r <= rx1_kdata;
rx1_kdata_1r <= rx1_kdata_r;
rx1_kdata_2r <= rx1_kdata_1r;
end
always @ (posedge rx0_clk) begin
if (!rx0_link_r[3]) begin
sof_vld <= 'h0;
end else if (rx0_data_r==FRAM_SOF && rx0_kdata_r=='h1) begin
sof_vld <= 'h1;
end else begin
sof_vld <= 'h0;
end
end
always @ (posedge rx0_clk) begin
if (!rx0_link_r[3]) begin
eof_vld <= 'h0;
end else if (rx0_data_r==FRAM_EOF && rx0_kdata_r=='h1) begin
eof_vld <= 'h1;
end else begin
eof_vld <= 'h0;
end
end
always @ (posedge rx0_clk) begin
if (!rx0_link_r[3]) begin
frame_vld <= 'h0;
end else if (sof_vld || eof_vld) begin
frame_vld <= 'h0;
end else begin
frame_vld <= 'h1;
end
end
always @ (posedge rx0_clk) begin
if (!rx0_link_r[3]) begin
user_data <= 'h0;
user_data_vld <= 'h0;
end else if (rx0_kdata_2r=='h0 && frame_vld) begin
user_data <= rx0_data_2r;
user_data_vld <= 'h1;
end else begin
user_data <= user_data;
user_data_vld <= 'h0;
end
end
//-------------------output port---------------------
assign user_rx0_data = user_data;
assign user_rx0_data_vld = user_data_vld;
assign user_rx1_data = rx1_link_r[3] ? user_data : 'h0;
assign user_rx1_data_vld = rx1_link_r[3] ? user_data_vld : 'h0;
//----------------------DEBUG-----------------------
ila_0 ILA_user_rx (
.clk (rx0_clk), // input wire clk
.probe0 ({
'h0,
rx0_data,
rx0_kdata,
sof_vld,
eof_vld,
frame_vld,
// state_cur,
// state_next,
rx0_link_r,
rx1_link_r,
rx0_data_r,
rx0_kdata_r,
rx0_data_1r,
rx0_kdata_1r,
rx0_data_2r,
rx0_kdata_2r,
user_data,
user_data_vld
}) // input wire [255:0] probe0
);
endmodule
GT收发顶层:
这个模块中,你得把原有的帧生成模块和帧检查模块屏蔽掉使用!!!!里面还有的参数进行了修改,同学们自己看源码即可。
////////////////////////////////////////////////////////////////////////////////
// ____ ____
// / /\/ /
// /___/ \ / Vendor: Xilinx
// \ \ \/ Version : 3.6
// \ \ Application : 7 Series FPGAs Transceivers Wizard
// / / Filename : gtx_aurora_x2_exdes.v
// /___/ /\
// \ \ / \
// \___\/\___\
//
//
// Module gtx_aurora_x2_exdes
// Generated by Xilinx 7 Series FPGAs Transceivers Wizard
//
//
// (c) Copyright 2010-2012 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
`timescale 1ns / 1ps
`define DLY #1
(* DowngradeIPIdentifiedWarnings="yes" *)
//***********************************Entity Declaration************************
(* CORE_GENERATION_INFO = "gtx_aurora_x2,gtwizard_v3_6_11,{protocol_file=aurora_8b10b_single_lane_4byte}" *)
module gtx_aurora_x2_exdes #
(
parameter EXAMPLE_CONFIG_INDEPENDENT_LANES = 1,//configuration for frame gen and check
parameter EXAMPLE_LANE_WITH_START_CHAR = 0, // specifies lane with unique start frame char
parameter EXAMPLE_WORDS_IN_BRAM = 512, // specifies amount of data in BRAM
parameter EXAMPLE_SIM_GTRESET_SPEEDUP = "TRUE", // simulation setting for GT SecureIP model
parameter EXAMPLE_USE_CHIPSCOPE = 0, // Set to 1 to use Chipscope to drive resets
parameter STABLE_CLOCK_PERIOD = 10
)
(
input wire Q1_CLK1_GTREFCLK_PAD_N_IN,
input wire Q1_CLK1_GTREFCLK_PAD_P_IN,
input wire DRP_CLK_IN,
input wire [1:0] RXN_IN,
input wire [1:0] RXP_IN,
output wire [1:0] TXN_OUT,
output wire [1:0] TXP_OUT,
//-------------user interface-------------------------
input soft_rst_tx,
input soft_rst_rx,
input [2:0] gt_loopback,
output user_rx0_clk,
output [31:0] user_rx0_data,
output [3:0] user_rx0_kdata,
output user_rx0_link,
output user_rx1_clk,
output [31:0] user_rx1_data,
output [3:0] user_rx1_kdata,
output user_rx1_link,
output user_tx0_clk,
input [31:0] user_tx0_data,
input [3:0] user_tx0_kdata,
output user_tx0_link,
output user_tx1_clk,
input [31:0] user_tx1_data,
input [3:0] user_tx1_kdata,
output user_tx1_link
);
wire soft_reset_i;
(*mark_debug = "TRUE" *) wire soft_reset_vio_i;
//************************** Register Declarations ****************************
wire gt_txfsmresetdone_i;
wire gt_rxfsmresetdone_i;
(* ASYNC_REG = "TRUE" *)reg gt_txfsmresetdone_r;
(* ASYNC_REG = "TRUE" *)reg gt_txfsmresetdone_r2;
wire gt0_txfsmresetdone_i;
wire gt0_rxfsmresetdone_i;
(* ASYNC_REG = "TRUE" *)reg gt0_txfsmresetdone_r;
(* ASYNC_REG = "TRUE" *)reg gt0_txfsmresetdone_r2;
(* ASYNC_REG = "TRUE" *)reg gt0_rxfsmresetdone_r;
(* ASYNC_REG = "TRUE" *)reg gt0_rxfsmresetdone_r2;
(* ASYNC_REG = "TRUE" *)reg gt0_rxresetdone_r;
(* ASYNC_REG = "TRUE" *)reg gt0_rxresetdone_r2;
(* ASYNC_REG = "TRUE" *)reg gt0_rxresetdone_r3;
(* ASYNC_REG = "TRUE" *)reg gt0_rxresetdone_vio_r;
(* ASYNC_REG = "TRUE" *)reg gt0_rxresetdone_vio_r2;
(* ASYNC_REG = "TRUE" *)reg gt0_rxresetdone_vio_r3;
wire gt1_txfsmresetdone_i;
wire gt1_rxfsmresetdone_i;
(* ASYNC_REG = "TRUE" *)reg gt1_txfsmresetdone_r;
(* ASYNC_REG = "TRUE" *)reg gt1_txfsmresetdone_r2;
(* ASYNC_REG = "TRUE" *)reg gt1_rxfsmresetdone_r;
(* ASYNC_REG = "TRUE" *)reg gt1_rxfsmresetdone_r2;
(* ASYNC_REG = "TRUE" *)reg gt1_rxresetdone_r;
(* ASYNC_REG = "TRUE" *)reg gt1_rxresetdone_r2;
(* ASYNC_REG = "TRUE" *)reg gt1_rxresetdone_r3;
(* ASYNC_REG = "TRUE" *)reg gt1_rxresetdone_vio_r;
(* ASYNC_REG = "TRUE" *)reg gt1_rxresetdone_vio_r2;
(* ASYNC_REG = "TRUE" *)reg gt1_rxresetdone_vio_r3;
reg [5:0] reset_counter = 0;
reg [3:0] reset_pulse;
//**************************** Wire Declarations ******************************//
//------------------------ GT Wrapper Wires ------------------------------
//________________________________________________________________________
//________________________________________________________________________
//GT0 (X1Y5)
//------------------------------- CPLL Ports -------------------------------
wire gt0_cpllfbclklost_i;
wire gt0_cplllock_i;
wire gt0_cpllrefclklost_i;
wire gt0_cpllreset_i;
//-------------------------- Channel - DRP Ports --------------------------
wire [8:0] gt0_drpaddr_i;
wire [15:0] gt0_drpdi_i;
wire [15:0] gt0_drpdo_i;
wire gt0_drpen_i;
wire gt0_drprdy_i;
wire gt0_drpwe_i;
//------------------------- Digital Monitor Ports --------------------------
wire [7:0] gt0_dmonitorout_i;
//----------------------------- Loopback Ports -----------------------------
wire [2:0] gt0_loopback_i;
//---------------------------- Power-Down Ports ----------------------------
wire [1:0] gt0_rxpd_i;
wire [1:0] gt0_txpd_i;
//------------------- RX Initialization and Reset Ports --------------------
wire gt0_eyescanreset_i;
wire gt0_rxuserrdy_i;
//------------------------ RX Margin Analysis Ports ------------------------
wire gt0_eyescandataerror_i;
wire gt0_eyescantrigger_i;
//----------------------- Receive Ports - CDR Ports ------------------------
wire gt0_rxcdrhold_i;
wire gt0_rxcdrovrden_i;
//----------------- Receive Ports - Clock Correction Ports -----------------
wire [1:0] gt0_rxclkcorcnt_i;
//---------------- Receive Ports - FPGA RX interface Ports -----------------
wire [31:0] gt0_rxdata_i;
//----------------- Receive Ports - Pattern Checker Ports ------------------
wire gt0_rxprbserr_i;
wire [2:0] gt0_rxprbssel_i;
//----------------- Receive Ports - Pattern Checker ports ------------------
wire gt0_rxprbscntreset_i;
//---------------- Receive Ports - RX 8B/10B Decoder Ports -----------------
wire [3:0] gt0_rxdisperr_i;
wire [3:0] gt0_rxnotintable_i;
//------------------------- Receive Ports - RX AFE -------------------------
wire gt0_gtxrxp_i;
//---------------------- Receive Ports - RX AFE Ports ----------------------
wire gt0_gtxrxn_i;
//----------------- Receive Ports - RX Buffer Bypass Ports -----------------
wire gt0_rxbufreset_i;
wire [2:0] gt0_rxbufstatus_i;
//------------ Receive Ports - RX Byte and Word Alignment Ports ------------
wire gt0_rxbyteisaligned_i;
wire gt0_rxbyterealign_i;
wire gt0_rxcommadet_i;
wire gt0_rxmcommaalignen_i;
wire gt0_rxpcommaalignen_i;
//------------------- Receive Ports - RX Equalizer Ports -------------------
wire gt0_rxdfelpmreset_i;
wire [6:0] gt0_rxmonitorout_i;
wire [1:0] gt0_rxmonitorsel_i;
//------------- Receive Ports - RX Fabric Output Control Ports -------------
wire gt0_rxoutclk_i;
wire gt0_rxoutclkfabric_i;
//----------- Receive Ports - RX Initialization and Reset Ports ------------
wire gt0_gtrxreset_i;
wire gt0_rxpcsreset_i;
wire gt0_rxpmareset_i;
//---------------- Receive Ports - RX Margin Analysis ports ----------------
wire gt0_rxlpmen_i;
//--------------- Receive Ports - RX Polarity Control Ports ----------------
wire gt0_rxpolarity_i;
//----------------- Receive Ports - RX8B/10B Decoder Ports -----------------
wire [3:0] gt0_rxchariscomma_i;
wire [3:0] gt0_rxcharisk_i;
//------------ Receive Ports -RX Initialization and Reset Ports ------------
wire gt0_rxresetdone_i;
//---------------------- TX Configurable Driver Ports ----------------------
wire [4:0] gt0_txpostcursor_i;
wire [4:0] gt0_txprecursor_i;
//------------------- TX Initialization and Reset Ports --------------------
wire gt0_gttxreset_i;
wire gt0_txuserrdy_i;
//-------------- Transmit Ports - 8b10b Encoder Control Ports --------------
wire [3:0] gt0_txchardispmode_i;
wire [3:0] gt0_txchardispval_i;
//---------------- Transmit Ports - Pattern Generator Ports ----------------
wire gt0_txprbsforceerr_i;
//-------------------- Transmit Ports - TX Buffer Ports --------------------
wire [1:0] gt0_txbufstatus_i;
//------------- Transmit Ports - TX Configurable Driver Ports --------------
wire [3:0] gt0_txdiffctrl_i;
wire [6:0] gt0_txmaincursor_i;
//---------------- Transmit Ports - TX Data Path interface -----------------
wire [31:0] gt0_txdata_i;
//-------------- Transmit Ports - TX Driver and OOB signaling --------------
wire gt0_gtxtxn_i;
wire gt0_gtxtxp_i;
//--------- Transmit Ports - TX Fabric Clock Output Control Ports ----------
wire gt0_txoutclk_i;
wire gt0_txoutclkfabric_i;
wire gt0_txoutclkpcs_i;
//------------------- Transmit Ports - TX Gearbox Ports --------------------
wire [3:0] gt0_txcharisk_i;
//----------- Transmit Ports - TX Initialization and Reset Ports -----------
wire gt0_txpcsreset_i;
wire gt0_txpmareset_i;
wire gt0_txresetdone_i;
//--------------- Transmit Ports - TX Polarity Control Ports ---------------
wire gt0_txpolarity_i;
//---------------- Transmit Ports - pattern Generator Ports ----------------
wire [2:0] gt0_txprbssel_i;
//________________________________________________________________________
//________________________________________________________________________
//GT1 (X1Y6)
//------------------------------- CPLL Ports -------------------------------
wire gt1_cpllfbclklost_i;
wire gt1_cplllock_i;
wire gt1_cpllrefclklost_i;
wire gt1_cpllreset_i;
//-------------------------- Channel - DRP Ports --------------------------
wire [8:0] gt1_drpaddr_i;
wire [15:0] gt1_drpdi_i;
wire [15:0] gt1_drpdo_i;
wire gt1_drpen_i;
wire gt1_drprdy_i;
wire gt1_drpwe_i;
//------------------------- Digital Monitor Ports --------------------------
wire [7:0] gt1_dmonitorout_i;
//----------------------------- Loopback Ports -----------------------------
wire [2:0] gt1_loopback_i;
//---------------------------- Power-Down Ports ----------------------------
wire [1:0] gt1_rxpd_i;
wire [1:0] gt1_txpd_i;
//------------------- RX Initialization and Reset Ports --------------------
wire gt1_eyescanreset_i;
wire gt1_rxuserrdy_i;
//------------------------ RX Margin Analysis Ports ------------------------
wire gt1_eyescandataerror_i;
wire gt1_eyescantrigger_i;
//----------------------- Receive Ports - CDR Ports ------------------------
wire gt1_rxcdrhold_i;
wire gt1_rxcdrovrden_i;
//----------------- Receive Ports - Clock Correction Ports -----------------
wire [1:0] gt1_rxclkcorcnt_i;
//---------------- Receive Ports - FPGA RX interface Ports -----------------
wire [31:0] gt1_rxdata_i;
//----------------- Receive Ports - Pattern Checker Ports ------------------
wire gt1_rxprbserr_i;
wire [2:0] gt1_rxprbssel_i;
//----------------- Receive Ports - Pattern Checker ports ------------------
wire gt1_rxprbscntreset_i;
//---------------- Receive Ports - RX 8B/10B Decoder Ports -----------------
wire [3:0] gt1_rxdisperr_i;
wire [3:0] gt1_rxnotintable_i;
//------------------------- Receive Ports - RX AFE -------------------------
wire gt1_gtxrxp_i;
//---------------------- Receive Ports - RX AFE Ports ----------------------
wire gt1_gtxrxn_i;
//----------------- Receive Ports - RX Buffer Bypass Ports -----------------
wire gt1_rxbufreset_i;
wire [2:0] gt1_rxbufstatus_i;
//------------ Receive Ports - RX Byte and Word Alignment Ports ------------
wire gt1_rxbyteisaligned_i;
wire gt1_rxbyterealign_i;
wire gt1_rxcommadet_i;
wire gt1_rxmcommaalignen_i;
wire gt1_rxpcommaalignen_i;
//------------------- Receive Ports - RX Equalizer Ports -------------------
wire gt1_rxdfelpmreset_i;
wire [6:0] gt1_rxmonitorout_i;
wire [1:0] gt1_rxmonitorsel_i;
//------------- Receive Ports - RX Fabric Output Control Ports -------------
wire gt1_rxoutclk_i;
wire gt1_rxoutclkfabric_i;
//----------- Receive Ports - RX Initialization and Reset Ports ------------
wire gt1_gtrxreset_i;
wire gt1_rxpcsreset_i;
wire gt1_rxpmareset_i;
//---------------- Receive Ports - RX Margin Analysis ports ----------------
wire gt1_rxlpmen_i;
//--------------- Receive Ports - RX Polarity Control Ports ----------------
wire gt1_rxpolarity_i;
//----------------- Receive Ports - RX8B/10B Decoder Ports -----------------
wire [3:0] gt1_rxchariscomma_i;
wire [3:0] gt1_rxcharisk_i;
//------------ Receive Ports -RX Initialization and Reset Ports ------------
wire gt1_rxresetdone_i;
//---------------------- TX Configurable Driver Ports ----------------------
wire [4:0] gt1_txpostcursor_i;
wire [4:0] gt1_txprecursor_i;
//------------------- TX Initialization and Reset Ports --------------------
wire gt1_gttxreset_i;
wire gt1_txuserrdy_i;
//-------------- Transmit Ports - 8b10b Encoder Control Ports --------------
wire [3:0] gt1_txchardispmode_i;
wire [3:0] gt1_txchardispval_i;
//---------------- Transmit Ports - Pattern Generator Ports ----------------
wire gt1_txprbsforceerr_i;
//-------------------- Transmit Ports - TX Buffer Ports --------------------
wire [1:0] gt1_txbufstatus_i;
//------------- Transmit Ports - TX Configurable Driver Ports --------------
wire [3:0] gt1_txdiffctrl_i;
wire [6:0] gt1_txmaincursor_i;
//---------------- Transmit Ports - TX Data Path interface -----------------
wire [31:0] gt1_txdata_i;
//-------------- Transmit Ports - TX Driver and OOB signaling --------------
wire gt1_gtxtxn_i;
wire gt1_gtxtxp_i;
//--------- Transmit Ports - TX Fabric Clock Output Control Ports ----------
wire gt1_txoutclk_i;
wire gt1_txoutclkfabric_i;
wire gt1_txoutclkpcs_i;
//------------------- Transmit Ports - TX Gearbox Ports --------------------
wire [3:0] gt1_txcharisk_i;
//----------- Transmit Ports - TX Initialization and Reset Ports -----------
wire gt1_txpcsreset_i;
wire gt1_txpmareset_i;
wire gt1_txresetdone_i;
//--------------- Transmit Ports - TX Polarity Control Ports ---------------
wire gt1_txpolarity_i;
//---------------- Transmit Ports - pattern Generator Ports ----------------
wire [2:0] gt1_txprbssel_i;
//____________________________COMMON PORTS________________________________
//-------------------- Common Block - Ref Clock Ports ---------------------
wire gt0_gtrefclk1_common_i;
//----------------------- Common Block - QPLL Ports ------------------------
wire gt0_qplllock_i;
wire gt0_qpllrefclklost_i;
wire gt0_qpllreset_i;
//----------------------------- Global Signals -----------------------------
wire drpclk_in_i;
wire DRPCLK_IN;
wire gt0_tx_system_reset_c;
wire gt0_rx_system_reset_c;
wire gt1_tx_system_reset_c;
wire gt1_rx_system_reset_c;
wire tied_to_ground_i;
wire [63:0] tied_to_ground_vec_i;
wire tied_to_vcc_i;
wire [7:0] tied_to_vcc_vec_i;
wire GTTXRESET_IN;
wire GTRXRESET_IN;
wire CPLLRESET_IN;
wire QPLLRESET_IN;
//--------------------------- User Clocks ---------------------------------
wire gt0_txusrclk_i;
wire gt0_txusrclk2_i;
wire gt0_rxusrclk_i;
wire gt0_rxusrclk2_i;
wire gt1_txusrclk_i;
wire gt1_txusrclk2_i;
wire gt1_rxusrclk_i;
wire gt1_rxusrclk2_i;
//--------------------------- Reference Clocks ----------------------------
wire q1_clk1_refclk_i;
//--------------------- Frame check/gen Module Signals --------------------
wire gt0_matchn_i;
wire [3:0] gt0_txcharisk_float_i;
wire [15:0] gt0_txdata_float16_i;
wire [31:0] gt0_txdata_float_i;
wire gt0_block_sync_i;
wire gt0_track_data_i;
wire [7:0] gt0_error_count_i;
wire gt0_frame_check_reset_i;
wire gt0_inc_in_i;
wire gt0_inc_out_i;
wire [31:0] gt0_unscrambled_data_i;
wire gt1_matchn_i;
wire [3:0] gt1_txcharisk_float_i;
wire [15:0] gt1_txdata_float16_i;
wire [31:0] gt1_txdata_float_i;
wire gt1_block_sync_i;
wire gt1_track_data_i;
wire [7:0] gt1_error_count_i;
wire gt1_frame_check_reset_i;
wire gt1_inc_in_i;
wire gt1_inc_out_i;
wire [31:0] gt1_unscrambled_data_i;
wire reset_on_data_error_i;
wire track_data_out_i;
//--------------------- Chipscope Signals ---------------------------------
(*mark_debug = "TRUE" *)wire rxresetdone_vio_i;
wire [35:0] tx_data_vio_control_i;
wire [35:0] rx_data_vio_control_i;
wire [35:0] shared_vio_control_i;
wire [35:0] ila_control_i;
wire [35:0] channel_drp_vio_control_i;
wire [35:0] common_drp_vio_control_i;
wire [31:0] tx_data_vio_async_in_i;
wire [31:0] tx_data_vio_sync_in_i;
wire [31:0] tx_data_vio_async_out_i;
wire [31:0] tx_data_vio_sync_out_i;
wire [31:0] rx_data_vio_async_in_i;
wire [31:0] rx_data_vio_sync_in_i;
wire [31:0] rx_data_vio_async_out_i;
wire [31:0] rx_data_vio_sync_out_i;
wire [31:0] shared_vio_in_i;
wire [31:0] shared_vio_out_i;
wire [163:0] ila_in_i;
wire [31:0] channel_drp_vio_async_in_i;
wire [31:0] channel_drp_vio_sync_in_i;
wire [31:0] channel_drp_vio_async_out_i;
wire [31:0] channel_drp_vio_sync_out_i;
wire [31:0] common_drp_vio_async_in_i;
wire [31:0] common_drp_vio_sync_in_i;
wire [31:0] common_drp_vio_async_out_i;
wire [31:0] common_drp_vio_sync_out_i;
wire [31:0] gt0_tx_data_vio_async_in_i;
wire [31:0] gt0_tx_data_vio_sync_in_i;
wire [31:0] gt0_tx_data_vio_async_out_i;
wire [31:0] gt0_tx_data_vio_sync_out_i;
wire [31:0] gt0_rx_data_vio_async_in_i;
wire [31:0] gt0_rx_data_vio_sync_in_i;
wire [31:0] gt0_rx_data_vio_async_out_i;
wire [31:0] gt0_rx_data_vio_sync_out_i;
wire [163:0] gt0_ila_in_i;
wire [31:0] gt0_channel_drp_vio_async_in_i;
wire [31:0] gt0_channel_drp_vio_sync_in_i;
wire [31:0] gt0_channel_drp_vio_async_out_i;
wire [31:0] gt0_channel_drp_vio_sync_out_i;
wire [31:0] gt0_common_drp_vio_async_in_i;
wire [31:0] gt0_common_drp_vio_sync_in_i;
wire [31:0] gt0_common_drp_vio_async_out_i;
wire [31:0] gt0_common_drp_vio_sync_out_i;
wire [31:0] gt1_tx_data_vio_async_in_i;
wire [31:0] gt1_tx_data_vio_sync_in_i;
wire [31:0] gt1_tx_data_vio_async_out_i;
wire [31:0] gt1_tx_data_vio_sync_out_i;
wire [31:0] gt1_rx_data_vio_async_in_i;
wire [31:0] gt1_rx_data_vio_sync_in_i;
wire [31:0] gt1_rx_data_vio_async_out_i;
wire [31:0] gt1_rx_data_vio_sync_out_i;
wire [163:0] gt1_ila_in_i;
wire [31:0] gt1_channel_drp_vio_async_in_i;
wire [31:0] gt1_channel_drp_vio_sync_in_i;
wire [31:0] gt1_channel_drp_vio_async_out_i;
wire [31:0] gt1_channel_drp_vio_sync_out_i;
wire [31:0] gt1_common_drp_vio_async_in_i;
wire [31:0] gt1_common_drp_vio_sync_in_i;
wire [31:0] gt1_common_drp_vio_async_out_i;
wire [31:0] gt1_common_drp_vio_sync_out_i;
wire gttxreset_i;
wire gtrxreset_i;
wire mux_sel_i;
wire user_tx_reset_i;
wire user_rx_reset_i;
wire tx_vio_clk_i;
wire tx_vio_clk_mux_out_i;
wire rx_vio_ila_clk_i;
wire rx_vio_ila_clk_mux_out_i;
wire cpllreset_i;
wire [(80 -32) -1:0] zero_vector_rx_80 ;
wire [(8 -4) -1:0] zero_vector_rx_8 ;
wire [79:0] gt0_rxdata_ila ;
wire [1:0] gt0_rxdatavalid_ila;
wire [7:0] gt0_rxcharisk_ila ;
wire gt0_txmmcm_lock_ila ;
wire gt0_rxmmcm_lock_ila ;
wire gt0_rxresetdone_ila ;
wire gt0_txresetdone_ila ;
wire [79:0] gt1_rxdata_ila ;
wire [1:0] gt1_rxdatavalid_ila;
wire [7:0] gt1_rxcharisk_ila ;
wire gt1_txmmcm_lock_ila ;
wire gt1_rxmmcm_lock_ila ;
wire gt1_rxresetdone_ila ;
wire gt1_txresetdone_ila ;
//**************************** Main Body of Code *******************************
// Static signal Assigments
assign tied_to_ground_i = 1'b0;
assign tied_to_ground_vec_i = 64'h0000000000000000;
assign tied_to_vcc_i = 1'b1;
assign tied_to_vcc_vec_i = 8'hff;
assign zero_vector_rx_80 = 0;
assign zero_vector_rx_8 = 0;
assign q1_clk1_refclk_i = 1'b0;
//------------------------------USER INTERFACE---------------------------
//-------------channel 0---------------------
assign user_rx0_clk = gt0_rxusrclk2_i;
assign user_rx0_data = gt0_rxdata_i;
assign user_rx0_kdata = gt0_rxcharisk_i;
assign user_rx0_link = gt0_rxfsmresetdone_i;
assign user_tx0_clk = gt0_txusrclk2_i;
assign gt0_txdata_i = user_tx0_data;
assign gt0_txcharisk_i = user_tx0_kdata;
assign user_tx0_link = gt0_txfsmresetdone_i;
//-------------channel 1---------------------
assign user_rx1_clk = gt1_rxusrclk2_i;
assign user_rx1_data = gt1_rxdata_i;
assign user_rx1_kdata = gt1_rxcharisk_i;
assign user_rx1_link = gt1_rxfsmresetdone_i;
assign user_tx1_clk = gt1_txusrclk2_i;
assign gt1_txdata_i = user_tx1_data;
assign gt1_txcharisk_i = user_tx1_kdata;
assign user_tx1_link = gt1_txfsmresetdone_i;
//***********************************************************************//
// //
//--------------------------- The GT Wrapper ----------------------------//
// //
//***********************************************************************//
// Use the instantiation template in the example directory to add the GT wrapper to your design.
// In this example, the wrapper is wired up for basic operation with a frame generator and frame
// checker. The GTs will reset, then attempt to align and transmit data. If channel bonding is
// enabled, bonding should occur after alignment.
// While connecting the GT TX/RX Reset ports below, please add a delay of
// minimum 500ns as mentioned in AR 43482.
gtx_aurora_x2_support #
(
.EXAMPLE_SIM_GTRESET_SPEEDUP (EXAMPLE_SIM_GTRESET_SPEEDUP),
.STABLE_CLOCK_PERIOD (STABLE_CLOCK_PERIOD)
)
gtx_aurora_x2_support_i
(
.soft_reset_tx_in (soft_rst_tx),
.soft_reset_rx_in (soft_rst_rx),
.dont_reset_on_data_error_in (tied_to_ground_i),
.q1_clk1_gtrefclk_pad_n_in(Q1_CLK1_GTREFCLK_PAD_N_IN),
.q1_clk1_gtrefclk_pad_p_in(Q1_CLK1_GTREFCLK_PAD_P_IN),
.gt0_tx_fsm_reset_done_out (gt0_txfsmresetdone_i),
.gt0_rx_fsm_reset_done_out (gt0_rxfsmresetdone_i),
.gt0_data_valid_in ('b1),
.gt1_tx_fsm_reset_done_out (gt1_txfsmresetdone_i),
.gt1_rx_fsm_reset_done_out (gt1_rxfsmresetdone_i),
.gt1_data_valid_in ('b1),
.gt0_txusrclk_out(gt0_txusrclk_i),
.gt0_txusrclk2_out(gt0_txusrclk2_i),
.gt0_rxusrclk_out(gt0_rxusrclk_i),
.gt0_rxusrclk2_out(gt0_rxusrclk2_i),
.gt1_txusrclk_out(gt1_txusrclk_i),
.gt1_txusrclk2_out(gt1_txusrclk2_i),
.gt1_rxusrclk_out(gt1_rxusrclk_i),
.gt1_rxusrclk2_out(gt1_rxusrclk2_i),
//_____________________________________________________________________
//_____________________________________________________________________
//GT0 (X1Y5)
//------------------------------- CPLL Ports -------------------------------
.gt0_cpllfbclklost_out (gt0_cpllfbclklost_i),
.gt0_cplllock_out (gt0_cplllock_i),
.gt0_cpllreset_in (tied_to_ground_i),
//-------------------------- Channel - DRP Ports --------------------------
.gt0_drpaddr_in (gt0_drpaddr_i),
.gt0_drpdi_in (gt0_drpdi_i),
.gt0_drpdo_out (gt0_drpdo_i),
.gt0_drpen_in (gt0_drpen_i),
.gt0_drprdy_out (gt0_drprdy_i),
.gt0_drpwe_in (gt0_drpwe_i),
//------------------------- Digital Monitor Ports --------------------------
.gt0_dmonitorout_out (gt0_dmonitorout_i),
//----------------------------- Loopback Ports -----------------------------
.gt0_loopback_in (gt_loopback),
//---------------------------- Power-Down Ports ----------------------------
.gt0_rxpd_in (gt0_rxpd_i),
.gt0_txpd_in (gt0_txpd_i),
//------------------- RX Initialization and Reset Ports --------------------
.gt0_eyescanreset_in (tied_to_ground_i),
.gt0_rxuserrdy_in (tied_to_vcc_i),
//------------------------ RX Margin Analysis Ports ------------------------
.gt0_eyescandataerror_out (gt0_eyescandataerror_i),
.gt0_eyescantrigger_in (tied_to_ground_i),
//----------------------- Receive Ports - CDR Ports ------------------------
.gt0_rxcdrhold_in (gt0_rxcdrhold_i),
.gt0_rxcdrovrden_in (tied_to_ground_i),
//----------------- Receive Ports - Clock Correction Ports -----------------
.gt0_rxclkcorcnt_out (gt0_rxclkcorcnt_i),
//---------------- Receive Ports - FPGA RX interface Ports -----------------
.gt0_rxdata_out (gt0_rxdata_i),
//----------------- Receive Ports - Pattern Checker Ports ------------------
.gt0_rxprbserr_out (gt0_rxprbserr_i),
.gt0_rxprbssel_in (gt0_rxprbssel_i),
//----------------- Receive Ports - Pattern Checker ports ------------------
.gt0_rxprbscntreset_in (gt0_rxprbscntreset_i),
//---------------- Receive Ports - RX 8B/10B Decoder Ports -----------------
.gt0_rxdisperr_out (gt0_rxdisperr_i),
.gt0_rxnotintable_out (gt0_rxnotintable_i),
//------------------------- Receive Ports - RX AFE -------------------------
.gt0_gtxrxp_in (RXP_IN[0]),
//---------------------- Receive Ports - RX AFE Ports ----------------------
.gt0_gtxrxn_in (RXN_IN[0]),
//----------------- Receive Ports - RX Buffer Bypass Ports -----------------
.gt0_rxbufreset_in (gt0_rxbufreset_i),
.gt0_rxbufstatus_out (gt0_rxbufstatus_i),
//------------ Receive Ports - RX Byte and Word Alignment Ports ------------
.gt0_rxbyteisaligned_out (gt0_rxbyteisaligned_i),
.gt0_rxbyterealign_out (gt0_rxbyterealign_i),
.gt0_rxcommadet_out (gt0_rxcommadet_i),
.gt0_rxmcommaalignen_in ('b1),
.gt0_rxpcommaalignen_in ('b1),
//------------------- Receive Ports - RX Equalizer Ports -------------------
.gt0_rxdfelpmreset_in (tied_to_ground_i),
.gt0_rxmonitorout_out (gt0_rxmonitorout_i),
.gt0_rxmonitorsel_in (2'b00),
//------------- Receive Ports - RX Fabric Output Control Ports -------------
.gt0_rxoutclkfabric_out (gt0_rxoutclkfabric_i),
//----------- Receive Ports - RX Initialization and Reset Ports ------------
.gt0_gtrxreset_in (tied_to_ground_i),
.gt0_rxpcsreset_in (tied_to_ground_i),
.gt0_rxpmareset_in (gt0_rxpmareset_i),
//---------------- Receive Ports - RX Margin Analysis ports ----------------
.gt0_rxlpmen_in (gt0_rxlpmen_i),
//--------------- Receive Ports - RX Polarity Control Ports ----------------
.gt0_rxpolarity_in (gt0_rxpolarity_i),
//----------------- Receive Ports - RX8B/10B Decoder Ports -----------------
.gt0_rxchariscomma_out (gt0_rxchariscomma_i),
.gt0_rxcharisk_out (gt0_rxcharisk_i),
//------------ Receive Ports -RX Initialization and Reset Ports ------------
.gt0_rxresetdone_out (gt0_rxresetdone_i),
//---------------------- TX Configurable Driver Ports ----------------------
.gt0_txpostcursor_in (gt0_txpostcursor_i),
.gt0_txprecursor_in (gt0_txprecursor_i),
//------------------- TX Initialization and Reset Ports --------------------
.gt0_gttxreset_in (tied_to_ground_i),
.gt0_txuserrdy_in (tied_to_vcc_i),
//-------------- Transmit Ports - 8b10b Encoder Control Ports --------------
.gt0_txchardispmode_in (gt0_txchardispmode_i),
.gt0_txchardispval_in (gt0_txchardispval_i),
//---------------- Transmit Ports - Pattern Generator Ports ----------------
.gt0_txprbsforceerr_in (gt0_txprbsforceerr_i),
//-------------------- Transmit Ports - TX Buffer Ports --------------------
.gt0_txbufstatus_out (gt0_txbufstatus_i),
//------------- Transmit Ports - TX Configurable Driver Ports --------------
.gt0_txdiffctrl_in (gt0_txdiffctrl_i),
.gt0_txmaincursor_in (7'b0000000),
//---------------- Transmit Ports - TX Data Path interface -----------------
.gt0_txdata_in (gt0_txdata_i),
//-------------- Transmit Ports - TX Driver and OOB signaling --------------
.gt0_gtxtxn_out (TXN_OUT[0]),
.gt0_gtxtxp_out (TXP_OUT[0]),
//--------- Transmit Ports - TX Fabric Clock Output Control Ports ----------
.gt0_txoutclkfabric_out (gt0_txoutclkfabric_i),
.gt0_txoutclkpcs_out (gt0_txoutclkpcs_i),
//------------------- Transmit Ports - TX Gearbox Ports --------------------
.gt0_txcharisk_in (gt0_txcharisk_i),
//----------- Transmit Ports - TX Initialization and Reset Ports -----------
.gt0_txpcsreset_in (tied_to_ground_i),
.gt0_txpmareset_in (tied_to_ground_i),
.gt0_txresetdone_out (gt0_txresetdone_i),
//--------------- Transmit Ports - TX Polarity Control Ports ---------------
.gt0_txpolarity_in (gt0_txpolarity_i),
//---------------- Transmit Ports - pattern Generator Ports ----------------
.gt0_txprbssel_in (gt0_txprbssel_i),
//_____________________________________________________________________
//_____________________________________________________________________
//GT1 (X1Y6)
//------------------------------- CPLL Ports -------------------------------
.gt1_cpllfbclklost_out (gt1_cpllfbclklost_i),
.gt1_cplllock_out (gt1_cplllock_i),
.gt1_cpllreset_in (tied_to_ground_i),
//-------------------------- Channel - DRP Ports --------------------------
.gt1_drpaddr_in (gt1_drpaddr_i),
.gt1_drpdi_in (gt1_drpdi_i),
.gt1_drpdo_out (gt1_drpdo_i),
.gt1_drpen_in (gt1_drpen_i),
.gt1_drprdy_out (gt1_drprdy_i),
.gt1_drpwe_in (gt1_drpwe_i),
//------------------------- Digital Monitor Ports --------------------------
.gt1_dmonitorout_out (gt1_dmonitorout_i),
//----------------------------- Loopback Ports -----------------------------
.gt1_loopback_in (gt1_loopback_i),
//---------------------------- Power-Down Ports ----------------------------
.gt1_rxpd_in (gt1_rxpd_i),
.gt1_txpd_in (gt1_txpd_i),
//------------------- RX Initialization and Reset Ports --------------------
.gt1_eyescanreset_in (tied_to_ground_i),
.gt1_rxuserrdy_in (tied_to_vcc_i),
//------------------------ RX Margin Analysis Ports ------------------------
.gt1_eyescandataerror_out (gt1_eyescandataerror_i),
.gt1_eyescantrigger_in (tied_to_ground_i),
//----------------------- Receive Ports - CDR Ports ------------------------
.gt1_rxcdrhold_in (gt1_rxcdrhold_i),
.gt1_rxcdrovrden_in (tied_to_ground_i),
//----------------- Receive Ports - Clock Correction Ports -----------------
.gt1_rxclkcorcnt_out (gt1_rxclkcorcnt_i),
//---------------- Receive Ports - FPGA RX interface Ports -----------------
.gt1_rxdata_out (gt1_rxdata_i),
//----------------- Receive Ports - Pattern Checker Ports ------------------
.gt1_rxprbserr_out (gt1_rxprbserr_i),
.gt1_rxprbssel_in (gt1_rxprbssel_i),
//----------------- Receive Ports - Pattern Checker ports ------------------
.gt1_rxprbscntreset_in (gt1_rxprbscntreset_i),
//---------------- Receive Ports - RX 8B/10B Decoder Ports -----------------
.gt1_rxdisperr_out (gt1_rxdisperr_i),
.gt1_rxnotintable_out (gt1_rxnotintable_i),
//------------------------- Receive Ports - RX AFE -------------------------
.gt1_gtxrxp_in (RXP_IN[1]),
//---------------------- Receive Ports - RX AFE Ports ----------------------
.gt1_gtxrxn_in (RXN_IN[1]),
//----------------- Receive Ports - RX Buffer Bypass Ports -----------------
.gt1_rxbufreset_in (gt1_rxbufreset_i),
.gt1_rxbufstatus_out (gt1_rxbufstatus_i),
//------------ Receive Ports - RX Byte and Word Alignment Ports ------------
.gt1_rxbyteisaligned_out (gt1_rxbyteisaligned_i),
.gt1_rxbyterealign_out (gt1_rxbyterealign_i),
.gt1_rxcommadet_out (gt1_rxcommadet_i),
.gt1_rxmcommaalignen_in ('b1),
.gt1_rxpcommaalignen_in ('b1),
//------------------- Receive Ports - RX Equalizer Ports -------------------
.gt1_rxdfelpmreset_in (tied_to_ground_i),
.gt1_rxmonitorout_out (gt1_rxmonitorout_i),
.gt1_rxmonitorsel_in (2'b00),
//------------- Receive Ports - RX Fabric Output Control Ports -------------
.gt1_rxoutclkfabric_out (gt1_rxoutclkfabric_i),
//----------- Receive Ports - RX Initialization and Reset Ports ------------
.gt1_gtrxreset_in (tied_to_ground_i),
.gt1_rxpcsreset_in (tied_to_ground_i),
.gt1_rxpmareset_in (gt1_rxpmareset_i),
//---------------- Receive Ports - RX Margin Analysis ports ----------------
.gt1_rxlpmen_in (gt1_rxlpmen_i),
//--------------- Receive Ports - RX Polarity Control Ports ----------------
.gt1_rxpolarity_in (gt1_rxpolarity_i),
//----------------- Receive Ports - RX8B/10B Decoder Ports -----------------
.gt1_rxchariscomma_out (gt1_rxchariscomma_i),
.gt1_rxcharisk_out (gt1_rxcharisk_i),
//------------ Receive Ports -RX Initialization and Reset Ports ------------
.gt1_rxresetdone_out (gt1_rxresetdone_i),
//---------------------- TX Configurable Driver Ports ----------------------
.gt1_txpostcursor_in (gt1_txpostcursor_i),
.gt1_txprecursor_in (gt1_txprecursor_i),
//------------------- TX Initialization and Reset Ports --------------------
.gt1_gttxreset_in (tied_to_ground_i),
.gt1_txuserrdy_in (tied_to_vcc_i),
//-------------- Transmit Ports - 8b10b Encoder Control Ports --------------
.gt1_txchardispmode_in (gt1_txchardispmode_i),
.gt1_txchardispval_in (gt1_txchardispval_i),
//---------------- Transmit Ports - Pattern Generator Ports ----------------
.gt1_txprbsforceerr_in (gt1_txprbsforceerr_i),
//-------------------- Transmit Ports - TX Buffer Ports --------------------
.gt1_txbufstatus_out (gt1_txbufstatus_i),
//------------- Transmit Ports - TX Configurable Driver Ports --------------
.gt1_txdiffctrl_in (gt1_txdiffctrl_i),
.gt1_txmaincursor_in (7'b0000000),
//---------------- Transmit Ports - TX Data Path interface -----------------
.gt1_txdata_in (gt1_txdata_i),
//-------------- Transmit Ports - TX Driver and OOB signaling --------------
.gt1_gtxtxn_out (TXN_OUT[1]),
.gt1_gtxtxp_out (TXP_OUT[1]),
//--------- Transmit Ports - TX Fabric Clock Output Control Ports ----------
.gt1_txoutclkfabric_out (gt1_txoutclkfabric_i),
.gt1_txoutclkpcs_out (gt1_txoutclkpcs_i),
//------------------- Transmit Ports - TX Gearbox Ports --------------------
.gt1_txcharisk_in (gt1_txcharisk_i),
//----------- Transmit Ports - TX Initialization and Reset Ports -----------
.gt1_txpcsreset_in (tied_to_ground_i),
.gt1_txpmareset_in (tied_to_ground_i),
.gt1_txresetdone_out (gt1_txresetdone_i),
//--------------- Transmit Ports - TX Polarity Control Ports ---------------
.gt1_txpolarity_in (gt1_txpolarity_i),
//---------------- Transmit Ports - pattern Generator Ports ----------------
.gt1_txprbssel_in (gt1_txprbssel_i),
//____________________________COMMON PORTS________________________________
.gt0_qplloutclk_out (),
.gt0_qplloutrefclk_out (),
.sysclk_in (DRP_CLK_IN)
);
// IBUFDS IBUFDS_DRP_CLK
// (
// .I (DRP_CLK_IN_P),
// .IB (DRP_CLK_IN_N),
// .O (DRPCLK_IN)
// );
// BUFG DRP_CLK_BUFG
// (
// .I (DRPCLK_IN),
// .O (drpclk_in_i)
// );
//***********************************************************************//
// //
//--------------------------- User Module Resets-------------------------//
// //
//***********************************************************************//
// All the User Modules i.e. FRAME_GEN, FRAME_CHECK and the sync modules
// are held in reset till the RESETDONE goes high.
// The RESETDONE is registered a couple of times on *USRCLK2 and connected
// to the reset of the modules
always @(posedge gt0_rxusrclk2_i or negedge gt0_rxresetdone_i)
begin
if (!gt0_rxresetdone_i)
begin
gt0_rxresetdone_r <= `DLY 1'b0;
gt0_rxresetdone_r2 <= `DLY 1'b0;
gt0_rxresetdone_r3 <= `DLY 1'b0;
end
else
begin
gt0_rxresetdone_r <= `DLY gt0_rxresetdone_i;
gt0_rxresetdone_r2 <= `DLY gt0_rxresetdone_r;
gt0_rxresetdone_r3 <= `DLY gt0_rxresetdone_r2;
end
end
always @(posedge gt0_txusrclk2_i or negedge gt0_txfsmresetdone_i)
begin
if (!gt0_txfsmresetdone_i)
begin
gt0_txfsmresetdone_r <= `DLY 1'b0;
gt0_txfsmresetdone_r2 <= `DLY 1'b0;
end
else
begin
gt0_txfsmresetdone_r <= `DLY gt0_txfsmresetdone_i;
gt0_txfsmresetdone_r2 <= `DLY gt0_txfsmresetdone_r;
end
end
always @(posedge gt1_rxusrclk2_i or negedge gt1_rxresetdone_i)
begin
if (!gt1_rxresetdone_i)
begin
gt1_rxresetdone_r <= `DLY 1'b0;
gt1_rxresetdone_r2 <= `DLY 1'b0;
gt1_rxresetdone_r3 <= `DLY 1'b0;
end
else
begin
gt1_rxresetdone_r <= `DLY gt1_rxresetdone_i;
gt1_rxresetdone_r2 <= `DLY gt1_rxresetdone_r;
gt1_rxresetdone_r3 <= `DLY gt1_rxresetdone_r2;
end
end
always @(posedge gt1_txusrclk2_i or negedge gt1_txfsmresetdone_i)
begin
if (!gt1_txfsmresetdone_i)
begin
gt1_txfsmresetdone_r <= `DLY 1'b0;
gt1_txfsmresetdone_r2 <= `DLY 1'b0;
end
else
begin
gt1_txfsmresetdone_r <= `DLY gt1_txfsmresetdone_i;
gt1_txfsmresetdone_r2 <= `DLY gt1_txfsmresetdone_r;
end
end
//***********************************************************************//
// //
//------------------------ Frame Generators ---------------------------//
// //
//***********************************************************************//
// The example design uses Block RAM based frame generators to provide test
// data to the GTs for transmission. By default the frame generators are
// loaded with an incrementing data sequence that includes commas/alignment
// characters for alignment. If your protocol uses channel bonding, the
// frame generator will also be preloaded with a channel bonding sequence.
// You can modify the data transmitted by changing the INIT values of the frame
// generator in this file. Pay careful attention to bit order and the spacing
// of your control and alignment characters.
// gtx_aurora_x2_GT_FRAME_GEN #
// (
// .WORDS_IN_BRAM(EXAMPLE_WORDS_IN_BRAM)
// )
// gt0_frame_gen
// (
// // User Interface
// .TX_DATA_OUT ({gt0_txdata_float_i,gt0_txdata_i,gt0_txdata_float16_i}),
// .TXCTRL_OUT ({gt0_txcharisk_float_i,gt0_txcharisk_i}),
// // System Interface
// .USER_CLK (gt0_txusrclk2_i),
// .SYSTEM_RESET (gt0_tx_system_reset_c)
// );
// gtx_aurora_x2_GT_FRAME_GEN #
// (
// .WORDS_IN_BRAM(EXAMPLE_WORDS_IN_BRAM)
// )
// gt1_frame_gen
// (
// // User Interface
// .TX_DATA_OUT ({gt1_txdata_float_i,gt1_txdata_i,gt1_txdata_float16_i}),
// .TXCTRL_OUT ({gt1_txcharisk_float_i,gt1_txcharisk_i}),
// // System Interface
// .USER_CLK (gt1_txusrclk2_i),
// .SYSTEM_RESET (gt1_tx_system_reset_c)
// );
//***********************************************************************//
// //
//------------------------ Frame Checkers -----------------------------//
// //
//***********************************************************************//
// The example design uses Block RAM based frame checkers to verify incoming
// data. By default the frame generators are loaded with a data sequence that
// matches the outgoing sequence of the frame generators for the TX ports.
// You can modify the expected data sequence by changing the INIT values of the frame
// checkers in this file. Pay careful attention to bit order and the spacing
// of your control and alignment characters.
// When the frame checker receives data, it attempts to synchronise to the
// incoming pattern by looking for the first sequence in the pattern. Once it
// finds the first sequence, it increments through the sequence, and indicates an
// error whenever the next value received does not match the expected value.
// assign gt0_frame_check_reset_i = (EXAMPLE_CONFIG_INDEPENDENT_LANES==0)?reset_on_data_error_i:gt0_matchn_i;
// gt0_frame_check0 is always connected to the lane with the start of char
// and this lane starts off the data checking on all the other lanes. The INC_IN port is tied off
// assign gt0_inc_in_i = 1'b0;
// gtx_aurora_x2_GT_FRAME_CHECK #
// (
// .RX_DATA_WIDTH ( 32 ),
// .RXCTRL_WIDTH ( 4 ),
// .COMMA_DOUBLE ( 16'h04bc ),
// .WORDS_IN_BRAM(EXAMPLE_WORDS_IN_BRAM),
// .START_OF_PACKET_CHAR ( 32'h060504bc )
// )
// gt0_frame_check
// (
// // GT Interface
// .RX_DATA_IN (gt0_rxdata_i),
// .RXCTRL_IN (gt0_rxcharisk_i),
// .RXENMCOMMADET_OUT (gt0_rxmcommaalignen_i),
// .RXENPCOMMADET_OUT (gt0_rxpcommaalignen_i),
// .RX_ENCHAN_SYNC_OUT ( ),
// .RX_CHANBOND_SEQ_IN (tied_to_ground_i),
// // Control Interface
// .INC_IN (gt0_inc_in_i),
// .INC_OUT (gt0_inc_out_i),
// .PATTERN_MATCHB_OUT (gt0_matchn_i),
// .RESET_ON_ERROR_IN (gt0_frame_check_reset_i),
// // System Interface
// .USER_CLK (gt0_rxusrclk2_i),
// .SYSTEM_RESET (gt0_rx_system_reset_c),
// .ERROR_COUNT_OUT (gt0_error_count_i),
// .TRACK_DATA_OUT (gt0_track_data_i)
// );
// assign gt1_frame_check_reset_i = (EXAMPLE_CONFIG_INDEPENDENT_LANES==0)?reset_on_data_error_i:gt1_matchn_i;
// in the "independent lanes" configuration, each of the lanes looks for the unique start char and
// in this case, the INC_IN port is tied off.
// Else, the data checking is triggered by the "master" lane
// assign gt1_inc_in_i = (EXAMPLE_CONFIG_INDEPENDENT_LANES==0)?gt0_inc_out_i:1'b0;
// gtx_aurora_x2_GT_FRAME_CHECK #
// (
// .RX_DATA_WIDTH ( 32 ),
// .RXCTRL_WIDTH ( 4 ),
// .COMMA_DOUBLE ( 16'h04bc ),
// .WORDS_IN_BRAM(EXAMPLE_WORDS_IN_BRAM),
// .START_OF_PACKET_CHAR ( 32'h060504bc )
// )
// gt1_frame_check
// (
// // GT Interface
// .RX_DATA_IN (gt1_rxdata_i),
// .RXCTRL_IN (gt1_rxcharisk_i),
// .RXENMCOMMADET_OUT (gt1_rxmcommaalignen_i),
// .RXENPCOMMADET_OUT (gt1_rxpcommaalignen_i),
// .RX_ENCHAN_SYNC_OUT ( ),
// .RX_CHANBOND_SEQ_IN (tied_to_ground_i),
// // Control Interface
// .INC_IN (gt1_inc_in_i),
// .INC_OUT (gt1_inc_out_i),
// .PATTERN_MATCHB_OUT (gt1_matchn_i),
// .RESET_ON_ERROR_IN (gt1_frame_check_reset_i),
// // System Interface
// .USER_CLK (gt1_rxusrclk2_i),
// .SYSTEM_RESET (gt1_rx_system_reset_c),
// .ERROR_COUNT_OUT (gt1_error_count_i),
// .TRACK_DATA_OUT (gt1_track_data_i)
// );
// assign TRACK_DATA_OUT = track_data_out_i;
// assign track_data_out_i =
// gt0_track_data_i &
// gt1_track_data_i ;
//-------------------------------------------------------------------------------------
//-------------------------Debug Signals assignment--------------------
assign gt0_rxlpmen_i = tied_to_vcc_i;
assign gt1_rxlpmen_i = tied_to_vcc_i;
//------------ optional Ports assignments --------------
assign gt0_rxprbscntreset_i = tied_to_ground_i;
assign gt0_rxprbssel_i = 0;
assign gt0_loopback_i = 0;
assign gt0_txdiffctrl_i = 0;
assign gt0_rxbufreset_i = tied_to_ground_i;
assign gt0_rxcdrhold_i = tied_to_ground_i;
//------GTH/GTP
assign gt0_rxdfelpmreset_i = tied_to_ground_i;
assign gt0_rxpmareset_i = tied_to_ground_i;
assign gt0_rxpolarity_i = tied_to_ground_i;
assign gt0_rxpd_i = 0;
assign gt0_txprecursor_i = 0;
assign gt0_txpostcursor_i = 0;
assign gt0_txchardispmode_i = 0;
assign gt0_txchardispval_i = 0;
assign gt0_txpolarity_i = tied_to_ground_i;
assign gt0_txpd_i = 0;
assign gt0_txprbsforceerr_i = tied_to_ground_i;
assign gt0_txprbssel_i = 0;
assign gt1_rxprbscntreset_i = tied_to_ground_i;
assign gt1_rxprbssel_i = 0;
assign gt1_loopback_i = 0;
assign gt1_txdiffctrl_i = 0;
assign gt1_rxbufreset_i = tied_to_ground_i;
assign gt1_rxcdrhold_i = tied_to_ground_i;
//------GTH/GTP
assign gt1_rxdfelpmreset_i = tied_to_ground_i;
assign gt1_rxpmareset_i = tied_to_ground_i;
assign gt1_rxpolarity_i = tied_to_ground_i;
assign gt1_rxpd_i = 0;
assign gt1_txprecursor_i = 0;
assign gt1_txpostcursor_i = 0;
assign gt1_txchardispmode_i = 0;
assign gt1_txchardispval_i = 0;
assign gt1_txpolarity_i = tied_to_ground_i;
assign gt1_txpd_i = 0;
assign gt1_txprbsforceerr_i = tied_to_ground_i;
assign gt1_txprbssel_i = 0;
//------------------------------------------------------
// assign resets for frame_gen modules
assign gt0_tx_system_reset_c = !gt0_txfsmresetdone_r2;
assign gt1_tx_system_reset_c = !gt1_txfsmresetdone_r2;
// assign resets for frame_check modules
assign gt0_rx_system_reset_c = !gt0_rxresetdone_r3;
assign gt1_rx_system_reset_c = !gt1_rxresetdone_r3;
assign gt0_drpaddr_i = 9'd0;
assign gt0_drpdi_i = 16'd0;
assign gt0_drpen_i = 1'b0;
assign gt0_drpwe_i = 1'b0;
assign gt1_drpaddr_i = 9'd0;
assign gt1_drpdi_i = 16'd0;
assign gt1_drpen_i = 1'b0;
assign gt1_drpwe_i = 1'b0;
assign soft_reset_i = tied_to_ground_i;
endmodule
3. 在线调试
调试思路:如果没有多余的板卡,你就用ip核进行回环调试,具体看ug476手册第88页进行配置(广子:上xianyu搜麻酱就烧饼,获取xilinx全系列文档手册),近端pcs和近端pma,如果这样调试通了,那基本没问题了。
TX链路:
可以很清晰的看到,当我的sys_on拉高的时候,经过编码后的数据包已经有效的发送出去了

RX链路:
可以看到,当我的vld有效的时候,接收到的正好是发送过来的顺序数,和发送的有效数据包一致!

vio调试:
说明:
1.sys_on_sim是总的系统启动信号
2.soft_vld是控制剩余的复位GT链路信号和回环测试的信号

有需要工程源码的同学上xianyu搜麻酱就烧饼找对应源码即可
感谢
创作不易,要是有帮到同学你的地方,我也感到高兴
感谢你能看到最后,好了求个赞赞行吗哈哈哈哈哈哈哈
有问题评论指出,或者你有好点的方法来实现结果,大家一起学习好吗哈哈哈哈哈哈
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)