re-bba-rb/re-bba/ReBba/amaranth_boards/test/blinky.py

49 lines
1.6 KiB
Python

import itertools
from amaranth import *
from amaranth.build import ResourceError
__all__ = ["Blinky"]
class Blinky(Elaboratable):
def elaborate(self, platform):
m = Module()
def get_all_resources(name):
resources = []
for number in itertools.count():
try:
resources.append(platform.request(name, number))
except ResourceError:
break
return resources
rgb_leds = [res for res in get_all_resources("rgb_led")]
leds = [res.o for res in get_all_resources("led")]
leds.extend([led.r.o for led in rgb_leds])
leds.extend([led.g.o for led in rgb_leds])
leds.extend([led.b.o for led in rgb_leds])
buttons = [res.i for res in get_all_resources("button")]
switches = [res.i for res in get_all_resources("switch")]
inverts = [0 for _ in leds]
for index, button in zip(itertools.cycle(range(len(inverts))), buttons):
inverts[index] ^= button
for index, switch in zip(itertools.cycle(range(len(inverts))), switches):
inverts[index] ^= switch
clk_freq = platform.default_clk_frequency
timer = Signal(range(int(clk_freq//2)), reset=int(clk_freq//2) - 1)
flops = Signal(len(leds))
m.d.comb += Cat(leds).eq(flops ^ Cat(inverts))
with m.If(timer == 0):
m.d.sync += timer.eq(timer.reset)
m.d.sync += flops.eq(~flops)
with m.Else():
m.d.sync += timer.eq(timer - 1)
return m