AD9371 官方例程 NO-OS 主函数 headless 梳理(二)

AD9371 系列快速入口

AD9371+ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发

ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射

AD9371 官方例程 时钟间的关系与生成 : AD9371 官方例程HDL详解之JESD204B TX侧时钟生成(一)

JESD204B相关IP端口信号 : AD9371 官方例程HDL JESD204B相关IP端口信号

裸机程序配置 AD9528、AD9371、FPGA IP: AD9371 官方例程裸机SW 和 HDL配置概述(一)

裸机程序配置 AD9528、AD9371、FPGA IP: AD9371 官方例程裸机SW 和 HDL配置概述(二)

裸机程序配置 AD9528、AD9371、FPGA IP: AD9371 官方例程裸机SW 和 HDL配置概述(三)

I、Q 基带数据 JESD 传输层映射 :AD9371 Crossbar


后续重心会转移到算法上,本篇算 AD9371 系列的一个小结,前后也花费了近一个月时间,学习了JESD204B、GTH、ADI官方HDL和裸机驱动 等,还有一些内容用文字记录太麻烦,有时间再整理。

有所帮助的话,多多点赞、关注,感谢!

文章目录

  • 六、AD9371 初始化步骤
    • 6.11 使能 Rx 和 ORx 接收 SYSREF
    • 6.12 关闭 TX Deframer SYSREF 、复位 Deframer
    • 6.13 使能FPGA 中JESD TX 的物理层
    • 6.14 使能FPGA 中JESD TX 的链路层
    • 6.15 使能 AD9371 的Deframer 接收 SYSREF,并产生SYSREF脉冲
    • 6.16 使能FPGA 中 RX和RX_OS JESD的物理层和链路层
    • 6.17 请求SYSREF脉冲
    • 6.18 检查 AD9371的 Framer 和 Deframer 状态
    • 6.19 启用跟踪校准
    • 6.20 AD9371 进入 radio on 状态
    • 6.21 ObsRx 路径设置为 OBS_INTERNAL_CALS
    • 6.22 检查 FPGA RX和RX_OS 链路状态
    • 6.23 读取 JESD 状态 并 打印信息
    • 6.24 使能TX传输层,传输其产生的DDS数据
    • 6.25 使能RX和RX_OS传输层
  • 七、传输 DDS 数据
  • 八、传输 DMA 数据
  • 九、传输 自定义基带数据
    • 9.1 MATLAB
    • 9.2 FPGA 进行调制解调等基带信号处理


AD9371 官方例程 NO-OS 主函数 headless 梳理(一),DAC(TX) 对于FPGA 是 framer ,对于AD9371是 Deframer 。ADC时相反。

执行 MCS 时发送的 SYSREF 脉冲用于多个AD9371之间的多芯片同步,但由于 【6.4节执行 MCS】 代码运行时 AD9371 的 framers/deframers 还不能接收 SYSREF 信号 。并且 FPGA 中 JESD204B 的物理层 和 链路层等IP还未使能,不能工作,所以确定性延时这一步并未完成,还需要 SYSREF 脉冲来复位同步 AD9371和FPGA链路层中的LMFC,以保证确定性延迟。

六、AD9371 初始化步骤

6.11 使能 Rx 和 ORx 接收 SYSREF

Rx和ORx Framer 忽略 SYSREF (enable = 0),令enable = 1,允许设备外部的SYSREF(AD9528)到达 Rx 和 ORx framer 中的SYSREF输入端口,等待 SYSREF,以便开始从 AD9371的 Rx和ORx Framer 传输 CGS (K码)

	MYKONOS_enableSysrefToRxFramer(&mykDevice,1)
	MYKONOS_enableSysrefToObsRxFramer(&mykDevice,1)

6.12 关闭 TX Deframer SYSREF 、复位 Deframer

对 Deframer 复位 ,来清除之前检测到的 disparity bit 错误。并且如果FPGA内部的SERDES锁相环复位,则可能导致lane fifo 上溢/下溢,也需要复位 Deframer

	MYKONOS_enableSysrefToDeframer(&mykDevice,0)		
	MYKONOS_resetDeframer(&mykDevice)		

6.13 使能FPGA 中JESD TX 的物理层

adxcvr_write(xcvr, ADXCVR_REG_RESETN, 1),解除 JESD 物理层 ip 复位信号,使其逻辑工作,up_resetn 为1后,等几个时钟后,up_pll_rst 变为 0,其连接QPLL,QPLL0RESET (up_qpll_rst), 0 复位失效,使物理层QPLL 工作 ,RX 类似,CPLLPD (up_cpll_rst), adxcvr_clk_enable(rx_adxcvr) CPLL解除复位

    if (up_rstn == 0) begin
      up_resetn <= 'd0;
    end else begin
      if ((up_wreq == 1'b1) && (up_waddr == 10'h004)) begin
        up_resetn <= up_wdata[0];
      end
    adxcvr_clk_enable(tx_adxcvr);

6.14 使能FPGA 中JESD TX 的链路层

axi_jesd204_tx_write(jesd, JESD204_TX_REG_LINK_DISABLE, 0x0),解除链路层复位信号 ,up_reset_core 为 0 后,解除 core_reset_all 复位信号,进而 core_reset 变为0,解除 链路层主逻辑 axi_ad9371_tx_jesd/tx IP 的复位信号,JESD 链路层主逻辑开始工作,现在 FPGA 中的 JESD 链路层和物理层已经开始工作,链路中的 serializer 可以输出 K 字符(CGS)

    12'h030: up_reset_core <= up_wdata[0];

    core_reset_vector <= {1'b0,core_reset_vector[4:1]};
   
    core_reset = core_reset_vector[0];
    axi_jesd204_tx_lane_clk_enable(tx_jesd);

6.15 使能 AD9371 的Deframer 接收 SYSREF,并产生SYSREF脉冲

允许设备外部的SYSREF(AD9528)到达 AD9371 的 TX Deframer 中的SYSREF输入端口,等待 SYSREF脉冲,完成 [ AD9371 的 Deframer 和 FPGA 中TX链路层 ] 各自的LMFC 同步复位,保证 DAC 链路的 确定性延迟

同时 AD9371 的 Rx和ORx Framer 开始传输 K 字符(CGS )

    MYKONOS_enableSysrefToDeframer(&mykDevice,1)

	AD9528_requestSysref(clockAD9528_device, 1);
	no_os_mdelay(1);

6.16 使能FPGA 中 RX和RX_OS JESD的物理层和链路层

同TX,使能 FPGA中RX和RX_OS 链路层和物理层的 主逻辑,使其工作,但对链路层而言,由于还没有接收到 SYSREF 脉冲 ,链路将保持在CGS状态。

	adxcvr_clk_enable(rx_adxcvr);
	axi_jesd204_rx_lane_clk_enable(rx_jesd);

	adxcvr_clk_enable(rx_os_adxcvr);
	axi_jesd204_rx_lane_clk_enable(rx_os_jesd);

6.17 请求SYSREF脉冲

请求SYSREF脉冲,完成 [ AD9371 RX和RX_OS framer 和 FPGA 中RX和RX_OS 链路层 ] 各自的LMFC 同步复位,保证 ADC 链路的 确定性延迟

	AD9528_requestSysref(clockAD9528_device, 1);
	no_os_mdelay(1);
	AD9528_requestSysref(clockAD9528_device, 1);
	no_os_mdelay(5);

这时 [ AD9371 的 Deframer 和 FPGA 中TX链路层 ] 各自的LMFC 在之前的 SYSREF 脉冲已经完成同步复位新请求的 这两次 SYSREF脉冲是否会影响 之前已经同步好的 LMFC ?

不会影响 , 后续AD9528产生的 SYSREF 和 LMFC 是对齐的,不会在 LMFC 计数中间 抓到 sysref_edge ,导致其LMFC 计数清零,新的 SYSREF脉冲 对同步好的 LMFC没有影响。

下面对AD9528做些测试

sysref_edge:抓取到的 SYSREF 上升沿
lmfc_clk:抓到第一次 SYSREF 后产生的 lmfc 时钟
lmfc_edge:抓到第一次 SYSREF 后产生的 lmfc 边沿
sysref_alignment_error: lmfc 计数器和 sysref_edge 对齐错误标志,当LMFC和SYSREF频率是整数倍关系时,必然不会拉高

    if (sysref_edge == 1'b1 && lmfc_active == 1'b1 &&
        lmfc_counter_next != cfg_lmfc_offset) begin
      sysref_alignment_error <= 1'b1;
    end

使能后第一次请求 SYSREF脉冲
在这里插入图片描述

随机请求一次 SYSREF脉冲

在这里插入图片描述
随机请求多次 SYSREF脉冲
在这里插入图片描述

sysref_alignment_error都没有拉高,同时经过 验证 AD9528 后续产生的 SYSREF脉冲 和 LMFC 频率满足整数倍关系

6.18 检查 AD9371的 Framer 和 Deframer 状态

	MYKONOS_readRxFramerStatus(&mykDevice,&framerStatus)
	MYKONOS_readOrxFramerStatus(&mykDevice,&obsFramerStatus)
	MYKONOS_readDeframerStatus(&mykDevice,&deframerStatus)

6.19 启用跟踪校准

选择在 radioOn 状态期间使用哪些跟踪校准,必须在 radioOff 状态下设置

 * enableMask  |  Bit description
 *        [0]  | TRACK_RX1_QEC
 *        [1]  | TRACK_RX2_QEC
 *        [2]  | TRACK_ORX1_QEC
 *        [3]  | TRACK_ORX2_QEC
 *        [4]  | TRACK_TX1_LOL
 *        [5]  | TRACK_TX2_LOL
 *        [6]  | TRACK_TX1_QEC
 *        [7]  | TRACK_TX2_QEC
 *        [8]  | TRACK_TX1_DPD
 *        [9]  | TRACK_TX2_DPD
 *       [10]  | TRACK_TX1_CLGC
 *       [11]  | TRACK_TX2_CLGC
 *       [12]  | TRACK_TX1_VSWR
 *       [13]  | TRACK_TX2_VSWR
 *       [16]  | TRACK_ORX1_QEC_SNLO
 *       [17]  | TRACK_ORX2_QEC_SNLO
 *       [18]  | TRACK_SRX_QEC

	uint32_t trackingCalMask = TRACK_ORX1_QEC | TRACK_ORX2_QEC | TRACK_RX1_QEC |
				   TRACK_RX2_QEC | TRACK_TX1_QEC | TRACK_TX2_QEC;
				   
    MYKONOS_enableTrackingCals(&mykDevice,trackingCalMask)

6.20 AD9371 进入 radio on 状态

AD9371 转入 radio on 状态,使能的(之前配置的使能链路) Rx和Tx信号链 将上电,并且开始之前设置的跟踪校准,要退出 radio on 状态回到低功耗,可以使用 MYKONOS_radioOff() 函数。

    MYKONOS_radioOn(&mykDevice)

6.21 ObsRx 路径设置为 OBS_INTERNAL_CALS

Tx校准只有在 radioOn状态 ,并且 obsRx 路径设置为OBS_INTERNAL_CALS时,才能运行。通过下面函数在 radioOn 状态下启动或关闭Obs Rx信号链,先关闭当前 obsRx 路径,再更改到所需的 obsRx 路径

  	MYKONOS_setObsRxPathSource(&mykDevice,OBS_RXOFF)
	MYKONOS_setObsRxPathSource(&mykDevice,OBS_INTERNALCALS)

6.22 检查 FPGA RX和RX_OS 链路状态

CGS 顺利完成后,jesd204_rx_ctrl 控制其状态机进入 STATE_SYNCHRONIZED 状态 ,根据物理层GTH的接收通道提供的RXCTRL1 和3, (RXCTRL1 ( rx_disperr) 表示对应的接收字节有 disparity error),(RXCTRL3 (rx_not in table),表示对应接收字节 不是8B/10B 表里的有效字节),通过逻辑 ( phy_notintable | phy_disperr ) 确定当前接收有无发生错误,如果所有LANE 都发生错误,或着累积到设定的一定数目错误,jesd204_rx_cgs 控制其转到 CGS_STATE_INIT 状态

axi_jesd204_rx_watchdog 检查 RX 和 RX_OS 链路状态,如果 jesd204_rx_ctrl 在 STATE_SYNCHRONIZED 状态,而 jesd204_rx_cgs 在 CGS_STATE_INIT 状态,说明接收数据出现严重错误,控制链路进入 restart

	axi_jesd204_rx_watchdog(rx_jesd);
	axi_jesd204_rx_watchdog(rx_os_jesd);

6.23 读取 JESD 状态 并 打印信息

	axi_jesd204_rx_status_read(rx_jesd);
	for (i = 0; i < rx_jesd->num_lanes; i++)
		axi_jesd204_rx_laneinfo_read(rx_jesd, i);
	axi_jesd204_tx_status_read(tx_jesd);
	axi_jesd204_rx_status_read(rx_os_jesd);
	for (i = 0; i < rx_os_jesd->num_lanes; i++)
		axi_jesd204_rx_laneinfo_read(rx_os_jesd, i);

6.24 使能TX传输层,传输其产生的DDS数据

	axi_dac_init(&tx_dac, &tx_dac_init);

通过 函数 axi_dac_write(dac, AXI_DAC_REG_RSTN,AXI_DAC_MMCM_RSTN | AXI_DAC_RSTN) 使 up_resetn由0变成 1 ,进而 up_core_preset 1 变 0,up_core_preset 传递给 dac_rst (高电平复位),使FPGA中的JESD传输层 部分逻辑使能,退出复位状态 。mmcm_rst 信号暂未使用

axi_dac_init_finish(dac)获取DAC 时钟。DAC CLK = ratio * LINK CLK(传输层时钟)。2T2R,DAC 速率和传输层时钟比值 = 32 * L / M / NP = 2; 后续通过 axi_dac_read(dac, AXI_DAC_REG_CLK_RATIO, &ratio) 获得比值

先得到传输层时钟速率,通过 100M 时钟基准计数 2^16,得到用传输层时钟计数的 freq 值,
LINK clock_hz = freq * 100M / 2^16 = freq *390625/ 2^8 = freq * 1525.8789,dac->clock_hz = LINK clock_hz *ratio

传输层时钟频率 freq 基于100Mhz axi_clk测量,有一定的抖动,得到的DAC 时钟 会有一些误差,只是为了调试目的。

设置DDS 频率 相位等参数,并选择 传输层组帧的数据源,比如 DDS DMA 等数据来源,例程中先默认选择的0,DDS

enum axi_dac_data_sel {
	AXI_DAC_DATA_SEL_DDS,
	AXI_DAC_DATA_SEL_SED,
	AXI_DAC_DATA_SEL_DMA,
	AXI_DAC_DATA_SEL_ZERO,
	AXI_DAC_DATA_SEL_PN7,
	AXI_DAC_DATA_SEL_PN15,
	AXI_DAC_DATA_SEL_PN23,
	AXI_DAC_DATA_SEL_PN31,
	AXI_DAC_DATA_SEL_LB,
	AXI_DAC_DATA_SEL_PNXX,
};
      axi_dac_write(dac, AXI_DAC_REG_DATA_SELECT((i*2)+0), 0);
      
      4'h7: dac_data <= pn15_data;
      4'h6: dac_data <= pn7_data;
      4'h5: dac_data <= ~pn15_data;
      4'h4: dac_data <= ~pn7_data;
      4'h3: dac_data <= 'h00;
      4'h2: dac_data <= dac_dma_data_s;
      4'h1: dac_data <= dac_pat_data_s;
      default: dac_data <= dac_dds_data_s;

函数 axi_dac_write(dac, AXI_DAC_REG_SYNC_CONTROL, AXI_DAC_SYNC) 会将传输层主逻辑 复位几个时钟 ,再开始工作

6.25 使能RX和RX_OS传输层

大部分和TX操作类似,使能 RX_OS 传输层之前,把ObsRx 路径切换到 OBS_RX1_SNIFFERLO

adc_enable 设为 1 , Channel使能标志,给后续 JESD204B 应用层使用。

adc_dfmt_se,adc_dfmt_enable置 1 ,用来把RX和RX_OS链路解帧后的数据通过逻辑< ad_datafmt >转换数据格式,当设置的RX传输层IP参数 CONVERTER_RESOLUTION < BITS_PER_SAMPLE 时,且adc_dfmt_enable 和 adc_dfmt_se(dfmt_sign_extend)为1, 会进行有符号扩展。

dfmt_type 0(补码),解帧数据最高位不变,dfmt_type 1(offset binary),解帧数据最高位取反

	axi_adc_init(&rx_adc, &rx_adc_init);
	
	MYKONOS_setObsRxPathSource(&mykDevice,OBS_RX1_SNIFFERLO)
	axi_adc_init(&rx_obs_adc, &rx_obs_adc_init);
	----------------------------------------------------
    axi_adc_write(adc, AXI_ADC_REG_CHAN_CNTRL(ch), AXI_ADC_FORMAT_SIGNEXT | AXI_ADC_FORMAT_ENABLE | AXI_ADC_ENABLE);
    
    up_adc_enable <= up_wdata[0];
    up_adc_dfmt_se <= up_wdata[6];
    up_adc_dfmt_enable <= up_wdata[4];

在这里插入图片描述

七、传输 DDS 数据

官方例程默认关闭 #define DMA_EXAMPLE,TX 传输层 使用其产生的DDS 信号,可以设置 DDS信号的 频率 相位 幅度,运行主函数,用 ILA 连接在 RX 传输层 IP核的输出,可以正确接收到正弦波
在这里插入图片描述

    axi_dac_data_setup(dac);
    ------------------------------------------------------
	axi_dac_dds_set_frequency(dac, ((i*2)+0), 3*1000*1000);
	axi_dac_dds_set_frequency(dac, ((i*2)+1), 3*1000*1000);
	axi_dac_dds_set_phase(dac, ((i*2)+0), (i % 2) ? 0 : 90000);
	axi_dac_dds_set_phase(dac, ((i*2)+1), (i % 2) ? 0 : 90000);
	axi_dac_dds_set_scale(dac, ((i*2)+0), 50*1000);
	axi_dac_dds_set_scale(dac, ((i*2)+1), 50*1000);
	
	// 设置TX传输层数据来源选择DDS
	axi_dac_write(dac, AXI_DAC_REG_DATA_SELECT((i*2)+0), 0);
	axi_dac_write(dac, AXI_DAC_REG_DATA_SELECT((i*2)+1), 0);
    --------------------------------------------------------
      4'h7: dac_data <= pn15_data;
      4'h6: dac_data <= pn7_data;
      4'h5: dac_data <= ~pn15_data;
      4'h4: dac_data <= ~pn7_data;
      4'h3: dac_data <= 'h00;
      4'h2: dac_data <= dac_dma_data_s;
      4'h1: dac_data <= dac_pat_data_s;
      default: dac_data <= dac_dds_data_s;

八、传输 DMA 数据

TX传输层数据来源也可以选择 DMA(2),官方例程没有使用基带调制,而是先把正弦波形数据(补码)存储到DDR,通过DMA把DDR中的数据搬移到FPGA的FIFO中,经过处理(主要是把当前数据变成传输层要求的数据格式,【插值和抽取IP tx_fir_interpolator和rx_fir_decimator并未使用】),送给JESD 204b 传输层 ,最终通过AD9371 板卡射频。

AD9371 板卡采集到的ADC数据,传到 RX 传输层后,经过打包、跨时钟域,通过DMA写入到DDR内存中 。

axi_dac_load_custom_data()先把正弦补码数据写到 DCache,Xil_DCacheFlush 将数据冲到DDR
axi_dac_write(dac,AXI_DAC_REG_DATA_SELECT((chan*2)+0), 0x2) 传输层数据源选择DMA搬运的数据

DCache 用法在AD9361 中也类似,可以参考AD9361 官方例程详解(二) 第五节

	axi_dac_load_custom_data(tx_dac, sine_lut_iq_x8, NO_OS_ARRAY_SIZE(sine_lut_iq_x8), (uintptr_t)dac_buffer);
	------------------------------------------------------------
	axi_dac_write(dac, AXI_DAC_REG_DATA_SELECT((chan*2)+0), 0x2);  // 106 126 146
	axi_dac_write(dac, AXI_DAC_REG_DATA_SELECT((chan*2)+1), 0x2); 

    Xil_DCacheFlush();

axi_dmac_init 初始化 DMA ip核的 cyclic、burst size、direction等,其中axi_dmac_detect_caps 驱动函数 通过下面的函数axi_dmac_write(dmac,AXI_DMAC_REG_DEST_ADDRESS, 0xffffffff);
axi_dmac_read(dmac, AXI_DMAC_REG_DEST_ADDRESS, &dest_mem_mapped)
并配合 FPGA rx_dma 和 tx_dma IP中的相应逻辑,即根据 IP核 配置的 Source Type和Destination Type ,TX和RX 读回的 dest_mem_mapped 和 src_mem_mapped 值不同,驱动函数进而配置DMA方向。

对于TX ,驱动函数会配置为 DMA_MEM_TO_DEV 方向,后续传输需要有源地址。对于RX,驱动函数会配置为 DMA_DEV_TO_MEM,后续传输需要有目的地址。

    axi_dmac_init(&tx_dmac, &tx_dmac_init);
    ----------------------------------------------
    	axi_dmac_write(dmac, AXI_DMAC_REG_DEST_ADDRESS, 0xffffffff);
		axi_dmac_read(dmac, AXI_DMAC_REG_DEST_ADDRESS, &dest_mem_mapped);
		axi_dmac_write(dmac, AXI_DMAC_REG_SRC_ADDRESS, 0xffffffff);
		axi_dmac_read(dmac, AXI_DMAC_REG_SRC_ADDRESS, &src_mem_mapped);
		if (dest_mem_mapped && !src_mem_mapped) {
			dmac->direction = DMA_DEV_TO_MEM;
			} else if (!dest_mem_mapped && src_mem_mapped) {
			dmac->direction = DMA_MEM_TO_DEV;
			} else if (dest_mem_mapped && src_mem_mapped) {
			dmac->direction = DMA_MEM_TO_MEM;

在这里插入图片描述
在这里插入图片描述
启动传输,并把dac_buffer 指向的地址数据从DDR中拉到Cache中来,也就是之前更新到DDR的正弦补码数据再读回Cache

	axi_dmac_transfer_start(tx_dmac, &transfer);
	Xil_DCacheInvalidateRange((uintptr_t)dac_buffer, sizeof(sine_lut_iq_x8));

RX和RX_OS类似,先初始化DMA ip,启动DMA搬移数据,等待DMA把特定数量的接收数据都搬移到DDR的指定范围,搬移完成后,把存到DDR指定地址的接收数据拉到Cache中来

	axi_dmac_init(&rx_dmac, &rx_dmac_init);
	axi_dmac_init(&rx_obs_dmac, &rx_obs_dmac_init);
	axi_dmac_transfer_start(rx_dmac, &read_transfer);
	axi_dmac_transfer_wait_completion(rx_dmac, 500);
	Xil_DCacheInvalidateRange((uintptr_t)adc_buffer, sizeof(adc_buffer));

把接收数据拉到Cache中后,可以添加下列代码,把接收数据打印到串口,在 Matlab 中观察接收信号的时域和频域,可以参考AD9361 官方例程详解(二) 第六节,分析接收数据。

具体 I 路数据在高16位,还是低16位,还未验证,参考 AD9371 官方例程之 tx_jesd 与 xcvr接口映射AD9371 Crossbar

		uint16_t index;
	    uint32_t data_1,data_2;
	    uint16_t Q1,I1,Q2,I2;

	    for(index =0; index < 8192; index += 1)
	    {
	    	// RX1
	    	data_1 =Xil_In32(adc_buffer+ index*(4));
	    	// RX2
	    	data_2 =Xil_In32(adc_buffer+2+ index*(4));

	    	I1 = (data_1) & 0xFFFF;
	    	Q1 = (data_1 >> 16) & 0xFFFF;

	    	I2 = (data_2) & 0xFFFF;
	    	Q2 = (data_2 >> 16) & 0xFFFF;
	    	printf("%d,%d\n",(signed short)I1,(signed short)Q1);
	    //	printf("%d,%d\n",(signed short)I2,(signed short)Q2);
	    }

九、传输 自定义基带数据

可以有几种基于官方例程的开发方式,以使用 AD9371 在 300 MHz至6000 MHz 进行算法验证

9.1 MATLAB

用MATLAB等 对特定算法仿真,产生基带补码数据,通过网口等把基带数据传给ZYNQ的DDR,通过DMA搬移到FIFO,按JESD204B 传输层要求数据排布格式传给AD9371,和当前官方例程基本一致。

9.2 FPGA 进行调制解调等基带信号处理

可以在FPGA中对数据做 特定的基带调制,如 OFDM、MSK、ASK、DSSS等等,由于ZCU106有视频编解码的硬核资源,还能进行 4KP60 的 H.264/H.265 视频编解码。在FPGA中完成基带信号处理后,再通过JESD204B 传输层 提供/接收 AD9371数据,进行射频收发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/123806.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows11使用docker部署安装minio

时间 2023-11-08 windows11使用docker部署安装minio 目录 1.docker 下载镜像2.docker安装镜像3.访问控制台4.安装问题解决5.使用教程 1.docker 下载镜像 调整镜像源到国内&#xff0c;否则会很慢 docker pull minio/minio2.docker安装镜像 设置用户名和密码时需要注意&…

开源:特殊的垄断

免责声明&#xff1a;本博客旨在分享我对开源策略的理解和体会&#xff0c;不代表任何组织或机构的立场或观点&#xff0c;也不构成任何商业或投资的建议或担保。本博客的内容可能存在错误或遗漏&#xff0c;也可能随着时间的推移而变得过时或不适用。请在使用或依赖本博客的内…

MySQL的表格去重,史上最简便的算法,一看就会

首先&#xff0c;表格my_tab02存在很多重复的数据&#xff1a; #表格的去重 方法一&#xff1a; 详细内容传送门&#xff1a;表格的去重 -- 思路&#xff1a; -- 1.先创建一张临时表 my_tmp,该表的结构和my_tab02一样 -- 2.把my_tmp的记录通过distinct关键字 处理后 把记录复…

基于单片机GP2D12测距-proteus仿真-源程序

基于51单片机红外测距-proteus仿真-源程序 一、系统方案 本设计采用51单片机作为主控器&#xff0c;液晶1602显示&#xff0c;GP2D12采集距离值&#xff0c;按键设置报警阀值&#xff0c;测量值超过阀值&#xff0c;蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单…

flutter笔记:骨架化加载器

flutter笔记 骨架化加载器 - 文章信息 - Author: Jack Lee (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/134224135 【介绍】&#xff1a;本文介…

21 移动网络的前世今生

1、移动网络的发展历程 发展过程就是&#xff1a;2G,3G,4G,5G的过程&#xff0c;用2G看txt&#xff0c;用3G看jpg&#xff0c;用4G看avi。 2、2G网络 手机本来是用来打电话的&#xff0c;不是用来上网的&#xff0c;所以原来在2G时代&#xff0c;上网使用的不是IP网络&#…

「Verilog学习笔记」多功能数据处理器

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 注意题目要求输入信号为有符号数&#xff0c;另外输出信号可能是输入信号的和&#xff0c;所以需要拓展一位&#xff0c;防止溢出。 timescale 1ns/1ns module data_…

【C语言】数据结构——无头单链表实例探究

&#x1f497;个人主页&#x1f497; ⭐个人专栏——数据结构学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读&#xff1a;1. 单链表1.1 什么是单链表1.2 优缺点 2. 实现单链表基本功能2.1 定义结构体2.2 单链表打印2.3 销毁单链…

nav2 调节纯追踪算法

纯追踪算法 纯追踪基础 The core idea is to find a point on the path in front of the robot and find the linear and angular velocity to help drive towards it. 核心思想是在机器人前方的路径上找到一个点&#xff0c;并找到一个合适的线速度和角速度&#xff0c;以驱…

深入理解JVM虚拟机第二十二篇:详解JVM当中与操作数栈相关的字节码指令

大神链接&#xff1a;作者有幸结识技术大神孙哥为好友&#xff0c;获益匪浅。现在把孙哥视频分享给大家。 孙哥链接&#xff1a;孙哥个人主页 作者简介&#xff1a;一个颜值99分&#xff0c;只比孙哥差一点的程序员 本专栏简介&#xff1a;话不多说&#xff0c;让我们一起干翻J…

【无代码】【VR开发】【Unity】【VRTK】4-导入VRTK Tilia Package

【导入VRTK V4】 VRTK的Tilia Package包含了一整套空间开发方案。导入后你可以在PackageManager中看到它们。 所有的Tilia包都可以在如下页面找到: https://www.vrtk.io/tilia.html Tilia包有一个安装器,可以让你仅仅安装需要的包。包的种类很多,按照适用方向分类。 点击H…

C++ 之多态(一)

什么是虚函数 在类的定义中&#xff0c;前面有 virtual 关键字的成员函数称为虚函数&#xff1b;virtual 关键字只用在类定义里的函数声明中&#xff0c;写函数体时不用。 class Base {virtual int Fun() ; // 虚函数 };int Base::Fun() // virtual 字段不用在函数体时定义 …

react 实现chatGPT的打印机效果 兼容富文本,附git地址

1、方式一 &#xff1a;使用插件 typed.js typed.js 网站地址&#xff0c;点我打开 1.1、核心代码如下&#xff1a; //TypeWriteEffect/index.tsx 组件 import React, { useEffect, useRef } from react; import Typed from typed.js; import { PropsType } from ./index.d;…

t2017递推3骨牌

答案&#xff1a; #include<iostream> using namespace std; long long n,s[10009]; int main() {cin>>n;s[1]1,s[2]2,s[3]4;if(n1){cout<<1;return 0;}if(n2){cout<<2;return 0;}if(n3){cout<<4;return 0;}for(int i4;i<n;i)s[i]s[i-1]s[i…

什么是观察者模式?用 Python 如何实现 Observer(观察者或发布订阅)对象行为型模式?

什么是观察者模式&#xff1f; 观察者模式&#xff08;Observer pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象之间建立一种一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;其相关依赖对象都会得到通知并自动更新。 在观察者模式中&am…

【服务发现与配置】Consul特性及搭建

文章目录 一、前言二、概念2.1、什么是Consul&#xff1f;2.2、Consul具有哪些特点?2.3、Consul 架构图2.4、Consul的使用场景 三、安装3.1. 下载3.2. 解压3.3. 拷贝到usr目录下3.4. 查看 安装是否成功3.5. 启动 四、Consul 开机自启动4.1. 路径/usr/lib/systemd/system/&…

【Qt之QMetaType】使用

介绍 QMetaType类管理元对象系统中的命名类型。 该类用作QVariant和排队的信号与槽连接中类型的编组辅助器。它将类型名称与类型关联起来&#xff0c;以便可以在运行时动态创建和销毁它。使用Q_DECLARE_METATYPE()声明新类型&#xff0c;以使它们可供QVariant和其他基于模板的…

三菱FX3U系列—原点回归指令

目录 一、简介 二、指令形式 1、原点指令[ZRN/DZRN] 2、带搜索的原点回归指令[DSZR] 三、回归指令运行过程 1、ZRN原点回归运行过程 2、带搜索的原点回归运行过程 四、特殊辅助继电器 五、特殊输出模块 六、总结 一、简介 用于将电机或伺服驱动器控制的轴回到预定的原…

浙江大学漏洞报送证书

获取来源&#xff1a;edusrc&#xff08;教育漏洞报告平台&#xff09; url&#xff1a;主页 | 教育漏洞报告平台 兑换价格&#xff1a;20金币 获取条件&#xff1a;提交浙江大学任意中危或以上级别漏洞