本功能用于支持载板 UDP 通讯地址的运行时配置,减少因更换上位机或载板地址变化而重新生成 bit 文件的需求。
设计目标主要包括:
raw 和当前实际应用配置 active,便于上位机确认配置是否被接收和应用。本次功能在原有 UDP 收发链路基础上,新增和修改了以下模块,用于完成网络地址配置 UDP 包的识别、解析和后续地址管理。
UDP_IP_MAC 是原有 UDP/IP/MAC 封装与解析模块。本次修改主要增加了动态网络地址配置接口,使模块不再只能使用固件中写死的源地址和目的地址。
新增的动态地址输入主要包括:
cfg_net_addr_validcfg_src_maccfg_src_ipcfg_src_portcfg_dst_maccfg_dst_ipcfg_dst_port其中 cfg_src_* 表示载板本机地址,cfg_dst_* 表示上位机目标地址。后续这些信号将由 addr_config_gen 输出,用来动态控制 UDP 包发送时使用的源地址和目的地址。
同时,UDP_IP_MAC 也需要向外输出接收到的 UDP 包真实来源地址,例如源 MAC、源 IP 和源 UDP 端口。该信息用于 DISCOVER 指令中载板学习上位机地址。
udp_rx_dispatcher 用于接收 UDP_IP_MAC 输出的 UDP payload AXIS 数据,并根据 DDAQ 公共包头中的 cmd_id 对 UDP 包进行分流。
该模块会按照 udp_config_driver 中一致的方式对 AXIS 数据进行字节序整理,然后解析公共包头,判断当前 UDP 包属于哪一类指令:
udp_config_drivernet_addr_config_recv通过这个模块,原有系统配置指令和新增网络地址配置指令可以共用同一条 UDP 接收链路。
net_addr_config_recv 用于解析网络地址配置相关 UDP 指令。该模块接收 udp_rx_dispatcher 分流后的 AXIS 数据和 UDP 包来源信息,解析出具体的网络地址配置参数。
目前支持解析 5 类网络地址配置指令:
DISCOVERGET_NET_INFOSET_HOST_ADDRSET_BOARD_ADDRCONFIRM_BOARD_ADDR模块解析完成后,会在 STATE_EMIT_EVENT 状态下拉高一个周期的 valid 信号,例如:
discover_req_validget_net_info_req_validhost_addr_cfg_validboard_addr_cfg_validboard_addr_confirm_valid同时,模块也会输出公共命令信息 net_cmd_*,包括命令 ID、目标载板编号、UDP 包真实来源地址等。后续 addr_config_gen 根据这些输出进行实际地址配置管理。
addr_config_gen 是网络地址配置管理模块。该模块后续用于接收 net_addr_config_recv 的解析结果,并根据指令类型更新载板本机地址和上位机目标地址。
该模块设计上需要同时维护两类配置:
raw:原始配置,记录最新接收到的配置内容active:当前实际应用配置,表示系统正在使用的地址该模块完成的主要任务包括:
DISCOVER 指令,并在允许学习时绑定上位机地址GET_NET_INFO 指令,触发网络地址状态反馈SET_HOST_ADDR 指令,配置上位机目标地址SET_BOARD_ADDR 指令,配置载板本机地址CONFIRM_BOARD_ADDR 指令,完成 pending 地址配置的确认或取消cfg_src_* 和 cfg_dst_* 给 UDP_IP_MAC当前阶段,addr_config_gen 已经创建PS端的端口框架,先优先实现 PL 端 UDP 配置逻辑,PS 端配置端口先保留。
本次功能中,基础参数配置指令解析模块,udp_config_driver 也需要配合修改。原因是:普通基础参数配置指令虽然不属于网络地址配置指令,但系统仍然需要知道这条配置指令来自哪一台上位机。
实际使用中,如果上位机 A 发送基础参数配置指令,那么载板完成配置后,参数反馈 UDP 包就应该优先发送回上位机 A,而不是继续发送到需要发送采集数据包的上位机地址。
因此,udp_config_driver 需要在解析基础参数配置、采集控制、PGA 配置等普通 UDP 指令时,同步获取该 UDP 包的真实来源地址,包括:
这些来源地址来自 UDP_IP_MAC 输出的 UDP 接收 metadata,并通过 udp_rx_dispatcher 或顶层连接传递给配置解析链路。
该逻辑的目标是:
也就是说,系统里存在两类会影响 UDP 反馈目标地址的来源:
DISCOVER、SET_HOST_ADDR。前者由 net_addr_config_recv 和 addr_config_gen 处理;后者需要 udp_config_driver 在解析普通配置指令时记录来源地址,并将该来源地址提供给后续地址管理或反馈发送逻辑。
整体上,UDP_IP_MAC 的目标上位机地址不再只是固定参数,而应该能够根据最近一次有效配置指令来源进行更新或临时切换,从而保证“谁发配置,反馈就回给谁”。
新增网络地址配置功能的整体数据流如下:
UDP_IP_MAC
|--> udp_rx_dispatcher
|--> udp_config_driver
| |--> UDP_IP_MAC 动态地址暂时修改
|--> net_addr_config_recv
|--> addr_config_gen
|--> UDP_IP_MAC 动态地址配置输入
其中,udp_config_driver 继续负责原有系统参数配置和采集控制指令;net_addr_config_recv 和 addr_config_gen 负责新增网络地址配置指令。
该测试用于检查,在载板未更新网络地址配置,上位机不知晓载板地址前,载板是否能够正确识别上位机发送的地址配置广播 UDP 包,并根据UDP包的来源地址进行相应的处理。
上位机发送广播 DISCOVER UDP 包,载板收到后解析出上位机的源 MAC、源 IP 和源 UDP 端口,并将这些信息传递给 addr_config_gen。
为避免载板初始地址刚好和上位机地址匹配,载板初始目标地址设置为:
- MAC: 00:11:22:33:44:55
- IP: 192.168.1.1
- UDP Port: 5000
经过配置后,观察ILA抓取信号,如图:

图中,载板的目标mac地址显示为6c:b3:11:21:c5:37,目标ip地址显示为192.169.1.100,目标udp端口显示为8010,符合上位机网络配置。
之后完成基础参数配置后,点击上位机的采集起始按钮,上位机通过ff:conf抓包后,可以在wireshark里面看到对应的采集数据包,由此可见,完成配置后,载板可以将参数传输到上位机。
测试结果说明,载板已经正确识别了上位机发送的UDP包来源地址,并将其作为新的目标地址。
该测试用于检查,在载板收到上位机的参数配置指令后,是否能够正确识别该指令的来源地址,并将反馈包发送回该来源地址。
继续上一次测试,但是在上位机完成载板的目标地址配置后,更改上位机的网络配置。然后,上位机发送参数配置指令,载板收到后解析出上位机的源 MAC、源 IP 和源 UDP 端口,并将这些信息传递给 udp_config_driver。
经过测试后,观察ILA抓取信号,如图:

图中,载板的目标mac地址显示为6c:b3:11:21:c5:37,目标ip地址显示为192.168.2.100,目标udp端口显示为8010,符合上位机网络配置。
但是后续发现存在问题。配置完成后,系统并没有回归到上位机第一次配置的目标地址,而是继续使用了基础参数配置的UDP包源地址。由于地址没有复原,旧地址对应上位机将无法接受载板的采集数据UDP包,这个问题不符合预期,需要修改。
本文章使用limfx的vscode插件快速发布