| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| module clkgen_xil7series # ( |
| // Add BUFG if not done by downstream logic |
| parameter bit AddClkBuf = 1 |
| ) ( |
| input IO_CLK, |
| input IO_RST_N, |
| input jtag_srst_n, |
| output clk_main, |
| output clk_48MHz, |
| output rst_n |
| ); |
| logic locked_pll; |
| logic io_clk_buf; |
| logic io_rst_buf_n; |
| logic clk_10_buf; |
| logic clk_10_unbuf; |
| logic clk_fb_buf; |
| logic clk_fb_unbuf; |
| logic clk_48_buf; |
| logic clk_48_unbuf; |
| |
| // input clock buffer |
| IBUF io_clk_ibuf ( |
| .I (IO_CLK), |
| .O (io_clk_buf) |
| ); |
| |
| // input reset buffer |
| IBUF io_rst_ibuf ( |
| .I (IO_RST_N), |
| .O (io_rst_buf_n) |
| ); |
| |
| PLLE2_ADV #( |
| .BANDWIDTH ("OPTIMIZED"), |
| .COMPENSATION ("ZHOLD"), |
| .STARTUP_WAIT ("FALSE"), |
| .DIVCLK_DIVIDE (1), |
| .CLKFBOUT_MULT (12), |
| .CLKFBOUT_PHASE (0.000), |
| .CLKOUT0_DIVIDE (120), |
| .CLKOUT0_PHASE (0.000), |
| .CLKOUT0_DUTY_CYCLE (0.500), |
| .CLKOUT1_DIVIDE (25), |
| .CLKOUT1_PHASE (0.000), |
| .CLKOUT1_DUTY_CYCLE (0.500), |
| .CLKIN1_PERIOD (10.000) |
| ) pll ( |
| .CLKFBOUT (clk_fb_unbuf), |
| .CLKOUT0 (clk_10_unbuf), |
| .CLKOUT1 (clk_48_unbuf), |
| .CLKOUT2 (), |
| .CLKOUT3 (), |
| .CLKOUT4 (), |
| .CLKOUT5 (), |
| // Input clock control |
| .CLKFBIN (clk_fb_buf), |
| .CLKIN1 (io_clk_buf), |
| .CLKIN2 (1'b0), |
| // Tied to always select the primary input clock |
| .CLKINSEL (1'b1), |
| // Ports for dynamic reconfiguration |
| .DADDR (7'h0), |
| .DCLK (1'b0), |
| .DEN (1'b0), |
| .DI (16'h0), |
| .DO (), |
| .DRDY (), |
| .DWE (1'b0), |
| // Other control and status signals |
| .LOCKED (locked_pll), |
| .PWRDWN (1'b0), |
| // Do not reset PLL on external reset, otherwise ILA disconnects at a reset |
| .RST (1'b0)); |
| |
| // output buffering |
| BUFG clk_fb_bufg ( |
| .I (clk_fb_unbuf), |
| .O (clk_fb_buf) |
| ); |
| |
| if (AddClkBuf == 1) begin : gen_clk_bufs |
| BUFG clk_10_bufg ( |
| .I (clk_10_unbuf), |
| .O (clk_10_buf) |
| ); |
| |
| BUFG clk_48_bufg ( |
| .I (clk_48_unbuf), |
| .O (clk_48_buf) |
| ); |
| end else begin : gen_no_clk_bufs |
| // BUFGs added by downstream modules, no need to add here |
| assign clk_10_buf = clk_10_unbuf; |
| assign clk_48_buf = clk_48_unbuf; |
| end |
| |
| // outputs |
| // clock |
| assign clk_main = clk_10_buf; |
| assign clk_48MHz = clk_48_buf; |
| |
| // reset |
| assign rst_n = locked_pll & io_rst_buf_n & jtag_srst_n; |
| endmodule |