mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2025-01-28 18:04:51 +00:00
write the code phase rate and the nco phase rate parameters in the FPGA
This commit is contained in:
parent
19184da0f9
commit
91f509abf9
@ -53,6 +53,9 @@
|
||||
#define MEM_LOCAL_CODE_WR_ENABLE 0x0C000000 // command to enable the ENA and WR pins of the internal memory of the multicorrelator
|
||||
#define POW_2_2 4 // 2^2 (used for the conversion of floating point numbers to integers)
|
||||
#define POW_2_31 2147483648 // 2^31 (used for the conversion of floating point numbers to integers)
|
||||
#define ENABLE_INT_ON_RESET 2 // flag that causes the acquisition to trigger an interrupt when it is reset. It is used \
|
||||
// to avoid a potential deadlock caused by the SW waiting for an interrupt from the FPGA when the \
|
||||
// HW is reset
|
||||
|
||||
#define SELECT_LSBits 0x0000FFFF // Select the 10 LSbits out of a 20-bit word
|
||||
#define SELECT_MSBbits 0xFFFF0000 // Select the 10 MSbits out of a 20-bit word
|
||||
@ -311,7 +314,9 @@ void Fpga_Acquisition::close_device()
|
||||
|
||||
void Fpga_Acquisition::reset_acquisition(void)
|
||||
{
|
||||
d_map_base[8] = RESET_ACQUISITION; // writing a 2 to d_map_base[8] resets the multicorrelator
|
||||
d_map_base[8] = RESET_ACQUISITION; // writing a 2 to d_map_base[8] resets the acquisition. This causes a reset of all
|
||||
// the FPGA HW modules including the multicorrelators
|
||||
d_map_base[14] = ENABLE_INT_ON_RESET; // enable int on reset
|
||||
}
|
||||
|
||||
|
||||
|
@ -59,7 +59,8 @@
|
||||
#define LOCAL_CODE_FPGA_CLEAR_ADDRESS_COUNTER 0x10000000
|
||||
#define LOCAL_CODE_FPGA_ENABLE_WRITE_MEMORY 0x0C000000
|
||||
#define TEST_REGISTER_TRACK_WRITEVAL 0x55AA
|
||||
|
||||
#define ENABLE_TRK_INT_ON_RESET 1 /* flag that causes the tracking HW accelerator to trigger an interrupt when it is reset. It is used \
|
||||
to avoid a potential deadlock caused by the SW waiting for an interrupt from the FPGA when the HW is reset */
|
||||
#ifndef TEMP_FAILURE_RETRY
|
||||
#define TEMP_FAILURE_RETRY(exp) \
|
||||
({ \
|
||||
@ -182,19 +183,21 @@ void Fpga_Multicorrelator_8sc::update_local_code()
|
||||
|
||||
|
||||
void Fpga_Multicorrelator_8sc::Carrier_wipeoff_multicorrelator_resampler(
|
||||
float rem_carrier_phase_in_rad,
|
||||
float phase_step_rad,
|
||||
float carrier_phase_rate_step_rad __attribute__((unused)),
|
||||
float rem_code_phase_chips,
|
||||
float code_phase_step_chips __attribute__((unused)),
|
||||
float code_phase_rate_step_chips __attribute__((unused)),
|
||||
int32_t signal_length_samples)
|
||||
float rem_carrier_phase_in_rad, // nco phase initial position
|
||||
float phase_step_rad, // nco phase step
|
||||
float carrier_phase_rate_step_rad __attribute__((unused)), // nco phase step rate change
|
||||
float rem_code_phase_chips, // code resampler initial position
|
||||
float code_phase_step_chips __attribute__((unused)), // code resampler step
|
||||
float code_phase_rate_step_chips __attribute__((unused)), // code resampler step rate
|
||||
int32_t signal_length_samples) // number of samples
|
||||
{
|
||||
d_rem_code_phase_chips = rem_code_phase_chips;
|
||||
d_rem_carrier_phase_in_rad = rem_carrier_phase_in_rad;
|
||||
d_code_phase_step_chips = code_phase_step_chips;
|
||||
d_phase_step_rad = phase_step_rad;
|
||||
d_correlator_length_samples = signal_length_samples;
|
||||
d_rem_carrier_phase_in_rad = rem_carrier_phase_in_rad; // nco phase initial position
|
||||
d_phase_step_rad = phase_step_rad; // nco phase step
|
||||
d_carrier_phase_rate_step_rad = carrier_phase_rate_step_rad; // nco phase step rate
|
||||
d_rem_code_phase_chips = rem_code_phase_chips; // code resampler initial position
|
||||
d_code_phase_step_chips = code_phase_step_chips; // code resampler step
|
||||
d_code_phase_rate_step_chips = code_phase_rate_step_chips; // code resampler step rate
|
||||
d_correlator_length_samples = signal_length_samples; // number of samples
|
||||
Fpga_Multicorrelator_8sc::update_local_code();
|
||||
Fpga_Multicorrelator_8sc::fpga_compute_signal_parameters_in_fpga();
|
||||
Fpga_Multicorrelator_8sc::fpga_configure_signal_parameters_in_fpga();
|
||||
@ -287,6 +290,8 @@ void Fpga_Multicorrelator_8sc::set_channel(uint32_t channel)
|
||||
LOG(INFO) << "Test register sanity check success !";
|
||||
}
|
||||
|
||||
d_map_base[INT_ON_RST_REG_ADDR] = ENABLE_TRK_INT_ON_RESET; // enable interrupts on reset to prevent deadlock
|
||||
|
||||
// enable interrupts
|
||||
int32_t reenable = 1;
|
||||
ssize_t nbytes = TEMP_FAILURE_RETRY(write(d_device_descriptor, reinterpret_cast<void *>(&reenable), sizeof(int32_t)));
|
||||
@ -396,6 +401,7 @@ void Fpga_Multicorrelator_8sc::fpga_compute_signal_parameters_in_fpga(void)
|
||||
float d_rem_carrier_phase_in_rad_temp;
|
||||
|
||||
d_code_phase_step_chips_num = static_cast<uint32_t>(roundf(MAX_CODE_RESAMPLER_COUNTER * d_code_phase_step_chips));
|
||||
d_code_phase_rate_step_chips_num = static_cast<uint32_t>(roundf(MAX_CODE_RESAMPLER_COUNTER * d_code_phase_rate_step_chips));
|
||||
|
||||
if (d_rem_carrier_phase_in_rad > M_PI)
|
||||
{
|
||||
@ -412,18 +418,23 @@ void Fpga_Multicorrelator_8sc::fpga_compute_signal_parameters_in_fpga(void)
|
||||
|
||||
d_rem_carr_phase_rad_int = static_cast<int32_t>(roundf((d_rem_carrier_phase_in_rad_temp)*PHASE_CARR_MAX_div_PI));
|
||||
d_phase_step_rad_int = static_cast<int32_t>(roundf((d_phase_step_rad)*PHASE_CARR_MAX_div_PI)); // the FPGA accepts a range for the phase step between -pi and +pi
|
||||
d_carrier_phase_rate_step_rad_int = static_cast<int32_t>(roundf((d_carrier_phase_rate_step_rad)*PHASE_CARR_MAX_div_PI));
|
||||
}
|
||||
|
||||
|
||||
void Fpga_Multicorrelator_8sc::fpga_configure_signal_parameters_in_fpga(void)
|
||||
{
|
||||
d_map_base[CODE_PHASE_STEP_CHIPS_NUM_REG_ADDR] = d_code_phase_step_chips_num;
|
||||
d_map_base[CODE_PHASE_STEP_CHIPS_NUM_REG_ADDR] = d_code_phase_step_chips_num; // code phase step
|
||||
|
||||
d_map_base[NSAMPLES_MINUS_1_REG_ADDR] = d_correlator_length_samples - 1;
|
||||
d_map_base[CODE_PHASE_STEP_CHIPS_RATE] = d_code_phase_rate_step_chips_num; // code phase step rate
|
||||
|
||||
d_map_base[REM_CARR_PHASE_RAD_REG_ADDR] = d_rem_carr_phase_rad_int;
|
||||
d_map_base[NSAMPLES_MINUS_1_REG_ADDR] = d_correlator_length_samples - 1; // number of samples
|
||||
|
||||
d_map_base[PHASE_STEP_RAD_REG_ADDR] = d_phase_step_rad_int;
|
||||
d_map_base[REM_CARR_PHASE_RAD_REG_ADDR] = d_rem_carr_phase_rad_int; // initial nco phase
|
||||
|
||||
d_map_base[PHASE_STEP_RAD_REG_ADDR] = d_phase_step_rad_int; // nco phase step
|
||||
|
||||
d_map_base[PHASE_STEP_RATE_REG_ADDR] = d_carrier_phase_rate_step_rad_int; // nco phase step rate
|
||||
}
|
||||
|
||||
|
||||
|
@ -54,7 +54,10 @@
|
||||
#define DROP_SAMPLES_REG_ADDR 18
|
||||
#define INITIAL_COUNTER_VALUE_REG_ADDR_LSW 19
|
||||
#define INITIAL_COUNTER_VALUE_REG_ADDR_MSW 20
|
||||
#define CODE_PHASE_STEP_CHIPS_RATE 21
|
||||
#define PHASE_STEP_RATE_REG_ADDR 22
|
||||
#define STOP_TRACKING_REG_ADDR 23
|
||||
#define INT_ON_RST_REG_ADDR 24 // cause interrupt on reset to prevent deadlock
|
||||
#define START_FLAG_ADDR 30
|
||||
// read-write addresses
|
||||
#define TEST_REG_ADDR 31
|
||||
@ -109,15 +112,19 @@ private:
|
||||
uint32_t d_correlator_length_samples;
|
||||
float d_rem_code_phase_chips;
|
||||
float d_code_phase_step_chips;
|
||||
float d_code_phase_rate_step_chips;
|
||||
float d_rem_carrier_phase_in_rad;
|
||||
float d_phase_step_rad;
|
||||
float d_carrier_phase_rate_step_rad;
|
||||
|
||||
// configuration data computed in the format that the FPGA expects
|
||||
uint32_t *d_initial_index;
|
||||
uint32_t *d_initial_interp_counter;
|
||||
uint32_t d_code_phase_step_chips_num;
|
||||
uint32_t d_code_phase_rate_step_chips_num;
|
||||
int32_t d_rem_carr_phase_rad_int;
|
||||
int32_t d_phase_step_rad_int;
|
||||
int32_t d_carrier_phase_rate_step_rad_int;
|
||||
uint64_t d_initial_sample_counter;
|
||||
|
||||
// driver
|
||||
|
Loading…
Reference in New Issue
Block a user