mirror of
https://github.com/enjoy-digital/litex.git
synced 2025-01-04 09:52:26 -05:00
sdram: create module.py to define SDRAM modules and use it on de0nano/ppro targets
This commit is contained in:
parent
6e4b7c6cfd
commit
de2f1c31d5
3 changed files with 76 additions and 29 deletions
70
misoclib/mem/sdram/module.py
Normal file
70
misoclib/mem/sdram/module.py
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
from math import ceil
|
||||||
|
|
||||||
|
from migen.fhdl.std import *
|
||||||
|
from misoclib.mem import sdram
|
||||||
|
|
||||||
|
class SDRAMModule:
|
||||||
|
def __init__(self, clk_freq, geom_settings, timing_settings):
|
||||||
|
self.clk_freq = clk_freq
|
||||||
|
self.geom_settings = sdram.GeomSettings(
|
||||||
|
bank_a=log2_int(geom_settings["nbanks"]),
|
||||||
|
row_a=log2_int(geom_settings["nrows"]),
|
||||||
|
col_a=log2_int(geom_settings["ncols"])
|
||||||
|
)
|
||||||
|
self.timing_settings = sdram.TimingSettings(
|
||||||
|
tRP=self.ns(timing_settings["tRP"]),
|
||||||
|
tRCD=self.ns(timing_settings["tRCD"]),
|
||||||
|
tWR=self.ns(timing_settings["tWR"]),
|
||||||
|
tWTR=timing_settings["tWTR"],
|
||||||
|
tREFI=self.ns(timing_settings["tREFI"], False),
|
||||||
|
tRFC=self.ns(timing_settings["tRFC"])
|
||||||
|
)
|
||||||
|
|
||||||
|
def ns(self, t, margin=True):
|
||||||
|
clk_period_ns = 1000000000/self.clk_freq
|
||||||
|
if margin:
|
||||||
|
t += clk_period_ns/2
|
||||||
|
return ceil(t/clk_period_ns)
|
||||||
|
|
||||||
|
# SDR
|
||||||
|
class IS42S16160(SDRAMModule):
|
||||||
|
geom_settings = {
|
||||||
|
"nbanks": 4,
|
||||||
|
"nrows": 8192,
|
||||||
|
"ncols": 512
|
||||||
|
}
|
||||||
|
timing_settings = {
|
||||||
|
"tRP": 20,
|
||||||
|
"tRCD": 20,
|
||||||
|
"tWR": 20,
|
||||||
|
"tWTR": 2,
|
||||||
|
"tREFI": 7800,
|
||||||
|
"tRFC": 70
|
||||||
|
}
|
||||||
|
def __init__(self, clk_freq):
|
||||||
|
SDRAMModule.__init__(self, clk_freq, self.geom_settings, self.timing_settings)
|
||||||
|
|
||||||
|
class MT48LC4M16(SDRAMModule):
|
||||||
|
geom_settings = {
|
||||||
|
"nbanks": 4,
|
||||||
|
"nrows": 4096,
|
||||||
|
"ncols": 256
|
||||||
|
}
|
||||||
|
timing_settings = {
|
||||||
|
"tRP": 15,
|
||||||
|
"tRCD": 15,
|
||||||
|
"tWR": 14,
|
||||||
|
"tWTR": 2,
|
||||||
|
"tREFI": 64*1000*1000/4096,
|
||||||
|
"tRFC": 66
|
||||||
|
}
|
||||||
|
def __init__(self, clk_freq):
|
||||||
|
SDRAMModule.__init__(self, clk_freq, self.geom_settings, self.timing_settings)
|
||||||
|
|
||||||
|
# DDR
|
||||||
|
|
||||||
|
# LPDDR
|
||||||
|
|
||||||
|
# DDR2
|
||||||
|
|
||||||
|
# DDR3
|
|
@ -3,6 +3,7 @@ from migen.bus import wishbone
|
||||||
|
|
||||||
from misoclib.cpu.peripherals import gpio
|
from misoclib.cpu.peripherals import gpio
|
||||||
from misoclib.mem import sdram
|
from misoclib.mem import sdram
|
||||||
|
from misoclib.mem.sdram.module import IS42S16160
|
||||||
from misoclib.mem.sdram.phy import gensdrphy
|
from misoclib.mem.sdram.phy import gensdrphy
|
||||||
from misoclib.com import uart
|
from misoclib.com import uart
|
||||||
from misoclib.soc.sdram import SDRAMSoC
|
from misoclib.soc.sdram import SDRAMSoC
|
||||||
|
@ -90,27 +91,14 @@ class BaseSoC(SDRAMSoC):
|
||||||
self.submodules.crg = _CRG(platform)
|
self.submodules.crg = _CRG(platform)
|
||||||
|
|
||||||
if not self.with_main_ram:
|
if not self.with_main_ram:
|
||||||
sdram_geom_settings = sdram.GeomSettings(
|
sdram_module = IS42S16160(self.clk_freq)
|
||||||
bank_a=2,
|
|
||||||
row_a=13,
|
|
||||||
col_a=9
|
|
||||||
)
|
|
||||||
|
|
||||||
sdram_timing_settings = sdram.TimingSettings(
|
|
||||||
tRP=self.ns(20),
|
|
||||||
tRCD=self.ns(20),
|
|
||||||
tWR=self.ns(20),
|
|
||||||
tWTR=2,
|
|
||||||
tREFI=self.ns(7800, False),
|
|
||||||
tRFC=self.ns(70)
|
|
||||||
)
|
|
||||||
sdram_controller_settings = sdram.ControllerSettings(
|
sdram_controller_settings = sdram.ControllerSettings(
|
||||||
req_queue_size=8,
|
req_queue_size=8,
|
||||||
read_time=32,
|
read_time=32,
|
||||||
write_time=16
|
write_time=16
|
||||||
)
|
)
|
||||||
self.submodules.sdrphy = gensdrphy.GENSDRPHY(platform.request("sdram"))
|
self.submodules.sdrphy = gensdrphy.GENSDRPHY(platform.request("sdram"))
|
||||||
self.register_sdram_phy(self.sdrphy, sdram_geom_settings, sdram_timing_settings,
|
self.register_sdram_phy(self.sdrphy, sdram_module.geom_settings, sdram_module.timing_settings,
|
||||||
sdram_controller_settings)
|
sdram_controller_settings)
|
||||||
|
|
||||||
default_subtarget = BaseSoC
|
default_subtarget = BaseSoC
|
||||||
|
|
|
@ -4,6 +4,7 @@ from migen.fhdl.std import *
|
||||||
from migen.genlib.resetsync import AsyncResetSynchronizer
|
from migen.genlib.resetsync import AsyncResetSynchronizer
|
||||||
|
|
||||||
from misoclib.mem import sdram
|
from misoclib.mem import sdram
|
||||||
|
from misoclib.mem.sdram.module import MT48LC4M16
|
||||||
from misoclib.mem.sdram.phy import gensdrphy
|
from misoclib.mem.sdram.phy import gensdrphy
|
||||||
from misoclib.mem.flash import spiflash
|
from misoclib.mem.flash import spiflash
|
||||||
from misoclib.soc.sdram import SDRAMSoC
|
from misoclib.soc.sdram import SDRAMSoC
|
||||||
|
@ -74,26 +75,14 @@ class BaseSoC(SDRAMSoC):
|
||||||
self.submodules.crg = _CRG(platform, clk_freq)
|
self.submodules.crg = _CRG(platform, clk_freq)
|
||||||
|
|
||||||
if not self.with_main_ram:
|
if not self.with_main_ram:
|
||||||
sdram_geom_settings = sdram.GeomSettings(
|
sdram_module = MT48LC4M16(clk_freq)
|
||||||
bank_a=2,
|
|
||||||
row_a=12,
|
|
||||||
col_a=8
|
|
||||||
)
|
|
||||||
sdram_timing_settings = sdram.TimingSettings(
|
|
||||||
tRP=self.ns(15),
|
|
||||||
tRCD=self.ns(15),
|
|
||||||
tWR=self.ns(14),
|
|
||||||
tWTR=2,
|
|
||||||
tREFI=self.ns(64*1000*1000/4096, False),
|
|
||||||
tRFC=self.ns(66)
|
|
||||||
)
|
|
||||||
sdram_controller_settings = sdram.ControllerSettings(
|
sdram_controller_settings = sdram.ControllerSettings(
|
||||||
req_queue_size=8,
|
req_queue_size=8,
|
||||||
read_time=32,
|
read_time=32,
|
||||||
write_time=16
|
write_time=16
|
||||||
)
|
)
|
||||||
self.submodules.sdrphy = gensdrphy.GENSDRPHY(platform.request("sdram"))
|
self.submodules.sdrphy = gensdrphy.GENSDRPHY(platform.request("sdram"))
|
||||||
self.register_sdram_phy(self.sdrphy, sdram_geom_settings, sdram_timing_settings,
|
self.register_sdram_phy(self.sdrphy, sdram_module.geom_settings, sdram_module.timing_settings,
|
||||||
sdram_controller_settings)
|
sdram_controller_settings)
|
||||||
|
|
||||||
self.submodules.spiflash = spiflash.SpiFlash(platform.request("spiflash2x"), dummy=4, div=6)
|
self.submodules.spiflash = spiflash.SpiFlash(platform.request("spiflash2x"), dummy=4, div=6)
|
||||||
|
|
Loading…
Reference in a new issue