blob: 5352d012eab796e47fc9e7d387d43d1ad383d8d9 [file] [log] [blame]
Sylvain Munautbd83e532020-09-15 22:11:29 +02001/*
2 * sysmgr.v
3 *
4 * vim: ts=4 sw=4
5 *
6 * System Clock / Reset generation
7 *
8 * Copyright (C) 2019-2020 Sylvain Munaut <tnt@246tNt.com>
9 * SPDX-License-Identifier: CERN-OHL-S-2.0
10 */
11
12`default_nettype none
13
14module sysmgr (
15 input wire clk_in,
16 input wire rst_in,
17 output wire clk_sys,
18 output wire rst_sys,
19 output wire clk_48m,
20 output wire rst_48m
21);
22
23 // Signals
24 wire pll_lock;
25 wire pll_reset_n;
26
27 wire clk_30m72_i;
28 wire rst_30m72_i;
29 wire clk_48m_i;
30 reg rst_48m_i;
31
32 reg [3:0] rst_cnt;
33
34 // Global input buffer for 30.72 MHz clock
35 SB_GB_IO #(
Sylvain Munaut7b228842020-09-22 20:00:13 +020036 .PIN_TYPE(6'b000001)
Sylvain Munautbd83e532020-09-15 22:11:29 +020037 ) gb_in (
38 .PACKAGE_PIN(clk_in),
Sylvain Munaut7b228842020-09-22 20:00:13 +020039 .GLOBAL_BUFFER_OUTPUT(clk_30m72_i)
Sylvain Munautbd83e532020-09-15 22:11:29 +020040 );
41
42 // PLL instance
43 SB_PLL40_CORE #(
44 .DIVR(4'b0000),
45 .DIVF(7'b0011000),
46 .DIVQ(3'b100),
47 .FILTER_RANGE(3'b011),
48 .FEEDBACK_PATH("SIMPLE"),
49 .DELAY_ADJUSTMENT_MODE_FEEDBACK("FIXED"),
50 .FDA_FEEDBACK(4'b0000),
51 .SHIFTREG_DIV_MODE(2'b00),
52 .PLLOUT_SELECT("GENCLK"),
Sylvain Munaut7b228842020-09-22 20:00:13 +020053 .ENABLE_ICEGATE(1'b0)
Sylvain Munautbd83e532020-09-15 22:11:29 +020054 ) pll_I (
55 .REFERENCECLK(clk_30m72_i),
56 .PLLOUTCORE(),
57 .PLLOUTGLOBAL(clk_48m_i),
58 .EXTFEEDBACK(1'b0),
59 .DYNAMICDELAY(8'h00),
60 .RESETB(pll_reset_n),
61 .BYPASS(1'b0),
62 .LATCHINPUTVALUE(1'b0),
63 .LOCK(pll_lock),
64 .SDI(1'b0),
65 .SDO(),
66 .SCLK(1'b0)
67 );
68
69 assign clk_sys = clk_30m72_i;
70 assign clk_48m = clk_48m_i;
71
72 // PLL reset generation
73 assign pll_reset_n = ~rst_in;
74
75 // Logic reset generation
76 always @(posedge clk_30m72_i or negedge pll_lock)
77 if (!pll_lock)
78 rst_cnt <= 4'h0;
79 else if (~rst_cnt[3])
80 rst_cnt <= rst_cnt + 1;
81
82 assign rst_30m72_i = ~rst_cnt[3];
83
84 always @(posedge clk_48m or posedge rst_30m72_i)
85 if (rst_30m72_i)
86 rst_48m_i <= 1'b1;
87 else
88 rst_48m_i <= 1'b0;
89
90 SB_GB rst_sys_gbuf_I (
91 .USER_SIGNAL_TO_GLOBAL_BUFFER(rst_30m72_i),
92 .GLOBAL_BUFFER_OUTPUT(rst_sys)
93 );
94
95 SB_GB rst_48m_gbuf_I (
96 .USER_SIGNAL_TO_GLOBAL_BUFFER(rst_48m_i),
97 .GLOBAL_BUFFER_OUTPUT(rst_48m)
98 );
99
100endmodule // sysmgr