aboutsummaryrefslogtreecommitdiff
path: root/nmigen_boards/_blinky.py
blob: 4fc0cc8db8c07e84685fb24de6fb476245e2b6ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import itertools

from nmigen import *
from nmigen.build import ResourceError


class Blinky(Elaboratable):
    def __init__(self, clk_name, clk_freq):
        self.clk_name = clk_name
        self.clk_freq = clk_freq

    def elaborate(self, platform):
        m = Module()

        clk = platform.request(self.clk_name)
        m.domains.sync = ClockDomain()
        m.d.comb += ClockSignal().eq(clk.i)

        leds = []
        for n in itertools.count():
            try:
                leds.append(platform.request("user_led", n))
            except ResourceError:
                break
        leds = Cat(led.o for led in leds)

        ctr = Signal(max=int(self.clk_freq//2), reset=int(self.clk_freq//2) - 1)
        with m.If(ctr == 0):
            m.d.sync += ctr.eq(ctr.reset)
            m.d.sync += leds.eq(~leds)
        with m.Else():
            m.d.sync += ctr.eq(ctr - 1)

        return m


def build_and_program(platform_cls, clk_name, clk_freq, **kwargs):
    platform_cls().build(Blinky(clk_name, clk_freq), do_program=True, **kwargs)