diff --git a/utils/agc_calibrate.R b/utils/agc_calibrate.R new file mode 100644 index 0000000..111e333 --- /dev/null +++ b/utils/agc_calibrate.R @@ -0,0 +1,43 @@ +dB2lin <- function(x) { 10^(x/10) } + +gain.levels <- 0:46 * 2 +gains <- dB2lin(gain.levels) + +ref.level <- 1/0.03125 # the level we want to tune to +ref.gain <- gains[which(gain.levels == 46)] # idle gain setting + +abs.level <- ref.level * ref.gain / gains + +abs.level.int <- round(abs.level * 2**15) + +lna.level <- c(0, 16, 30) +lna.conf <- c(0, 64, 96) + +cat('if signed(power_in) > ', abs.level.int[1], ' then + a <= std_logic_vector(to_unsigned(0, 7));\n'); + +last = abs.level.int[1] +for(i in 2:length(abs.level.int)) { + if(abs.level.int[i] == last) { + next + } + last = abs.level.int[i]; + gdb = gain.levels[i] + + lna.index = max(which(lna.level <= gdb)) + gdb = gdb - lna.level[lna.index] + lna = lna.conf[lna.index] + gdb = floor(gdb / 2) + +cat('elsif signed(power_in) > ', last, ' then + a <= std_logic_vector(to_unsigned(', lna + gdb, ', 7));\n'); +} + + +# --if signed(power_in) > 2**24 then +# -- a <= std_logic_vector(to_unsigned(0, 7)); +# --elsif signed(power_in) > 2**16 then +# -- a <= std_logic_vector(to_unsigned(32, 7)); +# --else +# -- a <= std_logic_vector(to_unsigned(127, 7)); +# --end if;