4f2babdf283834d491314e7c1abc56c4447465d4
1 from migen
.fhdl
.std
import *
2 from migen
.genlib
.cdc
import MultiReg
3 from migen
.bank
.description
import *
5 class Clocking(Module
, AutoCSR
):
6 def __init__(self
, pads
):
7 self
._r
_pll
_reset
= CSRStorage(reset
=1)
8 self
._r
_locked
= CSRStatus()
11 self
._r
_pll
_adr
= CSRStorage(5)
12 self
._r
_pll
_dat
_r
= CSRStatus(16)
13 self
._r
_pll
_dat
_w
= CSRStorage(16)
14 self
._r
_pll
_read
= CSR()
15 self
._r
_pll
_write
= CSR()
16 self
._r
_pll
_drdy
= CSRStatus()
18 self
.locked
= Signal()
19 self
.serdesstrobe
= Signal()
20 self
.clock_domains
._cd
_pix
= ClockDomain()
21 self
.clock_domains
._cd
_pix
2x
= ClockDomain()
22 self
.clock_domains
._cd
_pix
10x
= ClockDomain(reset_less
=True)
27 self
.specials
+= Instance("IBUFDS", i_I
=pads
.clk_p
, i_IB
=pads
.clk_n
, o_O
=clk_se
)
35 self
.sync
+= If(self
._r
_pll
_read
.re | self
._r
_pll
_write
.re
,
36 self
._r
_pll
_drdy
.status
.eq(0)
38 self
._r
_pll
_drdy
.status
.eq(1)
40 self
.specials
+= Instance("PLL_ADV",
42 p_CLKOUT0_DIVIDE
=1, # pix10x
43 p_CLKOUT1_DIVIDE
=5, # pix2x
44 p_CLKOUT2_DIVIDE
=10, # pix
45 p_COMPENSATION
="INTERNAL",
49 o_CLKOUT0
=pll_clk0
, o_CLKOUT1
=pll_clk1
, o_CLKOUT2
=pll_clk2
,
50 o_CLKFBOUT
=clkfbout
, i_CLKFBIN
=clkfbout
,
51 o_LOCKED
=pll_locked
, i_RST
=self
._r
_pll
_reset
.storage
,
53 i_DADDR
=self
._r
_pll
_adr
.storage
,
54 o_DO
=self
._r
_pll
_dat
_r
.status
,
55 i_DI
=self
._r
_pll
_dat
_w
.storage
,
56 i_DEN
=self
._r
_pll
_read
.re | self
._r
_pll
_write
.re
,
57 i_DWE
=self
._r
_pll
_write
.re
,
61 locked_async
= Signal()
63 Instance("BUFPLL", p_DIVIDE
=5,
64 i_PLLIN
=pll_clk0
, i_GCLK
=ClockSignal("pix2x"), i_LOCKED
=pll_locked
,
65 o_IOCLK
=self
._cd
_pix
10x
.clk
, o_LOCK
=locked_async
, o_SERDESSTROBE
=self
.serdesstrobe
),
66 Instance("BUFG", i_I
=pll_clk1
, o_O
=self
._cd
_pix
2x
.clk
),
67 Instance("BUFG", i_I
=pll_clk2
, o_O
=self
._cd
_pix
.clk
),
68 MultiReg(locked_async
, self
.locked
, "sys")
70 self
.comb
+= self
._r
_locked
.status
.eq(self
.locked
)
72 # sychronize pix+pix2x reset
75 new_pix_rst_n
= Signal()
76 self
.specials
+= Instance("FDCE", i_D
=pix_rst_n
, i_CE
=1, i_C
=ClockSignal("pix"),
77 i_CLR
=~locked_async
, o_Q
=new_pix_rst_n
)
78 pix_rst_n
= new_pix_rst_n
79 self
.comb
+= self
._cd
_pix
.rst
.eq(~pix_rst_n
), self
._cd
_pix
2x
.rst
.eq(~pix_rst_n
)