litex/targets/mlabs_video.py

138 lines
4.4 KiB
Python
Raw Normal View History

2013-11-24 07:37:32 -05:00
import os
2012-02-16 12:02:37 -05:00
from fractions import Fraction
2015-04-01 02:33:12 -04:00
from math import ceil
2012-02-16 12:02:37 -05:00
2013-05-22 11:10:13 -04:00
from migen.fhdl.std import *
2013-07-04 13:19:39 -04:00
from mibuild.generic_platform import ConstraintError
2011-12-16 10:02:49 -05:00
from misoclib.others import mxcrg
from misoclib.mem import sdram
from misoclib.mem.sdram.module import MT46V32M16
from misoclib.mem.sdram.phy import s6ddrphy
from misoclib.mem.sdram.core.lasmicon import LASMIconSettings
from misoclib.mem.flash import norflash16
from misoclib.cpu.peripherals import gpio
from misoclib.video import framebuffer
from misoclib.soc import mem_decoder
from misoclib.soc.sdram import SDRAMSoC
from misoclib.com.liteeth.phy import LiteEthPHY
from misoclib.com.liteeth.mac import LiteEthMAC
2011-12-13 11:33:12 -05:00
2013-11-24 04:30:02 -05:00
class _MXClockPads:
2013-03-26 12:57:17 -04:00
def __init__(self, platform):
self.clk50 = platform.request("clk50")
2013-07-04 13:19:39 -04:00
self.trigger_reset = 0
try:
self.trigger_reset = platform.request("user_btn", 1)
except ConstraintError:
pass
2013-03-26 12:57:17 -04:00
self.norflash_rst_n = platform.request("norflash_rst_n")
ddram_clock = platform.request("ddram_clock")
self.ddr_clk_p = ddram_clock.p
self.ddr_clk_n = ddram_clock.n
2012-05-16 19:41:41 -04:00
2014-08-03 00:30:15 -04:00
class BaseSoC(SDRAMSoC):
default_platform = "mixxeo" # also supports m1
def __init__(self, platform, sdram_controller_settings=LASMIconSettings(), **kwargs):
2013-11-24 04:30:02 -05:00
SDRAMSoC.__init__(self, platform,
clk_freq=(83 + Fraction(1, 3))*1000000,
cpu_reset_address=0x00180000,
sdram_controller_settings=sdram_controller_settings,
**kwargs)
2013-07-17 07:58:58 -04:00
self.submodules.crg = mxcrg.MXCRG(_MXClockPads(platform), self.clk_freq)
if not self.integrated_main_ram_size:
self.submodules.ddrphy = s6ddrphy.S6DDRPHY(platform.request("ddram"), MT46V32M16(self.clk_freq),
rd_bitslip=0, wr_bitslip=3, dqs_ddr_alignment="C1")
self.register_sdram_phy(self.ddrphy)
self.comb += [
self.ddrphy.clk4x_wr_strb.eq(self.crg.clk4x_wr_strb),
self.ddrphy.clk4x_rd_strb.eq(self.crg.clk4x_rd_strb)
]
2012-02-17 17:50:10 -05:00
if not self.integrated_rom_size:
2015-04-01 02:33:12 -04:00
clk_period_ns = 1000000000/self.clk_freq
self.submodules.norflash = norflash16.NorFlash16(platform.request("norflash"),
ceil(110/clk_period_ns), ceil(50/clk_period_ns))
self.flash_boot_address = 0x001a0000
self.register_rom(self.norflash.bus)
2014-02-21 11:55:05 -05:00
2013-11-24 07:37:32 -05:00
platform.add_platform_command("""
INST "mxcrg/wr_bufpll" LOC = "BUFPLL_X0Y2";
INST "mxcrg/rd_bufpll" LOC = "BUFPLL_X0Y3";
PIN "mxcrg/bufg_x1.O" CLOCK_DEDICATED_ROUTE = FALSE;
""")
platform.add_source_dir(os.path.join("misoclib", "others", "mxcrg"))
2014-08-03 00:30:15 -04:00
class MiniSoC(BaseSoC):
csr_map = {
"ethphy": 16,
"ethmac": 17,
2014-08-03 00:30:15 -04:00
}
csr_map.update(BaseSoC.csr_map)
interrupt_map = {
2014-11-20 19:47:11 -05:00
"ethmac": 2,
2014-08-03 00:30:15 -04:00
}
interrupt_map.update(BaseSoC.interrupt_map)
mem_map = {
"ethmac": 0x30000000, # (shadow @0xb0000000)
}
mem_map.update(BaseSoC.mem_map)
2014-08-03 00:30:15 -04:00
def __init__(self, platform, **kwargs):
BaseSoC.__init__(self, platform, **kwargs)
if platform.name == "mixxeo":
self.submodules.leds = gpio.GPIOOut(platform.request("user_led"))
if platform.name == "m1":
self.submodules.buttons = gpio.GPIOIn(Cat(platform.request("user_btn", 0), platform.request("user_btn", 2)))
self.submodules.leds = gpio.GPIOOut(Cat(platform.request("user_led", i) for i in range(2)))
2013-11-24 07:37:32 -05:00
self.submodules.ethphy = LiteEthPHY(platform.request("eth_clocks"), platform.request("eth"))
self.submodules.ethmac = LiteEthMAC(phy=self.ethphy, dw=32, interface="wishbone")
self.add_wb_slave(mem_decoder(self.mem_map["ethmac"]), self.ethmac.bus)
self.add_memory_region("ethmac", self.mem_map["ethmac"]+0x80000000, 0x2000)
2014-08-03 00:30:15 -04:00
def get_vga_dvi(platform):
2013-11-24 04:30:02 -05:00
try:
pads_vga = platform.request("vga_out")
except ConstraintError:
pads_vga = None
try:
pads_dvi = platform.request("dvi_out")
except ConstraintError:
pads_dvi = None
2013-11-24 07:37:32 -05:00
else:
platform.add_platform_command("""
PIN "dviout_pix_bufg.O" CLOCK_DEDICATED_ROUTE = FALSE;
""")
2013-11-24 04:30:02 -05:00
return pads_vga, pads_dvi
2014-08-03 00:30:15 -04:00
def add_vga_tig(platform, fb):
2013-11-24 07:37:32 -05:00
platform.add_platform_command("""
NET "{vga_clk}" TNM_NET = "GRPvga_clk";
NET "sys_clk" TNM_NET = "GRPsys_clk";
TIMESPEC "TSise_sucks1" = FROM "GRPvga_clk" TO "GRPsys_clk" TIG;
TIMESPEC "TSise_sucks2" = FROM "GRPsys_clk" TO "GRPvga_clk" TIG;
""", vga_clk=fb.driver.clocking.cd_pix.clk)
2013-11-24 04:30:02 -05:00
class FramebufferSoC(MiniSoC):
2014-08-03 00:30:15 -04:00
csr_map = {
"fb": 18,
2014-08-03 00:30:15 -04:00
}
csr_map.update(MiniSoC.csr_map)
def __init__(self, platform, **kwargs):
MiniSoC.__init__(self, platform, **kwargs)
2014-08-03 00:30:15 -04:00
pads_vga, pads_dvi = get_vga_dvi(platform)
self.submodules.fb = framebuffer.Framebuffer(pads_vga, pads_dvi, self.sdram.crossbar.get_master())
2014-08-03 00:30:15 -04:00
add_vga_tig(platform, self.fb)
2013-11-24 04:30:02 -05:00
2014-08-03 00:30:15 -04:00
default_subtarget = FramebufferSoC