diff --git a/sdram_init.py b/sdram_init.py new file mode 100644 index 0000000..86bab43 --- /dev/null +++ b/sdram_init.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python3 +from migen import * + +from VintageBusFPGA_Common.wb_master import * +from VintageBusFPGA_Common.wb_master import _WRITE_CMD, _WAIT_CMD, _DONE_CMD + +dfii_control_sel = 0x01 +dfii_control_cke = 0x02 +dfii_control_odt = 0x04 +dfii_control_reset_n = 0x08 + +dfii_command_cs = 0x01 +dfii_command_we = 0x02 +dfii_command_cas = 0x04 +dfii_command_ras = 0x08 +dfii_command_wrdata = 0x10 +dfii_command_rddata = 0x20 + +def period_to_cycles(sys_clk_freq, period): + return int(period*sys_clk_freq) + +def ddr3_init_instructions(sys_clk_freq): + return [ + _WAIT_CMD | period_to_cycles(sys_clk_freq, 0.001), + # phase + _WRITE_CMD, self.ddrphy_rdphase, 2, + _WRITE_CMD, self.ddrphy_wdphase, 3, + + # software control + _WRITE_CMD, self.sdram_dfii_control, dfii_control_reset_n | dfii_control_odt | dfii_control_cke, + + # reset + _WRITE_CMD, self.ddrphy_rst, 1, + _WAIT_CMD | period_to_cycles(sys_clk_freq, 0.001), + _WRITE_CMD, self.ddrphy_rst, 0, + _WAIT_CMD | period_to_cycles(sys_clk_freq, 0.001), + + # release reset + _WRITE_CMD, self.sdram_dfii_pi0_address, 0x0, + _WRITE_CMD, self.sdram_dfii_pi0_baddress, 0, + _WRITE_CMD, self.sdram_dfii_control, dfii_control_odt|dfii_control_reset_n, + _WAIT_CMD | period_to_cycles(sys_clk_freq, 0.005), + + # bring cke high + _WRITE_CMD, self.sdram_dfii_pi0_address, 0x0, + _WRITE_CMD, self.sdram_dfii_pi0_baddress, 0, + _WRITE_CMD, self.sdram_dfii_control, dfii_control_cke|dfii_control_odt|dfii_control_reset_n, + _WAIT_CMD | period_to_cycles(sys_clk_freq, 0.001), + + # load mode register 2, CWL = 5 + _WRITE_CMD, self.sdram_dfii_pi0_address, 0x200, + _WRITE_CMD, self.sdram_dfii_pi0_baddress, 2, + _WRITE_CMD, self.sdram_dfii_pi0_command, dfii_command_ras|dfii_command_cas|dfii_command_we|dfii_command_cs, + _WRITE_CMD, self.sdram_dfii_pi0_command_issue, 1, + + # load mode register 3 + _WRITE_CMD, self.sdram_dfii_pi0_address, 0x0, + _WRITE_CMD, self.sdram_dfii_pi0_baddress, 3, + _WRITE_CMD, self.sdram_dfii_pi0_command, dfii_command_ras|dfii_command_cas|dfii_command_we|dfii_command_cs, + _WRITE_CMD, self.sdram_dfii_pi0_command_issue, 1, + + # load mode register 1 + _WRITE_CMD, self.sdram_dfii_pi0_address, 0x6, + _WRITE_CMD, self.sdram_dfii_pi0_baddress, 1, + _WRITE_CMD, self.sdram_dfii_pi0_command, dfii_command_ras|dfii_command_cas|dfii_command_we|dfii_command_cs, + _WRITE_CMD, self.sdram_dfii_pi0_command_issue, 1, + + # load mode register 0, CL=6, BL=8 + _WRITE_CMD, self.sdram_dfii_pi0_address, 0x920, + _WRITE_CMD, self.sdram_dfii_pi0_baddress, 0, + _WRITE_CMD, self.sdram_dfii_pi0_command, dfii_command_ras|dfii_command_cas|dfii_command_we|dfii_command_cs, + _WRITE_CMD, self.sdram_dfii_pi0_command_issue, 1, + _WAIT_CMD | period_to_cycles(sys_clk_freq, 0.0002), + + # zq calibration + _WRITE_CMD, self.sdram_dfii_pi0_address, 0x400, + _WRITE_CMD, self.sdram_dfii_pi0_baddress, 0, + _WRITE_CMD, self.sdram_dfii_pi0_command, dfii_command_we|dfii_command_cs, + _WRITE_CMD, self.sdram_dfii_pi0_command_issue, 1, + _WAIT_CMD | period_to_cycles(sys_clk_freq, 0.0002), + + # hardware control + _WRITE_CMD, self.sdram_dfii_control, dfii_control_sel, +] + + +def ddr3_config_instructions(bitslip, delay): + r = [] + for module in range(2): + r += [_WRITE_CMD, self.ddrphy_dly_sel, 1<