import "/nmigen_boards.icebreaker/ICEBreakerPlatform" import "/nmigen_dg/*" import "/sys" import "modules/blinker/Blinker" import "modules/pulser/Pulser" import "modules/segment7/Segment7x2" import "resources/pmod" Top = subclass Elaboratable where elaborate = platform ~> m where with m = Module! => freq = int platform.default_clk_frequency @ledr = platform.request "led_r" 0 @ledg = platform.request "led_g" 0 @seg7 = platform.request "seven_seg" blinker = (Submodule.blinker$ Blinker$ freq // 3 ).out pulser = (Submodule.pulser $ Pulser$ freq // 2).out seg7 = Submodule.seg7$ Segment7x2 decimal: False Comb$ @ledr ::= blinker ff = Signal 1 reset: 1 When pulser $ -> Sync$ ff ::= ~ff Comb$ @ledg ::= ff counter = Signal 4 When pulser $ -> Sync$ counter ::= counter + 1 # TODO: learn SPI FLASH mem = Memory width: 8 depth: 16 # ew init: ([0xde, 0xad, 0xbe, 0xef]*4) rdport = Submodule.rdport$ mem.read_port! Comb$ rdport.addr ::= counter Comb$ seg7.number ::= rdport.data #Comb$ seg7.number ::= counter Comb$ @seg7 ::= Cat seg7.segs seg7.select @leds = Cat platform.request "led_g" 4 platform.request "led_g" 2 platform.request "led_g" 3 platform.request "led_g" 1 @ledm = platform.request "led_r" 1 @btn_r = platform.request "button" 1 @btn_m = platform.request "button" 2 @btn_l = platform.request "button" 3 state = Signal 4 reset: 0b1000 Comb$ @leds ::= state Comb$ @ledm ::= (@btn_r | @btn_l) When (on_rising_edge @btn_l) $ -> Sync$ state ::= state.rotate_left 1 When (on_rising_edge @btn_r) $ -> Sync$ state ::= state.rotate_right 1 When (on_rising_edge @btn_m) $ -> Sync$ state ::= ~state on_rising_edge = signal -> result where prev = Signal (signal.shape!) Sync$ prev ::= signal result = ~ signal.implies prev if __name__ == "__main__" => plat = ICEBreakerPlatform! plat.add_resources$ pmod.seven_seg 0 pmod: 0 # pmod 1a plat.add_resources$ pmod.dip_switch8 0 pmod: 1 # pmod 1b plat.add_resources$ plat.break_off_pmod plat.build Top! do_program: ("--flash" in sys.argv)