diff --git a/crates/fayalite/examples/blinky.rs b/crates/fayalite/examples/blinky.rs new file mode 100644 index 0000000..694c736 --- /dev/null +++ b/crates/fayalite/examples/blinky.rs @@ -0,0 +1,50 @@ +use clap::Parser; +use fayalite::{ + clock::{Clock, ClockDomain}, + hdl_module, + int::{DynUInt, DynUIntType, IntTypeTrait, UInt}, + reset::{SyncReset, ToReset}, +}; + +#[hdl_module] +fn blinky(clock_frequency: u64) { + #[hdl] + let clk: Clock = m.input(); + #[hdl] + let rst: SyncReset = m.input(); + let cd = #[hdl] + ClockDomain { + clk, + rst: rst.to_reset(), + }; + let max_value = clock_frequency / 2 - 1; + let int_ty = DynUIntType::range_inclusive(0..=max_value); + #[hdl] + let counter: DynUInt = m.reg_builder().clock_domain(cd).reset(int_ty.literal(0)); + #[hdl] + let output_reg: UInt<1> = m.reg_builder().clock_domain(cd).reset_default(); + #[hdl] + if counter == int_ty.literal(max_value) { + m.connect(counter, int_ty.literal(0)); + m.connect(output_reg, !output_reg); + } else { + m.connect_any(counter, counter + 1_hdl_u1); + } + #[hdl] + let led: UInt<1> = m.output(); + m.connect(led, output_reg); +} + +#[derive(Parser)] +struct Cli { + /// clock frequency in hertz + #[arg(long, default_value = "1000000", value_parser = clap::value_parser!(u64).range(2..))] + clock_frequency: u64, + #[command(subcommand)] + cli: fayalite::cli::Cli, +} + +fn main() { + let cli = Cli::parse(); + cli.cli.run(blinky(cli.clock_frequency)) +}