blob: 8fa32671afa4368b9f1d5f7371554cfc4561ffd8 [file] [log] [blame]
`include "src/lfsr.v"
`include "src/oserdes_test.v"
`include "src/comparator.v"
`default_nettype none
// ============================================================================
module top
(
input wire clk,
input wire rx,
output wire tx,
input wire [15:0] sw,
output wire [15:0] led,
inout wire [9:0] io
);
// ============================================================================
// Clock & reset
reg [3:0] rst_sr;
initial rst_sr <= 4'hF;
always @(posedge clk)
if (sw[0])
rst_sr <= 4'hF;
else
rst_sr <= rst_sr >> 1;
wire CLK = clk;
wire RST = rst_sr[0];
// ============================================================================
// Clocks for OSERDES
wire CLK1_X0Y0;
wire CLK2_X0Y0;
wire CLK1_X0Y2;
wire CLK2_X0Y2;
wire CLK1_X1Y1;
wire CLK2_X1Y1;
reg clk_r;
always @(posedge CLK)
if (RST) clk_r <= 1'b0;
else clk_r <= !clk_r;
BUFMR mr_buf_x1y1_1 (.I(CLK), .O(CLK1_X1Y1));
BUFMR mr_buf_x1y1_2 (.I(clk_r), .O(CLK2_X1Y1));
BUFMR mr_buf_x0y2_1 (.I(CLK), .O(CLK1_X0Y2));
BUFMR mr_buf_x0y2_2 (.I(clk_r), .O(CLK2_X0Y2));
BUFMR mr_buf_x0y0_1 (.I(CLK), .O(CLK1_X0Y0));
BUFMR mr_buf_x0y0_2 (.I(clk_r), .O(CLK2_X0Y0));
// ============================================================================
// Test uints
wire [9:0] error;
genvar i;
generate for (i=0; i<10; i=i+1) begin
localparam DATA_WIDTH = (i == 0) ? 2 :
(i == 1) ? 3 :
(i == 2) ? 4 :
(i == 3) ? 5 :
(i == 4) ? 6 :
(i == 5) ? 7 :
(i == 6) ? 8 :
(i == 7) ? 4 :
(i == 8) ? 6 :
/*(i == 9) ?*/ 8;
localparam DATA_RATE = (i < 7) ? "SDR" : "DDR";
wire CLK1 = (i >= 0 && i < 4) ? CLK1_X1Y1 :
(i >= 4 && i < 7) ? CLK1_X0Y2 :
CLK1_X0Y0;
wire CLK2 = (i >= 0 && i < 4) ? CLK2_X1Y1 :
(i >= 4 && i < 7) ? CLK2_X0Y2 :
CLK2_X0Y0;
oserdes_test #
(
.DATA_WIDTH (DATA_WIDTH),
.DATA_RATE (DATA_RATE)
)
oserdes_test
(
.CLK (CLK),
.CLK1 (CLK1),
.CLK2 (CLK2),
.RST (RST),
.IO_DAT (io[i]),
.O_ERROR (error[i])
);
end endgenerate
// ============================================================================
// IOs
reg [24:0] heartbeat_cnt;
always @(posedge CLK)
heartbeat_cnt <= heartbeat_cnt + 1;
assign led[ 0] = !error[0];
assign led[ 1] = !error[1];
assign led[ 2] = !error[2];
assign led[ 3] = !error[3];
assign led[ 4] = !error[4];
assign led[ 5] = !error[5];
assign led[ 6] = !error[6];
assign led[ 7] = !error[7];
assign led[ 8] = !error[8];
assign led[ 9] = !error[9];
assign led[10] = heartbeat_cnt[23];
assign led[11] = 1'b0;
assign led[12] = 1'b0;
assign led[13] = 1'b0;
assign led[14] = 1'b0;
assign led[15] = 1'b0;
endmodule