def main():

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)
        setup_dac(rft.command)
        setup_adc(rft.command)

        # 初期化
        rft.awg_sa_cmd.initialize_awg_sa()
        # AWG 有効化
        rft.awg_sa_cmd.enable_awg(*awg_list)
        # Multi Tile Synchronization
        rft.awg_sa_cmd.sync_dac_tiles()
        rft.awg_sa_cmd.sync_adc_tiles()
        # ADC キャリブレーション
        calibrate_adc(rft.awg_sa_cmd)
        # 波形シーケンス設定
        awg_id_to_wave_sequence = set_wave_sequence(rft.awg_sa_cmd)
        # キャプチャシーケンス設定
        set_capture_sequence(rft.awg_sa_cmd, awg_id_to_wave_sequence)
        # 波形出力 & キャプチャスタート
        rft.awg_sa_cmd.start_wave_sequence()
        # 終了待ち
        wait_for_sequence_to_finish(rft.awg_sa_cmd, awg_list)
        # エラーチェック
        print("Check for errors")
        check_skipped_step(rft.awg_sa_cmd)
        check_capture_data_fifo_oevrflow(rft.awg_sa_cmd)
        for ch in range(8):
            check_intr_flags(rft.command, ADC, ch)
        for ch in range(8):
            check_intr_flags(rft.command, DAC, ch)

        print("Generating graph images.")
        nu = ndarrayutil.NdarrayUtil
        for awg_id in awg_list:
            for step_id in range(2):
                # キャプチャデータ取得
                awg_id_to_wave_samples = {}
                wave_data = rft.awg_sa_cmd.read_capture_data(awg_id,
                                                             step_id=step_id)
                awg_id_to_wave_samples[awg_id] = nu.bytes_to_real_32(wave_data)

                # キャプチャデータ出力
                output_graphs(
                    (awg_id, step_id, awg_id_to_wave_samples[awg_id]))

        # 送信波形をグラフ化
        for awg_id in awg_list:
            rft.awg_sa_cmd.get_waveform_sequence(awg_id).save_as_img(
                PLOT_DIR + "waveform/awg_{}_waveform.png".format(awg_id))

    print("Done.")
    return
def main():

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)
        shutdown_all_tiles(rft.command)
        set_adc_sampling_rate(rft.command, ADC_FREQ)
        set_dac_sampling_rate(rft.command, DAC_FREQ)
        startup_all_tiles(rft.command)
        setup_dac(rft.command)
        setup_adc(rft.command)

        # 初期化
        rft.awg_sa_cmd.initialize_awg_sa()
        # AWG 有効化
        rft.awg_sa_cmd.enable_awg(awgsa.AwgId.AWG_0)
        # ADC キャリブレーション
        calibrate_adc(rft.awg_sa_cmd)
        # 波形シーケンス設定
        wave_seq_0 = set_wave_sequence(rft.awg_sa_cmd, 1)
        # キャプチャシーケンス設定
        set_capture_sequence(rft.awg_sa_cmd, wave_seq_0)
        # 波形出力 & キャプチャスタート
        rft.awg_sa_cmd.start_wave_sequence()
        # 終了待ち
        wait_for_sequence_to_finish(rft.awg_sa_cmd)
        # エラーチェック
        check_skipped_step(rft.awg_sa_cmd)
        check_capture_data_fifo_oevrflow(rft.awg_sa_cmd)
        for ch in range(8):
            check_intr_flags(rft.command, ADC, ch)
        for ch in range(8):
            check_intr_flags(rft.command, DAC, ch)

        # キャプチャデータ取得
        r_data_0 = rft.awg_sa_cmd.read_capture_data(awgsa.AwgId.AWG_0,
                                                    step_id=0)
        r_data_1 = rft.awg_sa_cmd.read_capture_data(awgsa.AwgId.AWG_0,
                                                    step_id=1)

        nu = ndarrayutil.NdarrayUtil
        r_sample_0 = nu.bytes_to_real_32(r_data_0)
        r_sample_1 = nu.bytes_to_real_32(r_data_1)

        output_graphs((awgsa.AwgId.AWG_0, 0, r_sample_0),
                      (awgsa.AwgId.AWG_0, 1, r_sample_1))

        # 送信波形をグラフ化
        rft.awg_sa_cmd.get_waveform_sequence(awgsa.AwgId.AWG_0).save_as_img(
            PLOT_DIR +
            "waveform/awg_{}_waveform.png".format(awgsa.AwgId.AWG_0))

    print("Done.")
    return
Beispiel #3
0
def main():   

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)
        set_adc_sampling_rate(rft.command, ADC_FREQ)
        set_dac_sampling_rate(rft.command, DAC_FREQ)
        setup_dac(rft.command)
        setup_adc(rft.command)
        
        # 初期化    
        rft.awg_sa_cmd.initialize_awg_sa()
        #"""
        # AWG 有効化
        rft.awg_sa_cmd.enable_awg(awgsa.AwgId.AWG_0, awgsa.AwgId.AWG_1)
        # ADC キャリブレーション
        calibrate_adc(rft.awg_sa_cmd)
        # 波形シーケンス設定
        (wave_seq_0, wave_seq_1) = set_wave_sequence(rft.awg_sa_cmd)
        # キャプチャシーケンス設定
        set_capture_sequence(rft.awg_sa_cmd, wave_seq_0, wave_seq_1)
        # デジタル出力シーケンス設定
        set_digital_output_sequence(rft.awg_sa_cmd)
        # 波形出力 & キャプチャスタート
        rft.awg_sa_cmd.start_wave_sequence()
        # 終了待ち
        wait_for_sequence_to_finish(rft.awg_sa_cmd)
        #"""
        # エラーチェック
        check_skipped_step(rft.awg_sa_cmd)
        check_capture_data_fifo_oevrflow(rft.awg_sa_cmd)
        check_skipped_digital_output(rft.awg_sa_cmd)
        for ch in range(8):
            check_intr_flags(rft.command, ADC, ch)
        for ch in range(8):
            check_intr_flags(rft.command, DAC, ch)
        #"""
        # キャプチャデータ取得
        r_data_0 = rft.awg_sa_cmd.read_capture_data(awgsa.AwgId.AWG_0, step_id = 0)
        r_data_1 = rft.awg_sa_cmd.read_capture_data(awgsa.AwgId.AWG_0, step_id = 1)
        r_data_2 = rft.awg_sa_cmd.read_capture_data(awgsa.AwgId.AWG_1, step_id = 0)

        nu = ndarrayutil.NdarrayUtil
        r_sample_0 = nu.bytes_to_real_32(r_data_0)
        r_sample_1 = nu.bytes_to_real_32(r_data_1)
        r_sample_2 = nu.bytes_to_real_32(r_data_2)

        output_graphs(
            (awgsa.AwgId.AWG_0, 0, r_sample_0),
            (awgsa.AwgId.AWG_0, 1, r_sample_1),
            (awgsa.AwgId.AWG_1, 0, r_sample_2))
        #"""
    print("Done.")
    return
Beispiel #4
0
def main():

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)

        # 初期化
        rft.awg_sa_cmd.initialize_awg_sa()
        (wave_seq_0, wave_seq_1) = set_wave_sequence(rft.awg_sa_cmd)

        # Real 波形出力
        # Python スクリプト内で計算したサンプル値を保持するオブジェクトを取得
        waveform_0 = wave_seq_0.get_waveform_sequence()
        waveform_0.save_as_img(PLOT_DIR + "user_def_seq_0_waveform.png")
        step_id_to_samples = waveform_0.get_samples_by_step_id()
        output_samples(PLOT_DIR + "user_def_seq_0_waveform.txt",
                       step_id_to_samples)

        # ハードウェア内部の RAM に格納されたサンプル値を保持するオブジェクトを取得
        waveform_0 = rft.awg_sa_cmd.get_waveform_sequence(awgsa.AwgId.AWG_0)
        waveform_0.save_as_img(PLOT_DIR + "actual_seq_0_waveform.png")
        step_id_to_samples = waveform_0.get_samples_by_step_id()
        output_samples(PLOT_DIR + "actual_seq_0_waveform.txt",
                       step_id_to_samples)

        # I/Q 波形出力
        # Python スクリプト内で計算したサンプル値を保持するオブジェクトを取得
        waveform_1 = wave_seq_1.get_waveform_sequence()
        waveform_1.save_as_img(PLOT_DIR + "user_def_seq_1_waveform.png")
        waveform_1.save_as_img(PLOT_DIR + "user_def_seq_1_waveform_merged.png",
                               iq_separation=False)
        step_id_to_i_samples = waveform_1.get_i_samples_by_step_id()
        step_id_to_q_samples = waveform_1.get_q_samples_by_step_id()
        output_samples(PLOT_DIR + "user_def_seq_1_i_waveform.txt",
                       step_id_to_i_samples)
        output_samples(PLOT_DIR + "user_def_seq_1_q_waveform.txt",
                       step_id_to_q_samples)

        # ハードウェア内部の RAM に格納されたサンプル値を保持するオブジェクトを取得
        waveform_1 = rft.awg_sa_cmd.get_waveform_sequence(awgsa.AwgId.AWG_1)
        waveform_1.save_as_img(PLOT_DIR + "actual_seq_1_waveform.png")
        waveform_1.save_as_img(PLOT_DIR + "actual_seq_1_waveform_merged.png",
                               iq_separation=False)
        step_id_to_i_samples = waveform_1.get_i_samples_by_step_id()
        step_id_to_q_samples = waveform_1.get_q_samples_by_step_id()
        output_samples(PLOT_DIR + "actual_seq_1_i_waveform.txt",
                       step_id_to_i_samples)
        output_samples(PLOT_DIR + "actual_seq_1_q_waveform.txt",
                       step_id_to_q_samples)

    print("Done.")
    return
Beispiel #5
0
def main():

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)
        shutdown_all_tiles(rft.command)
        set_adc_sampling_rate(rft.command, ADC_FREQ)
        set_dac_sampling_rate(rft.command, DAC_FREQ)
        startup_all_tiles(rft.command)
        setup_dac(rft.command)
        setup_adc(rft.command)
        # 初期化
        rft.awg_sa_cmd.initialize_awg_sa()
        # AWG 有効化
        rft.awg_sa_cmd.enable_awg(*awg_list)
        # ADC キャリブレーション
        calibrate_adc(rft.awg_sa_cmd)
        # 波形シーケンス設定
        awg_id_to_wave_sequence = set_wave_sequence(rft.awg_sa_cmd)
        # キャプチャシーケンス設定
        set_capture_sequence(rft.awg_sa_cmd, awg_id_to_wave_sequence)
        # 波形出力 & キャプチャスタート
        start_awg_and_capture(rft.awg_sa_cmd)
        # エラーチェック
        check_skipped_step(rft.awg_sa_cmd)
        check_capture_data_fifo_oevrflow(rft.awg_sa_cmd)
        for ch in range(8):
            check_intr_flags(rft.command, ADC, ch)
        for ch in range(8):
            check_intr_flags(rft.command, DAC, ch)

        # キャプチャデータ取得
        print("Get capture data.")
        nu = ndarrayutil.NdarrayUtil
        awg_id_to_wave_samples = {}
        for awg_id in awg_list:
            wave_data = rft.awg_sa_cmd.read_capture_data(awg_id, step_id=0)
            awg_id_to_wave_samples[awg_id] = nu.bytes_to_real_32(wave_data)

        # キャプチャデータ出力
        print("Output capture data.")
        for awg_id, wave_samples in awg_id_to_wave_samples.items():
            output_graphs((awg_id, 0, wave_samples))

    print("Done.")
    return
Beispiel #6
0
 def initServer(self):
     logger = logging.getLogger(__name__)
     handler = logging.StreamHandler()
     handler.setLevel(LOG_LEVEL)
     logger.setLevel(LOG_LEVEL)
     logger.addHandler(handler)
     self.rft = client.RftoolClient(logger)
     self.rft.connect(ZCU111_IP_ADDR)
     self.wr_size = 0
     self.wr_pos = 0
     self.rd_size = 0
     self.rd_pos = 0
     self.buf_mem = bytearray(BUF_MEM_SIZE)
     yield None
Beispiel #7
0
def main():
    wgen = wavegen.WaveGen(logger=logger)
    nu = ndarrayutil.NdarrayUtil

    print("Generate waveform data.")
    wgen.set_parameter(num_sample=DAC_SAMPLES,
                       dac_freq=DAC_FREQ,
                       carrier_freq=10.67,
                       amplitude=-30000.)
    sin_data = wgen.sinwave()
    pulse_data = wgen.pulsewave()
    tri_data = wgen.triwave()
    saw_data = wgen.sawwave()
    awg_data = sin_data
    mac_wav_data = sin_data + pulse_data + tri_data + saw_data
    adc_cap_len = ADC_SAMPLES * 2  # 16-bit signed integer
    dac_words = int(DAC_SAMPLES / 8)

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)

        print("Setup ADC.")
        for tile in [0, 1, 2, 3]:
            for block in [0, 1]:
                rft.command.SetMixerSettings(0, tile, block, 0.0, 0.0, 2, 2, 0,
                                             3, 0)
                rft.command.ResetNCOPhase(0, tile, block)
                rft.command.UpdateEvent(0, tile, block, 1)
            rft.command.SetupFIFO(0, tile, 0)
            for block in [0, 1]:
                rft.command.SetDither(tile, block,
                                      1 if ADC_FREQ > 3000. else 0)
                rft.command.SetDecimationFactor(tile, block, 1)
            rft.command.SetFabClkOutDiv(0, tile, 2)
            for block in [0, 1]:
                rft.command.IntrClr(0, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(0, tile, 1)

        print("Setup DAC.")
        for tile in [0, 1]:
            for block in [0, 1, 2, 3]:
                rft.command.SetMixerSettings(1, tile, block, 0.0, 0.0, 2, 1,
                                             16, 4, 0)
                rft.command.ResetNCOPhase(1, tile, block)
                rft.command.UpdateEvent(1, tile, block, 1)
            rft.command.SetupFIFO(1, tile, 0)
            for block in [0, 1, 2, 3]:
                rft.command.SetInterpolationFactor(tile, block, 1)
            rft.command.SetFabClkOutDiv(1, tile, 1)
            for block in [0, 1, 2, 3]:
                rft.command.IntrClr(1, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(1, tile, 1)

        print("Clear BlockRAM.")
        rft.command.ClearBRAM()

        print("Send DAC AWG waveform data / parameters.")
        ## Write waveform data / trigger parameters for DAC AWG
        rft.if_data.WriteDataToMemory(1, CH_AWG_CAP, len(awg_data), awg_data)
        dac_awg_params = np.array([0, dac_words] * 16, dtype="<i4")
        dac_awg_params_b = nu.real_to_bytes_32(dac_awg_params)
        rft.if_data.WriteDataToMemory(5, CH_AWG_CAP, len(dac_awg_params_b),
                                      dac_awg_params_b)

        print("Send waveform data for DAC Waveform selector.")
        ## Write waveform data / trigger parameters for DAC Waveform selector
        # 4 patterns output
        rft.if_data.WriteDataToMemory(1, CH_TEST_MAC, len(mac_wav_data),
                                      mac_wav_data)

        print("Set trigger parameters.")
        # Set parameters for ADC/DAC-BRAM Bridge controller
        rft.command.SetTriggerInfo(0, ((0x1 << CH_TEST_MAC) |
                                       (0x1 << CH_AWG_CAP)), ADC_SAMPLES, 0)
        rft.command.SetTriggerLatency(0, 48)
        rft.command.SetTriggerCycle(32768 * 32, 1)
        rft.command.SetMACConfig(0xFF,
                                 0x00)  # all ADC channels is 12-bit format
        # do not trigger all DACs when MAC is overrange

        print("Start Trigger.")
        rft.command.StartTrigger()

        wait_trig_done(rft.command)

        # Get RFDC ADC interrupt flags / overvoltage detection
        adc_test_ch_flags = rft.command.GetIntrStatus(0,
                                                      (CH_TEST_MAC >> 1) & 0x3,
                                                      CH_TEST_MAC & 0x1)[3]
        adc_cap_ch_flags = rft.command.GetIntrStatus(0,
                                                     (CH_AWG_CAP >> 1) & 0x3,
                                                     CH_AWG_CAP & 0x1)[3]
        check_adc_overvoltage(adc_test_ch_flags, CH_TEST_MAC)
        check_adc_overvoltage(adc_cap_ch_flags, CH_AWG_CAP)

        print("Receive ADC MAC channel capture data.")
        # Get ADC capture data of test channel
        adc_mac_capdata = rft.if_data.ReadDataFromMemory(
            0, CH_TEST_MAC * 2, adc_cap_len)

        adc_awg_force_captures = []
        for sel_pattern in [0, 1, 2, 3]:
            print("Set force DAC Waveform selector output pattern {}".format(
                sel_pattern))
            dac_sel_params = np.array([sel_pattern * dac_words, dac_words] *
                                      16,
                                      dtype="<i4")
            dac_sel_params_b = nu.real_to_bytes_32(dac_sel_params)
            rft.if_data.WriteDataToMemory(5, CH_TEST_MAC,
                                          len(dac_sel_params_b),
                                          dac_sel_params_b)

            print("Start Trigger.")
            rft.command.StartTrigger()

            wait_trig_done(rft.command)

            # Get RFDC ADC interrupt flags / overvoltage detection
            adc_test_ch_flags = rft.command.GetIntrStatus(
                0, (CH_TEST_MAC >> 1) & 0x3, CH_TEST_MAC & 0x1)[3]
            check_adc_overvoltage(adc_test_ch_flags, CH_TEST_MAC)
            adc_cap_ch_flags = rft.command.GetIntrStatus(
                0, (CH_AWG_CAP >> 1) & 0x3, CH_AWG_CAP & 0x1)[3]
            check_adc_overvoltage(adc_cap_ch_flags, CH_AWG_CAP)

            print("Receive ADC capture data for DAC Waveform selector output.")
            adc_awg_capdata_force = rft.if_data.ReadDataFromMemory(
                0, CH_AWG_CAP * 2, adc_cap_len)
            adc_awg_capsample_force = np.array(
                nu.bytes_to_real(adc_awg_capdata_force)) / 16
            check_low_input_signal(adc_awg_capsample_force, CH_AWG_CAP)
            adc_awg_force_captures.append(adc_awg_capsample_force)

    print("Disconnect from server.")

    adc_mac_capsample = np.array(
        nu.bytes_to_real(adc_mac_capdata)) / 16  # conv. 12-bit integer
    check_low_input_signal(adc_mac_capsample, CH_TEST_MAC)

    print("Prepare MAC multiplied coefficients for self-test.")

    require_mac_val = [-25165824, -8388608, 8388608, 25165824]
    mac_cap_sq_sum = np.dot(1. * adc_mac_capsample, adc_mac_capsample)
    multiplied_samples = [
        np.round((rq / mac_cap_sq_sum) * adc_mac_capsample).astype("<i4")
        for rq in require_mac_val
    ]

    # print("mac_cap_sq_sum: {}".format(mac_cap_sq_sum))
    # print("require_mac_val / mac_cap_sq_sum = {}".format(np.array(require_mac_val) / mac_cap_sq_sum))
    print("MAC multiplied coefficients .max={0}, min={1}".format(
        np.max(multiplied_samples), np.min(multiplied_samples)))

    multiplied_data = [nu.real_to_bytes_32(smp) for smp in multiplied_samples]
    mac_comp_coeff = np.array([-16777216, 0, 16777216], dtype="<i4")
    mac_comp_coeff_b = nu.real_to_bytes_32(mac_comp_coeff)

    with client.RftoolClient(logger=logger) as rft:
        print("Re-connect to ZCU111 RFTOOL server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        # Clear all ADC interrupt flags
        for tile in [0, 1, 2, 3]:
            for block in [0, 1]:
                rft.command.IntrClr(0, tile, block, 0xFFFFFFFF)

        print("Send ADC MAC result comparation coefficient data.")
        ## Write comparation coefficients for ADC MAC
        rft.if_data.WriteDataToMemory(4, CH_TEST_MAC * 2,
                                      len(mac_comp_coeff_b), mac_comp_coeff_b)

        print("Set DAC Waveform selector parameters.")
        dac_sel_params = np.array(
            [
                0 * dac_words,
                dac_words,  # sine
                1 * dac_words,
                dac_words,  # pulse
                2 * dac_words,
                dac_words,  # triangle
                3 * dac_words,
                dac_words,  # sawtooth
            ] * 4,
            dtype="<i4")
        dac_sel_params_b = nu.real_to_bytes_32(dac_sel_params)
        rft.if_data.WriteDataToMemory(5, CH_TEST_MAC, len(dac_sel_params_b),
                                      dac_sel_params_b)

        rft.command.SetTriggerCycle(3, 1)

        adc_awg_result_captures = []
        adc_mac_actual_captures = []
        for sel_pattern in [0, 1, 2, 3]:
            print(
                "Send ADC MAC multiplied coefficient data where DAC Waveform selector output to be pattern {}."
                .format(sel_pattern))
            ## Write Multiplied coefficients for ADC MAC
            rft.if_data.WriteDataToMemory(3, CH_TEST_MAC * 2,
                                          len(multiplied_data[sel_pattern]),
                                          multiplied_data[sel_pattern])

            print("Start trigger BRAM Bridge controller.")
            rft.command.StartTrigger()

            wait_trig_done(rft.command)

            mac_ovrrange = rft.command.GetAccumulateOverrange()
            check_mac_overrange(mac_ovrrange, CH_TEST_MAC)

            # Get RFDC ADC interrupt flags / overvoltage detection
            adc_test_ch_flags = rft.command.GetIntrStatus(
                0, (CH_TEST_MAC >> 1) & 0x3, CH_TEST_MAC & 0x1)[3]
            check_adc_overvoltage(adc_test_ch_flags, CH_TEST_MAC)
            adc_cap_ch_flags = rft.command.GetIntrStatus(
                0, (CH_AWG_CAP >> 1) & 0x3, CH_AWG_CAP & 0x1)[3]
            check_adc_overvoltage(adc_cap_ch_flags, CH_AWG_CAP)

            print(
                "Receive ADC capture data for DAC Waveform selector output validation."
            )
            # Get ADC capture data of test channel
            adc_awg_result_capdata = rft.if_data.ReadDataFromMemory(
                0, CH_AWG_CAP * 2, adc_cap_len)
            adc_awg_result_capsample = np.array(
                nu.bytes_to_real(adc_awg_result_capdata)) / 16
            check_low_input_signal(adc_awg_result_capsample, CH_AWG_CAP)
            adc_awg_result_captures.append(adc_awg_result_capsample)

            print("Receive ADC MAC channel actual capture data.")
            # Get ADC capture data of test channel
            adc_mac_actual_capdata = rft.if_data.ReadDataFromMemory(
                0, CH_TEST_MAC * 2, adc_cap_len)
            adc_mac_actual_capsample = np.array(
                nu.bytes_to_real(adc_mac_actual_capdata)) / 16
            check_low_input_signal(adc_mac_actual_capsample, CH_TEST_MAC)
            adc_mac_actual_captures.append(adc_mac_actual_capsample)

    print("Disconnect from server.")

    time_dac = np.linspace(0.,
                           DAC_SAMPLES / DAC_FREQ,
                           DAC_SAMPLES,
                           endpoint=False)  # us
    time_adc = np.linspace(0.,
                           ADC_SAMPLES / DAC_FREQ,
                           ADC_SAMPLES,
                           endpoint=False)  # us

    validation_res = False
    os.makedirs(PLOT_DIR, exist_ok=True)

    for sel_pattern in [0, 1, 2, 3]:
        print("Validation DAC Waveform selector output pattern {}".format(
            sel_pattern))
        expected_mac_result = np.dot(adc_mac_capsample,
                                     multiplied_samples[sel_pattern])
        print("    Expected MAC Result = {}".format(expected_mac_result))
        actual_mac_result = np.dot(adc_mac_actual_captures[sel_pattern],
                                   multiplied_samples[sel_pattern])
        print(" Actual last MAC Result = {}".format(actual_mac_result))
        adc_awg_error = np.abs(adc_awg_result_captures[sel_pattern] -
                               adc_awg_force_captures[sel_pattern])
        adc_awg_error_sum = np.sum(adc_awg_error)
        print(" DAC Waveform selector output error sum. = {}".format(
            adc_awg_error_sum))
        if adc_awg_error_sum < ERR_THRESHOLD:
            print(
                "Validate DAC Waveform selector output pattern {} successful.".
                format(sel_pattern))
        else:
            print("Validate DAC Waveform selector output pattern {} failed.".
                  format(sel_pattern))
            validation_res = True

        print("Generate graph image.")
        fig = plt.figure(figsize=(8, 6), dpi=300)
        plt.xlabel("Time [us]")
        plt.title(
            "ADC capture DAC Sel. output Pattern {2} ({0} samples, {1} Msps)".
            format(ADC_SAMPLES, ADC_FREQ, sel_pattern))
        plt.plot(time_adc,
                 adc_awg_force_captures[sel_pattern],
                 linewidth=0.8,
                 label="Expected")
        plt.plot(time_adc,
                 adc_awg_result_captures[sel_pattern],
                 linewidth=0.8,
                 label="Actual")
        plt.legend()
        plt.savefig(PLOT_DIR +
                    "adc_cap_dacsel_pattern_{}.png".format(sel_pattern))

        fig = plt.figure(figsize=(8, 6), dpi=300)
        plt.xlabel("Time [us]")
        plt.title(
            "ADC capture DAC AWG output Pattern {2} ({0} samples, {1} Msps)".
            format(ADC_SAMPLES, ADC_FREQ, sel_pattern))
        plt.plot(time_adc, adc_mac_capsample, linewidth=0.8, label="Expected")
        plt.plot(time_adc,
                 adc_mac_actual_captures[sel_pattern],
                 linewidth=0.8,
                 label="Actual")
        plt.legend()
        plt.savefig(PLOT_DIR +
                    "adc_cap_awg_pattern_{}.png".format(sel_pattern))

    print("Done.")
    return validation_res
Beispiel #8
0
def main():

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)
        if fpga_design != MTS:
            shutdown_all_tiles(rft.command)
            set_adc_sampling_rate(rft.command, ADC_FREQ)
            set_dac_sampling_rate(rft.command, DAC_FREQ)
            startup_all_tiles(rft.command)

        setup_dac(rft.command)
        setup_adc(rft.command)
        # 初期化
        rft.awg_sa_cmd.initialize_awg_sa()
        # AWG 有効化
        rft.awg_sa_cmd.enable_awg(*awg_list)
        # Multi Tile Synchronization
        if fpga_design == MTS:
            rft.awg_sa_cmd.sync_dac_tiles()
            rft.awg_sa_cmd.sync_adc_tiles()
        # ADC キャリブレーション
        calibrate_adc(rft.awg_sa_cmd)
        # 波形シーケンス設定
        awg_id_to_wave_sequence = set_wave_sequence(rft.awg_sa_cmd)
        # キャプチャシーケンス設定
        set_capture_sequence(rft.awg_sa_cmd, awg_id_to_wave_sequence)
        # 波形出力 & キャプチャスタート
        start_awg_and_capture(rft.awg_sa_cmd)
        # エラーチェック
        check_skipped_step(rft.awg_sa_cmd)
        check_capture_data_fifo_oevrflow(rft.awg_sa_cmd)
        for ch in range(8):
            check_intr_flags(rft.command, ADC, ch)
        for ch in range(8):
            check_intr_flags(rft.command, DAC, ch)

        # キャプチャデータ取得
        print("Get capture data.")
        nu = ndarrayutil.NdarrayUtil
        awg_id_to_wave_samples = {}
        for awg_id in awg_list:
            wave_data = rft.awg_sa_cmd.read_capture_data(awg_id, step_id=0)
            awg_id_to_wave_samples[awg_id] = nu.bytes_to_real_32(wave_data)

        # キャプチャデータ出力
        print("Output capture data.")
        for awg_id, wave_samples in awg_id_to_wave_samples.items():
            start = int(OUTPUT_START * ADC_FREQ / 1000)
            end = start + int(OUTPUT_DURATION * ADC_FREQ / 1000)
            output_graphs((awg_id, 0, wave_samples[start:end], "whole"))

        for awg_id, wave_samples in awg_id_to_wave_samples.items():
            start = int(CLIPPING_START * ADC_FREQ / 1000)
            end = start + int(CLIPPING_DURATION * ADC_FREQ / 1000)
            output_graphs((awg_id, 0, wave_samples[start:end], "part"))

        # 送信波形をグラフ化
        for awg_id in awg_list:
            rft.awg_sa_cmd.get_waveform_sequence(awg_id).save_as_img(
                PLOT_DIR +
                "waveform/actual_awg_{}_waveform.png".format(awg_id))
            awg_id_to_wave_sequence[awg_id].get_waveform_sequence(
            ).save_as_img(
                PLOT_DIR +
                "waveform/user_def_awg_{}_waveform.png".format(awg_id))

    print("Done.")
    return
Beispiel #9
0
def main(num_trig):
    wgen = wavegen.WaveGen(logger=logger)
    nu = ndarrayutil.NdarrayUtil

    print("Generate waveform data.")
    wgen.set_parameter(num_sample=DAC_SAMPLES,
                       dac_freq=DAC_FREQ,
                       carrier_freq=20.,
                       amplitude=30000.0)
    sin_wave = nu.bytes_to_real(wgen.sinwave())

    amplitude = np.linspace(-1., 1., DAC_SAMPLES, endpoint=False)

    w_data = (sin_wave * amplitude).reshape(1, -1)[0].astype("<i2").tobytes()

    del sin_wave, amplitude

    w_size = len(w_data)  # for 16bit signed integer
    r_size = ADC_SAMPLES * 4  # for 32bit signed integer

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)

        print("Setup ADC.")
        for tile in [0, 1, 2, 3]:
            for block in [0, 1]:
                rft.command.SetMixerSettings(0, tile, block, 0.0, 0.0, 2, 2, 0,
                                             3, 0)
                rft.command.ResetNCOPhase(0, tile, block)
                rft.command.UpdateEvent(0, tile, block, 1)
            rft.command.SetupFIFO(0, tile, 0)
            for block in [0, 1]:
                rft.command.SetDither(tile, block,
                                      1 if ADC_FREQ > 3000. else 0)
                rft.command.SetDecimationFactor(tile, block, DUC_DDC_FACTOR)
            rft.command.SetFabClkOutDiv(0, tile,
                                        2 + int(np.log2(DUC_DDC_FACTOR)))
            for block in [0, 1]:
                rft.command.IntrClr(0, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(0, tile, 1)

        print("Setup DAC.")
        for tile in [0, 1]:
            for block in [0, 1, 2, 3]:
                rft.command.SetMixerSettings(1, tile, block, 0.0, 0.0, 2, 1,
                                             16, 4, 0)
                rft.command.ResetNCOPhase(1, tile, block)
                rft.command.UpdateEvent(1, tile, block, 1)
            rft.command.SetupFIFO(1, tile, 0)
            for block in [0, 1, 2, 3]:
                rft.command.SetInterpolationFactor(tile, block, DUC_DDC_FACTOR)
            rft.command.SetFabClkOutDiv(1, tile,
                                        2 + int(np.log2(DUC_DDC_FACTOR)))
            for block in [0, 1, 2, 3]:
                rft.command.IntrClr(1, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(1, tile, 1)

        print("Clear BlockRAM.")
        rft.command.ClearBRAM()

        for ch in [6, 7]:
            print("Send waveform data to DAC Ch.{} BlockRAM".format(ch))
            rft.if_data.WriteDataToMemory(1, ch, w_size, w_data)

        print("Setting trigger information.")
        rft.command.SetTriggerInfo(0, 0xFF, ADC_SAMPLES, 0)
        rft.command.SetTriggerInfo(1, 0xFF, DAC_SAMPLES, 0)
        rft.command.SetTriggerLatency(0, 97)
        rft.command.SetTriggerLatency(1, 0)
        rft.command.SetTriggerCycle(32768, 1)  # trigger 32768 times
        rft.command.SetAccumulateMode(0)  # disable accumulation

        print("Configure PMOD.")
        # 4 つの PMOD 出力データ (0xAA, 0xBB, 0xCC, xDD) を設定
        rft.if_data.WriteDataToMemory(2, 0, 4, b"\xAA\xBB\xCC\xDD")
        rft.command.SetPMODConfig(
            bit_to_enable=0xFF,  # 全 PMOD の出力 bit を有効にする
            num_samples=4,  # 出力されるサンプル数 (1サンプル = 8 bit)
            latency=0,  # トリガーレイテンシ
            divratio=32,  # 1 サンプルの出力が保持される長さ (DAC tile 1 のサンプリングレートに依存)
            polarity=0x0F)  # 下位 4 bit の PMOD 出力を反転する

        print("Start trigger.")
        rft.command.StartTrigger()  # for ADC calibration

        wait_trig_done(rft.command)

        print("Clear BlockRAM.")
        rft.command.ClearBRAM()

        for ch in [6, 7]:
            print("Send waveform data to DAC Ch.{} BlockRAM".format(ch))
            rft.if_data.WriteDataToMemory(1, ch, w_size, w_data)

        print("Setting trigger information.")
        rft.command.SetTriggerCycle(num_trig, 1)
        rft.command.SetAccumulateMode(1)  # enable accumulation

        print("Start trigger.")
        rft.command.StartTrigger()  # for ADC accumualtion

        wait_trig_done(rft.command)

        r_data = []
        for ch in [0, 1]:
            print("Receive waveform data from ADC Ch.{} BlockRAM".format(ch))
            r_data.append(rft.if_data.ReadDataFromMemory(0, ch, r_size))

        print("Check interrupt flags.")
        for ch in range(8):  # ADC
            check_intr_flags(rft.command, 0, ch)
        for ch in range(8):  # DAC
            check_intr_flags(rft.command, 1, ch)

    print("Processing sample data.")
    print("- DAC sample data")
    w_sample = nu.bytes_to_real(w_data)
    del w_data
    print("- ADC sample data")
    r_sample = np.array([nu.bytes_to_real_32(rd) for rd in r_data])
    del r_data

    print("Generating graph image.")
    os.makedirs(PLOT_DIR + str(num_trig) + "/", exist_ok=True)

    print("- entire DAC")
    plot_graph_entire(
        DAC_FREQ, w_sample, "C0",
        "DAC waveform {} samples, {} Msps".format(DAC_SAMPLES, DAC_FREQ),
        PLOT_DIR + str(num_trig) + "/bram_send.png")

    print("- crop DAC")
    plot_graph_crop(
        DAC_FREQ, w_sample, "C0", "DAC waveform {} samples{}, {} Msps".format(
            DAC_SAMPLES, " (crop {}-{})".format(CROP_PLOT[0], CROP_PLOT[1]),
            DAC_FREQ), PLOT_DIR + str(num_trig) + "/bram_send_crop.png")

    print("- FFT DAC")
    plot_graph_fft(
        DAC_FREQ, w_sample, "C0",
        "DAC FFT, {} samples, {} Msps".format(DAC_SAMPLES, DAC_FREQ),
        PLOT_DIR + str(num_trig) + "/bram_send_fft.png")

    for ch in [0, 1]:
        print("- entire ADC Ch.{}".format(ch))
        plot_graph_entire(
            ADC_FREQ, r_sample[ch], "C{}".format(ch + 1),
            "ADC waveform {} samples, {} Msps({} times accum.)".format(
                ADC_SAMPLES, ADC_FREQ, str(num_trig)),
            PLOT_DIR + str(num_trig) + "/bram_recv_{}.png".format(ch))

        print("- crop ADC Ch.{}".format(ch))
        plot_graph_crop(
            ADC_FREQ, r_sample[ch], "C{}".format(ch + 1),
            "ADC waveform {} samples{}, {} Msps({} times accum.)".format(
                ADC_SAMPLES, " (crop {}-{})".format(CROP_PLOT[0],
                                                    CROP_PLOT[1]), ADC_FREQ,
                str(num_trig)),
            PLOT_DIR + str(num_trig) + "/bram_recv_{}_crop.png".format(ch))

        print("- FFT ADC Ch.{}".format(ch))
        plot_graph_fft(
            ADC_FREQ, r_sample[ch], "C{}".format(ch + 1),
            "ADC FFT {} samples, {} Msps({} times accum.)".format(
                ADC_SAMPLES, ADC_FREQ, str(num_trig)),
            PLOT_DIR + str(num_trig) + "/bram_recv_{}_fft.png".format(ch))

    print("Done.")
    return
def main():

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)
        setup_dac(rft.command)
        setup_adc(rft.command)

        # 初期化
        rft.awg_sa_cmd.initialize_awg_sa()
        # AWG 有効化
        rft.awg_sa_cmd.enable_awg(*awg_list)
        # ADC キャリブレーション
        calibrate_adc(rft.awg_sa_cmd)
        # 波形シーケンス設定
        awg_id_to_wave_sequence = set_wave_sequence(rft.awg_sa_cmd)
        # キャプチャシーケンス設定
        set_capture_sequence(rft.awg_sa_cmd, awg_id_to_wave_sequence)
        # 波形出力 & キャプチャスタート
        start_awg_and_capture(rft.awg_sa_cmd)
        # エラーチェック
        check_skipped_step(rft.awg_sa_cmd)
        check_capture_data_fifo_oevrflow(rft.awg_sa_cmd)
        for ch in range(8):
            check_intr_flags(rft.command, ADC, ch)
        for ch in range(8):
            check_intr_flags(rft.command, DAC, ch)

        # キャプチャデータの取得と出力
        nu = ndarrayutil.NdarrayUtil
        for awg_id in awg_list:
            print("Get capture {} data.".format(awg_id))
            for step_id in [0, 1]:
                wave_data = rft.awg_sa_cmd.read_capture_data(awg_id,
                                                             step_id=step_id)
                wave_samples = nu.bytes_to_real_32(wave_data)
                num_output_samples = int(
                    8 * (ADC_FREQ / awg_to_freq[awg_id][step_id]))
                wave_samples = wave_samples[0:num_output_samples]
                output_graphs((awg_id, step_id, wave_samples))

        # スペクトラム取得
        num_frames = 1
        start_sample_idx = 0  # FFT 開始サンプルのインデックス
        fft_size = rft.awg_sa_cmd.get_fft_size()
        for awg_id in awg_list:
            print("Get capture {} spectrums.".format(awg_id))
            for step_id in [0, 1]:
                spectrum = rft.awg_sa_cmd.get_spectrum(
                    awg_id,
                    step_id=step_id,
                    start_sample_idx=start_sample_idx,
                    num_frames=num_frames,
                    is_iq_data=False)
                output_spectrum_data(awg_id, step_id, spectrum, num_frames,
                                     fft_size)

        # 送信波形をグラフ化
        for awg_id in awg_list:
            rft.awg_sa_cmd.get_waveform_sequence(awg_id).save_as_img(
                PLOT_DIR + "waveform/awg_{}_waveform.png".format(awg_id))

    print("Done.")
    return
Beispiel #11
0
def main():

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)
        setup_dac(rft.command)
        setup_adc(rft.command)

        # 初期化
        rft.awg_sa_cmd.initialize_awg_sa()
        # AWG 有効化
        rft.awg_sa_cmd.enable_awg(*awg_list)
        # Multi Tile Synchronization
        rft.awg_sa_cmd.sync_dac_tiles()
        rft.awg_sa_cmd.sync_adc_tiles()
        # ADC キャリブレーション
        calibrate_adc(rft.awg_sa_cmd)
        # 波形シーケンス設定
        awg_id_to_wave_sequence = set_wave_sequence(rft.awg_sa_cmd)
        # キャプチャシーケンス設定
        set_capture_sequence(rft.awg_sa_cmd, awg_id_to_wave_sequence)
        # 波形出力 & キャプチャスタート
        rft.awg_sa_cmd.start_wave_sequence()
        # 終了待ち
        wait_for_sequence_to_finish(rft.awg_sa_cmd, awg_list)
        # エラーチェック
        print("Check for errors")
        check_skipped_step(rft.awg_sa_cmd)
        check_capture_data_fifo_oevrflow(rft.awg_sa_cmd)
        for ch in range(8):
            check_intr_flags(rft.command, ADC, ch)
        for ch in range(8):
            check_intr_flags(rft.command, DAC, ch)

        # キャプチャデータ取得
        print("Get capture data.")
        nu = ndarrayutil.NdarrayUtil
        awg_id_to_wave_samples = {}
        for awg_id in awg_list:
            wave_data = rft.awg_sa_cmd.read_capture_data(awg_id, step_id=0)
            awg_id_to_wave_samples[awg_id] = nu.bytes_to_real_32(wave_data)

        # キャプチャデータ出力
        print("Output capture data.")
        for awg_id, wave_samples in awg_id_to_wave_samples.items():
            output_graphs((awg_id, 0, wave_samples))

        # スペクトラム取得
        print("Get spectrums.")
        num_frames = 1
        start_sample_idx = 1024  # FFT 開始サンプルのインデックス
        fft_size = rft.awg_sa_cmd.get_fft_size()
        awg_id_to_spectrum = {}
        for awg_id in awg_list:
            awg_id_to_spectrum[awg_id] = rft.awg_sa_cmd.get_spectrum(
                awg_id,
                step_id=1,
                start_sample_idx=start_sample_idx,
                num_frames=num_frames,
                is_iq_data=False)

        print("Output spectrums.")
        # スペクトラム出力
        output_spectrum_data(awg_id_to_spectrum, num_frames, 1, fft_size)

        # 送信波形をグラフ化
        for awg_id in awg_list:
            rft.awg_sa_cmd.get_waveform_sequence(awg_id).save_as_img(
                PLOT_DIR + "waveform/awg_{}_waveform.png".format(awg_id))

    print("Done.")
    return
Beispiel #12
0
def main():
    nu = ndarrayutil.NdarrayUtil

    print("Generating waveform data.")
    r_cycles = np.round(CHUNK_SAMPLES * 20.0 / EFF_DAC_FREQ)  # aprox. 20 MHz
    omega = 2. * np.pi * np.linspace(
        0., r_cycles, CHUNK_SAMPLES, endpoint=False)
    amplitude = np.linspace(-20000., 20000., DATA_DEVIDES, endpoint=False)
    sin_wave = np.sin(omega)
    cos_wave = np.cos(omega)
    interleaved_wave = np.array([sin_wave, cos_wave]).T.reshape(1, -1)

    w_data = np.multiply(interleaved_wave,
                         np.array([amplitude]).T).reshape(
                             1, -1)[0].astype("<i2").tobytes()

    del r_cycles, sin_wave, cos_wave, amplitude, interleaved_wave

    w_size = len(w_data)
    r_size = ADC_SAMPLES * 4

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)

        print("Setup ADC.")
        for tile in [0, 1, 2, 3]:
            for block in [0, 1]:
                rft.command.SetMixerSettings(0, tile, block, NCO_FREQ,
                                             NCO_PHASE, 2, 2, 0, 3, 0)
                rft.command.ResetNCOPhase(0, tile, block)
                rft.command.UpdateEvent(0, tile, block, 1)
            rft.command.SetupFIFO(0, tile, 0)
            for block in [0, 1]:
                rft.command.SetDither(tile, block,
                                      1 if ADC_FREQ > 3000. else 0)
                rft.command.SetDecimationFactor(tile, block, DUC_DDC_FACTOR)
            rft.command.SetFabClkOutDiv(0, tile,
                                        2 + int(np.log2(DUC_DDC_FACTOR)))
            for block in [0, 1]:
                rft.command.IntrClr(0, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(0, tile, 1)

        print("Setup DAC.")
        for tile in [0, 1]:
            for block in [0, 1, 2, 3]:
                rft.command.SetMixerSettings(1, tile, block, NCO_FREQ,
                                             NCO_PHASE, 2, 2, 0, 2, 0)
                rft.command.ResetNCOPhase(1, tile, block)
                rft.command.UpdateEvent(1, tile, block, 1)
            rft.command.SetupFIFO(1, tile, 0)
            for block in [0, 1, 2, 3]:
                rft.command.SetInterpolationFactor(tile, block, DUC_DDC_FACTOR)
            rft.command.SetFabClkOutDiv(1, tile,
                                        1 + int(np.log2(DUC_DDC_FACTOR)))
            for block in [0, 1, 2, 3]:
                rft.command.IntrClr(1, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(1, tile, 1)

        for ch in [6, 7]:
            print("Send waveform data to DAC Ch.{} DynamicRAM".format(ch))
            rft.if_data.WriteDataToMemory(1, ch, w_size, w_data)

        print("Setting trigger information.")
        rft.command.SetTriggerInfo(1, 0xC0, DAC_SAMPLES, 1)
        rft.command.SetTriggerInfo(0, 0x03, ADC_SAMPLES, 1)
        rft.command.SetTriggerLatency(1, 0)
        rft.command.SetTriggerLatency(0, 40)

        print("Start trigger.")
        rft.command.StartTrigger()

        print("Receive waveform data from ADC Ch.{} DynamicRAM".format(0))
        r_data_0 = rft.if_data.ReadDataFromMemory(0, 0, r_size)
        print("Receive waveform data from ADC Ch.{} DynamicRAM".format(1))
        r_data_1 = rft.if_data.ReadDataFromMemory(0, 1, r_size)

        print("Check interrupt flags.")
        for ch in range(8):  # ADC
            check_intr_flags(rft.command, 0, ch)
        for ch in range(8):  # DAC
            check_intr_flags(rft.command, 1, ch)

    print("Processing sample data.")
    print("- DAC sample data")
    w_sample = nu.bytes_to_complex(w_data)
    del w_data
    print("- ADC sample data")
    r_sample = [nu.bytes_to_complex(r_data_0), nu.bytes_to_complex(r_data_1)]
    del r_data_0, r_data_1

    print("Generating graph image.")
    os.makedirs(PLOT_DIR, exist_ok=True)

    print("- entire DAC")
    plot_graph_entire(
        EFF_DAC_FREQ, w_sample, "C0",
        "DAC waveform {} samples, {} Msps".format(DAC_SAMPLES, DAC_FREQ),
        "dram_iq_send.png")

    print("- crop DAC")
    plot_graph_crop(
        EFF_DAC_FREQ, w_sample, "C0",
        "DAC waveform {} samples{}, {} Msps".format(
            DAC_SAMPLES, " (crop {}-{})".format(CROP_PLOT[0], CROP_PLOT[1]),
            DAC_FREQ), "dram_iq_send_crop.png")

    print("- FFT DAC")
    plot_graph_fft(
        EFF_DAC_FREQ, w_sample, "C0",
        "DAC FFT (size:{} peak-holded), {} samples, {} Msps({}x DUC)".format(
            FFT_SIZE, DAC_SAMPLES, DAC_FREQ,
            DUC_DDC_FACTOR), "dram_iq_send_fft.png")

    for ch in range(2):
        print("- entire ADC Ch.{}".format(ch))
        plot_graph_entire(
            EFF_ADC_FREQ, r_sample[ch], "C{}".format(ch + 1),
            "ADC waveform {} samples, {} Msps({}x DDC)".format(
                ADC_SAMPLES, ADC_FREQ,
                DUC_DDC_FACTOR), "dram_iq_recv_{}.png".format(ch))

        print("- crop ADC Ch.{}".format(ch))
        plot_graph_crop(
            EFF_ADC_FREQ, r_sample[ch], "C{}".format(ch + 1),
            "ADC waveform {} samples{}, {} Msps({}x DDC)".format(
                ADC_SAMPLES, " (crop {}-{})".format(CROP_PLOT[0],
                                                    CROP_PLOT[1]), ADC_FREQ,
                DUC_DDC_FACTOR), "dram_iq_recv_{}_crop.png".format(ch))

        print("- FFT ADC Ch.{}".format(ch))
        plot_graph_fft(
            EFF_ADC_FREQ, r_sample[ch], "C{}".format(ch + 1),
            "ADC FFT (size:{} peak-holded), {} samples, {} Msps({}x DDC)".
            format(FFT_SIZE, ADC_SAMPLES, ADC_FREQ,
                   DUC_DDC_FACTOR), "dram_iq_recv_{}_fft.png".format(ch))

    print("Done.")
    return
Beispiel #13
0
def main():

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)
        shutdown_all_tiles(rft.command)
        set_adc_sampling_rate(rft.command, ADC_FREQ)
        set_dac_sampling_rate(rft.command, DAC_FREQ)
        startup_all_tiles(rft.command)
        setup_dac(rft.command)
        setup_adc(rft.command)

        # 初期化
        rft.awg_sa_cmd.initialize_awg_sa()
        # AWG 有効化
        rft.awg_sa_cmd.enable_awg(*awg_list)
        # ADC キャリブレーション
        calibrate_adc(rft.awg_sa_cmd)
        # 波形シーケンス設定
        awg_id_to_wave_sequence = set_wave_sequence(rft.awg_sa_cmd)
        # キャプチャシーケンス設定
        set_capture_sequence(rft.awg_sa_cmd, awg_id_to_wave_sequence)
        # 波形出力 & キャプチャスタート
        start_awg_and_capture(rft.awg_sa_cmd)
        # エラーチェック
        check_skipped_step(rft.awg_sa_cmd)
        check_capture_data_fifo_oevrflow(rft.awg_sa_cmd)
        for ch in range(8):
            check_intr_flags(rft.command, ADC, ch)
        for ch in range(8):
            check_intr_flags(rft.command, DAC, ch)

        # キャプチャデータのアドレスとサイズを指定してキャプチャデータを取得する
        print("Get capture data.")
        nu = ndarrayutil.NdarrayUtil
        awg_id_to_wave_samples = {}
        for awg_id in awg_list:
            (addr, size) = rft.awg_sa_cmd.get_capture_section_info(awg_id,
                                                                   step_id=0)
            capture_data_0 = rft.awg_sa_cmd.read_dram(addr, size)
            (addr, size) = rft.awg_sa_cmd.get_capture_section_info(awg_id,
                                                                   step_id=1)
            capture_data_1 = rft.awg_sa_cmd.read_dram(addr, size)
            awg_id_to_wave_samples[awg_id] = (
                nu.bytes_to_real_32(capture_data_0),
                nu.bytes_to_real_32(capture_data_1))

        # キャプチャデータ出力
        print("Output capture data.")
        for awg_id, wave_samples in awg_id_to_wave_samples.items():
            output_graphs((awg_id, 0, wave_samples[0]),
                          (awg_id, 1, wave_samples[1]))

        # 送信波形をグラフ化
        for awg_id in awg_list:
            rft.awg_sa_cmd.get_waveform_sequence(awg_id).save_as_img(
                PLOT_DIR + "waveform/awg_{}_waveform.png".format(awg_id))

    print("Done.")
    return
Beispiel #14
0
def main():
    nu = ndarrayutil.NdarrayUtil

    print("Generating waveform data.")
    r_cycles = np.round(CHUNK_SAMPLES * 20.0 / DAC_FREQ)  # aprox. 20 MHz
    sin_wave = np.array([
        np.sin(2. * np.pi *
               np.linspace(0., r_cycles, CHUNK_SAMPLES, endpoint=False))
    ])

    amplitude = np.linspace(-30000,
                            30000,
                            DATA_DEVIDES,
                            endpoint=False,
                            dtype="int16")

    w_data_0 = np.multiply(sin_wave,
                           np.array([amplitude]).T).reshape(
                               1, -1)[0].astype("<i2").tobytes()

    w_data_1 = np.multiply(sin_wave,
                           np.array([-amplitude]).T).reshape(
                               1, -1)[0].astype("<i2").tobytes()

    del r_cycles, sin_wave, amplitude

    w_size = len(w_data_0)

    print("Processing sample data.")
    print("- DAC sample data")
    w_sample = [nu.bytes_to_real(w_data_0), nu.bytes_to_real(w_data_1)]

    print("Generating graph image.")
    os.makedirs(PLOT_DIR, exist_ok=True)

    for ch in range(2):
        print("- entire DAC Ch.{}".format(ch + 6))
        plot_graph_entire(
            DAC_FREQ, w_sample[ch], "C{}".format(ch),
            "DAC waveform {} samples, {} Msps".format(DAC_SAMPLES, DAC_FREQ),
            "dram_send_{}.png".format(ch))

        print("- crop DAC Ch.{}".format(ch + 6))
        plot_graph_crop(
            DAC_FREQ, w_sample[ch], "C{}".format(ch),
            "DAC waveform {} samples{}, {} Msps".format(
                DAC_SAMPLES, " (crop {}-{})".format(CROP_PLOT[0],
                                                    CROP_PLOT[1]),
                DAC_FREQ), "dram_send_{}_crop.png".format(ch))

        print("- FFT DAC Ch.{}".format(ch + 6))
        plot_graph_fft(
            DAC_FREQ, w_sample[ch], "C{}".format(ch),
            "DAC FFT (size:{} peak-holded), {} samples, {} Msps".format(
                FFT_SIZE, DAC_SAMPLES,
                DAC_FREQ), "dram_send_{}_fft.png".format(ch))

    del w_sample

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)

        print("Setup DAC.")
        for tile in [0, 1]:
            for block in [0, 1, 2, 3]:
                rft.command.SetMixerSettings(1, tile, block, 0.0, 0.0, 2, 1,
                                             16, 4, 0)
                rft.command.ResetNCOPhase(1, tile, block)
                rft.command.UpdateEvent(1, tile, block, 1)
            rft.command.SetupFIFO(1, tile, 0)
            for block in [0, 1, 2, 3]:
                rft.command.SetInterpolationFactor(tile, block, DUC_DDC_FACTOR)
            rft.command.SetFabClkOutDiv(1, tile,
                                        2 + int(np.log2(DUC_DDC_FACTOR)))
            for block in [0, 1, 2, 3]:
                rft.command.IntrClr(1, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(1, tile, 1)

        print("Send waveform data to DAC Ch.{} DynamicRAM".format(6))
        rft.if_data.WriteDataToMemory(1, 6, w_size, w_data_0)
        print("Send waveform data to DAC Ch.{} DynamicRAM".format(7))
        rft.if_data.WriteDataToMemory(1, 7, w_size, w_data_1)

        print("Setting trigger information.")
        rft.command.SetTriggerInfo(1, 0xC0, DAC_SAMPLES, 0)
        rft.command.SetTriggerInfo(0, 0x00, 0, 0)
        rft.command.SetTriggerLatency(1, 0)

        kpmon_thread = threading.Thread(target=keypress_mon)
        kpmon_thread.start()

        print("\r\n --- Press Enter to stop triggering --- \r\n")
        while not is_keypressed:
            rft.command.StartTrigger()
            time.sleep(1.)

        print("Check interrupt flags.")
        for ch in range(8):  # DAC
            check_intr_flags(rft.command, 1, ch)

    print("Done.")
    return
Beispiel #15
0
def main():

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)

        shutdown_all_tiles(rft.command)
        set_adc_sampling_rate(rft.command, ADC_FREQ)
        set_dac_sampling_rate(rft.command, DAC_FREQ)
        startup_all_tiles(rft.command)
        setup_dac(rft.command)
        setup_adc(rft.command)

        # 初期化
        rft.awg_sa_cmd.initialize_awg_sa()
        # AWG 有効化
        rft.awg_sa_cmd.enable_awg(*awg_list)
        # ADC キャリブレーション
        calibrate_adc(rft.awg_sa_cmd)
        # AWG の波形シーケンス設定
        awg_id_to_wave_sequence = set_wave_sequence(rft.awg_sa_cmd)
        # キャプチャシーケンス設定
        set_capture_sequence(rft.awg_sa_cmd, awg_id_to_wave_sequence)
        # トリガモードの設定
        for awg_id, trigger_mode in awg_to_trigger_mode.items():
            rft.awg_sa_cmd.set_trigger_mode(awg_id, trigger_mode)

        # AWG 4 にマニュアルトリガを発行して, 波形の出力を開始する.
        start_awg_and_capture(rft.awg_sa_cmd)
        # 外部トリガ設定 & 起動
        # 外部トリガモジュールは起動後すぐに, 出力中の AWG 4 の波形を読み取って外部トリガを発行する.
        # その結果, AWG 0 ~ 3, 5 ~ 7 が起動して波形の出力とキャプチャが始まる.
        start_external_trigger(rft.awg_sa_cmd)
        # 波形キャプチャ終了待ち
        wait_for_sequence_to_finish(rft.awg_sa_cmd, *awg_list)
        # エラーチェック
        check_skipped_step(rft.awg_sa_cmd, awg_id_to_wave_sequence)
        check_capture_data_fifo_oevrflow(rft.awg_sa_cmd,
                                         awg_id_to_wave_sequence)
        for ch in range(8):
            check_intr_flags(rft.command, ADC, ch)
        for ch in range(8):
            check_intr_flags(rft.command, DAC, ch)

        # キャプチャデータ取得
        print("Get capture data.")
        nu = ndarrayutil.NdarrayUtil
        awg_id_to_wave_samples = {}
        for awg_id, wave_sequence in awg_id_to_wave_sequence.items():
            step_id_list = wave_sequence.get_step_id_list()
            wave_data = rft.awg_sa_cmd.read_capture_data(
                awg_id, step_id=step_id_list[0])
            awg_id_to_wave_samples[awg_id] = nu.bytes_to_real_32(wave_data)

        # キャプチャデータ出力
        print("Output capture data.")
        for awg_id, wave_samples in awg_id_to_wave_samples.items():
            output_graphs((awg_id, 0, wave_samples))

        # スペクトラム取得
        print("Get spectrums.")
        num_frames = 1
        start_sample_idx = 16  # FFT 開始サンプルのインデックス
        fft_size = rft.awg_sa_cmd.get_fft_size()
        awg_id_to_spectrum = {}
        for awg_id, wave_sequence in awg_id_to_wave_sequence.items():
            if (wave_sequence.num_wave_steps() >= 2):
                step_id_list = wave_sequence.get_step_id_list()
                awg_id_to_spectrum[awg_id] = rft.awg_sa_cmd.get_spectrum(
                    awg_id,
                    step_id=step_id_list[1],
                    start_sample_idx=start_sample_idx,
                    num_frames=num_frames,
                    is_iq_data=False)

        # スペクトラム出力
        print("Output spectrums.")
        output_spectrum_data(awg_id_to_spectrum, num_frames, 1, fft_size)

        # 送信波形をグラフ化
        for awg_id in awg_list:
            if awg_to_trigger_mode[awg_id] == awgsa.TriggerMode.MANUAL:
                continue
            rft.awg_sa_cmd.get_waveform_sequence(awg_id).save_as_img(
                PLOT_DIR + "waveform/awg_{}_waveform.png".format(awg_id))

    print("Done.")
    return
Beispiel #16
0
def main():

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)
        shutdown_all_tiles(rft.command)
        set_adc_sampling_rate(rft.command, ADC_FREQ)
        set_dac_sampling_rate(rft.command, DAC_FREQ)
        startup_all_tiles(rft.command)
        setup_dac(rft.command)
        setup_adc(rft.command)

        # 初期化    
        rft.awg_sa_cmd.initialize_awg_sa()
        # AWG 有効化
        rft.awg_sa_cmd.enable_awg(*awg_list)
        # ADC キャリブレーション
        calibrate_adc(rft.awg_sa_cmd)
        # 波形シーケンス設定
        awg_id_to_wave_sequence = set_wave_sequence(rft.awg_sa_cmd)
        # キャプチャシーケンス設定
        set_capture_sequence(rft.awg_sa_cmd, awg_id_to_wave_sequence)
        # 波形出力 & キャプチャスタート
        start_awg_and_capture(rft.awg_sa_cmd)
        # エラーチェック
        check_skipped_step(rft.awg_sa_cmd)
        check_capture_data_fifo_oevrflow(rft.awg_sa_cmd)
        for ch in range(8):
            check_intr_flags(rft.command, ADC, ch)
        for ch in range(8):
            check_intr_flags(rft.command, DAC, ch)
        
        # キャプチャデータ取得
        print("Get capture data.")
        awg_id_to_wave_data = {}
        for awg_id in awg_list:
            awg_id_to_wave_data[awg_id] = rft.awg_sa_cmd.read_capture_data(awg_id, step_id = 0)

        # キャプチャデータ出力
        print("Output capture data.")
        num_frames = 1
        start_sample_idx = 1024 # FFT 開始サンプルのインデックス
        fft_size = rft.awg_sa_cmd.get_fft_size()
        output_capture_data(awg_id_to_wave_data, num_frames, start_sample_idx, fft_size)
        
        # スペクトラム取得
        print("Get spectrums.")
        awg_id_to_spectrum = {}
        for awg_id in awg_list:
            awg_id_to_spectrum[awg_id] = rft.awg_sa_cmd.get_spectrum(
                awg_id, step_id = 0,
                start_sample_idx = start_sample_idx, num_frames = num_frames, is_iq_data = True)
        
        # スペクトラム出力
        print("Output spectrums.")
        output_spectrum_data(awg_id_to_spectrum, num_frames, 0, fft_size)
        
        # 送信波形をグラフ化
        for awg_id in awg_list:
           rft.awg_sa_cmd.get_waveform_sequence(awg_id).save_as_img(PLOT_DIR + "waveform/awg_{}_waveform.png".format(awg_id))

    print("Done.")
    return
Beispiel #17
0
def main():

    wgen = wavegen.WaveGen(logger=logger)
    nu = ndarrayutil.NdarrayUtil

    # 送信する波の形状をサンプリングレートによらず一定にするため, dac_freq = 4096.0 で固定
    print("Generate waveform data.")
    wgen.set_parameter(num_sample=DAC_SAMPLES,
                       dac_freq=4096.0,
                       carrier_freq=1.0,
                       amplitude=30000.0)
    sin_wave = nu.bytes_to_real(wgen.sinwave())
    amplitude = np.linspace(-1., 1., DAC_SAMPLES, endpoint=False)
    w_data = (sin_wave * amplitude).reshape(1, -1)[0].astype("<i2").tobytes()
    del sin_wave, amplitude
    w_size = len(w_data)  # for 16bit signed integer

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)

        print("set sampling rate.")
        set_dac_sampling_rate(rft.command, DAC_FREQ)

        print("Setup DAC.")
        for tile in [0, 1]:
            for block in [0, 1, 2, 3]:
                rft.command.SetMixerSettings(DAC, tile, block, 0.0, 0.0, 2, 1,
                                             16, 4, 0)
                rft.command.ResetNCOPhase(DAC, tile, block)
                rft.command.UpdateEvent(DAC, tile, block, 1)
            rft.command.SetupFIFO(DAC, tile, 0)
            for block in [0, 1, 2, 3]:
                rft.command.SetInterpolationFactor(tile, block, DUC_DDC_FACTOR)
            rft.command.SetFabClkOutDiv(DAC, tile,
                                        2 + int(np.log2(DUC_DDC_FACTOR)))
            for block in [0, 1, 2, 3]:
                rft.command.IntrClr(DAC, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(DAC, tile, 1)

        print("Clear BlockRAM.")
        rft.command.ClearBRAM()

        for ch in range(8):
            print("Send waveform data to DAC Ch.{} BlockRAM".format(ch))
            rft.if_data.WriteDataToMemory(DAC, ch, w_size, w_data)

        print("Setting trigger information.")
        rft.command.SetTriggerInfo(DAC, 0xFF, DAC_SAMPLES, USE_REAL)
        rft.command.SetTriggerLatency(DAC, 0)
        rft.command.SetTriggerCycle(1, 1)

        print("Start trigger.")
        rft.command.StartTrigger()

        wait_trig_done(rft.command)

        print("Check interrupt flags.")
        for ch in range(8):
            check_intr_flags(rft.command, DAC, ch)

    print("Processing sample data.")
    print("- DAC sample data")
    w_sample = nu.bytes_to_real(w_data)
    del w_data

    print("Generating graph image.")
    os.makedirs(PLOT_DIR, exist_ok=True)

    print("- entire DAC")
    plot_graph_entire(
        DAC_FREQ, w_sample, CHUNK_DAC_PLOT, "C0",
        "DAC waveform {} samples, {} Msps".format(DAC_SAMPLES,
                                                  DAC_FREQ), "bram_send.png")

    print("- crop DAC")
    plot_graph_crop(
        DAC_FREQ, w_sample, "C0", "DAC waveform {} samples{}, {} Msps".format(
            DAC_SAMPLES, " (crop {}-{})".format(CROP_PLOT[0], CROP_PLOT[1]),
            DAC_FREQ), "bram_send_crop.png")

    print("- FFT DAC")
    plot_graph_fft(
        DAC_FREQ, w_sample, "C0",
        "DAC FFT, {} samples, {} Msps".format(DAC_SAMPLES,
                                              DAC_FREQ), "bram_send_fft.png")

    print("Done.")
    return
Beispiel #18
0
def main():
    
    wgen = wavegen.WaveGen(logger=logger)
    nu = ndarrayutil.NdarrayUtil

    print("Generate waveform data.")
    wgen.set_parameter(num_sample=DAC_SAMPLES, dac_freq=DAC_FREQ,
                       carrier_freq=30.0, amplitude=30000.0)
    w_data = wgen.sinwave()
    w_size = len(w_data)  # for 16bit signed integer
    r_size = ADC_SAMPLES * 4 * 2  # for two 32bit signed integer values (I Data and Q Data)
    
    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)

        print("set sampling rate.")
        set_adc_sampling_rate(rft.command, ADC_FREQ)
        set_dac_sampling_rate(rft.command, DAC_FREQ)

        print("Setup ADC.")
        for tile in [0, 1, 2, 3]:
            for block in [0, 1]:
                rft.command.SetMixerSettings(ADC, tile, block, 10, 45.0,
                    2, 2, 16, 3, 0)
                rft.command.ResetNCOPhase(ADC, tile, block)
                rft.command.UpdateEvent(ADC, tile, block, 1)
            rft.command.SetupFIFO(ADC, tile, 0)
            for block in [0, 1]:
                rft.command.SetDither(tile, block, 1 if ADC_FREQ > 3000. else 0)
                rft.command.SetDecimationFactor(tile, block, DUC_DDC_FACTOR)
            rft.command.SetFabClkOutDiv(ADC, tile, 2 + int(np.log2(DUC_DDC_FACTOR)))
            for block in [0, 1]:
                rft.command.IntrClr(ADC, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(ADC, tile, 1)

        print("Setup DAC.")
        for tile in [0, 1]:
            for block in [0, 1, 2, 3]:
                rft.command.SetMixerSettings(DAC, tile, block, 0.0, 0.0,
                    2, 1, 16, 4, 0)
                rft.command.ResetNCOPhase(DAC, tile, block)
                rft.command.UpdateEvent(DAC, tile, block, 1)
            rft.command.SetupFIFO(DAC, tile, 0)
            for block in [0, 1, 2, 3]:
                rft.command.SetInterpolationFactor(tile, block, DUC_DDC_FACTOR)
            rft.command.SetFabClkOutDiv(DAC, tile, 2 + int(np.log2(DUC_DDC_FACTOR)))
            for block in [0, 1, 2, 3]:
                rft.command.IntrClr(DAC, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(DAC, tile, 1)

        print("Clear BlockRAM.")
        rft.command.ClearBRAM()

        for ch in [6, 7]:
            print("Send waveform data to DAC Ch.{} BlockRAM".format(ch))
            rft.if_data.WriteDataToMemory(DAC, ch, w_size, w_data)

        print("Setting trigger information.")
        rft.command.SetTriggerInfo(ADC, 0xFF, ADC_SAMPLES, USE_IQ)
        rft.command.SetTriggerInfo(DAC, 0xFF, DAC_SAMPLES, USE_REAL)
        rft.command.SetTriggerLatency(ADC, 45)
        rft.command.SetTriggerLatency(DAC, 0)
        rft.command.SetTriggerCycle(1, 1)
        rft.command.SetAccumulateMode(0)  # disable accumulation

        print("Start trigger.")
        rft.command.StartTrigger()
        wait_trig_done(rft.command)

        r_data = []
        for ch in [0, 1]:
            print("Receive waveform data from ADC Ch.{} BlockRAM".format(ch))
            r_data.append(rft.if_data.ReadDataFromMemory(ADC, ch, r_size))

        print("Check interrupt flags.")
        for ch in range(8):
            check_intr_flags(rft.command, ADC, ch)
        for ch in range(8):
            check_intr_flags(rft.command, DAC, ch)
    
    print("Processing sample data.")
    print("- DAC sample data")
    w_sample = nu.bytes_to_real(w_data)
    del w_data
    print("- ADC sample data")
    r_sample = np.array([nu.bytes_to_complex_32(rd) for rd in r_data])
    del r_data

    print("Generating graph image.")
    os.makedirs(PLOT_DIR, exist_ok=True)

    print("- entire DAC")
    plot_graph_entire(
        DAC_FREQ,
        w_sample,
        1,
        "C0",
        "DAC waveform {} samples, {} Msps".format(DAC_SAMPLES, DAC_FREQ),
        "bram_send.png"
    )

    print("- crop DAC")
    plot_graph_crop(
        DAC_FREQ,
        w_sample,
        "C0",
        "DAC waveform {} samples{}, {} Msps".format(
            DAC_SAMPLES,
            " (crop {}-{})".format(CROP_PLOT[0], CROP_PLOT[1]),
            DAC_FREQ),
        "bram_send_crop.png"
    )

    print("- FFT DAC")
    plot_graph_fft(
        DAC_FREQ,
        w_sample,
        "C0",
        "DAC FFT, {} samples, {} Msps".format(DAC_SAMPLES, DAC_FREQ),
        "bram_send_fft.png"
    )    

    for ch in range(2):
        print("- entire ADC Ch.{}".format(ch))
        plot_graph_entire_iq(
            ADC_FREQ,
            r_sample[ch],
            1,
            "C{}".format(ch + 1),
            "ADC waveform {} samples, {} Msps".format(ADC_SAMPLES, ADC_FREQ),
            "bram_recv_{}.png".format(ch)
        )

        print("- crop ADC Ch.{}".format(ch))
        plot_graph_crop_iq(
            ADC_FREQ,
            r_sample[ch],
            "C{}".format(ch + 1),
            "ADC waveform {} samples{}, {} Msps".format(
                ADC_SAMPLES,
                " (crop {}-{})".format(CROP_PLOT[0], CROP_PLOT[1]),
                ADC_FREQ),
            "bram_recv_{}_crop.png".format(ch)
        )

        print("- FFT ADC Ch.{}".format(ch))
        plot_graph_fft_iq(
            ADC_FREQ,
            r_sample[ch],
            "C{}".format(ch + 1),
            "ADC FFT {} samples, {} Msps".format(ADC_SAMPLES, ADC_FREQ),
            "bram_recv_{}_fft.png".format(ch)
        )
    print("Done.")
    return
Beispiel #19
0
def main(num_trig):

    nu = ndarrayutil.NdarrayUtil
    print("Generating waveform data.")
    r_cycles = np.round(CHUNK_SAMPLES * 20 / DAC_FREQ)  # aprox. 20 MHz
    sin_wave = np.array([
        np.sin(2. * np.pi *
               np.linspace(0., r_cycles, CHUNK_SAMPLES, endpoint=False))
    ])
    amplitude_0 = np.linspace(-30000,
                              30000,
                              DATA_DEVIDES,
                              endpoint=False,
                              dtype="int16")
    amplitude_1 = np.linspace(-3000,
                              3000,
                              DATA_DEVIDES,
                              endpoint=False,
                              dtype="int16")
    w_data_0 = np.multiply(sin_wave,
                           np.array([amplitude_0]).T).reshape(
                               1, -1)[0].astype("<i2").tobytes()
    del r_cycles, sin_wave, amplitude_0, amplitude_1

    w_size = len(w_data_0)
    r_size = ADC_SAMPLES * 4

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)

        set_adc_sampling_rate(rft.command, ADC_FREQ)
        set_dac_sampling_rate(rft.command, DAC_FREQ)

        print("Setup ADC.")
        for tile in [0, 1, 2, 3]:
            for block in [0, 1]:
                rft.command.SetMixerSettings(ADC, tile, block, 0.0, 0.0, 2, 2,
                                             0, 3, 0)
                rft.command.ResetNCOPhase(ADC, tile, block)
                rft.command.UpdateEvent(ADC, tile, block, 1)
            rft.command.SetupFIFO(ADC, tile, 0)
            for block in [0, 1]:
                rft.command.SetDither(tile, block,
                                      1 if ADC_FREQ > 3000. else 0)
                rft.command.SetDecimationFactor(tile, block, DUC_DDC_FACTOR)
            rft.command.SetFabClkOutDiv(ADC, tile,
                                        2 + int(np.log2(DUC_DDC_FACTOR)))
            for block in [0, 1]:
                rft.command.IntrClr(ADC, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(ADC, tile, 1)

        print("Setup DAC.")
        for tile in [0, 1]:
            for block in [0, 1, 2, 3]:
                rft.command.SetMixerSettings(DAC, tile, block, 0.0, 0.0, 2, 1,
                                             16, 4, 0)
                rft.command.ResetNCOPhase(DAC, tile, block)
                rft.command.UpdateEvent(DAC, tile, block, 1)
            rft.command.SetupFIFO(DAC, tile, 0)
            for block in [0, 1, 2, 3]:
                rft.command.SetInterpolationFactor(tile, block, DUC_DDC_FACTOR)
            rft.command.SetFabClkOutDiv(DAC, tile,
                                        2 + int(np.log2(DUC_DDC_FACTOR)))
            for block in [0, 1, 2, 3]:
                rft.command.IntrClr(DAC, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(DAC, tile, 1)

        print("Send waveform data to DAC Ch.{} DynamicRAM".format(DAC_CH))
        rft.if_data.WriteDataToMemory(DAC, DAC_CH, w_size, w_data_0)

        rft.command.SetAccumulateMode(0)  # disable accumulation
        print("Setting trigger information.")
        active_dac_ch_list = 1 << DAC_CH
        active_adc_ch_list = 1 << ADC_CH
        rft.command.SetTriggerInfo(DAC, active_dac_ch_list, DAC_SAMPLES,
                                   USE_REAL)
        rft.command.SetTriggerInfo(ADC, active_adc_ch_list, ADC_SAMPLES,
                                   USE_REAL)
        rft.command.SetTriggerLatency(
            DAC, calc_trigger_wait_count(DAC_TRIGGER_LATENCY))
        rft.command.SetTriggerLatency(
            ADC, calc_trigger_wait_count(ADC_TRIGGER_LATENCY))
        rft.command.SetTriggerCycle(2,
                                    calc_trigger_wait_count(TRIGGER_INTERVAL))

        print("Start trigger.")
        rft.command.StartTrigger()  # for ADC calibration
        wait_trig_done(rft.command)

        rft.command.SetAccumulateMode(1)  # enable accumulation
        rft.command.ClearDRAM(ADC)
        rft.command.SetTriggerCycle(num_trig,
                                    calc_trigger_wait_count(TRIGGER_INTERVAL))
        rft.command.StartTrigger()
        wait_trig_done(rft.command)

        print("Receive waveform data from ADC Ch.{} DynamicRAM".format(ADC_CH))
        r_data_0 = rft.if_data.ReadDataFromMemory(ADC, ADC_CH, r_size)

        print("Check interrupt flags.")
        for ch in range(8):
            check_intr_flags(rft.command, ADC, ch)
        for ch in range(8):
            check_intr_flags(rft.command, DAC, ch)

    print("Processing sample data.")
    print("- DAC sample data")
    w_sample = nu.bytes_to_real(w_data_0)
    del w_data_0
    print("- ADC sample data")
    r_sample = nu.bytes_to_real_32(r_data_0)
    del r_data_0

    print("Generating graph image.")
    outputdir = PLOT_DIR + str(num_trig) + "/"
    os.makedirs(outputdir, exist_ok=True)

    print("- entire DAC Ch.{}".format(DAC_CH))
    plot_graph_entire(
        DAC_FREQ, w_sample, "C{}".format(DAC_CH),
        "DAC waveform {} samples, {} Msps".format(DAC_SAMPLES, DAC_FREQ),
        outputdir + "dram_send_{}.png".format(DAC_CH))

    print("- crop DAC Ch.{}".format(DAC_CH))
    plot_graph_crop(
        DAC_FREQ, w_sample, "C{}".format(DAC_CH),
        "DAC waveform {} samples{}, {} Msps".format(
            DAC_SAMPLES, " (crop {}-{})".format(CROP_PLOT[0], CROP_PLOT[1]),
            DAC_FREQ), outputdir + "dram_send_{}_crop.png".format(DAC_CH))

    print("- FFT DAC Ch.{}".format(DAC_CH))
    plot_graph_fft(
        DAC_FREQ, w_sample, "C{}".format(DAC_CH),
        "DAC FFT (size:{} peak-holded), {} samples, {} Msps".format(
            FFT_SIZE, DAC_SAMPLES,
            DAC_FREQ), outputdir + "dram_send_{}_fft.png".format(DAC_CH))

    print("- entire ADC Ch.{}".format(ADC_CH))
    plot_graph_entire(
        ADC_FREQ, r_sample, "C{}".format(ADC_CH),
        "ADC waveform {} samples, {} Msps({} times accum.)".format(
            ADC_SAMPLES, ADC_FREQ,
            str(num_trig)), outputdir + "dram_recv_{}.png".format(ADC_CH))

    print("- crop ADC Ch.{}".format(ADC_CH))
    plot_graph_crop(
        ADC_FREQ, r_sample, "C{}".format(ADC_CH),
        "ADC waveform {} samples{}, {} Msps({} times accum.)".format(
            ADC_SAMPLES, " (crop {}-{})".format(CROP_PLOT[0],
                                                CROP_PLOT[1]), ADC_FREQ,
            str(num_trig)), outputdir + "dram_recv_{}_crop.png".format(ADC_CH))

    print("- FFT ADC Ch.{}".format(ADC_CH))
    plot_graph_fft(
        ADC_FREQ, r_sample, "C{}".format(ADC_CH),
        "ADC FFT (size:{} peak-holded), {} samples, {} Msps({} times accum.)".
        format(FFT_SIZE, ADC_SAMPLES, ADC_FREQ, str(num_trig)),
        outputdir + "dram_recv_{}_fft.png".format(ADC_CH))

    print("Done.")
    return
Beispiel #20
0
def main(num_trig):
    wgen = wavegen.WaveGen(logger=logger)
    nu = ndarrayutil.NdarrayUtil

    print("Generate waveform data.")
    wgen.set_parameter(num_sample=DAC_SAMPLES,
                       dac_freq=DAC_FREQ,
                       carrier_freq=64.,
                       amplitude=-30000.0)

    w_data = wgen.sinwave()

    w_size = len(w_data)  # for 16bit signed integer
    r_size = ADC_SAMPLES * 4  # for 32bit signed integer

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)

        print("Setup ADC.")
        for tile in [0, 1, 2, 3]:
            for block in [0, 1]:
                rft.command.SetMixerSettings(0, tile, block, 0.0, 0.0, 2, 2, 0,
                                             3, 0)
                rft.command.ResetNCOPhase(0, tile, block)
                rft.command.UpdateEvent(0, tile, block, 1)
            rft.command.SetupFIFO(0, tile, 0)
            for block in [0, 1]:
                rft.command.SetDither(tile, block,
                                      1 if ADC_FREQ > 3000. else 0)
                rft.command.SetDecimationFactor(tile, block, DUC_DDC_FACTOR)
            rft.command.SetFabClkOutDiv(0, tile,
                                        2 + int(np.log2(DUC_DDC_FACTOR)))
            for block in [0, 1]:
                rft.command.IntrClr(0, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(0, tile, 1)

        print("Setup DAC.")
        for tile in [0, 1]:
            for block in [0, 1, 2, 3]:
                rft.command.SetMixerSettings(1, tile, block, 0.0, 0.0, 2, 1,
                                             16, 4, 0)
                rft.command.ResetNCOPhase(1, tile, block)
                rft.command.UpdateEvent(1, tile, block, 1)
            rft.command.SetupFIFO(1, tile, 0)
            for block in [0, 1, 2, 3]:
                rft.command.SetInterpolationFactor(tile, block, DUC_DDC_FACTOR)
            rft.command.SetFabClkOutDiv(1, tile,
                                        2 + int(np.log2(DUC_DDC_FACTOR)))
            for block in [0, 1, 2, 3]:
                rft.command.IntrClr(1, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(1, tile, 1)

        print("Clear BlockRAM.")
        rft.command.ClearBRAM()

        for ch in [6, 7]:
            print("Send waveform data to DAC Ch.{} BlockRAM".format(ch))
            rft.if_data.WriteDataToMemory(1, ch, w_size, w_data)

        print("Setting trigger information.")
        rft.command.SetTriggerInfo(0, 0xFF, ADC_SAMPLES, 0)
        rft.command.SetTriggerInfo(1, 0xFF, DAC_SAMPLES, 0)
        rft.command.SetTriggerLatency(0, 97)
        rft.command.SetTriggerLatency(1, 0)
        rft.command.SetTriggerCycle(32768, 1)  # trigger 32768 times
        rft.command.SetAccumulateMode(0)  # disable accumulation

        print("Start trigger.")
        rft.command.StartTrigger()  # for ADC calibration

        wait_trig_done(rft.command)

        print("Clear BlockRAM.")
        rft.command.ClearBRAM()

        for ch in [6, 7]:
            print("Send waveform data to DAC Ch.{} BlockRAM".format(ch))
            rft.if_data.WriteDataToMemory(1, ch, w_size, w_data)

        print("Setting trigger information.")
        rft.command.SetTriggerCycle(num_trig, 1)
        rft.command.SetAccumulateMode(1)  # enable accumulation

        print("Start trigger.")
        rft.command.StartTrigger()  # for ADC accumualtion

        wait_trig_done(rft.command)

        r_data = []
        for ch in [0, 1]:
            print("Receive waveform data from ADC Ch.{} BlockRAM".format(ch))
            r_data.append(rft.if_data.ReadDataFromMemory(0, ch, r_size))

        print("Check interrupt flags.")
        for ch in range(8):  # ADC
            check_intr_flags(rft.command, 0, ch)
        for ch in range(8):  # DAC
            check_intr_flags(rft.command, 1, ch)

    print("Processing sample data.")
    print("- DAC sample data")
    w_sample = nu.bytes_to_real(w_data)
    del w_data
    print("- ADC sample data")
    r_sample = np.array([nu.bytes_to_real_32(rd) for rd in r_data])
    del r_data

    print("Generating graph image.")
    os.makedirs(PLOT_DIR + str(num_trig) + "/", exist_ok=True)

    # print("- entire DAC")
    # plot_graph_entire(
    #     DAC_FREQ,
    #     w_sample,
    #     "C0",
    #     "DAC waveform {} samples, {} Msps".format(DAC_SAMPLES, DAC_FREQ),
    #     PLOT_DIR + str(num_trig) + "/bram_send.png"
    # )
    #
    print("- crop DAC")
    plot_graph_crop(
        DAC_FREQ, w_sample, "C0", "DAC waveform {} samples{}, {} Msps".format(
            DAC_SAMPLES, " (crop {}-{})".format(CROP_PLOT[0], CROP_PLOT[1]),
            DAC_FREQ), PLOT_DIR + str(num_trig) + "/bram_send_crop.png")
    #
    # print("- FFT DAC")
    # plot_graph_fft(
    #     DAC_FREQ,
    #     w_sample,
    #     "C0",
    #     "DAC FFT, {} samples, {} Msps".format(DAC_SAMPLES, DAC_FREQ),
    #     PLOT_DIR + str(num_trig) + "/bram_send_fft.png"
    # )

    for ch in [0, 1]:
        # print("- entire ADC Ch.{}".format(ch))
        # plot_graph_entire(
        #     ADC_FREQ,
        #     r_sample[ch],
        #     "C{}".format(ch + 1),
        #     "ADC waveform {} samples, {} Msps({} times accum.)".format(ADC_SAMPLES, ADC_FREQ, str(num_trig)),
        #     PLOT_DIR + str(num_trig) + "/bram_recv_{}.png".format(ch)
        # )

        print("- crop ADC Ch.{}".format(ch))
        plot_graph_crop(
            ADC_FREQ, r_sample[ch], "C{}".format(ch + 1),
            "ADC waveform {} samples{}, {} Msps({} times accum.)".format(
                ADC_SAMPLES, " (crop {}-{})".format(CROP_PLOT[0],
                                                    CROP_PLOT[1]), ADC_FREQ,
                str(num_trig)),
            PLOT_DIR + str(num_trig) + "/bram_recv_{}_crop.png".format(ch))

        # print("- FFT ADC Ch.{}".format(ch))
        # plot_graph_fft(
        #     ADC_FREQ,
        #     r_sample[ch],
        #     "C{}".format(ch + 1),
        #     "ADC FFT {} samples, {} Msps({} times accum.)".format(ADC_SAMPLES, ADC_FREQ, str(num_trig)),
        #     PLOT_DIR + str(num_trig) + "/bram_recv_{}_fft.png".format(ch)
        # )

    print("Done.")
    return
Beispiel #21
0
def main():

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)

        set_adc_sampling_rate(rft.command, ADC_FREQ)
        set_dac_sampling_rate(rft.command, DAC_FREQ)
        setup_dac(rft.command)
        setup_adc(rft.command)

        # 初期化
        rft.awg_sa_cmd.initialize_awg_sa()
        # AWG 有効化
        rft.awg_sa_cmd.enable_awg(awgsa.AwgId.AWG_0)
        # ADC キャリブレーション
        calibrate_adc(rft.awg_sa_cmd)
        # 波形シーケンス設定
        wave_seq_0 = set_wave_sequence(rft.awg_sa_cmd)
        # キャプチャシーケンス設定
        set_capture_sequence(rft.awg_sa_cmd, wave_seq_0)
        # 波形出力 & キャプチャスタート
        rft.awg_sa_cmd.start_wave_sequence()
        # 終了待ち
        wait_for_sequence_to_finish(rft.awg_sa_cmd)
        # エラーチェック
        check_skipped_step(rft.awg_sa_cmd)
        check_capture_data_fifo_oevrflow(rft.awg_sa_cmd)
        for ch in range(8):
            check_intr_flags(rft.command, ADC, ch)
        for ch in range(8):
            check_intr_flags(rft.command, DAC, ch)

        # キャプチャデータ取得
        iq_data_0 = rft.awg_sa_cmd.read_capture_data(awgsa.AwgId.AWG_0,
                                                     step_id=0)

        # キャプチャデータ出力
        num_frames = 3
        start_sample_idx = 0  # FFT 開始サンプルのインデックス
        fft_size = rft.awg_sa_cmd.get_fft_size()
        awg_id_to_iq_data = {awgsa.AwgId.AWG_0: iq_data_0}
        awg_id_to_wave_seq = {awgsa.AwgId.AWG_0: wave_seq_0}
        output_capture_data(awg_id_to_iq_data, awg_id_to_wave_seq, num_frames,
                            start_sample_idx, fft_size)

        # スペクトラム取得
        spectrum_0 = rft.awg_sa_cmd.get_spectrum(
            awgsa.AwgId.AWG_0,
            step_id=0,
            start_sample_idx=start_sample_idx,
            num_frames=num_frames,
            is_iq_data=True)

        # スペクトラム出力
        awg_id_to_spectrum = {awgsa.AwgId.AWG_0: spectrum_0}
        output_spectrum_data(awg_id_to_spectrum, num_frames, fft_size)

        # 送信波形をグラフ化
        rft.awg_sa_cmd.get_waveform_sequence(awgsa.AwgId.AWG_0).save_as_img(
            PLOT_DIR + "waveform/actual_seq_0_waveform.png")

    print("Done.")
    return
Beispiel #22
0
def main():
    wgen = wavegen.WaveGen(logger=logger)
    nu = ndarrayutil.NdarrayUtil

    print("Generate waveform data.")
    wgen.set_parameter(num_sample=DAC_SAMPLES,
                       dac_freq=DAC_FREQ,
                       carrier_freq=20.0,
                       amplitude=-30000.0)
    w_data = wgen.sinwave()

    w_size = len(w_data)  # for 16-bit signed integer
    r_size = ADC_SAMPLES * 2  # for 16-bit signed integer

    mac_comp_coeff = np.array(
        [-1, 0, 1], dtype="<i4")  # MAC result comparation coefficients
    mac_comp_coeff_b = nu.real_to_bytes_32(mac_comp_coeff)

    dac_trig_params = np.array(
        [0, DAC_SAMPLES / 8] * 16,
        dtype="<i4")  # start of word:0, num of word:DAC_SAMPLES/8
    dac_trig_params_b = nu.real_to_bytes_32(dac_trig_params)

    with client.RftoolClient(logger=logger) as rft:
        print("Connect to RFTOOL Server.")
        rft.connect(ZCU111_IP_ADDR)
        rft.command.TermMode(0)

        print("Configure Bitstream.")
        config_bitstream(rft.command, BITSTREAM)

        print("Setup ADC.")
        for tile in [0, 1, 2, 3]:
            for block in [0, 1]:
                rft.command.SetMixerSettings(0, tile, block, 0.0, 0.0, 2, 2, 0,
                                             3, 0)
                rft.command.ResetNCOPhase(0, tile, block)
                rft.command.UpdateEvent(0, tile, block, 1)
            rft.command.SetupFIFO(0, tile, 0)
            for block in [0, 1]:
                rft.command.SetDither(tile, block,
                                      1 if ADC_FREQ > 3000. else 0)
                rft.command.SetDecimationFactor(tile, block, 1)
            rft.command.SetFabClkOutDiv(0, tile, 2)
            for block in [0, 1]:
                rft.command.IntrClr(0, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(0, tile, 1)

        print("Setup DAC.")
        for tile in [0, 1]:
            for block in [0, 1, 2, 3]:
                rft.command.SetMixerSettings(1, tile, block, 0.0, 0.0, 2, 1,
                                             16, 4, 0)
                rft.command.ResetNCOPhase(1, tile, block)
                rft.command.UpdateEvent(1, tile, block, 1)
            rft.command.SetupFIFO(1, tile, 0)
            for block in [0, 1, 2, 3]:
                rft.command.SetInterpolationFactor(tile, block, 1)
            rft.command.SetFabClkOutDiv(1, tile, 1)
            for block in [0, 1, 2, 3]:
                rft.command.IntrClr(1, tile, block, 0xFFFFFFFF)
            rft.command.SetupFIFO(1, tile, 1)

        print("Clear BlockRAM.")
        rft.command.ClearBRAM()

        # Write waveform data to DAC channel 0, 1 (Tile 1 Block 2, 3) BRAM region
        for ch in [0, 1]:
            print("Send waveform data to Feedback system Ch.{} DAC BlockRAM".
                  format(ch))
            rft.if_data.WriteDataToMemory(1, ch, w_size, w_data)

        # Write MAC result comparation coefficients for ADC channel 0 I part, 0 Q part, 1 I part, 1 Q part
        for ch in [0, 1, 2, 3]:
            print(
                "Send waveform data to Feedback system Ch.{} MAC result comparation coefficients."
                .format(ch))
            rft.if_data.WriteDataToMemory(4, ch, len(mac_comp_coeff_b),
                                          mac_comp_coeff_b)

        print(
            "Send waveform data to Feedback system Ch.{} DAC trigger parameters."
            .format(0))
        rft.if_data.WriteDataToMemory(5, 0, len(dac_trig_params_b),
                                      dac_trig_params_b)
        print(
            "Send waveform data to Feedback system Ch.{} DAC trigger parameters."
            .format(1))
        rft.if_data.WriteDataToMemory(5, 1, len(dac_trig_params_b),
                                      dac_trig_params_b)

        print("Setting trigger information.")
        rft.command.SetTriggerInfo(
            0, 0x03, ADC_SAMPLES, 0
        )  # enable ADC channel 0(Tile 0 Block 0), channel 1(Tile 0 Block 1)
        # to trigger DAC channel 0(Tile 1 Block 2), channel 1(Tile 1 Block 3)
        rft.command.SetTriggerLatency(
            0, 66)  # ADC trigger latency (approx. 0.22us = 66/300MHz)
        rft.command.SetMACConfig(0x00,
                                 0xFF)  # all ADC channels is 16-bit format
        # force trigger all DACs regardless of MAC overrange
        rft.command.SetTriggerCycle(32768, 1)  # trigger 32768 times

        print("Start trigger.")
        rft.command.StartTrigger()

        wait_trig_done(rft.command)

        time.sleep(1.)

        print("Setting trigger information.")
        rft.command.SetTriggerCycle(3, 1)  # trigger 3 times

        print("Start trigger.")
        rft.command.StartTrigger()

        wait_trig_done(rft.command)

        # Read I(Real) data from ADC Tile 0 Block 0, 1 RAM region
        r_data = []
        for ch in [0, 2]:
            print(
                "Receive waveform data from Feedback system Ch.{} ADC capture BlockRAM"
                .format(ch))
            r_data.append(rft.if_data.ReadDataFromMemory(0, ch, r_size))

        print("Check interrupt flags.")
        for ch in range(8):  # ADC
            check_intr_flags(rft.command, 0, ch)
        for ch in range(8):  # DAC
            check_intr_flags(rft.command, 1, ch)

    print("Processing sample data.")
    print("- DAC sample data")
    w_sample = nu.bytes_to_real(w_data)
    del w_data
    print("- ADC sample data")
    r_sample = [nu.bytes_to_real(r_data[ch]) for ch in [0, 1]]
    del r_data

    print("Generating graph image.")
    os.makedirs(PLOT_DIR, exist_ok=True)

    print("- DAC waveform")
    plot_graph(
        DAC_FREQ, w_sample, "C0",
        "DAC waveform {} samples, {} Msps".format(DAC_SAMPLES,
                                                  DAC_FREQ), "bram_send.png")

    for ch in range(2):
        print("- ADC waveform Ch.{}".format(ch))
        plot_graph(
            ADC_FREQ, r_sample[ch], "C{}".format(ch + 1),
            "ADC waveform {} samples, {} Msps".format(ADC_SAMPLES, ADC_FREQ),
            "bram_recv_{}.png".format(ch))

    print("Done.")
    return