55 lines
1.5 KiB
Rust
55 lines
1.5 KiB
Rust
// SPDX-License-Identifier: LGPL-3.0-or-later
|
|
// See Notices.txt for copyright information
|
|
use fayalite::{
|
|
build::{ToArgs, WriteArgs},
|
|
prelude::*,
|
|
};
|
|
|
|
#[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 = 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]
|
|
if counter_reg.cmp_eq(max_value) {
|
|
connect_any(counter_reg, 0u8);
|
|
connect(output_reg, !output_reg);
|
|
} else {
|
|
connect_any(counter_reg, counter_reg + 1_hdl_u1);
|
|
}
|
|
#[hdl]
|
|
let led: Bool = m.output();
|
|
connect(led, output_reg);
|
|
}
|
|
|
|
#[derive(clap::Args, Clone, PartialEq, Eq, Hash, Debug)]
|
|
struct ExtraArgs {
|
|
/// clock frequency in hertz
|
|
#[arg(long, default_value = "1000000", value_parser = clap::value_parser!(u64).range(2..))]
|
|
clock_frequency: u64,
|
|
}
|
|
|
|
impl ToArgs for ExtraArgs {
|
|
fn to_args(&self, args: &mut (impl WriteArgs + ?Sized)) {
|
|
let Self { clock_frequency } = self;
|
|
args.write_arg(format_args!("--clock-frequency={clock_frequency}"));
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
BuildCli::main(|_cli, ExtraArgs { clock_frequency }| {
|
|
Ok(JobParams::new(blinky(clock_frequency), "blinky"))
|
|
});
|
|
}
|