@@ -81,7 +81,11 @@ def __init__(self, platform, sys_clk_freq, cpu_clk_freq=0,
8181 self .pll = pll = GW5APLL (devicename = platform .devicename , device = platform .device )
8282 self .comb += pll .reset .eq (~ por_done | self .rst )
8383 pll .register_clkin (clk50 , 50e6 )
84- pll .create_clkout (self .cd_sys , sys_clk_freq , with_reset = not with_ddr3 )
84+ if with_ddr3 :
85+ # Keep sys/sys2x phase-aligned across the PHY stop/reset sequence.
86+ pll .create_clkout (self .cd_sys2x_i , 2 * sys_clk_freq )
87+ else :
88+ pll .create_clkout (self .cd_sys , sys_clk_freq )
8589 if cpu_clk_freq :
8690 pll .create_clkout (self .cd_cpu , cpu_clk_freq , with_reset = False )
8791 platform .toolchain .additional_cst_commands .append ("INS_LOC \" PLL\" PLL_R[0]" ) # Magic incantation for Gowin-AE350 CPU :)
@@ -99,13 +103,19 @@ def __init__(self, platform, sys_clk_freq, cpu_clk_freq=0,
99103
100104 # DDR3 clock
101105 if with_ddr3 :
102- pll .create_clkout (self .cd_sys2x_i , 2 * sys_clk_freq )
103106 self .specials += [
104107 Instance ("DHCE" ,
105108 i_CLKIN = self .cd_sys2x_i .clk ,
106109 i_CEN = self .stop ,
107110 o_CLKOUT = self .cd_sys2x .clk
108111 ),
112+ Instance ("CLKDIV" ,
113+ p_DIV_MODE = "2" ,
114+ i_CALIB = 0 ,
115+ i_HCLKIN = self .cd_sys2x .clk ,
116+ i_RESETN = ~ self .reset ,
117+ o_CLKOUT = self .cd_sys .clk
118+ ),
109119 AsyncResetSynchronizer (self .cd_sys , ~ pll .locked | self .reset ),
110120 ]
111121 # Init clock domain
0 commit comments