ad_serdes- altera/xilinx sync
parent
67d4e71ff0
commit
a2d15acb89
|
@ -47,42 +47,42 @@ module ad_serdes_in #(
|
||||||
|
|
||||||
// reset and clocks
|
// reset and clocks
|
||||||
|
|
||||||
input rst,
|
input rst,
|
||||||
input clk,
|
input clk,
|
||||||
input div_clk,
|
input div_clk,
|
||||||
input loaden,
|
input loaden,
|
||||||
input [ 7:0] phase,
|
input [ 7:0] phase,
|
||||||
input locked,
|
input locked,
|
||||||
|
|
||||||
// data interface
|
// data interface
|
||||||
|
|
||||||
output [(DATA_WIDTH-1):0] data_s0,
|
output [(DATA_WIDTH-1):0] data_s0,
|
||||||
output [(DATA_WIDTH-1):0] data_s1,
|
output [(DATA_WIDTH-1):0] data_s1,
|
||||||
output [(DATA_WIDTH-1):0] data_s2,
|
output [(DATA_WIDTH-1):0] data_s2,
|
||||||
output [(DATA_WIDTH-1):0] data_s3,
|
output [(DATA_WIDTH-1):0] data_s3,
|
||||||
output [(DATA_WIDTH-1):0] data_s4,
|
output [(DATA_WIDTH-1):0] data_s4,
|
||||||
output [(DATA_WIDTH-1):0] data_s5,
|
output [(DATA_WIDTH-1):0] data_s5,
|
||||||
output [(DATA_WIDTH-1):0] data_s6,
|
output [(DATA_WIDTH-1):0] data_s6,
|
||||||
output [(DATA_WIDTH-1):0] data_s7,
|
output [(DATA_WIDTH-1):0] data_s7,
|
||||||
input [(DATA_WIDTH-1):0] data_in_p,
|
input [(DATA_WIDTH-1):0] data_in_p,
|
||||||
input [(DATA_WIDTH-1):0] data_in_n,
|
input [(DATA_WIDTH-1):0] data_in_n,
|
||||||
|
|
||||||
// delay-data interface
|
// delay-data interface
|
||||||
|
|
||||||
input up_clk,
|
input up_clk;
|
||||||
input up_dld,
|
input [(DATA_WIDTH-1):0] up_dld;
|
||||||
input [ 4:0] up_dwdata,
|
input [((DATA_WIDTH*5)-1):0] up_dwdata;
|
||||||
output [ 4:0] up_drdata,
|
output [((DATA_WIDTH*5)-1):0] up_drdata;
|
||||||
|
|
||||||
// delay-control interface
|
// delay-control interface
|
||||||
|
|
||||||
input delay_clk,
|
input delay_clk,
|
||||||
input delay_rst,
|
input delay_rst,
|
||||||
output delay_locked);
|
output delay_locked);
|
||||||
|
|
||||||
// internal signals
|
// internal signals
|
||||||
|
|
||||||
wire [(DATA_WIDTH-1):0] delay_locked_s;
|
wire [(DATA_WIDTH-1):0] delay_locked_s;
|
||||||
|
|
||||||
// assignments
|
// assignments
|
||||||
|
|
||||||
|
|
|
@ -34,54 +34,35 @@
|
||||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
// serial data output interface: serdes(x8) or oddr(x2) output module
|
// serial data output interface: serdes(x8)
|
||||||
|
|
||||||
`timescale 1ps/1ps
|
`timescale 1ps/1ps
|
||||||
|
|
||||||
module ad_serdes_clk (
|
module ad_serdes_clk #(
|
||||||
|
|
||||||
// clock and divided clock
|
|
||||||
|
|
||||||
mmcm_rst,
|
|
||||||
clk_in_p,
|
|
||||||
clk_in_n,
|
|
||||||
|
|
||||||
clk,
|
|
||||||
div_clk,
|
|
||||||
out_clk,
|
|
||||||
|
|
||||||
// drp interface
|
|
||||||
|
|
||||||
up_clk,
|
|
||||||
up_rstn,
|
|
||||||
up_drp_sel,
|
|
||||||
up_drp_wr,
|
|
||||||
up_drp_addr,
|
|
||||||
up_drp_wdata,
|
|
||||||
up_drp_rdata,
|
|
||||||
up_drp_ready,
|
|
||||||
up_drp_locked);
|
|
||||||
|
|
||||||
// parameters
|
// parameters
|
||||||
|
|
||||||
parameter SERDES_OR_DDR_N = 1;
|
parameter DDR_OR_SDR_N = 1,
|
||||||
parameter MMCM_OR_BUFR_N = 1;
|
parameter SERDES_FACTOR = 8,
|
||||||
parameter MMCM_DEVICE_TYPE = 0;
|
parameter MMCM_OR_BUFR_N = 1,
|
||||||
parameter MMCM_CLKIN_PERIOD = 1.667;
|
parameter MMCM_DEVICE_TYPE = 0,
|
||||||
parameter MMCM_VCO_DIV = 6;
|
parameter MMCM_CLKIN_PERIOD = 1.667,
|
||||||
parameter MMCM_VCO_MUL = 12.000;
|
parameter MMCM_VCO_DIV = 6,
|
||||||
parameter MMCM_CLK0_DIV = 2.000;
|
parameter MMCM_VCO_MUL = 12.000,
|
||||||
parameter MMCM_CLK1_DIV = 6;
|
parameter MMCM_CLK0_DIV = 2.000,
|
||||||
|
parameter MMCM_CLK1_DIV = 6) (
|
||||||
|
|
||||||
// clock and divided clock
|
// clock and divided clock
|
||||||
|
|
||||||
input mmcm_rst;
|
input rst;
|
||||||
input clk_in_p;
|
input clk_in_p;
|
||||||
input clk_in_n;
|
input clk_in_n;
|
||||||
|
|
||||||
output clk;
|
output clk;
|
||||||
output div_clk;
|
output div_clk;
|
||||||
output out_clk;
|
output out_clk;
|
||||||
|
output loaden;
|
||||||
|
output [ 7:0] phase,
|
||||||
|
|
||||||
// drp interface
|
// drp interface
|
||||||
|
|
||||||
|
@ -90,8 +71,8 @@ module ad_serdes_clk (
|
||||||
input up_drp_sel;
|
input up_drp_sel;
|
||||||
input up_drp_wr;
|
input up_drp_wr;
|
||||||
input [11:0] up_drp_addr;
|
input [11:0] up_drp_addr;
|
||||||
input [15:0] up_drp_wdata;
|
input [31:0] up_drp_wdata;
|
||||||
output [15:0] up_drp_rdata;
|
output [31:0] up_drp_rdata;
|
||||||
output up_drp_ready;
|
output up_drp_ready;
|
||||||
output up_drp_locked;
|
output up_drp_locked;
|
||||||
|
|
||||||
|
@ -99,6 +80,12 @@ module ad_serdes_clk (
|
||||||
|
|
||||||
wire clk_in_s;
|
wire clk_in_s;
|
||||||
|
|
||||||
|
// defaults
|
||||||
|
|
||||||
|
assign loaden = 'd0;
|
||||||
|
assign phase = 'd0;
|
||||||
|
assign up_drp_rdata[31:16] = 'd0;
|
||||||
|
|
||||||
// instantiations
|
// instantiations
|
||||||
|
|
||||||
IBUFGDS i_clk_in_ibuf (
|
IBUFGDS i_clk_in_ibuf (
|
||||||
|
@ -124,7 +111,7 @@ module ad_serdes_clk (
|
||||||
.clk (clk_in_s),
|
.clk (clk_in_s),
|
||||||
.clk2 (1'b0),
|
.clk2 (1'b0),
|
||||||
.clk_sel (1'b1),
|
.clk_sel (1'b1),
|
||||||
.mmcm_rst (mmcm_rst),
|
.mmcm_rst (rst),
|
||||||
.mmcm_clk_0 (clk),
|
.mmcm_clk_0 (clk),
|
||||||
.mmcm_clk_1 (div_clk),
|
.mmcm_clk_1 (div_clk),
|
||||||
.mmcm_clk_2 (out_clk),
|
.mmcm_clk_2 (out_clk),
|
||||||
|
@ -133,24 +120,13 @@ module ad_serdes_clk (
|
||||||
.up_drp_sel (up_drp_sel),
|
.up_drp_sel (up_drp_sel),
|
||||||
.up_drp_wr (up_drp_wr),
|
.up_drp_wr (up_drp_wr),
|
||||||
.up_drp_addr (up_drp_addr),
|
.up_drp_addr (up_drp_addr),
|
||||||
.up_drp_wdata (up_drp_wdata),
|
.up_drp_wdata (up_drp_wdata[15:0]),
|
||||||
.up_drp_rdata (up_drp_rdata),
|
.up_drp_rdata (up_drp_rdata[15:0]),
|
||||||
.up_drp_ready (up_drp_ready),
|
.up_drp_ready (up_drp_ready),
|
||||||
.up_drp_locked (up_drp_locked));
|
.up_drp_locked (up_drp_locked));
|
||||||
end
|
end
|
||||||
|
|
||||||
if ((MMCM_OR_BUFR_N == 0) && (SERDES_OR_DDR_N == 0)) begin
|
if (MMCM_OR_BUFR_N == 0) begin
|
||||||
BUFR #(.BUFR_DIVIDE("BYPASS")) i_clk_buf (
|
|
||||||
.CLR (1'b0),
|
|
||||||
.CE (1'b1),
|
|
||||||
.I (clk_in_s),
|
|
||||||
.O (clk));
|
|
||||||
|
|
||||||
assign div_clk = clk;
|
|
||||||
assign out_clk = clk;
|
|
||||||
end
|
|
||||||
|
|
||||||
if ((MMCM_OR_BUFR_N == 0) && (SERDES_OR_DDR_N == 1)) begin
|
|
||||||
BUFIO i_clk_buf (
|
BUFIO i_clk_buf (
|
||||||
.I (clk_in_s),
|
.I (clk_in_s),
|
||||||
.O (clk));
|
.O (clk));
|
||||||
|
|
|
@ -35,96 +35,67 @@
|
||||||
// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
// ***************************************************************************
|
|
||||||
// ***************************************************************************
|
|
||||||
`timescale 1ps/1ps
|
`timescale 1ps/1ps
|
||||||
|
|
||||||
module ad_serdes_in (
|
module ad_serdes_in #(
|
||||||
|
|
||||||
// reset and clocks
|
|
||||||
|
|
||||||
rst,
|
|
||||||
clk,
|
|
||||||
div_clk,
|
|
||||||
|
|
||||||
// data interface
|
|
||||||
|
|
||||||
data_s0,
|
|
||||||
data_s1,
|
|
||||||
data_s2,
|
|
||||||
data_s3,
|
|
||||||
data_s4,
|
|
||||||
data_s5,
|
|
||||||
data_s6,
|
|
||||||
data_s7,
|
|
||||||
data_in_p,
|
|
||||||
data_in_n,
|
|
||||||
|
|
||||||
// delay-data interface
|
|
||||||
|
|
||||||
up_clk,
|
|
||||||
up_dld,
|
|
||||||
up_dwdata,
|
|
||||||
up_drdata,
|
|
||||||
|
|
||||||
// delay-control interface
|
|
||||||
|
|
||||||
delay_clk,
|
|
||||||
delay_rst,
|
|
||||||
delay_locked);
|
|
||||||
|
|
||||||
// parameters
|
// parameters
|
||||||
|
|
||||||
parameter DEVICE_TYPE = 0;
|
parameter DEVICE_TYPE = 0,
|
||||||
parameter IODELAY_CTRL = 0;
|
parameter DDR_OR_SDR_N = 0,
|
||||||
parameter IODELAY_GROUP = "dev_if_delay_group";
|
parameter SERDES_FACTOR = 8,
|
||||||
// SDR = 0 / DDR = 1
|
parameter DATA_WIDTH = 16,
|
||||||
parameter DDR_OR_SDR_N = 0;
|
parameter IODELAY_CTRL = 0,
|
||||||
// serialization factor
|
parameter IODELAY_GROUP = "dev_if_delay_group") (
|
||||||
parameter DATA_WIDTH = 8;
|
|
||||||
|
|
||||||
localparam DEVICE_6SERIES = 1;
|
|
||||||
localparam DEVICE_7SERIES = 0;
|
|
||||||
localparam SDR = 0;
|
|
||||||
localparam DDR = 1;
|
|
||||||
|
|
||||||
// reset and clocks
|
// reset and clocks
|
||||||
|
|
||||||
input rst;
|
input rst;
|
||||||
input clk;
|
input clk;
|
||||||
input div_clk;
|
input div_clk;
|
||||||
|
input loaden,
|
||||||
|
input [ 7:0] phase,
|
||||||
|
input locked,
|
||||||
|
|
||||||
// data interface
|
// data interface
|
||||||
|
|
||||||
output data_s0;
|
output [(DATA_WIDTH-1):0] data_s0;
|
||||||
output data_s1;
|
output [(DATA_WIDTH-1):0] data_s1;
|
||||||
output data_s2;
|
output [(DATA_WIDTH-1):0] data_s2;
|
||||||
output data_s3;
|
output [(DATA_WIDTH-1):0] data_s3;
|
||||||
output data_s4;
|
output [(DATA_WIDTH-1):0] data_s4;
|
||||||
output data_s5;
|
output [(DATA_WIDTH-1):0] data_s5;
|
||||||
output data_s6;
|
output [(DATA_WIDTH-1):0] data_s6;
|
||||||
output data_s7;
|
output [(DATA_WIDTH-1):0] data_s7;
|
||||||
input data_in_p;
|
input [(DATA_WIDTH-1):0] data_in_p;
|
||||||
input data_in_n;
|
input [(DATA_WIDTH-1):0] data_in_n;
|
||||||
|
|
||||||
// delay-data interface
|
// delay-data interface
|
||||||
|
|
||||||
input up_clk;
|
input up_clk;
|
||||||
input up_dld;
|
input [(DATA_WIDTH-1):0] up_dld;
|
||||||
input [ 4:0] up_dwdata;
|
input [((DATA_WIDTH*5)-1):0] up_dwdata;
|
||||||
output [ 4:0] up_drdata;
|
output [((DATA_WIDTH*5)-1):0] up_drdata;
|
||||||
|
|
||||||
// delay-control interface
|
// delay-control interface
|
||||||
input delay_clk;
|
|
||||||
input delay_rst;
|
input delay_clk;
|
||||||
output delay_locked;
|
input delay_rst;
|
||||||
|
output delay_locked;
|
||||||
|
|
||||||
// internal signals
|
// internal signals
|
||||||
|
|
||||||
wire data_in_ibuf_s;
|
wire [(DATA_WIDTH-1):0] data_in_ibuf_s;
|
||||||
wire data_in_idelay_s;
|
wire [(DATA_WIDTH-1):0] data_in_idelay_s;
|
||||||
wire data_shift1_s;
|
wire [(DATA_WIDTH-1):0] data_shift1_s;
|
||||||
wire data_shift2_s;
|
wire [(DATA_WIDTH-1):0] data_shift2_s;
|
||||||
|
|
||||||
|
// parameters
|
||||||
|
|
||||||
|
localparam DEVICE_6SERIES = 1;
|
||||||
|
localparam DEVICE_7SERIES = 0;
|
||||||
|
localparam DATA_RATE = (DDR_OR_SDR_N == 1) ? "DDR" : "SDR";
|
||||||
|
|
||||||
// delay controller
|
// delay controller
|
||||||
|
|
||||||
|
@ -142,257 +113,210 @@ module ad_serdes_in (
|
||||||
|
|
||||||
// received data interface: ibuf -> idelay -> iserdes
|
// received data interface: ibuf -> idelay -> iserdes
|
||||||
|
|
||||||
|
genvar l_inst;
|
||||||
|
generate
|
||||||
|
for (l_inst = 0; l_inst <= (DATA_WIDTH-1); l_inst = l_inst + 1) begin: g_data
|
||||||
|
|
||||||
IBUFDS i_ibuf (
|
IBUFDS i_ibuf (
|
||||||
.O(data_in_ibuf_s),
|
.I (data_in_p[l_inst]),
|
||||||
.I(data_in_p),
|
.IB (data_in_n[l_inst]),
|
||||||
.IB(data_in_n)
|
.O (data_in_ibuf_s[l_inst]));
|
||||||
);
|
|
||||||
|
|
||||||
if(DEVICE_TYPE == DEVICE_7SERIES) begin
|
if (DEVICE_TYPE == DEVICE_7SERIES) begin
|
||||||
(* IODELAY_GROUP = IODELAY_GROUP *)
|
(* IODELAY_GROUP = IODELAY_GROUP *)
|
||||||
|
IDELAYE2 #(
|
||||||
IDELAYE2 #(
|
.CINVCTRL_SEL ("FALSE"),
|
||||||
.CINVCTRL_SEL ("FALSE"),
|
.DELAY_SRC ("IDATAIN"),
|
||||||
.DELAY_SRC ("IDATAIN"),
|
.HIGH_PERFORMANCE_MODE ("FALSE"),
|
||||||
.HIGH_PERFORMANCE_MODE ("FALSE"),
|
.IDELAY_TYPE ("VAR_LOAD"),
|
||||||
.IDELAY_TYPE ("VAR_LOAD"),
|
.IDELAY_VALUE (0),
|
||||||
.IDELAY_VALUE (0),
|
.REFCLK_FREQUENCY (200.0),
|
||||||
.REFCLK_FREQUENCY (200.0),
|
.PIPE_SEL ("FALSE"),
|
||||||
.PIPE_SEL ("FALSE"),
|
.SIGNAL_PATTERN ("DATA"))
|
||||||
.SIGNAL_PATTERN ("DATA"))
|
i_idelay (
|
||||||
i_rx_data_idelay (
|
.CE (1'b0),
|
||||||
.CE (1'b0),
|
.INC (1'b0),
|
||||||
.INC (1'b0),
|
.DATAIN (1'b0),
|
||||||
.DATAIN (1'b0),
|
.LDPIPEEN (1'b0),
|
||||||
.LDPIPEEN (1'b0),
|
.CINVCTRL (1'b0),
|
||||||
.CINVCTRL (1'b0),
|
.REGRST (1'b0),
|
||||||
.REGRST (1'b0),
|
.C (up_clk),
|
||||||
.C (up_clk),
|
.IDATAIN (data_in_ibuf_s[l_inst]),
|
||||||
.IDATAIN (data_in_ibuf_s),
|
.DATAOUT (data_in_idelay_s[l_inst]),
|
||||||
.DATAOUT (data_in_idelay_s),
|
.LD (up_dld[l_inst]),
|
||||||
.LD (up_dld),
|
.CNTVALUEIN (up_dwdata[((5*l_inst)+4):(5*l_inst)),
|
||||||
.CNTVALUEIN (up_dwdata),
|
.CNTVALUEOUT (up_drdata[((5*l_inst)+4):(5*l_inst)));
|
||||||
.CNTVALUEOUT (up_drdata));
|
end
|
||||||
|
if(DEVICE_TYPE == DEVICE_6SERIES) begin
|
||||||
// Note: The first sample in time will be data_s7, the last data_s0!
|
(* IODELAY_GROUP = IODELAY_GROUP *)
|
||||||
if(DDR_OR_SDR_N == SDR) begin
|
IODELAYE1 #(
|
||||||
ISERDESE2 #(
|
.CINVCTRL_SEL ("FALSE"),
|
||||||
.DATA_RATE("SDR"),
|
.DELAY_SRC ("I"),
|
||||||
.DATA_WIDTH(DATA_WIDTH),
|
.HIGH_PERFORMANCE_MODE ("TRUE"),
|
||||||
.DYN_CLKDIV_INV_EN("FALSE"),
|
.IDELAY_TYPE ("VAR_LOADABLE"),
|
||||||
.DYN_CLK_INV_EN("FALSE"),
|
.IDELAY_VALUE (0),
|
||||||
.INIT_Q1(1'b0),
|
.ODELAY_TYPE ("FIXED"),
|
||||||
.INIT_Q2(1'b0),
|
.ODELAY_VALUE (0),
|
||||||
.INIT_Q3(1'b0),
|
.REFCLK_FREQUENCY (200.0),
|
||||||
.INIT_Q4(1'b0),
|
.SIGNAL_PATTERN ("DATA"))
|
||||||
.INTERFACE_TYPE("NETWORKING"),
|
i_idelay (
|
||||||
.IOBDELAY("IFD"),
|
.T (1'b1),
|
||||||
.NUM_CE(2),
|
.CE (1'b0),
|
||||||
.OFB_USED("FALSE"),
|
.INC (1'b0),
|
||||||
.SERDES_MODE("MASTER"),
|
.CLKIN (1'b0),
|
||||||
.SRVAL_Q1(1'b0),
|
.DATAIN (1'b0),
|
||||||
.SRVAL_Q2(1'b0),
|
.ODATAIN (1'b0),
|
||||||
.SRVAL_Q3(1'b0),
|
.CINVCTRL (1'b0),
|
||||||
.SRVAL_Q4(1'b0))
|
.C (up_clk),
|
||||||
ISERDESE2_inst (
|
.IDATAIN (data_in_ibuf_s[l_inst]),
|
||||||
.O(),
|
.DATAOUT (data_in_idelay_s[l_inst]),
|
||||||
.Q1(data_s0),
|
.RST (up_dld[l_inst]),
|
||||||
.Q2(data_s1),
|
.CNTVALUEIN (up_dwdata[((5*l_inst)+4):(5*l_inst)]),
|
||||||
.Q3(data_s2),
|
.CNTVALUEOUT (up_drdata[((5*l_inst)+4):(5*l_inst)]));
|
||||||
.Q4(data_s3),
|
|
||||||
.Q5(data_s4),
|
|
||||||
.Q6(data_s5),
|
|
||||||
.Q7(data_s6),
|
|
||||||
.Q8(data_s7),
|
|
||||||
.SHIFTOUT1(),
|
|
||||||
.SHIFTOUT2(),
|
|
||||||
.BITSLIP(1'b0),
|
|
||||||
.CE1(1'b1),
|
|
||||||
.CE2(1'b1),
|
|
||||||
.CLKDIVP(1'b0),
|
|
||||||
.CLK(clk),
|
|
||||||
.CLKB(~clk),
|
|
||||||
.CLKDIV(div_clk),
|
|
||||||
.OCLK(1'b0),
|
|
||||||
.DYNCLKDIVSEL(1'b0),
|
|
||||||
.DYNCLKSEL(1'b0),
|
|
||||||
.D(1'b0),
|
|
||||||
.DDLY(data_in_idelay_s),
|
|
||||||
.OFB(1'b0),
|
|
||||||
.OCLKB(1'b0),
|
|
||||||
.RST(rst),
|
|
||||||
.SHIFTIN1(1'b0),
|
|
||||||
.SHIFTIN2(1'b0)
|
|
||||||
);
|
|
||||||
end else begin
|
|
||||||
|
|
||||||
ISERDESE2 #(
|
|
||||||
.DATA_RATE("DDR"),
|
|
||||||
.DATA_WIDTH(DATA_WIDTH),
|
|
||||||
.DYN_CLKDIV_INV_EN("FALSE"),
|
|
||||||
.DYN_CLK_INV_EN("FALSE"),
|
|
||||||
.INIT_Q1(1'b0),
|
|
||||||
.INIT_Q2(1'b0),
|
|
||||||
.INIT_Q3(1'b0),
|
|
||||||
.INIT_Q4(1'b0),
|
|
||||||
.INTERFACE_TYPE("NETWORKING"),
|
|
||||||
.IOBDELAY("IFD"),
|
|
||||||
.NUM_CE(2),
|
|
||||||
.OFB_USED("FALSE"),
|
|
||||||
.SERDES_MODE("MASTER"),
|
|
||||||
.SRVAL_Q1(1'b0),
|
|
||||||
.SRVAL_Q2(1'b0),
|
|
||||||
.SRVAL_Q3(1'b0),
|
|
||||||
.SRVAL_Q4(1'b0))
|
|
||||||
ISERDESE2_inst (
|
|
||||||
.O(),
|
|
||||||
.Q1(data_s0),
|
|
||||||
.Q2(data_s1),
|
|
||||||
.Q3(data_s2),
|
|
||||||
.Q4(data_s3),
|
|
||||||
.Q5(data_s4),
|
|
||||||
.Q6(data_s5),
|
|
||||||
.Q7(data_s6),
|
|
||||||
.Q8(data_s7),
|
|
||||||
.SHIFTOUT1(),
|
|
||||||
.SHIFTOUT2(),
|
|
||||||
.BITSLIP(1'b0),
|
|
||||||
.CE1(1'b1),
|
|
||||||
.CE2(1'b1),
|
|
||||||
.CLKDIVP(1'b0),
|
|
||||||
.CLK(clk),
|
|
||||||
.CLKB(~clk),
|
|
||||||
.CLKDIV(div_clk),
|
|
||||||
.OCLK(1'b0),
|
|
||||||
.DYNCLKDIVSEL(1'b0),
|
|
||||||
.DYNCLKSEL(1'b0),
|
|
||||||
.D(1'b0),
|
|
||||||
.DDLY(data_in_idelay_s),
|
|
||||||
.OFB(1'b0),
|
|
||||||
.OCLKB(1'b0),
|
|
||||||
.RST(rst),
|
|
||||||
.SHIFTIN1(1'b0),
|
|
||||||
.SHIFTIN2(1'b0)
|
|
||||||
);
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if(DEVICE_TYPE == DEVICE_6SERIES) begin
|
if (DEVICE_TYPE == DEVICE_7SERIES) begin
|
||||||
(* IODELAY_GROUP = IODELAY_GROUP *)
|
ISERDESE2 #(
|
||||||
IODELAYE1 #(
|
.DATA_RATE (DATA_RATE),
|
||||||
.CINVCTRL_SEL ("FALSE"),
|
.DATA_WIDTH (8),
|
||||||
.DELAY_SRC ("I"),
|
.DYN_CLKDIV_INV_EN ("FALSE"),
|
||||||
.HIGH_PERFORMANCE_MODE ("TRUE"),
|
.DYN_CLK_INV_EN ("FALSE"),
|
||||||
.IDELAY_TYPE ("VAR_LOADABLE"),
|
.INIT_Q1 (1'b0),
|
||||||
.IDELAY_VALUE (0),
|
.INIT_Q2 (1'b0),
|
||||||
.ODELAY_TYPE ("FIXED"),
|
.INIT_Q3 (1'b0),
|
||||||
.ODELAY_VALUE (0),
|
.INIT_Q4 (1'b0),
|
||||||
.REFCLK_FREQUENCY (200.0),
|
.INTERFACE_TYPE ("NETWORKING"),
|
||||||
.SIGNAL_PATTERN ("DATA"))
|
.IOBDELAY ("IFD"),
|
||||||
i_rx_data_idelay (
|
.NUM_CE (2),
|
||||||
.T (1'b1),
|
.OFB_USED ("FALSE"),
|
||||||
.CE (1'b0),
|
.SERDES_MODE ("MASTER"),
|
||||||
.INC (1'b0),
|
.SRVAL_Q1 (1'b0),
|
||||||
.CLKIN (1'b0),
|
.SRVAL_Q2 (1'b0),
|
||||||
.DATAIN (1'b0),
|
.SRVAL_Q3 (1'b0),
|
||||||
.ODATAIN (1'b0),
|
.SRVAL_Q4 (1'b0))
|
||||||
.CINVCTRL (1'b0),
|
i_iserdes (
|
||||||
.C (up_clk),
|
.O (),
|
||||||
.IDATAIN (data_in_ibuf_s),
|
.Q1 (data_s0[l_inst]),
|
||||||
.DATAOUT (data_in_idelay_s),
|
.Q2 (data_s1[l_inst]),
|
||||||
.RST (up_dld),
|
.Q3 (data_s2[l_inst]),
|
||||||
.CNTVALUEIN (up_dwdata),
|
.Q4 (data_s3[l_inst]),
|
||||||
.CNTVALUEOUT (up_drdata));
|
.Q5 (data_s4[l_inst]),
|
||||||
|
.Q6 (data_s5[l_inst]),
|
||||||
|
.Q7 (data_s6[l_inst]),
|
||||||
|
.Q8 (data_s7[l_inst]),
|
||||||
|
.SHIFTOUT1 (),
|
||||||
|
.SHIFTOUT2 (),
|
||||||
|
.BITSLIP (1'b0),
|
||||||
|
.CE1 (1'b1),
|
||||||
|
.CE2 (1'b1),
|
||||||
|
.CLKDIVP (1'b0),
|
||||||
|
.CLK (clk),
|
||||||
|
.CLKB (~clk),
|
||||||
|
.CLKDIV (div_clk),
|
||||||
|
.OCLK (1'b0),
|
||||||
|
.DYNCLKDIVSEL (1'b0),
|
||||||
|
.DYNCLKSEL (1'b0),
|
||||||
|
.D (1'b0),
|
||||||
|
.DDLY (data_in_idelay_s[l_inst]),
|
||||||
|
.OFB (1'b0),
|
||||||
|
.OCLKB (1'b0),
|
||||||
|
.RST (rst),
|
||||||
|
.SHIFTIN1 (1'b0),
|
||||||
|
.SHIFTIN2 (1'b0));
|
||||||
|
end
|
||||||
|
if (DEVICE_TYPE == DEVICE_6SERIES) begin
|
||||||
|
ISERDESE1 #(
|
||||||
|
.DATA_RATE (DATA_RATE),
|
||||||
|
.DATA_WIDTH (8),
|
||||||
|
.DYN_CLKDIV_INV_EN ("FALSE"),
|
||||||
|
.DYN_CLK_INV_EN ("FALSE"),
|
||||||
|
.INIT_Q1 (1'b0),
|
||||||
|
.INIT_Q2 (1'b0),
|
||||||
|
.INIT_Q3 (1'b0),
|
||||||
|
.INIT_Q4 (1'b0),
|
||||||
|
.INTERFACE_TYPE ("NETWORKING"),
|
||||||
|
.IOBDELAY ("NONE"),
|
||||||
|
.NUM_CE (1),
|
||||||
|
.OFB_USED ("FALSE"),
|
||||||
|
.SERDES_MODE ("MASTER"),
|
||||||
|
.SRVAL_Q1 (1'b0),
|
||||||
|
.SRVAL_Q2 (1'b0),
|
||||||
|
.SRVAL_Q3 (1'b0),
|
||||||
|
.SRVAL_Q4 (1'b0))
|
||||||
|
i_iserdes_m (
|
||||||
|
.O (),
|
||||||
|
.Q1 (data_s0[l_inst]),
|
||||||
|
.Q2 (data_s1[l_inst]),
|
||||||
|
.Q3 (data_s2[l_inst]),
|
||||||
|
.Q4 (data_s3[l_inst]),
|
||||||
|
.Q5 (data_s4[l_inst]),
|
||||||
|
.Q6 (data_s5[l_inst]),
|
||||||
|
.SHIFTOUT1 (data_shift1_s[l_inst]),
|
||||||
|
.SHIFTOUT2 (data_shift2_s[l_inst]),
|
||||||
|
.BITSLIP (1'b0),
|
||||||
|
.CE1 (1'b1),
|
||||||
|
.CE2 (1'b1),
|
||||||
|
.CLK (clk),
|
||||||
|
.CLKB (~clk),
|
||||||
|
.CLKDIV (div_clk),
|
||||||
|
.OCLK (1'b0),
|
||||||
|
.DYNCLKDIVSEL (1'b0),
|
||||||
|
.DYNCLKSEL (1'b0),
|
||||||
|
.D (1'b0),
|
||||||
|
.DDLY (data_in_idelay_s[l_inst]),
|
||||||
|
.OFB (1'b0),
|
||||||
|
.RST (rst),
|
||||||
|
.SHIFTIN1 (1'b0),
|
||||||
|
.SHIFTIN2 (1'b0));
|
||||||
|
|
||||||
ISERDESE1 #(
|
ISERDESE1 #(
|
||||||
.DATA_RATE("DDR"),
|
.DATA_RATE (DATA_RATE),
|
||||||
.DATA_WIDTH(DATA_WIDTH),
|
.DATA_WIDTH (8),
|
||||||
.DYN_CLKDIV_INV_EN("FALSE"),
|
.DYN_CLKDIV_INV_EN ("FALSE"),
|
||||||
.DYN_CLK_INV_EN("FALSE"),
|
.DYN_CLK_INV_EN ("FALSE"),
|
||||||
.INIT_Q1(1'b0),
|
.INIT_Q1 (1'b0),
|
||||||
.INIT_Q2(1'b0),
|
.INIT_Q2 (1'b0),
|
||||||
.INIT_Q3(1'b0),
|
.INIT_Q3 (1'b0),
|
||||||
.INIT_Q4(1'b0),
|
.INIT_Q4 (1'b0),
|
||||||
.INTERFACE_TYPE("NETWORKING"),
|
.INTERFACE_TYPE ("NETWORKING"),
|
||||||
.IOBDELAY("NONE"),
|
.IOBDELAY ("NONE"),
|
||||||
.NUM_CE(1),
|
.NUM_CE (1),
|
||||||
.OFB_USED("FALSE"),
|
.OFB_USED ("FALSE"),
|
||||||
.SERDES_MODE("MASTER"),
|
.SERDES_MODE ("SLAVE"),
|
||||||
.SRVAL_Q1(1'b0),
|
.SRVAL_Q1 (1'b0),
|
||||||
.SRVAL_Q2(1'b0),
|
.SRVAL_Q2 (1'b0),
|
||||||
.SRVAL_Q3(1'b0),
|
.SRVAL_Q3 (1'b0),
|
||||||
.SRVAL_Q4(1'b0))
|
.SRVAL_Q4 (1'b0))
|
||||||
i_serdes_m (
|
i_iserdes_s (
|
||||||
.O(),
|
.O (),
|
||||||
.Q1(data_s0),
|
.Q1 (),
|
||||||
.Q2(data_s1),
|
.Q2 (),
|
||||||
.Q3(data_s2),
|
.Q3 (data_s6[l_inst]),
|
||||||
.Q4(data_s3),
|
.Q4 (data_s7[l_inst]),
|
||||||
.Q5(data_s4),
|
.Q5 (),
|
||||||
.Q6(data_s5),
|
.Q6 (),
|
||||||
.SHIFTOUT1(data_shift1_s),
|
.SHIFTOUT1 (),
|
||||||
.SHIFTOUT2(data_shift2_s),
|
.SHIFTOUT2 (),
|
||||||
.BITSLIP(1'b0),
|
.BITSLIP (1'b0),
|
||||||
.CE1(1'b1),
|
.CE1 (1'b1),
|
||||||
.CE2(1'b1),
|
.CE2 (1'b1),
|
||||||
.CLK(clk),
|
.CLK (clk),
|
||||||
.CLKB(1'b0),
|
.CLKB (~clk),
|
||||||
.CLKDIV(div_clk),
|
.CLKDIV (div_clk),
|
||||||
.OCLK(1'b0),
|
.OCLK (1'b0),
|
||||||
.DYNCLKDIVSEL(1'b0),
|
.DYNCLKDIVSEL (1'b0),
|
||||||
.DYNCLKSEL(1'b0),
|
.DYNCLKSEL (1'b0),
|
||||||
.D(data_in_idelay_s),
|
.D (1'b0),
|
||||||
.DDLY(1'b0),
|
.DDLY (data_in_idelay_s[l_inst]),
|
||||||
.OFB(1'b0),
|
.OFB (1'b0),
|
||||||
.RST(rst),
|
.RST (rst),
|
||||||
.SHIFTIN1(1'b0),
|
.SHIFTIN1 (data_shift1_s[l_inst]),
|
||||||
.SHIFTIN2(1'b0)
|
.SHIFTIN2 (data_shift2_s[l_inst]));
|
||||||
);
|
end
|
||||||
|
end
|
||||||
ISERDESE1 #(
|
endgenerate
|
||||||
.DATA_RATE("DDR"),
|
|
||||||
.DATA_WIDTH(DATA_WIDTH),
|
|
||||||
.DYN_CLKDIV_INV_EN("FALSE"),
|
|
||||||
.DYN_CLK_INV_EN("FALSE"),
|
|
||||||
.INIT_Q1(1'b0),
|
|
||||||
.INIT_Q2(1'b0),
|
|
||||||
.INIT_Q3(1'b0),
|
|
||||||
.INIT_Q4(1'b0),
|
|
||||||
.INTERFACE_TYPE("NETWORKING"),
|
|
||||||
.IOBDELAY("NONE"),
|
|
||||||
.NUM_CE(1),
|
|
||||||
.OFB_USED("FALSE"),
|
|
||||||
.SERDES_MODE("SLAVE"),
|
|
||||||
.SRVAL_Q1(1'b0),
|
|
||||||
.SRVAL_Q2(1'b0),
|
|
||||||
.SRVAL_Q3(1'b0),
|
|
||||||
.SRVAL_Q4(1'b0))
|
|
||||||
i_serdes_s (
|
|
||||||
.O(),
|
|
||||||
.Q1(),
|
|
||||||
.Q2(),
|
|
||||||
.Q3(data_s6),
|
|
||||||
.Q4(data_s7),
|
|
||||||
.Q5(),
|
|
||||||
.Q6(),
|
|
||||||
.SHIFTOUT1(),
|
|
||||||
.SHIFTOUT2(),
|
|
||||||
.BITSLIP(1'b0),
|
|
||||||
.CE1(1'b1),
|
|
||||||
.CE2(1'b1),
|
|
||||||
.CLK(clk),
|
|
||||||
.CLKB(1'b0),
|
|
||||||
.CLKDIV(div_clk),
|
|
||||||
.OCLK(1'b0),
|
|
||||||
.DYNCLKDIVSEL(1'b0),
|
|
||||||
.DYNCLKSEL(1'b0),
|
|
||||||
.D(1'b0),
|
|
||||||
.DDLY(1'b0),
|
|
||||||
.OFB(1'b0),
|
|
||||||
.RST(rst),
|
|
||||||
.SHIFTIN1(data_shift1_s),
|
|
||||||
.SHIFTIN2(data_shift2_s));
|
|
||||||
end
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// ***************************************************************************
|
||||||
|
|
|
@ -34,91 +34,57 @@
|
||||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
// ***************************************************************************
|
// serial data output interface: serdes(x8)
|
||||||
// ***************************************************************************
|
|
||||||
// serial data output interface: serdes(x8) or oddr(x2) output module
|
|
||||||
|
|
||||||
`timescale 1ps/1ps
|
`timescale 1ps/1ps
|
||||||
|
|
||||||
module ad_serdes_out (
|
module ad_serdes_out #(
|
||||||
|
|
||||||
// reset and clocks
|
|
||||||
|
|
||||||
rst,
|
|
||||||
clk,
|
|
||||||
div_clk,
|
|
||||||
|
|
||||||
// data interface
|
|
||||||
|
|
||||||
data_s0,
|
|
||||||
data_s1,
|
|
||||||
data_s2,
|
|
||||||
data_s3,
|
|
||||||
data_s4,
|
|
||||||
data_s5,
|
|
||||||
data_s6,
|
|
||||||
data_s7,
|
|
||||||
data_out_p,
|
|
||||||
data_out_n);
|
|
||||||
|
|
||||||
// parameters
|
// parameters
|
||||||
|
|
||||||
parameter DEVICE_TYPE = 0;
|
parameter DEVICE_TYPE = 0,
|
||||||
parameter SERDES_OR_DDR_N = 1;
|
parameter DDR_OR_SDR_N = 1,
|
||||||
parameter DATA_WIDTH = 16;
|
parameter SERDES_FACTOR = 8,
|
||||||
|
parameter DATA_WIDTH = 16) (
|
||||||
|
|
||||||
localparam DEVICE_6SERIES = 1;
|
|
||||||
localparam DEVICE_7SERIES = 0;
|
|
||||||
localparam DW = DATA_WIDTH - 1;
|
|
||||||
|
|
||||||
// reset and clocks
|
// reset and clocks
|
||||||
|
|
||||||
input rst;
|
input rst;
|
||||||
input clk;
|
input clk;
|
||||||
input div_clk;
|
input div_clk;
|
||||||
|
input loaden;
|
||||||
|
|
||||||
// data interface
|
// data interface
|
||||||
|
|
||||||
input [DW:0] data_s0;
|
input [(DATA_WIDTH-1):0] data_s0;
|
||||||
input [DW:0] data_s1;
|
input [(DATA_WIDTH-1):0] data_s1;
|
||||||
input [DW:0] data_s2;
|
input [(DATA_WIDTH-1):0] data_s2;
|
||||||
input [DW:0] data_s3;
|
input [(DATA_WIDTH-1):0] data_s3;
|
||||||
input [DW:0] data_s4;
|
input [(DATA_WIDTH-1):0] data_s4;
|
||||||
input [DW:0] data_s5;
|
input [(DATA_WIDTH-1):0] data_s5;
|
||||||
input [DW:0] data_s6;
|
input [(DATA_WIDTH-1):0] data_s6;
|
||||||
input [DW:0] data_s7;
|
input [(DATA_WIDTH-1):0] data_s7;
|
||||||
output [DW:0] data_out_p;
|
output [(DATA_WIDTH-1):0] data_out_p;
|
||||||
output [DW:0] data_out_n;
|
output [(DATA_WIDTH-1):0] data_out_n;
|
||||||
|
|
||||||
// internal signals
|
// internal signals
|
||||||
|
|
||||||
wire [DW:0] data_out_s;
|
wire [(DATA_WIDTH-1):0] data_out_s;
|
||||||
wire [DW:0] serdes_shift1_s;
|
wire [(DATA_WIDTH-1):0] serdes_shift1_s;
|
||||||
wire [DW:0] serdes_shift2_s;
|
wire [(DATA_WIDTH-1):0] serdes_shift2_s;
|
||||||
|
|
||||||
|
// parameters
|
||||||
|
|
||||||
|
localparam DEVICE_6SERIES = 1;
|
||||||
|
localparam DEVICE_7SERIES = 0;
|
||||||
|
|
||||||
// instantiations
|
// instantiations
|
||||||
|
|
||||||
genvar l_inst;
|
genvar l_inst;
|
||||||
generate
|
generate
|
||||||
for (l_inst = 0; l_inst <= DW; l_inst = l_inst + 1) begin: g_data
|
for (l_inst = 0; l_inst <= (DATA_WIDTH-1); l_inst = l_inst + 1) begin: g_data
|
||||||
|
|
||||||
if (SERDES_OR_DDR_N == 0) begin
|
if (DEVICE_TYPE == DEVICE_7SERIES) begin
|
||||||
ODDR #(
|
|
||||||
.DDR_CLK_EDGE ("SAME_EDGE"),
|
|
||||||
.INIT (1'b0),
|
|
||||||
.SRTYPE ("ASYNC"))
|
|
||||||
i_oddr (
|
|
||||||
.S (1'b0),
|
|
||||||
.CE (1'b1),
|
|
||||||
.R (rst),
|
|
||||||
.C (clk),
|
|
||||||
.D1 (data_s0[l_inst]),
|
|
||||||
.D2 (data_s1[l_inst]),
|
|
||||||
.Q (data_out_s[l_inst]));
|
|
||||||
end
|
|
||||||
|
|
||||||
if ((SERDES_OR_DDR_N == 1) && (DEVICE_TYPE == DEVICE_7SERIES)) begin
|
|
||||||
OSERDESE2 #(
|
OSERDESE2 #(
|
||||||
.DATA_RATE_OQ ("DDR"),
|
.DATA_RATE_OQ ("DDR"),
|
||||||
.DATA_RATE_TQ ("SDR"),
|
.DATA_RATE_TQ ("SDR"),
|
||||||
|
@ -155,7 +121,7 @@ module ad_serdes_out (
|
||||||
.RST (rst));
|
.RST (rst));
|
||||||
end
|
end
|
||||||
|
|
||||||
if ((SERDES_OR_DDR_N == 1) && (DEVICE_TYPE == DEVICE_6SERIES)) begin
|
if (DEVICE_TYPE == DEVICE_6SERIES) begin
|
||||||
OSERDESE1 #(
|
OSERDESE1 #(
|
||||||
.DATA_RATE_OQ ("DDR"),
|
.DATA_RATE_OQ ("DDR"),
|
||||||
.DATA_RATE_TQ ("SDR"),
|
.DATA_RATE_TQ ("SDR"),
|
||||||
|
|
Loading…
Reference in New Issue