// SPDX-License-Identifier: LGPL-3.0-or-later // See Notices.txt for copyright information use fayalite::prelude::*; #[hdl_module] fn blinky(platform_io_builder: PlatformIOBuilder<'_>) { let clk_input = platform_io_builder.peripherals_with_type::()[0].use_peripheral(); let rst = platform_io_builder.peripherals_with_type::()[0].use_peripheral(); let cd = #[hdl] ClockDomain { clk: clk_input.clk, rst, }; let max_value = (Expr::ty(clk_input).frequency() / 2.0).round_ties_even() as u64 - 1; let int_ty = UInt::range_inclusive(0..=max_value); #[hdl] let counter_reg: UInt = reg_builder().clock_domain(cd).reset(0u8.cast_to(int_ty)); #[hdl] let output_reg: Bool = reg_builder().clock_domain(cd).reset(false); #[hdl] let rgb_output_reg = reg_builder().clock_domain(cd).reset( #[hdl] peripherals::RgbLed { r: false, g: false, b: false, }, ); #[hdl] if counter_reg.cmp_eq(max_value) { connect_any(counter_reg, 0u8); connect(output_reg, !output_reg); connect(rgb_output_reg.r, !rgb_output_reg.r); #[hdl] if rgb_output_reg.r { connect(rgb_output_reg.g, !rgb_output_reg.g); #[hdl] if rgb_output_reg.g { connect(rgb_output_reg.b, !rgb_output_reg.b); } } } else { connect_any(counter_reg, counter_reg + 1_hdl_u1); } for led in platform_io_builder.peripherals_with_type::() { if let Ok(led) = led.try_use_peripheral() { connect(led.on, output_reg); } } for rgb_led in platform_io_builder.peripherals_with_type::() { if let Ok(rgb_led) = rgb_led.try_use_peripheral() { connect(rgb_led, rgb_output_reg); } } #[hdl] let io = m.add_platform_io(platform_io_builder); } fn main() { ::main("blinky", |_, platform, _| { Ok(JobParams::new(platform.wrap_main_module(blinky))) }); }