From cfe66549ff40488be5b336f14a2cd170d1bb05f8 Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Mon, 28 Jan 2019 14:14:50 +0800 Subject: [PATCH] jesd204sync: cleanup DDMTD averaging code --- artiq/firmware/libboard_artiq/jesd204sync.rs | 21 +++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/artiq/firmware/libboard_artiq/jesd204sync.rs b/artiq/firmware/libboard_artiq/jesd204sync.rs index 9193bb149..2fc44c283 100644 --- a/artiq/firmware/libboard_artiq/jesd204sync.rs +++ b/artiq/firmware/libboard_artiq/jesd204sync.rs @@ -25,22 +25,21 @@ fn average_phases(phases: &[i32], modulo: i32) -> i32 { const DDMTD_N_SHIFT: i32 = 6; const DDMTD_N: i32 = 1 << DDMTD_N_SHIFT; -const SYSREF_SH_PRECISION_SHIFT: i32 = 5; -const SYSREF_SH_PRECISION: i32 = 1 << SYSREF_SH_PRECISION_SHIFT; -const SYSREF_SH_MOD: i32 = 1 << (DDMTD_N_SHIFT + SYSREF_SH_PRECISION_SHIFT); - - fn measure_ddmdt_phase_raw() -> i32 { unsafe { csr::sysref_ddmtd::dt_read() as i32 } } fn measure_ddmdt_phase() -> i32 { - let mut measurements = [0; SYSREF_SH_PRECISION as usize]; - for i in 0..SYSREF_SH_PRECISION { - measurements[i as usize] = measure_ddmdt_phase_raw() << SYSREF_SH_PRECISION_SHIFT; + const AVG_PRECISION_SHIFT: i32 = 5; + const AVG_PRECISION: i32 = 1 << AVG_PRECISION_SHIFT; + const AVG_MOD: i32 = 1 << (DDMTD_N_SHIFT + AVG_PRECISION_SHIFT); + + let mut measurements = [0; AVG_PRECISION as usize]; + for i in 0..AVG_PRECISION { + measurements[i as usize] = measure_ddmdt_phase_raw() << AVG_PRECISION_SHIFT; clock::spin_us(10); } - average_phases(&measurements, SYSREF_SH_MOD) >> SYSREF_SH_PRECISION_SHIFT + average_phases(&measurements, AVG_MOD) >> AVG_PRECISION_SHIFT } fn test_ddmtd_stability() -> Result<(), &'static str> { @@ -116,6 +115,10 @@ fn sysref_sh_error() -> bool { } } +const SYSREF_SH_PRECISION_SHIFT: i32 = 5; +const SYSREF_SH_PRECISION: i32 = 1 << SYSREF_SH_PRECISION_SHIFT; +const SYSREF_SH_MOD: i32 = 1 << (DDMTD_N_SHIFT + SYSREF_SH_PRECISION_SHIFT); + #[derive(Default)] struct SysrefShLimits { rising_phases: [i32; SYSREF_SH_PRECISION as usize],