| `default_nettype none | |
| `define CLKFBOUT_MULT 2 | |
| // ============================================================================ | |
| module top | |
| ( | |
| input wire clk, | |
| input wire rst, | |
| input wire [1:0] sw, | |
| output wire [9:0] led, | |
| ); | |
| // ============================================================================ | |
| // 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 PRE_BUFG_REFCLK; | |
| wire SYSCLK; | |
| wire CLKDIV; | |
| wire REFCLK; | |
| wire clk_fb_i; | |
| wire clk_fb_o; | |
| PLLE2_ADV #( | |
| .BANDWIDTH ("HIGH"), | |
| .COMPENSATION ("ZHOLD"), | |
| .CLKIN1_PERIOD (10.0), // 100MHz | |
| .CLKFBOUT_MULT (`CLKFBOUT_MULT), | |
| .CLKOUT0_DIVIDE (`CLKFBOUT_MULT / 2), // SYSCLK, 200MHz (Fast clock) | |
| .CLKOUT1_DIVIDE ((`CLKFBOUT_MULT * 4) / 2), // CLKDIV, 50MHz (Slow clock) | |
| .CLKOUT2_DIVIDE (`CLKFBOUT_MULT / 2), // REFCLK (IDELAYCTRL), 200 MHz | |
| .STARTUP_WAIT ("FALSE"), | |
| .DIVCLK_DIVIDE (1'd1) | |
| ) | |
| pll | |
| ( | |
| .CLKIN1 (CLK), | |
| .CLKINSEL (1), | |
| .RST (RST), | |
| .PWRDWN (0), | |
| .CLKFBIN (clk_fb_i), | |
| .CLKFBOUT (clk_fb_o), | |
| .CLKOUT0 (PRE_BUFG_SYSCLK), | |
| .CLKOUT1 (PRE_BUFG_CLKDIV), | |
| .CLKOUT2 (PRE_BUFG_REFCLK) | |
| ); | |
| BUFG bufg_clk(.I(PRE_BUFG_SYSCLK), .O(SYSCLK)); | |
| BUFG bufg_clkdiv(.I(PRE_BUFG_CLKDIV), .O(CLKDIV)); | |
| BUFG bufg_refclk(.I(PRE_BUFG_REFCLK), .O(REFCLK)); | |
| IDELAYCTRL idelayctrl_1 ( | |
| .REFCLK(REFCLK) | |
| ); | |
| IDELAYCTRL idelayctrl_2 ( | |
| .REFCLK(REFCLK) | |
| ); | |
| assign led[0] = 0; | |
| assign led[1] = 0; | |
| wire OUTPUTS[7:0]; | |
| // ISERDES reset generator | |
| wire i_rstdiv; | |
| // First ISERDES/IDELAY bank | |
| wire DDLY_1; | |
| IDELAYE2 # | |
| ( | |
| .IDELAY_TYPE ("FIXED"), | |
| .DELAY_SRC ("IDATAIN"), | |
| .IDELAY_VALUE (5'd31) | |
| ) | |
| idelay_1 | |
| ( | |
| .C (SYSCLK), | |
| .CE (1'b1), | |
| .LD (1'b1), | |
| .INC (1'b1), | |
| .IDATAIN (sw[0]), | |
| .DATAOUT (DDLY_1) | |
| ); | |
| ISERDESE2 # | |
| ( | |
| .DATA_RATE ("SDR"), | |
| .DATA_WIDTH (3'd4), | |
| .INTERFACE_TYPE ("NETWORKING"), | |
| .NUM_CE (2) | |
| ) | |
| iserdes_1 | |
| ( | |
| .CLK (SYSCLK), | |
| .CLKB (SYSCLK), | |
| .CLKDIV (CLKDIV), | |
| .CE1 (1'b1), | |
| .CE2 (1'b1), | |
| .RST (RST), | |
| .DDLY (DDLY_1), | |
| .Q1 (led[5]), | |
| .Q2 (led[4]), | |
| .Q3 (led[3]), | |
| .Q4 (led[2]), | |
| ); | |
| // Second ISERDES/IDELAY bank | |
| wire DDLY_2; | |
| IDELAYE2 # | |
| ( | |
| .IDELAY_TYPE ("FIXED"), | |
| .DELAY_SRC ("IDATAIN"), | |
| .IDELAY_VALUE (5'd31) | |
| ) | |
| idelay_2 | |
| ( | |
| .C (SYSCLK), | |
| .CE (1'b1), | |
| .LD (1'b1), | |
| .INC (1'b1), | |
| .IDATAIN (sw[1]), | |
| .DATAOUT (DDLY_2) | |
| ); | |
| ISERDESE2 # | |
| ( | |
| .DATA_RATE ("SDR"), | |
| .DATA_WIDTH (3'd4), | |
| .INTERFACE_TYPE ("NETWORKING"), | |
| .NUM_CE (2) | |
| ) | |
| iserdes_2 | |
| ( | |
| .CLK (SYSCLK), | |
| .CLKB (SYSCLK), | |
| .CLKDIV (CLKDIV), | |
| .CE1 (1'b1), | |
| .CE2 (1'b1), | |
| .RST (RST), | |
| .DDLY (DDLY_2), | |
| .Q1 (led[9]), | |
| .Q2 (led[8]), | |
| .Q3 (led[7]), | |
| .Q4 (led[6]), | |
| ); | |
| endmodule |