d2692e5e8a9b59dc82506bb8a18a141490922d9e
[gram.git] / examples / headless-versa-85.py
1 # This file is Copyright (c) 2020 LambdaConcept <contact@lambdaconcept.com>
2 # This file is Copyright (c) 2022 Raptor Engineering, LLC <support@raptorengineering.com>
3
4 from nmigen import *
5 from nmigen.lib.cdc import ResetSynchronizer
6 from nmigen_soc import wishbone, memory
7
8 from lambdasoc.cpu.minerva import MinervaCPU
9 from lambdasoc.periph.intc import GenericInterruptController
10 from lambdasoc.periph.serial import AsyncSerialPeripheral
11 from lambdasoc.periph.sram import SRAMPeripheral
12 from lambdasoc.periph.timer import TimerPeripheral
13 from lambdasoc.periph import Peripheral
14 from lambdasoc.soc.base import SoC
15
16 from gram.core import gramCore
17 from gram.phy.ecp5ddrphy import ECP5DDRPHY
18 from gram.modules import MT41K64M16
19 from gram.frontend.wishbone import gramWishbone
20
21 from nmigen_boards.versa_ecp5 import VersaECP5Platform85
22 from ecp5_crg import ECP5CRG
23 #from crg import ECPIX5CRG
24 from uartbridge import UARTBridge
25 from crg import *
26
27 class DDR3SoC(SoC, Elaboratable):
28 def __init__(self, *,
29 ddrphy_addr, dramcore_addr,
30 ddr_addr):
31 self._decoder = wishbone.Decoder(addr_width=30, data_width=32, granularity=8,
32 features={"cti", "bte"})
33
34 #self.crg = ECPIX5CRG()
35 self.crg = ECP5CRG()
36
37 self.ub = UARTBridge(divisor=868, pins=platform.request("uart", 0))
38
39 ddr_pins = platform.request("ddr3", 0, dir={"dq":"-", "dqs":"-"},
40 xdr={"clk":4, "a":4, "ba":4, "clk_en":4, "odt":4, "ras":4, "cas":4, "we":4, "cs":4, "rst":1})
41 self.ddrphy = DomainRenamer("dramsync")(ECP5DDRPHY(ddr_pins))
42 self._decoder.add(self.ddrphy.bus, addr=ddrphy_addr)
43
44 ddrmodule = MT41K64M16(platform.default_clk_frequency, "1:2")
45
46 self.dramcore = DomainRenamer("dramsync")(gramCore(
47 phy=self.ddrphy,
48 geom_settings=ddrmodule.geom_settings,
49 timing_settings=ddrmodule.timing_settings,
50 clk_freq=platform.default_clk_frequency))
51 self._decoder.add(self.dramcore.bus, addr=dramcore_addr)
52
53 self.drambone = DomainRenamer("dramsync")(gramWishbone(self.dramcore))
54 self._decoder.add(self.drambone.bus, addr=ddr_addr)
55
56 self.memory_map = self._decoder.bus.memory_map
57
58 self.clk_freq = platform.default_clk_frequency
59
60 def elaborate(self, platform):
61 m = Module()
62
63 m.submodules.sysclk = self.crg
64
65 m.submodules.ub = self.ub
66
67 m.submodules.decoder = self._decoder
68 m.submodules.ddrphy = self.ddrphy
69 m.submodules.dramcore = self.dramcore
70 m.submodules.drambone = self.drambone
71
72 m.d.comb += [
73 self.ub.bus.connect(self._decoder.bus),
74 ]
75
76 return m
77
78
79 if __name__ == "__main__":
80 platform = VersaECP5Platform85()
81
82 soc = DDR3SoC(ddrphy_addr=0x00008000, dramcore_addr=0x00009000,
83 ddr_addr=0x10000000)
84
85 soc.build(do_build=True)
86 platform.build(soc, do_program=True)