|  | `default_nettype none | 
|  |  | 
|  | `define CLKFBOUT_MULT 2 | 
|  |  | 
|  | // ============================================================================ | 
|  |  | 
|  | module top | 
|  | ( | 
|  | input  wire clk, | 
|  |  | 
|  | input  wire rst, | 
|  |  | 
|  | input  wire [7:0] sw, | 
|  | output wire [9:0] led, | 
|  |  | 
|  | inout wire io | 
|  | ); | 
|  |  | 
|  | localparam DATA_WIDTH = `DATA_WIDTH_DEFINE; | 
|  | localparam DATA_RATE =  `DATA_RATE_DEFINE; | 
|  |  | 
|  | // ============================================================================ | 
|  | // Clock & reset | 
|  | reg [3:0] rst_sr; | 
|  |  | 
|  | initial rst_sr <= 4'hF; | 
|  |  | 
|  | wire CLK; | 
|  |  | 
|  | BUFG bufg(.I(clk), .O(CLK)); | 
|  |  | 
|  | always @(posedge CLK) | 
|  | if (rst) | 
|  | rst_sr <= 4'hF; | 
|  | else | 
|  | rst_sr <= rst_sr >> 1; | 
|  |  | 
|  | wire RST = rst_sr[0]; | 
|  |  | 
|  | // ============================================================================ | 
|  | // Clocks for ISERDES | 
|  |  | 
|  | wire PRE_BUFG_SYSCLK; | 
|  | wire PRE_BUFG_CLKDIV; | 
|  |  | 
|  | wire SYSCLK; | 
|  | wire CLKDIV; | 
|  |  | 
|  | wire O_LOCKED; | 
|  |  | 
|  | wire clk_fb_i; | 
|  | wire clk_fb_o; | 
|  |  | 
|  | localparam DIVIDE_RATE = DATA_RATE == "SDR" ? DATA_WIDTH : DATA_WIDTH / 2; | 
|  |  | 
|  | PLLE2_ADV #( | 
|  | .BANDWIDTH          ("HIGH"), | 
|  | .COMPENSATION       ("ZHOLD"), | 
|  |  | 
|  | .CLKIN1_PERIOD      (10.0),  // 100MHz | 
|  |  | 
|  | .CLKFBOUT_MULT      (`CLKFBOUT_MULT), | 
|  | .CLKOUT0_DIVIDE     (`CLKFBOUT_MULT * 4), // SYSCLK, 25MHz | 
|  | .CLKOUT1_DIVIDE     ((`CLKFBOUT_MULT * 4) * DIVIDE_RATE), // CLKDIV, 25MHz / DIVIDE RATE | 
|  |  | 
|  | .STARTUP_WAIT       ("FALSE"), | 
|  |  | 
|  | .DIVCLK_DIVIDE      (1'd1) | 
|  | ) | 
|  | pll | 
|  | ( | 
|  | .CLKIN1     (CLK), | 
|  | .CLKINSEL   (1), | 
|  |  | 
|  | .RST        (RST), | 
|  | .PWRDWN     (0), | 
|  | .LOCKED     (O_LOCKED), | 
|  |  | 
|  | .CLKFBIN    (clk_fb_i), | 
|  | .CLKFBOUT   (clk_fb_o), | 
|  |  | 
|  | .CLKOUT0    (PRE_BUFG_SYSCLK), | 
|  | .CLKOUT1    (PRE_BUFG_CLKDIV) | 
|  | ); | 
|  |  | 
|  | BUFG bufg_clk(.I(PRE_BUFG_SYSCLK), .O(SYSCLK)); | 
|  | BUFG bufg_clkdiv(.I(PRE_BUFG_CLKDIV), .O(CLKDIV)); | 
|  |  | 
|  | // ============================================================================ | 
|  | // Test uints | 
|  | wire [7:0] OUTPUTS; | 
|  |  | 
|  | wire [7:0] INPUTS = sw[7:0]; | 
|  |  | 
|  | localparam MASK = DATA_WIDTH == 2 ? 8'b00000011 : | 
|  | DATA_WIDTH == 3 ? 8'b00000111 : | 
|  | DATA_WIDTH == 4 ? 8'b00001111 : | 
|  | DATA_WIDTH == 5 ? 8'b00011111 : | 
|  | DATA_WIDTH == 6 ? 8'b00111111 : | 
|  | DATA_WIDTH == 7 ? 8'b01111111 : | 
|  | /*DATA_WIDTH == 8*/ 8'b11111111; | 
|  |  | 
|  | wire [7:0] MASKED_INPUTS = INPUTS & MASK; | 
|  |  | 
|  | wire I_DAT; | 
|  | wire O_DAT; | 
|  | wire T_DAT; | 
|  |  | 
|  | IOBUF iobuf(.I(O_DAT), .O(I_DAT), .T(T_DAT), .IO(io)); | 
|  |  | 
|  | serdes_test # | 
|  | ( | 
|  | .DATA_WIDTH   (DATA_WIDTH), | 
|  | .DATA_RATE    (DATA_RATE) | 
|  | ) | 
|  | serdes_test | 
|  | ( | 
|  | .SYSCLK     (SYSCLK), | 
|  | .CLKDIV     (CLKDIV), | 
|  | .RST        (RST), | 
|  |  | 
|  | .OUTPUTS    (OUTPUTS), | 
|  | .INPUTS     (MASKED_INPUTS), | 
|  |  | 
|  | .I_DAT      (I_DAT), | 
|  | .O_DAT      (O_DAT), | 
|  | .T_DAT      (T_DAT) | 
|  | ); | 
|  |  | 
|  | wire [7:0] MASKED_OUTPUTS = OUTPUTS & MASK; | 
|  |  | 
|  | // ============================================================================ | 
|  | // I/O connections | 
|  |  | 
|  | reg [23:0] heartbeat_cnt; | 
|  |  | 
|  | always @(posedge SYSCLK) | 
|  | heartbeat_cnt <= heartbeat_cnt + 1; | 
|  |  | 
|  |  | 
|  | assign led[0] = heartbeat_cnt[22]; | 
|  | assign led[8:1] = MASKED_OUTPUTS; | 
|  |  | 
|  | endmodule |