diff options
Diffstat (limited to 'amaranth_boards/arrow_deca.py')
| -rw-r--r-- | amaranth_boards/arrow_deca.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/amaranth_boards/arrow_deca.py b/amaranth_boards/arrow_deca.py new file mode 100644 index 0000000..5fd4245 --- /dev/null +++ b/amaranth_boards/arrow_deca.py @@ -0,0 +1,88 @@ +import os +import subprocess + +from amaranth.build import * +from amaranth.vendor.intel import * +from .resources import * + + +__all__ = ["ArrowDECAPlatform"] + + +class ArrowDECAPlatform(IntelPlatform): + device = "10M50DA" # MAX 10 + package = "F484" + speed = "C6" + suffix = "GES" + default_clk = "clk50" + resources = [ + Resource("clk50", 0, Pins("M8", dir="i"), + Clock(50e6), Attrs(io_standard="2.5 V")), + Resource("clk50", 1, Pins("P11", dir="i"), + Clock(50e6), Attrs(io_standard="3.3 V")), + Resource("clk50", 2, Pins("N15", dir="i"), + Clock(50e6), Attrs(io_standard="1.5 V")), + Resource("clk10", 0, Pins("M9", dir="i"), + Clock(10e6), Attrs(io_standard="2.5 V")), + + *LEDResources( + pins="C7 C8 A6 B7 C4 A5 B4 C5", + invert=True, + attrs=Attrs(io_standard="1.2 V")), + *ButtonResources( + pins="H21 H22", + invert=True, + attrs=Attrs(io_standard="1.5 V")), + *SwitchResources( + pins="J21 J22", + attrs=Attrs(io_standard="1.5 V")), + ] + connectors = [ + Connector("gpio", 0, + "W18 Y18 Y19 AA17 AA20 AA19 AB21 AB20 AB19 Y16 V16 " + "AB18 V15 W17 AB17 AA16 AB16 W16 AB15 W15 Y14 AA15 " + "AB14 AA14 AB13 AA13 AB12 AA12 AB11 AA11 AB10 Y13 Y11 " + "W13 W12 W11 V12 V11 V13 V14 Y17 W14 U15 R13"), + Connector("gpio", 1, + "Y5 Y6 W6 W7 W8 V8 AB8 V7 R11 AB7 AB6 " + "AA7 AA6 Y7 V10 U7 W9 W5 R9 W4 P9 V17 " + "W3"), + ] + + def toolchain_program(self, products, name): + quartus_pgm = os.environ.get("QUARTUS_PGM", "quartus_pgm") + with products.extract("{}.sof".format(name)) as bitstream_filename: + subprocess.check_call([quartus_pgm, "--haltcc", "--mode", "JTAG", + "--operation", "P;" + bitstream_filename]) + + @property + def file_templates(self): + # Configure the voltages of the I/O banks by appending the global + # assignments to the template. However, we create our own copy of the + # file templates before modifying them to avoid modifying the original. + return { + **super().file_templates, + "{{name}}.qsf": + super().file_templates.get("{{name}}.qsf") + + r""" + set_global_assignment -name IOBANK_VCCIO 2.5V -section_id 1A + set_global_assignment -name IOBANK_VCCIO 2.5V -section_id 1B + set_global_assignment -name IOBANK_VCCIO 2.5V -section_id 2 + set_global_assignment -name IOBANK_VCCIO 3.3V -section_id 3 + set_global_assignment -name IOBANK_VCCIO 3.3V -section_id 4 + set_global_assignment -name IOBANK_VCCIO 1.5V -section_id 5 + set_global_assignment -name IOBANK_VCCIO 1.5V -section_id 6 + set_global_assignment -name IOBANK_VCCIO 1.8V -section_id 7 + set_global_assignment -name IOBANK_VCCIO 1.2V -section_id 8 + + set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON + set_global_assignment -name AUTO_RESTART_CONFIGURATION OFF + set_global_assignment -name ENABLE_CONFIGURATION_PINS OFF + set_global_assignment -name ENABLE_BOOT_SEL_PIN OFF + """ + } + + +if __name__ == "__main__": + from .test.blinky import Blinky + ArrowDECAPlatform().build(Blinky(), do_program=True) |
