为了让上位机能够及时确认配置是否被载板接收、是否被系统实际应用,本次新增配置参数 UDP 反馈功能。该功能在配置更新完成后,自动将原始配置和当前应用配置封装成 UDP 数据包,通过原有 SFP/UDP 发送链路反馈给上位机。
该功能的意义是:
本功能的设计目标如下:
新增功能整体链路如下:
config_set / pga_config_set
|
| cfg_update_valid / raw_pga_cfg_valid
v
config_feedback_packet_gen
|
| 100MHz AXIS feedback packet
v
config_feedback_udp_transmit
|
| 156MHz UDP TX source
v
udp_tx_arb_mux
|
| arbitrated UDP TX stream
v
UDP_IP_MAC
|
v
SFP / Ethernet / 上位机
原工程中,采集数据发送链路为:
ad_data_blob_generator
|
v
blob_fifo_udp_transmit
|
v
UDP_IP_MAC
新增功能后,blob_fifo_udp_transmit 不再直接驱动 UDP_IP_MAC,而是作为一路 UDP 源接入仲裁模块:
blob_fifo_udp_transmit \
-> udp_tx_arb_mux -> UDP_IP_MAC
config_feedback_udp_transmit /
其中:
config_set / pga_config_set负责锁存配置信息,并将PS端和UDP传输的配置整合为统一端口输出。config_feedback_packet_gen负责处理反馈UDP包封装打包。config_feedback_udp_transmit 负责配置反馈 UDP 包。udp_tx_arb_mux 负责在两路 UDP 源之间进行选择。UDP_IP_MAC 继续负责 UDP/IP/MAC 封装和 SFP 发送。config_setconfig_set 是基础配置参数处理模块。
它负责接收 PS 端和 UDP 端输入的基础配置参数,包括:
sample_ratetotal_sample_numsample_point_nummodule0_mask 到 module4_masksample_coefjob_idstream_mode该模块输出两类配置:
raw_cfg_*:原始配置参数。active_cfg_*:当前应用配置参数。当基础配置完成合法更新后,模块输出:
cfg_update_valid
该信号用于触发基础配置反馈包生成。
pga_config_setpga_config_set 是 PGA 增益倍率配置处理模块。
它负责接收 UDP 或 PS 端输入的 PGA 配置信息,包括:
*_pga_cfg_srcpga_target_idpga_channel_countpga_gain0 到 pga_gain7该模块同样输出两类配置:
raw_pga_*:原始 PGA 配置。active_pga_*:当前应用 PGA 配置。其中,raw_pga_* 用于记录系统收到的 PGA 配置,active_pga_* 用于记录经过子卡合法性检查后实际应用的 PGA 配置。
当原始 PGA 配置完整接收并锁存后,模块输出:
raw_pga_cfg_valid
该信号用于触发 PGA 配置反馈包生成。
config_feedback_packet_genconfig_feedback_packet_gen 是配置反馈包组包模块,工作在 clk_100mhz 时钟域。
该模块接收:
get_config_reqget_pga_gain_reqraw_cfg_*active_cfg_*raw_pga_*active_pga_*subcard_maskworking_state当前顶层连接中:
get_config_req = cfg_update_valid
get_pga_gain_req = raw_pga_cfg_valid
该模块生成两类反馈包:
每个反馈包长度固定为 96 字节:
16 字节 Frame Header + 80 字节 Payload
模块内部将反馈包锁存为 12 个 64 位 word:
config_udp_packet[0:11]
pga_udp_packet[0:11]
| 偏移 | 字段 | 长度(字节) | 说明 |
|---|---|---|---|
| 0 | magic |
4 | 固定为 0x44444151 ,ASCII 为 DDAQ |
| 4 | version |
2 | 协议版本编号,当前版本为16'd1 |
| 6 | config_type |
1 | 参数类型,区分基础参数和PGA增益倍率参数 |
| 7 | payload_len |
4 | 负载长度 |
| 11 | reserved |
5 | 暂留 |
其中,包头里面,参数类型分为Send_Config = 8'd1,Send_PGA_Gain = 8'd2。
基础参数,首先传输原始配置参数,然后传输当前应用配置参数。另外,子卡其他相关信息同样通过该包传输。
| 偏移 | 字段 | 长度(字节) | 说明 |
|---|---|---|---|
| 0 | subcard_mask |
1 | 子卡掩码,实际为5位,仅使用该字节的末5位,从低位到高位分别表示对应子卡aurora连接情况 |
| 1 | working_state |
1 | 载板工作状态 |
| 2 | raw_cfg_src |
1 | 原始配置参数来源,8'd1表示CFG_SRC_UDP,通过上位机发送的配置;8'd2表示CFG_SRC_PS,通过PS端传输过来的配置 |
| 3 | reserved0 |
1 | 暂留 |
| 4 | raw_cfg_sample_rate |
4 | 原始采样率配置 |
| 8 | raw_cfg_total_sample_num |
4 | 原始总采样点数配置 |
| 12 | raw_cfg_sample_point_num |
4 | 原始Blob包采样点数量 |
| 16 | raw_cfg_module0_mask |
4 | 0号子卡32通道原始采样掩码配置 |
| 20 | raw_cfg_module1_mask |
4 | 1号子卡32通道原始采样掩码配置 |
| 24 | raw_cfg_module2_mask |
4 | 2号子卡32通道原始采样掩码配置 |
| 28 | raw_cfg_module3_mask |
4 | 3号子卡32通道原始采样掩码配置 |
| 32 | raw_cfg_module4_mask |
4 | 4号子卡32通道原始采样掩码配置 |
| 36 | raw_cfg_sample_coef |
1 | 原始降采样倍率配置 |
| 37 | raw_cfg_job_id |
1 | 原始任务编号配置 |
| 38 | raw_cfg_stream_mode |
1 | 原始工作模式配置 |
| 39 | reserved1 |
1 | 暂留,用于4字节对齐 |
| 40 | active_cfg_src |
1 | 当前应用配置参数来源,8'd1表示CFG_SRC_UDP,通过上位机发送的配置;8'd2表示CFG_SRC_PS,通过PS端传输过来的配置 |
| 41 | reserved2 |
3 | 暂留 |
| 44 | active_cfg_sample_rate |
4 | 当前应用采样率配置 |
| 48 | active_cfg_total_sample_num |
4 | 当前应用总采样点数配置 |
| 52 | active_cfg_sample_point_num |
4 | 当前应用Blob包采样点数量 |
| 56 | active_cfg_module0_mask |
4 | 0号子卡32通道当前应用采样掩码配置 |
| 60 | active_cfg_module1_mask |
4 | 1号子卡32通道当前应用采样掩码配置 |
| 64 | active_cfg_module2_mask |
4 | 2号子卡32通道当前应用采样掩码配置 |
| 68 | active_cfg_module3_mask |
4 | 3号子卡32通道当前应用采样掩码配置 |
| 72 | active_cfg_module4_mask |
4 | 4号子卡32通道当前应用采样掩码配置 |
| 76 | active_cfg_sample_coef |
1 | 当前应用降采样倍率配置 |
| 77 | active_cfg_job_id |
1 | 当前应用任务编号配置 |
| 78 | active_cfg_stream_mode |
1 | 当前应用工作模式配置 |
| 79 | reserved3 |
1 | 暂留,用于4字节对齐 |
| 偏移 | 字段 | 长度(字节) | 说明 |
|---|---|---|---|
| 0 | subcard_mask |
1 | 子卡掩码,实际为5位,仅使用该字节的末5位,从低位到高位分别表示对应子卡aurora连接情况 |
| 1 | working_state |
1 | 载板工作状态 |
| 2 | raw_cfg_src |
1 | 原始配置参数来源,8'd1表示CFG_SRC_UDP,通过上位机发送的配置;8'd2表示CFG_SRC_PS,通过PS端传输过来的配置 |
| 3 | reserved0 |
1 | 暂留 |
| 4 | raw_pga_target_id |
1 | 原始配置PGA增益倍率参数配置子卡编号 |
| 5 | raw_pga_channel_count |
1 | 原始配置PGA增益倍率通道数 |
| 6 | reserved1 |
2 | 暂留 |
| 8 | raw_pga_gain_0_7 |
8 | 原始通道0到7的PGA增益倍率配置 |
| 16 | raw_pga_gain_8_15 |
8 | 原始通道8到15的PGA增益倍率配置 |
| 24 | raw_pga_gain_16_23 |
8 | 原始通道16到23的PGA增益倍率配置 |
| 32 | raw_pga_gain_24_31 |
8 | 原始通道24到31的PGA增益倍率配置 |
| 40 | active_cfg_src |
1 | 当前应用配置参数来源,8'd1表示CFG_SRC_UDP,通过上位机发送的配置;8'd2表示CFG_SRC_PS,通过PS端传输过来的配置 |
| 41 | reserved2 |
3 | 暂留 |
| 44 | active_pga_target_id |
1 | 当前应用PGA增益倍率参数配置子卡编号 |
| 45 | active_pga_channel_count |
1 | 当前应用PGA增益倍率通道数 |
| 46 | reserved3 |
2 | 暂留,用于8字节对齐 |
| 48 | active_pga_gain_0_7 |
8 | 当前应用通道0到7的PGA增益倍率配置 |
| 56 | active_pga_gain_8_15 |
8 | 当前应用通道8到15的PGA增益倍率配置 |
| 64 | active_pga_gain_16_23 |
8 | 当前应用通道16到23的PGA增益倍率配置 |
| 72 | active_pga_gain_24_31 |
8 | 当前应用通道24到31的PGA增益倍率配置 |
当触发信号到来时,模块会将当前输入参数锁存进对应数组,避免发送过程中配置参数变化导致同一个 UDP 包内出现新旧参数混合。
该模块通过 AXIS 接口输出反馈包:
m_udp_payload_axis_tdata
m_udp_payload_axis_tkeep
m_udp_payload_axis_tvalid
m_udp_payload_axis_tready
m_udp_payload_axis_tlast
m_udp_payload_axis_tuser
同时输出:
m_udp_tx_en
m_udp_payload_len
其中 m_udp_tx_en 用于通知后级模块开始发送一个反馈 UDP 包。
config_feedback_udp_transmitconfig_feedback_udp_transmit 是配置反馈 UDP 跨时钟与发送接口整理模块。
它连接在:
config_feedback_packet_gen
↓
config_feedback_udp_transmit
之间。
该模块输入侧工作在 clk_100mhz,输出侧工作在 clk_156mhz。
输入侧接收 config_feedback_packet_gen 输出的 AXIS 数据流:
s_udp_payload_axis_*
s_udp_tx_en
模块内部使用 axis_async_fifo 完成跨时钟传输:
FRAME_FIFO = 1
也就是说,模块按 tlast 标记的一整个 AXIS frame 进行跨时钟缓存。
输出侧生成一组 UDP TX 源信号:
m_udp_hdr_valid
m_udp_hdr_ready
m_udp_payload_length
m_udp_payload_axis_*
这些信号工作在 clk_156mhz,后续接入 udp_tx_arb_mux。
模块状态机包括:
UDP_IDLE
UDP_SEND_HEADER
UDP_SEND_PAYLOAD
UDP_SEND_END
基本流程:
UDP_IDLE:等待 s_udp_tx_en 跨时钟同步后的触发。UDP_SEND_HEADER:拉高 m_udp_hdr_valid,等待后级 m_udp_hdr_ready。UDP_SEND_PAYLOAD:从异步 FIFO 读取 payload,并通过 AXIS 输出。UDP_SEND_END:一包发送完成,回到空闲状态。该模块不包含 ARP 状态机。ARP 或静态 MAC 相关逻辑由统一的 UDP_IP_MAC 发送链路负责。
udp_tx_arb_muxudp_tx_arb_mux 是 UDP 发送仲裁模块,工作在 clk_156mhz 时钟域。
它有两路输入:
feedback_udp_*,来自 config_feedback_udp_transmit。blob_udp_*,来自 blob_fifo_udp_transmit。它输出一路仲裁后的 UDP TX 信号:
tx_udp_*
连接到 UDP_IP_MAC。
目前仲裁策略为固定优先级,配置反馈包优先级高于采集数据包。
状态机包括:
ARB_IDLE
ARB_FEEDBACK
ARB_BLOB
逻辑如下:
ARB_IDLE 状态下,如果 feedback_udp_hdr_valid 为高,则选择配置反馈源。blob_udp_hdr_valid 为高,则选择采集数据源。tvalid && tready && tlast
hdr_ready 或 payload_axis_tready,因此不会弹出 FIFO 数据。这种设计保证了:
blob_fifo_udp_transmitblob_fifo_udp_transmit 是原工程已有的采集数据 UDP 发送模块。
本次修改后,它不再直接连接 UDP_IP_MAC,而是输出到 blob_tx_udp_* 信号,再接入 udp_tx_arb_mux。
其功能保持不变:
ad_data_blob_generator 输出的采集数据 AXIS。UDP_IP_MACUDP_IP_MAC 是原工程已有的 UDP/IP/MAC 发送与接收模块。
本次新增功能仍然复用该模块,不新增独立 MAC 或 UDP 发送通路。
新增功能后,UDP_IP_MAC 的发送输入来自:
udp_tx_arb_mux
而不是只来自 blob_fifo_udp_transmit。
本节记录 config_feedback_chain_tb 对配置参数 UDP 反馈链路的仿真测试结果。该仿真主要用于验证从配置参数更新、反馈包封装、跨时钟发送,到 UDP TX 仲裁输出的完整链路是否能够按照预期工作。
本次仿真测试的目标如下:
config_feedback_packet_gen 输出的 AXIS payload 能够被 config_feedback_udp_transmit 正确跨时钟缓存并输出。udp_tx_arb_mux 能够在配置反馈 UDP 源和采集数据 blob UDP 源之间正确仲裁。tx_udp_payload_axis_* 输出不会丢包、混包,且每个 UDP 包均以 tlast 正确结束。本次仿真重点检查以下信号和现象:
s_status_good_frame 和 m_status_good_frame:确认反馈包已经作为完整 AXIS frame 写入并跨时钟释放。s_status_overflow 和 m_status_overflow:确认 FIFO 深度调整后不再出现反馈包溢出。feedback_hdr_valid / feedback_hdr_ready:确认反馈 UDP 包头请求被下游接受。arb_state:确认仲裁器在反馈包发送时进入 1,在 blob 包发送时进入 2。tx_udp_payload_axis_tvalid / tx_udp_payload_axis_tready:确认最终 AXIS payload 正常握手。tx_udp_payload_axis_tlast:确认每个 UDP payload 都有且仅有一个结束标记。tx_udp_payload_axis_tdata / tx_udp_payload_axis_tkeep:确认反馈包和 blob 包在最终输出端能够区分,且 tkeep 在有效 payload 周期为 8'hff。仿真文件 config_feedback_chain_tb.v 中设置的主要激励如下:
2_000_000,总采样点数为 4096,blob 内采样点数为 1024,插入子卡 0、2、4 的通道掩码为 32'hffff_ffff,任务 ID 为 8'd1,降采样倍率为 8'd1,工作模式为单次采集模式。20_000_000,总采样点数为 4096,blob 内采样点数为 1024,5 块子卡掩码均配置为 32'hffff_ffff,任务 ID 为 8'd1,降采样倍率为 8'd1,工作模式为连续采集模式。32'h0101_0101。32'h0202_0202。start_blob_packet(16'd128),模拟一路采集数据 blob UDP 包进入仲裁器,用于验证反馈包和采集数据包共用 UDP TX 输出时的仲裁行为。因此,本次最终输出应包含 5 个 UDP payload frame:4 个配置反馈相关数据包,以及 1 个仿真注入的 blob 数据包。

图中展示了 udp_tx_arb_mux 输出侧以及 blob 输入侧的关键信号。截图对应的波形中,arb_state 按照数据源选择在 0、1、2 之间切换,其中:
arb_state = 0 表示仲裁器空闲。arb_state = 1 表示当前选中配置反馈 UDP 源。arb_state = 2 表示当前选中采集数据 blob UDP 源。可以看到,波形中 arb_state 多次进入 1,对应 4 次配置反馈包输出;同时出现一次 arb_state = 2,对应 testbench 中主动注入的 128 字节 blob 数据包。该 blob 包的输出数据带有 b10b_0000 前缀,与仿真激励中 blob_tdata <= {32'hb10b_0000, ...} 的构造方式一致,因此可以确认该包来自模拟采集数据源,而不是额外多发的配置反馈包。
结合波形可以确认以下结果:
tx_udp_payload_axis_tlast 共出现 5 次,和预期的 4 个配置反馈包加 1 个 blob 包一致。arb_state 为 1,说明 udp_tx_arb_mux 正确选择了反馈 UDP 源。arb_state 为 2,且 blob 输入侧 blob_udp_payload_axis_tvalid 与 blob_udp_payload_axis_tready 完成握手,说明仲裁器能够正常切换到采集数据源。tx_udp_payload_axis_tvalid 与 tx_udp_payload_axis_tready 能够完成握手,tx_udp_payload_axis_tkeep 为 8'hff,说明 payload 数据宽度有效。tx_udp_payload_axis_tlast 在每个数据帧末尾产生,说明输出 UDP payload frame 边界正确。arb_state 在一个 payload frame 结束前保持对应源选择,说明 udp_tx_arb_mux 没有发生混包。因此,本次仿真结果可以证明:配置参数 UDP 反馈链路能够完成反馈包生成、跨时钟缓存、UDP TX 接口整理以及与采集数据包的发送仲裁;在当前激励条件下,输出包数量、数据源选择和 AXIS 帧结束标记均符合预期,仿真测试通过。
本节记录配置参数 UDP 反馈功能在实机联调中的 ILA 抓取结果。实机测试分为两个项目:
本测试用于验证基础参数配置反馈链路,目标如下:
UDP_IP_MAC 的 tx_udp_payload_axis_* 输出满足 AXIS 时序要求。本测试由上位机通过 UDP 下发基础配置参数,主要配置如下:
1_000_00040961024132'hffff_ffff因此,raw 原始配置中 0 到 4 号子卡掩码均应保持 32'hffff_ffff;active 当前应用配置中,0、2、4 号子卡掩码应为 32'hffff_ffff,1、3 号子卡掩码应被清零为 32'h0000_0000。
基础配置反馈包长度固定为 96 字节,对应 12 个 64-bit AXIS beat。若下游 tx_udp_payload_axis_tready 持续为高,则 tx_udp_payload_axis_tvalid 应连续保持有效 12 个发送周期,tx_udp_payload_axis_tkeep 在有效周期内应为 8'hff,tx_udp_payload_axis_tlast 应只在最后一个 beat 拉高。
按照当前封包逻辑,本次配置对应的关键数据应包含:
raw_cfg_src = 8'd1,表示配置来源为 UDP。subcard_mask = 5'b10101,在 payload 中对应低 5 位为 5'h15。raw_cfg_sample_rate = 32'd1_000_000,封装后在 64-bit 输出中以字节序调整后的 40 42 0f 00 形式出现。ffff_ffff。module0/module2/module4 = ffff_ffff,module1/module3 = 0000_0000。
图中抓取的是最终送入 UDP_IP_MAC 的 tx_udp_payload_axis_* 信号。可以看到:
tx_udp_payload_axis_tvalid 在反馈包发送期间拉高。tx_udp_payload_axis_tready 同步为高,说明每个有效 beat 均完成 AXIS 握手。tx_udp_payload_axis_tkeep 在有效发送周期为 8'hff,说明每个 64-bit beat 的 8 个字节全部有效。tx_udp_payload_axis_tlast 在本次 payload 末尾产生单周期高电平,说明 96 字节 UDP payload 的帧边界正确。tx_udp_payload_axis_tdata 在有效区间连续输出 12 个 64-bit beat,其中可观察到字段与预期结果一致。结合本次测试条件,ILA 波形中反馈包的 AXIS 握手、tkeep、tlast 以及关键 tdata 字段均符合预期,说明实机下发基础配置后,载板能够正确输出配置反馈 UDP payload。
本测试用于验证 PGA 增益倍率配置反馈链路,目标如下:
raw_pga_gain* 和 active_pga_gain* 的输出内容符合当前 RTL 封包逻辑。UDP_IP_MAC 的 tx_udp_payload_axis_* 输出满足 AXIS 时序要求。测试前,载板子卡插入状态仍为:
subcard_mask = 5'b10101首先,对 0 号子卡下发一次合法 PGA 配置,使 active PGA 配置更新为 0 号子卡配置。该配置内容如下:
0.125,编码为 8'h000.5,编码为 8'h021,编码为 8'h032,编码为 8'h040.125,编码为 8'h00随后,对 1 号子卡下发一次 PGA 配置。由于 1 号子卡未插入,该配置只应更新 raw PGA 配置,不应覆盖 active PGA 配置。该配置内容如下:
0.125,编码为 8'h000.25,编码为 8'h010.5,编码为 8'h021,编码为 8'h032,编码为 8'h040.125,编码为 8'h00PGA 配置反馈包长度同样固定为 96 字节,对应 12 个 64-bit AXIS beat。若下游 tx_udp_payload_axis_tready 持续为高,则 tx_udp_payload_axis_tvalid 应连续保持有效 12 个发送周期,tx_udp_payload_axis_tkeep 在有效周期内应为 8'hff,tx_udp_payload_axis_tlast 应只在最后一个 beat 拉高。
第二次配置 1 号未插入子卡后,raw PGA 配置应记录本次配置:
raw_pga_target_id = 8'd1
raw_pga_channel_count = 8'd32
raw_pga_cfg_src = 8'd1
raw_pga_gain0 = 32'h00010203
raw_pga_gain1 = 32'h04000000
raw_pga_gain2~7 = 32'h00000000
active PGA 配置应保持上一次 0 号子卡合法配置:
active_pga_target_id = 8'd0
active_pga_channel_count = 8'd32
active_pga_cfg_src = 8'd1
active_pga_gain0 = 32'h00020304
active_pga_gain1~7 = 32'h00000000
因此,按当前 config_feedback_packet_gen 的 64-bit tdata 显示方式,关键 beat 预期如下:
beat2 = 64'h00002001_00010115
beat3 = 64'h04000000_00010203
beat7 = 64'h00002000_00000001
beat8 = 64'h00000000_00020304
其中,beat2 表示 raw PGA 配置元信息,beat7 表示 active PGA 配置元信息。beat7 = 64'h00002000_00000001 说明当前实际应用 PGA 配置仍然是 0 号子卡、32 通道、UDP 来源,符合 1 号子卡未插入时 active 配置不更新的预期。
需要注意,ILA 中 tx_udp_payload_axis_tdata[63:0] 按高位到低位显示,因此可看到类似 {raw_pga_gain1, raw_pga_gain0} 的显示形式。实际 UDP payload 的字节偏移仍应以 AXIS byte lane 发送顺序为准。

图中抓取的是最终送入 UDP_IP_MAC 的 tx_udp_payload_axis_* 信号。可以看到:
tx_udp_payload_axis_tvalid 在 PGA 反馈包发送期间拉高。tx_udp_payload_axis_tready 同步为高,说明每个有效 beat 均完成 AXIS 握手。tx_udp_payload_axis_tkeep 在有效发送周期为 8'hff,说明每个 64-bit beat 的 8 个字节全部有效。tx_udp_payload_axis_tlast 在本次 payload 末尾产生单周期高电平,说明 96 字节 UDP payload 的帧边界正确。tx_udp_payload_axis_tdata 中可观察到 beat7 = 64'h00002000_00000001,说明 active PGA 配置保持为此前 0 号子卡合法配置。结合本次测试条件,ILA 波形中 raw PGA 配置、active PGA 配置、AXIS 握手、tkeep 和 tlast 均符合预期,说明实机下发 PGA 增益倍率配置后,载板能够正确输出 PGA 配置反馈 UDP payload;同时,目标子卡未插入时,系统能够保持 active PGA 配置不被无效配置覆盖。
本次新增功能实现了配置参数状态自动 UDP 反馈的完整结构。
它能够在基础配置或 PGA 配置完成后,将系统当前记录的原始配置和当前应用配置封装成 UDP 数据包,并通过原有 UDP/SFP 发送链路反馈给上位机。
新增功能主要由以下模块组成:
config_feedback_packet_gen:配置反馈包组包。config_feedback_udp_transmit:反馈包跨时钟与 UDP TX 接口整理。udp_tx_arb_mux:配置反馈包与采集数据包的 UDP 发送仲裁。该功能与原有采集数据发送链路共用 UDP_IP_MAC,通过仲裁模块将两路数据输入合并为一路,并保证配置反馈包和采集数据包不会混包。
本文章使用limfx的vscode插件快速发布