89 lines
3.5 KiB
Python
89 lines
3.5 KiB
Python
|
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)
|