#!/usr/bin/env python3 #https://gist.github.com/enjoy-digital/529a4d9994f0cc95e45382e4eb253b09 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 # bitslips and delays # # IIsiA7 Mini | bs | dl # module 0 | 3 | 15 # module 1 | 3 | 14 def period_to_cycles(sys_clk_freq, period): return int(period*sys_clk_freq) class DDR_Addr(WishboneMaster): def __init__(self, sdram_dfii_base, ddrphy_base): # /!\ keep up to date with csr /!\ self.sdram_dfii_base = sdram_dfii_base self.sdram_dfii_control = self.sdram_dfii_base + 0x000 self.sdram_dfii_pi0_command = self.sdram_dfii_base + 0x004 self.sdram_dfii_pi0_command_issue = self.sdram_dfii_base + 0x008 self.sdram_dfii_pi0_address = self.sdram_dfii_base + 0x00c self.sdram_dfii_pi0_baddress = self.sdram_dfii_base + 0x010 # /!\ keep up to date with csr /!\ self.ddrphy_base = ddrphy_base self.ddrphy_rst = self.ddrphy_base + 0x000 self.ddrphy_dly_sel = self.ddrphy_base + 0x004 self.ddrphy_rdly_dq_rst = self.ddrphy_base + 0x014 self.ddrphy_rdly_dq_inc = self.ddrphy_base + 0x018 self.ddrphy_rdly_dq_bitslip_rst = self.ddrphy_base + 0x01c self.ddrphy_rdly_dq_bitslip = self.ddrphy_base + 0x020 self.ddrphy_wdly_dq_bitslip_rst = self.ddrphy_base + 0x024 self.ddrphy_wdly_dq_bitslip = self.ddrphy_base + 0x028 self.ddrphy_rdphase = self.ddrphy_base + 0x02c self.ddrphy_wdphase = self.ddrphy_base + 0x030 def startfb(self): r = [] r += [_WRITE_CMD, 0xf0900008, 0x01000000] # FIXME: hardwired for now return r def ddr_config_instructions(self, bitslip, delay): r = [] for module in range(2): r += [_WRITE_CMD, self.ddrphy_dly_sel, 1<