blob: cc0cbb285fa52c3be3876dc69d61b498cfdc8e20 [file] [log] [blame] [edit]
`default_nettype none
// ============================================================================
module serdes_test #
(
parameter DATA_WIDTH = 8,
parameter DATA_RATE = "DDR"
)
(
input wire SYSCLK,
input wire CLKDIV,
input wire RST,
input wire I_DAT,
output wire O_DAT,
output wire T_DAT,
input wire [7:0] INPUTS,
output wire [7:0] OUTPUTS
);
// ============================================================================
// CLKDIV generation using a BUFR
wire i_rstdiv;
// ISERDES reset generator
reg [3:0] rst_sr;
initial rst_sr <= 4'hF;
always @(posedge CLKDIV)
if (RST) rst_sr <= 4'hF;
else rst_sr <= rst_sr >> 1;
assign i_rstdiv = rst_sr[0];
// OSERDES
OSERDESE2 #(
.DATA_RATE_OQ (DATA_RATE),
.DATA_WIDTH (DATA_WIDTH),
.DATA_RATE_TQ ((DATA_RATE == "DDR" && DATA_WIDTH == 4) ? "DDR" : "BUF"),
.TRISTATE_WIDTH ((DATA_RATE == "DDR" && DATA_WIDTH == 4) ? 4 : 1)
)
oserdes
(
.CLK (SYSCLK),
.CLKDIV (CLKDIV),
.RST (i_rstdiv),
.OCE (1'b1),
.D1 (INPUTS[0]),
.D2 (INPUTS[1]),
.D3 (INPUTS[2]),
.D4 (INPUTS[3]),
.D5 (INPUTS[4]),
.D6 (INPUTS[5]),
.D7 (INPUTS[6]),
.D8 (INPUTS[7]),
.OQ (O_DAT),
.TCE (1'b1),
.T1 (1'b0), // All 0 to keep OBUFT always on.
.T2 (1'b0),
.T3 (1'b0),
.T4 (1'b0),
.TQ (T_DAT)
);
// ============================================================================
// ISERDES
ISERDESE2 #
(
.DATA_RATE (DATA_RATE),
.DATA_WIDTH (DATA_WIDTH),
.INTERFACE_TYPE ("NETWORKING"),
.NUM_CE (2)
)
iserdes
(
.CLK (SYSCLK),
.CLKB (SYSCLK),
.CLKDIV (CLKDIV),
.CE1 (1'b1),
.CE2 (1'b1),
.RST (i_rstdiv),
.D (I_DAT),
.Q1 (OUTPUTS[7]),
.Q2 (OUTPUTS[6]),
.Q3 (OUTPUTS[5]),
.Q4 (OUTPUTS[4]),
.Q5 (OUTPUTS[3]),
.Q6 (OUTPUTS[2]),
.Q7 (OUTPUTS[1]),
.Q8 (OUTPUTS[0])
);
endmodule