forked from enjoy-digital/litex
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
6043108
commit 179b725
Showing
5 changed files
with
455 additions
and
93 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,12 +1,16 @@ | ||
#!/usr/bin/env python3 | ||
|
||
# This file is Copyright (c) 2015-2019 Florent Kermarrec <[email protected]> | ||
# This file is Copyright (c) 2020 Antmicro <www.antmicro.com> | ||
# License: BSD | ||
|
||
import argparse | ||
|
||
from migen import * | ||
|
||
from migen.build.generic_platform import Pins, IOStandard, Subsignal | ||
from litex.build.generic_platform import * | ||
|
||
from litex.boards.platforms import arty | ||
from litex.build.xilinx.vivado import vivado_build_args, vivado_build_argdict | ||
|
||
|
@@ -20,6 +24,22 @@ | |
|
||
from liteeth.phy.mii import LiteEthPHYMII | ||
|
||
from litesdcard.phy import SDPHY | ||
from litesdcard.clocker import SDClockerS7 | ||
from litesdcard.core import SDCore | ||
from litesdcard.data import SDDataReader, SDDataWriter | ||
from litex.soc.cores.timer import Timer | ||
from litex.soc.interconnect import wishbone | ||
|
||
_sd_io = [ | ||
("sdcard", 0, | ||
Subsignal("data", Pins("D15 J17 J18 E15")), | ||
Subsignal("cmd", Pins("E16")), | ||
Subsignal("clk", Pins("C15")), | ||
IOStandard("LVCMOS33"), Misc("SLEW=FAST") | ||
) | ||
] | ||
|
||
# CRG ---------------------------------------------------------------------------------------------- | ||
|
||
class _CRG(Module): | ||
|
@@ -53,6 +73,10 @@ class BaseSoC(SoCCore): | |
def __init__(self, sys_clk_freq=int(100e6), with_ethernet=False, with_etherbone=False, **kwargs): | ||
platform = arty.Platform() | ||
|
||
platform.add_extension(_sd_io) | ||
clk_freq = int(100e6) | ||
sd_freq = int(25e6) | ||
|
||
# SoCCore ---------------------------------------------------------------------------------- | ||
SoCCore.__init__(self, platform, clk_freq=sys_clk_freq, **kwargs) | ||
|
||
|
@@ -93,6 +117,64 @@ def __init__(self, sys_clk_freq=int(100e6), with_ethernet=False, with_etherbone= | |
self.add_csr("ethphy") | ||
self.add_etherbone(phy=self.ethphy) | ||
|
||
# SDCard ----------------------------------------------------------------------------------- | ||
sdcard_pads = platform.request('sdcard') | ||
|
||
self.submodules.sdclk = SDClockerS7(sd_clk_freq=sd_freq) | ||
self.add_csr("sdclk") | ||
self.submodules.sdphy = SDPHY(sdcard_pads, platform.device) | ||
self.add_csr("sdphy") | ||
self.submodules.sdcore = SDCore(self.sdphy, csr_data_width=8) | ||
self.add_csr("sdcore") | ||
self.submodules.sdtimer = Timer() | ||
self.add_csr("sdtimer") | ||
|
||
# SD Card data reader | ||
|
||
memory_size = 512; | ||
memory_width = 32; | ||
|
||
sdread_mem = Memory(memory_width, memory_size//4) | ||
sdread_sram = FullMemoryWE()(wishbone.SRAM(sdread_mem, read_only=True)) | ||
self.submodules += sdread_sram | ||
|
||
self.add_wb_slave(self.mem_map["sdread"], sdread_sram.bus, memory_size) | ||
self.add_memory_region("sdread", self.mem_map["sdread"], memory_size) | ||
|
||
sdread_port = sdread_sram.mem.get_port(write_capable=True); | ||
self.specials += sdread_port | ||
self.submodules.sddatareader = SDDataReader(port=sdread_port, endianness=self.cpu.endianness) | ||
self.add_csr("sddatareader") | ||
self.comb += self.sdcore.source.connect(self.sddatareader.sink), | ||
|
||
# SD Card data writer | ||
|
||
sdwrite_mem = Memory(memory_width, memory_size//4) | ||
sdwrite_sram = FullMemoryWE()(wishbone.SRAM(sdwrite_mem, read_only=False)) | ||
self.submodules += sdwrite_sram | ||
|
||
self.add_wb_slave(self.mem_map["sdwrite"], sdwrite_sram.bus, memory_size) | ||
self.add_memory_region("sdwrite", self.mem_map["sdwrite"], memory_size) | ||
|
||
sdwrite_port = sdwrite_sram.mem.get_port(write_capable=False, async_read=True, mode=READ_FIRST); | ||
self.specials += sdwrite_port | ||
self.submodules.sddatawriter = SDDataWriter(port=sdwrite_port, endianness=self.cpu.endianness) | ||
self.add_csr("sddatawriter") | ||
self.comb += self.sddatawriter.source.connect(self.sdcore.sink), | ||
|
||
|
||
self.platform.add_period_constraint(self.crg.cd_sys.clk, 1e9/clk_freq) | ||
self.platform.add_period_constraint(self.sdclk.cd_sd.clk, 1e9/sd_freq) | ||
self.platform.add_period_constraint(self.sdclk.cd_sd_fb.clk, 1e9/sd_freq) | ||
|
||
self.crg.cd_sys.clk.attr.add("keep") | ||
self.sdclk.cd_sd.clk.attr.add("keep") | ||
self.sdclk.cd_sd_fb.clk.attr.add("keep") | ||
self.platform.add_false_path_constraints( | ||
self.crg.cd_sys.clk, | ||
self.sdclk.cd_sd.clk, | ||
self.sdclk.cd_sd_fb.clk) | ||
|
||
# Build -------------------------------------------------------------------------------------------- | ||
|
||
def main(): | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,6 +10,7 @@ | |
// This file is Copyright (c) 2018 Jean-François Nguyen <[email protected]> | ||
// This file is Copyright (c) 2018 Sergiusz Bazanski <[email protected]> | ||
// This file is Copyright (c) 2016 Tim 'mithro' Ansell <[email protected]> | ||
// This file is Copyright (c) 2020 Antmicro <www.antmicro.com> | ||
|
||
// License: BSD | ||
|
||
|
@@ -386,6 +387,8 @@ static void help(void) | |
#ifdef CSR_SDCORE_BASE | ||
puts("sdclk <freq> - SDCard set clk frequency (Mhz)"); | ||
puts("sdinit - SDCard initialization"); | ||
puts("sdtestread <blk> - SDCard read data from <blk>"); | ||
puts("sdtestwrite <blk> <data> - SDCard write <data> to <blk>"); | ||
puts("sdtest <loops> - SDCard test"); | ||
#endif | ||
#ifdef USDDRPHY_DEBUG | ||
|
@@ -487,6 +490,8 @@ static void do_command(char *c) | |
#ifdef CSR_SDCORE_BASE | ||
else if(strcmp(token, "sdclk") == 0) sdclk_set_clk(atoi(get_token(&c))); | ||
else if(strcmp(token, "sdinit") == 0) sdcard_init(); | ||
else if(strcmp(token, "sdtestread") == 0) sdcard_test_read(atoi(get_token(&c))); | ||
else if(strcmp(token, "sdtestwrite") == 0) sdcard_test_write(atoi(get_token(&c)), c); | ||
else if(strcmp(token, "sdtest") == 0) sdcard_test(atoi(get_token(&c))); | ||
#endif | ||
#ifdef USDDRPHY_DEBUG | ||
|
Oops, something went wrong.