diff --git a/src/periph/fpga.cpp b/src/periph/fpga.cpp index 86532cfefae814283195835f2c478310172a1037..b85754efda51b3a80f3d04c43b48d07639cfde1c 100644 --- a/src/periph/fpga.cpp +++ b/src/periph/fpga.cpp @@ -72,10 +72,12 @@ Periph_fpga::Periph_fpga(uint global_nr, string ipaddr, uint n_beamsets): current_fw_version("-.-"), signal_input_sync_timeout(false), signal_input_bsn(0), - xst_input_bsn_at_sync(0), - xst_output_sync_bsn(0), signal_input_nof_packets(0), signal_input_nof_samples(0), + signal_input_mean {0.0}, + signal_input_rms {0.0}, + xst_input_bsn_at_sync(0), + xst_output_sync_bsn(0), sst_offload_nof_packets(0), sst_offload_nof_valid(0), bst_offload_nof_packets {0}, @@ -88,8 +90,6 @@ Periph_fpga::Periph_fpga(uint global_nr, string ipaddr, uint n_beamsets): jesd_csr_dev_syncn {0}, jesd_rx_err0 {0}, jesd_rx_err1 {0}, - signal_input_mean {0.0}, - signal_input_rms {0.0}, pps_offset_cnt(0), pps_expected_cnt(0), pps_present(false), @@ -138,10 +138,10 @@ bool Periph_fpga::clear_fw_values() current_fw_version = "-.-"; signal_input_sync_timeout = false; signal_input_bsn = 0; - xst_input_bsn_at_sync = 0; - xst_output_sync_bsn = 0; signal_input_nof_packets = 0; signal_input_nof_samples = 0; + xst_input_bsn_at_sync = 0; + xst_output_sync_bsn = 0; sst_offload_nof_packets = 0; sst_offload_nof_valid = 0; xst_offload_nof_packets = 0; @@ -197,16 +197,16 @@ bool Periph_fpga::read(char *data, const string addr, const string type, const i if (addr == "fpga/time_since_last_pps") { retval = read_time_since_last_pps(data, format, R_MEM); } else if (addr == "fpga/pps_capture_cnt") { retval = read_pps_capture_cnt(data, format, R_MEM); } else if (addr == "fpga/signal_input_bsn") { retval = read_signal_input_bsn(data, format, R_MEM); } - else if (addr == "fpga/xst_input_sync_at_bsn") { retval = read_xst_input_sync_at_bsn(data, format, R_MEM); } - else if (addr == "fpga/xst_output_sync_bsn") { retval = read_xst_output_sync_bsn(data, format, R_MEM); } else if (addr == "fpga/signal_input_nof_packets") { retval = read_signal_input_nof_packets(data, format, R_MEM); } else if (addr == "fpga/signal_input_nof_samples") { retval = read_signal_input_nof_samples(data, format, R_MEM); } + else if (addr == "fpga/signal_input_mean") { retval = read_signal_input_mean(data, format, R_MEM); } + else if (addr == "fpga/signal_input_rms") { retval = read_signal_input_rms(data, format, R_MEM); } + else if (addr == "fpga/xst_input_sync_at_bsn") { retval = read_xst_input_sync_at_bsn(data, format, R_MEM); } + else if (addr == "fpga/xst_output_sync_bsn") { retval = read_xst_output_sync_bsn(data, format, R_MEM); } else if (addr == "fpga/jesd204b_csr_dev_syncn") { retval = read_jesd204b_csr_dev_syncn(data, format, R_MEM); } else if (addr == "fpga/jesd204b_csr_rbd_count") { retval = read_jesd204b_csr_rbd_count(data, format, R_MEM); } else if (addr == "fpga/jesd204b_rx_err0") { retval = read_jesd204b_rx_err0(data, format, R_MEM); } else if (addr == "fpga/jesd204b_rx_err1") { retval = read_jesd204b_rx_err1(data, format, R_MEM); } - else if (addr == "fpga/signal_input_mean") { retval = read_signal_input_mean(data, format, R_MEM); } - else if (addr == "fpga/signal_input_rms") { retval = read_signal_input_rms(data, format, R_MEM); } else if (addr == "fpga/sst_offload_nof_packets") { retval = read_sst_offload_nof_packets(data, format, R_MEM); } else if (addr == "fpga/sst_offload_nof_valid") { retval = read_sst_offload_nof_valid(data, format, R_MEM); } else if (addr == "fpga/bst_offload_nof_packets") { retval = read_bst_offload_nof_packets(data, format, R_MEM); } @@ -400,16 +400,16 @@ bool Periph_fpga::monitor(char *data) read_pps_capture_cnt(data, REG_FORMAT_UINT32, R_UCP); read_signal_input_sync_timeout(data, REG_FORMAT_INT64, R_UCP); read_signal_input_bsn(data, REG_FORMAT_INT64, R_UCP); - read_xst_input_sync_at_bsn(data, REG_FORMAT_INT64, R_UCP); - read_xst_output_sync_bsn(data, REG_FORMAT_INT64, R_UCP); read_signal_input_nof_packets(data, REG_FORMAT_INT32, R_UCP); read_signal_input_nof_samples(data, REG_FORMAT_INT32, R_UCP); + read_signal_input_mean(data, REG_FORMAT_DOUBLE, R_UCP); + read_signal_input_rms(data, REG_FORMAT_DOUBLE, R_UCP); + read_xst_input_sync_at_bsn(data, REG_FORMAT_INT64, R_UCP); + read_xst_output_sync_bsn(data, REG_FORMAT_INT64, R_UCP); read_jesd204b_csr_rbd_count(data, REG_FORMAT_UINT32, R_UCP); read_jesd204b_csr_dev_syncn(data, REG_FORMAT_UINT32, R_UCP); read_jesd204b_rx_err0(data, REG_FORMAT_UINT32, R_UCP); read_jesd204b_rx_err1(data, REG_FORMAT_UINT32, R_UCP); - read_signal_input_mean(data, REG_FORMAT_DOUBLE, R_UCP); - read_signal_input_rms(data, REG_FORMAT_DOUBLE, R_UCP); read_sst_offload_nof_packets(data, REG_FORMAT_INT32, R_UCP); read_sst_offload_nof_valid(data, REG_FORMAT_INT32, R_UCP); read_bst_offload_nof_packets(data, REG_FORMAT_INT32, R_UCP); @@ -1935,6 +1935,29 @@ bool Periph_fpga::write_wg_frequency(const char *data) { return retval; } +bool Periph_fpga::write_signal_input_samples_delay(const char *data) { + uint32_t *_ptr = (uint32_t *)data; + bool retval = true; + uint32_t sdp_data; + uint32_t min_sample_delay = 0; + uint32_t max_sample_delay = 4095; + uint32_t sample_delay; + string regname; + for (uint i=0; i< C_S_pn; i++) { + sample_delay = *_ptr; + if ((sample_delay < min_sample_delay) || (sample_delay > max_sample_delay)) { + LOG_F(ERROR, "signal_input_sample_delay not in range<%d:%d>", min_sample_delay, max_sample_delay); + retval = false; + } else { + regname = "mm/0/REG_DP_SHIFTRAM/" + to_string(i) + "/shift"; + sdp_data = sample_delay; + retval = Write(regname, &sdp_data); + _ptr++; + } + } + return retval; +} + bool Periph_fpga::read_signal_input_sync_timeout(char *data, int format, int mode) { bool retval = true; uint32_t sdp_data; @@ -2007,172 +2030,149 @@ bool Periph_fpga::read_signal_input_nof_samples(char *data, int format, int mode return retval; } -bool Periph_fpga::read_jesd204b_csr_rbd_count(char *data, int format, int mode) { +bool Periph_fpga::read_signal_input_mean(char *data, int format, int mode) { bool retval = true; if (mode == R_UCP) { - uint32_t sdp_data; + uint32_t sdp_data[2]; + memset(sdp_data, 0, sizeof(sdp_data)); string regname; + int64_t mean_sum; for (uint i=0; i< C_S_pn; i++) { - regname = "mm/0/JESD204B/" + to_string(i) + "/csr_rbd_count"; - retval = Read(regname, &sdp_data); - jesd_csr_rbd_count[i] = (uint32_t)sdp_data; + regname = "mm/0/REG_ADUH_MONITOR/" + to_string(i) + "/mean_sum"; + retval = Read(regname, sdp_data); + mean_sum = (int64_t)(((int64_t)sdp_data[1] << 32) + sdp_data[0]); + signal_input_mean[i] = (double)mean_sum / C_N_CLK_PER_PPS; } } - uint32_t *_ptr = (uint32_t *)data; + double *_ptr = (double *)data; for (uint i=0; i< C_S_pn; i++) { - *_ptr = jesd_csr_rbd_count[i]; + *_ptr = signal_input_mean[i]; _ptr++; } return retval; } -bool Periph_fpga::read_jesd204b_csr_dev_syncn(char *data, int format, int mode) { +bool Periph_fpga::read_signal_input_rms(char *data, int format, int mode) { bool retval = true; if (mode == R_UCP) { - uint32_t sdp_data; + uint32_t sdp_data[2]; + memset(sdp_data, 0, sizeof(sdp_data)); string regname; + int64_t power_sum; for (uint i=0; i< C_S_pn; i++) { - regname = "mm/0/JESD204B/" + to_string(i) + "/csr_dev_syncn"; - retval = Read(regname, &sdp_data); - jesd_csr_dev_syncn[i] = (uint32_t)sdp_data; + regname = "mm/0/REG_ADUH_MONITOR/" + to_string(i) + "/power_sum"; + retval = Read(regname, sdp_data); + power_sum = (int64_t)(((int64_t)sdp_data[1] << 32) + sdp_data[0]); + signal_input_rms[i] = sqrt((double)power_sum / C_N_CLK_PER_PPS); } } - uint32_t *_ptr = (uint32_t *)data; + double *_ptr = (double *)data; for (uint i=0; i< C_S_pn; i++) { - *_ptr = jesd_csr_dev_syncn[i]; + *_ptr = signal_input_rms[i]; _ptr++; } return retval; } -bool Periph_fpga::read_jesd204b_rx_err0(char *data, int format, int mode) { +bool Periph_fpga::read_signal_input_data_buffer(char *data, int format) { + bool retval = true; + uint32_t sdp_data[C_V_si_db]; + string regname; + int16_t *_ptr = (int16_t *)data; + for (uint i=0; i< C_S_pn; i++) { + memset(sdp_data, 0, sizeof(sdp_data)); + regname = "mm/0/RAM_DIAG_DATA_BUFFER_BSN/" + to_string(i) + "/data"; + retval &= Read(regname, sdp_data); + for (uint j=0; j< C_V_si_db; j++) { + *_ptr = (int16_t)((sdp_data[j] & 0x3FFF) << 2) / 4; + _ptr++; + } + } + return retval; +} + +bool Periph_fpga::read_jesd204b_csr_rbd_count(char *data, int format, int mode) { bool retval = true; if (mode == R_UCP) { uint32_t sdp_data; string regname; for (uint i=0; i< C_S_pn; i++) { - regname = "mm/0/JESD204B/" + to_string(i) + "/rx_err0"; + regname = "mm/0/JESD204B/" + to_string(i) + "/csr_rbd_count"; retval = Read(regname, &sdp_data); - jesd_rx_err0[i] = (uint32_t)sdp_data; + jesd_csr_rbd_count[i] = (uint32_t)sdp_data; } } uint32_t *_ptr = (uint32_t *)data; for (uint i=0; i< C_S_pn; i++) { - *_ptr = jesd_rx_err0[i]; + *_ptr = jesd_csr_rbd_count[i]; _ptr++; } return retval; } -bool Periph_fpga::read_jesd204b_rx_err1(char *data, int format, int mode) { +bool Periph_fpga::read_jesd204b_csr_dev_syncn(char *data, int format, int mode) { bool retval = true; if (mode == R_UCP) { uint32_t sdp_data; string regname; for (uint i=0; i< C_S_pn; i++) { - regname = "mm/0/JESD204B/" + to_string(i) + "/rx_err1"; + regname = "mm/0/JESD204B/" + to_string(i) + "/csr_dev_syncn"; retval = Read(regname, &sdp_data); - jesd_rx_err1[i] = (uint32_t)sdp_data; + jesd_csr_dev_syncn[i] = (uint32_t)sdp_data; } } uint32_t *_ptr = (uint32_t *)data; for (uint i=0; i< C_S_pn; i++) { - *_ptr = jesd_rx_err1[i]; + *_ptr = jesd_csr_dev_syncn[i]; _ptr++; } return retval; } -bool Periph_fpga::write_signal_input_samples_delay(const char *data) { - uint32_t *_ptr = (uint32_t *)data; - bool retval = true; - uint32_t sdp_data; - uint32_t min_sample_delay = 0; - uint32_t max_sample_delay = 4095; - uint32_t sample_delay; - string regname; - for (uint i=0; i< C_S_pn; i++) { - sample_delay = *_ptr; - if ((sample_delay < min_sample_delay) || (sample_delay > max_sample_delay)) { - LOG_F(ERROR, "signal_input_sample_delay not in range<%d:%d>", min_sample_delay, max_sample_delay); - retval = false; - } else { - regname = "mm/0/REG_DP_SHIFTRAM/" + to_string(i) + "/shift"; - sdp_data = sample_delay; - retval = Write(regname, &sdp_data); - _ptr++; - } - } - return retval; -} - -bool Periph_fpga::read_signal_input_mean(char *data, int format, int mode) { +bool Periph_fpga::read_jesd204b_rx_err0(char *data, int format, int mode) { bool retval = true; if (mode == R_UCP) { - uint32_t sdp_data[2]; - memset(sdp_data, 0, sizeof(sdp_data)); + uint32_t sdp_data; string regname; - int64_t mean_sum; for (uint i=0; i< C_S_pn; i++) { - regname = "mm/0/REG_ADUH_MONITOR/" + to_string(i) + "/mean_sum"; - retval = Read(regname, sdp_data); - mean_sum = (int64_t)(((int64_t)sdp_data[1] << 32) + sdp_data[0]); - signal_input_mean[i] = (double)mean_sum / C_N_CLK_PER_PPS; + regname = "mm/0/JESD204B/" + to_string(i) + "/rx_err0"; + retval = Read(regname, &sdp_data); + jesd_rx_err0[i] = (uint32_t)sdp_data; } } - double *_ptr = (double *)data; + uint32_t *_ptr = (uint32_t *)data; for (uint i=0; i< C_S_pn; i++) { - *_ptr = signal_input_mean[i]; + *_ptr = jesd_rx_err0[i]; _ptr++; } return retval; } -bool Periph_fpga::read_signal_input_rms(char *data, int format, int mode) { +bool Periph_fpga::read_jesd204b_rx_err1(char *data, int format, int mode) { bool retval = true; if (mode == R_UCP) { - uint32_t sdp_data[2]; - memset(sdp_data, 0, sizeof(sdp_data)); + uint32_t sdp_data; string regname; - int64_t power_sum; for (uint i=0; i< C_S_pn; i++) { - regname = "mm/0/REG_ADUH_MONITOR/" + to_string(i) + "/power_sum"; - retval = Read(regname, sdp_data); - power_sum = (int64_t)(((int64_t)sdp_data[1] << 32) + sdp_data[0]); - signal_input_rms[i] = sqrt((double)power_sum / C_N_CLK_PER_PPS); + regname = "mm/0/JESD204B/" + to_string(i) + "/rx_err1"; + retval = Read(regname, &sdp_data); + jesd_rx_err1[i] = (uint32_t)sdp_data; } } - double *_ptr = (double *)data; + uint32_t *_ptr = (uint32_t *)data; for (uint i=0; i< C_S_pn; i++) { - *_ptr = signal_input_rms[i]; + *_ptr = jesd_rx_err1[i]; _ptr++; } return retval; } -bool Periph_fpga::read_signal_input_data_buffer(char *data, int format) { - bool retval = true; - uint32_t sdp_data[C_V_si_db]; - string regname; - int16_t *_ptr = (int16_t *)data; - for (uint i=0; i< C_S_pn; i++) { - memset(sdp_data, 0, sizeof(sdp_data)); - regname = "mm/0/RAM_DIAG_DATA_BUFFER_BSN/" + to_string(i) + "/data"; - retval &= Read(regname, sdp_data); - for (uint j=0; j< C_V_si_db; j++) { - *_ptr = (int16_t)((sdp_data[j] & 0x3FFF) << 2) / 4; - _ptr++; - } - } - return retval; -} - bool Periph_fpga::write_subband_weights(const char *data) { uint32_t *_ptr = (uint32_t *)data; bool retval = true; diff --git a/src/periph/fpga.h b/src/periph/fpga.h index 91af78ba1b4aef36d1bbebf8f3ff01fafc919b6b..2a1f5d1786a44915269f681648cb651d218736fe 100644 --- a/src/periph/fpga.h +++ b/src/periph/fpga.h @@ -62,10 +62,12 @@ private: bool signal_input_sync_timeout; int64_t signal_input_bsn; - int64_t xst_input_bsn_at_sync; - int64_t xst_output_sync_bsn; int32_t signal_input_nof_packets; int32_t signal_input_nof_samples; + double signal_input_mean[C_S_pn]; + double signal_input_rms[C_S_pn]; + int64_t xst_input_bsn_at_sync; + int64_t xst_output_sync_bsn; int32_t sst_offload_nof_packets; int32_t sst_offload_nof_valid; int32_t bst_offload_nof_packets[C_N_beamsets_sdp]; @@ -79,10 +81,8 @@ private: uint32_t jesd_csr_dev_syncn[C_S_pn]; uint32_t jesd_rx_err0[C_S_pn]; uint32_t jesd_rx_err1[C_S_pn]; - bool xst_processing_enable; + bool xst_processing_enable; - double signal_input_mean[C_S_pn]; - double signal_input_rms[C_S_pn]; uint32_t pps_offset_cnt; // used by read_time_since_last_pps() uint32_t pps_expected_cnt; @@ -189,20 +189,20 @@ private: bool write_wg_frequency(const char *data); bool read_wg_frequency(char *data, int format); + bool write_signal_input_samples_delay(const char *data); bool read_signal_input_sync_timeout(char *data, int format, int mode); bool read_signal_input_bsn(char *data, int format, int mode); bool read_signal_input_nof_packets(char *data, int format, int mode); bool read_signal_input_nof_samples(char *data, int format, int mode); + bool read_signal_input_mean(char *data, int format, int mode); + bool read_signal_input_rms(char *data, int format, int mode); + bool read_signal_input_data_buffer(char *data, int format); bool read_jesd204b_csr_rbd_count(char *data, int format, int mode); bool read_jesd204b_csr_dev_syncn(char *data, int format, int mode); bool read_jesd204b_rx_err0(char *data, int format, int mode); bool read_jesd204b_rx_err1(char *data, int format, int mode); - bool write_signal_input_samples_delay(const char *data); - bool read_signal_input_mean(char *data, int format, int mode); - bool read_signal_input_rms(char *data, int format, int mode); - bool read_signal_input_data_buffer(char *data, int format); bool write_subband_weights(const char *data); bool read_beamlet_subband_select(char *data, int format);