2 from migen
.genlib
.cdc
import MultiReg
4 from misoc
.interconnect
.csr
import *
7 class Clocking(Module
, AutoCSR
):
8 def __init__(self
, pads
):
9 self
._pll
_reset
= CSRStorage(reset
=1)
10 self
._locked
= CSRStatus()
13 self
._pll
_adr
= CSRStorage(5)
14 self
._pll
_dat
_r
= CSRStatus(16)
15 self
._pll
_dat
_w
= CSRStorage(16)
16 self
._pll
_read
= CSR()
17 self
._pll
_write
= CSR()
18 self
._pll
_drdy
= CSRStatus()
20 self
.locked
= Signal()
21 self
.serdesstrobe
= Signal()
22 self
.clock_domains
._cd
_pix
= ClockDomain()
23 self
.clock_domains
._cd
_pix
2x
= ClockDomain()
24 self
.clock_domains
._cd
_pix
10x
= ClockDomain(reset_less
=True)
29 self
.specials
+= Instance("IBUFDS", i_I
=pads
.clk_p
, i_IB
=pads
.clk_n
, o_O
=clk_se
)
37 self
.sync
+= If(self
._pll
_read
.re | self
._pll
_write
.re
,
38 self
._pll
_drdy
.status
.eq(0)
40 self
._pll
_drdy
.status
.eq(1)
42 self
.specials
+= Instance("PLL_ADV",
44 p_CLKOUT0_DIVIDE
=1, # pix10x
45 p_CLKOUT1_DIVIDE
=5, # pix2x
46 p_CLKOUT2_DIVIDE
=10, # pix
47 p_COMPENSATION
="INTERNAL",
51 o_CLKOUT0
=pll_clk0
, o_CLKOUT1
=pll_clk1
, o_CLKOUT2
=pll_clk2
,
52 o_CLKFBOUT
=clkfbout
, i_CLKFBIN
=clkfbout
,
53 o_LOCKED
=pll_locked
, i_RST
=self
._pll
_reset
.storage
,
55 i_DADDR
=self
._pll
_adr
.storage
,
56 o_DO
=self
._pll
_dat
_r
.status
,
57 i_DI
=self
._pll
_dat
_w
.storage
,
58 i_DEN
=self
._pll
_read
.re | self
._pll
_write
.re
,
59 i_DWE
=self
._pll
_write
.re
,
63 locked_async
= Signal()
65 Instance("BUFPLL", p_DIVIDE
=5,
66 i_PLLIN
=pll_clk0
, i_GCLK
=ClockSignal("pix2x"), i_LOCKED
=pll_locked
,
67 o_IOCLK
=self
._cd
_pix
10x
.clk
, o_LOCK
=locked_async
, o_SERDESSTROBE
=self
.serdesstrobe
),
68 Instance("BUFG", i_I
=pll_clk1
, o_O
=self
._cd
_pix
2x
.clk
),
69 Instance("BUFG", i_I
=pll_clk2
, o_O
=self
._cd
_pix
.clk
),
70 MultiReg(locked_async
, self
.locked
, "sys")
72 self
.comb
+= self
._locked
.status
.eq(self
.locked
)
74 # sychronize pix+pix2x reset
77 new_pix_rst_n
= Signal()
78 self
.specials
+= Instance("FDCE", i_D
=pix_rst_n
, i_CE
=1, i_C
=ClockSignal("pix"),
79 i_CLR
=~locked_async
, o_Q
=new_pix_rst_n
)
80 pix_rst_n
= new_pix_rst_n
81 self
.comb
+= self
._cd
_pix
.rst
.eq(~pix_rst_n
), self
._cd
_pix
2x
.rst
.eq(~pix_rst_n
)