| `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 |