Lattice LFCPNX-100 HSB+Fpga开发详解:2.3 Hololink 顶层模块深度全解析

一、概述

一个主芯片FPGA,把来自两个外设camera+IMU的数据,通过hololink逻辑模块整合下打包通过光口传出;NVIDIA Hololink IP 的顶层 SystemVerilog 模块,属于传感器→主机之间的高速图像 / 数据传输处理核心,是一个高度参数化、可配置、多时钟域、带协议处理的完整 FPGA 以太网 + 传感器桥接 SoC。主要应用在工业/医疗/车载图像传感器数据上云;

二、HOLOLINK 逻辑视图

HOLOLINK 顶层模块把五大系统子模块的信息进行整合,并输出;其核心功能模块可划分为,时钟复位管理子系统、主机接口(HIF)子系统、传感器接口(SIF)子系统、PTP 时间同步子系统、控制与外设子系统,它们都是通过统一 AXI-Stream互连,以及APB配置;

1、时钟复位管理子系统

该子系统包含多时钟域(HIF、APB、PTP、SIF_RX、SIF_TX)异步复位生成reset_gen IP核;

复制代码
reset_gen #(
  .NUM_SENSOR_RX ( NUM_SENSOR_RX      ),
  .NUM_SENSOR_TX ( NUM_SENSOR_TX      )
) u_rst_gen(
  .i_sys_rst     ( i_sys_rst          ),
  .i_cfg_rst     ( o_sw_sys_rst       ),
  .i_sif_rx_clk  ( sif_rx_clk         ),
  .i_sif_tx_clk  ( sif_tx_clk         ),
  .i_hif_clk     ( i_hif_clk          ),
  .i_apb_clk     ( i_apb_clk          ),
  .i_ptp_clk     ( i_ptp_clk          ),
  .o_sif_rx_rst  ( sif_rx_rst         ),
  .o_sif_tx_rst  ( sif_tx_rst         ),
  .o_hif_rst     ( o_hif_rst          ),
  .o_apb_rst     ( o_apb_rst          ),
  .o_ptp_rst     ( o_ptp_rst          )
);

也包含跨时钟域同步的data_sync、streaming_cdc IP 核,PTP 时间 → 同步到 主机时钟域 (HIF),以及PTP 时间 → 同步到 APB 配置时钟域;可消除亚稳态、毛刺、不定态、偶尔翻车

复制代码
data_sync u_eeprom_ip_addr_vld_sync (
  .clk      ( i_hif_clk                  ),  // 目标时钟:HIF(主机)时钟域
  .rst_n    ( !o_hif_rst                 ),  // 目标时钟域复位
  .sync_in  ( eeprom_ip_addr_vld         ),  // 源:APB时钟域来的有效标志(1bit)
  .sync_out ( eeprom_ip_addr_vld_hif_clk )   // 输出:同步到 HIF 时钟域
);

streaming_cdc #(
  .DATA_WIDTH ( 80                                        ),
  .SRC_FREQ   ( `PTP_CLK_FREQ                             ),
  .DST_FREQ   ( `HIF_CLK_FREQ                             )
) u_ptp_hif_cdc (
  .i_src_clk  ( i_ptp_clk                                 ),
  .i_dst_clk  ( i_hif_clk                                 ),
  .i_src_rst  ( o_ptp_rst                                 ),
  .i_dst_rst  ( o_hif_rst                                 ),
  .i_src_data ( {ptp_sec, ptp_nano_sec}                   ),
  .o_dst_data ( {ptp_sec_sync_hif, ptp_nano_sec_sync_hif} ),
  .o_dst_valid ( ptp_sync_hif_valid                       )
);

streaming_cdc #(
  .DATA_WIDTH ( 80                                        ),
  .SRC_FREQ   ( `PTP_CLK_FREQ                             ),
  .DST_FREQ   ( `APB_CLK_FREQ                             )
) u_ptp_apb_cdc (
  .i_src_clk  ( i_ptp_clk                                 ),
  .i_dst_clk  ( i_apb_clk                                 ),
  .i_src_rst  ( o_ptp_rst                                 ),
  .i_dst_rst  ( o_apb_rst                                 ),
  .i_src_data ( {ptp_sec, ptp_nano_sec}                   ),
  .o_dst_data ( {ptp_sec_sync_apb, ptp_nano_sec_sync_apb} ),
  .o_dst_valid ( ptp_sync_apb_valid                       )
);

2、主机接口(HIF)子系统

该子系统包含以太网帧解析、协议解封装(ETH/IP/UDP/PTP)rx_parser IP核;

复制代码
generate
  for (i=0; i<`HOST_IF_INST; i++) begin: gen_rx_parser

    assign  o_hif_axis_tready             [i] = init_done_hif_clk;

    rx_parser #(
      .AXI_DWIDTH                        ( `HOST_WIDTH                                ),
      .AXI_LS_DWIDTH                     ( 8                                          ),
      .MTU                               ( `HOST_MTU                                  ),
      .NUM_LS_INST                       ( NUM_LS_RX_INST                             ),
      .SYNC_CLK                          ( SYNC_CLK_HIF_APB                           )
    ) rx_parser (
      .host_clk                          ( i_hif_clk                                  ),
      .host_rst                          ( o_hif_rst                                  ),
      .apb_clk                           ( i_apb_clk                                  ),
      .apb_rst                           ( o_apb_rst                                  ),
      //Configuration
      .i_dev_mac_addr                    ( dev_mac_addr             [i]               ),
      .i_dev_ip_addr                     ( dev_ip_addr              [i]               ),
      //Register APB Interfaces
      .i_apb_m2s                         ( s_apb_m2s_host [(i*num_host_mod)+inst_dec] ),
      .o_apb_s2m                         ( s_apb_s2m_host [(i*num_host_mod)+inst_dec] ),
      .o_dest_info                       ( dest_info                [i]               ),
      .o_ptp_sync_msg                    ( is_ptp_sync_msg          [i]               ),
      //AXI RX Interface inbound from packet buffer (via Ethernet MAC)
      .i_axis_rx_tvalid                  ( i_hif_axis_tvalid [i] && init_done_hif_clk ),
      .i_axis_rx_tdata                   ( i_hif_axis_tdata         [i]               ),
      .i_axis_rx_tlast                   ( i_hif_axis_tlast         [i]               ),
      .i_axis_rx_tuser                   ( i_hif_axis_tuser         [i]               ),
      .i_axis_rx_tkeep                   ( i_hif_axis_tkeep         [i]               ),
      // Sensor TX Interface
      .o_stx_axis_tvalid                 ( stx_axis_tvalid          [i]               ),
      .o_stx_axis_tdata                  ( stx_axis_tdata           [i]               ),
      .o_stx_axis_tlast                  ( stx_axis_tlast           [i]               ),
      .o_stx_axis_tuser                  ( stx_axis_tuser           [i]               ),
      .o_stx_axis_tkeep                  ( stx_axis_tkeep           [i]               ),
      // PTP Interface
      .o_ptp_axis_tvalid                 ( ptp_rx_axis_tvalid       [i]               ),
      .o_ptp_axis_tdata                  ( ptp_rx_axis_tdata        [i]               ),
      .o_ptp_axis_tlast                  ( ptp_rx_axis_tlast        [i]               ),
      .o_ptp_axis_tuser                  ( ptp_rx_axis_tuser        [i]               ),
      .o_ptp_axis_tkeep                  ( ptp_rx_axis_tkeep        [i]               ),
      //Bridge TX AXIS Interface
      .o_btx_axis_tvalid                 ( brx_axis_tvalid          [i]               ),
      .o_btx_axis_tdata                  ( brx_axis_tdata           [i]               ),
      .o_btx_axis_tlast                  ( brx_axis_tlast           [i]               ),
      .o_btx_axis_tuser                  ( brx_axis_tuser           [i]               ),
      .o_btx_axis_tkeep                  ( brx_axis_tkeep           [i]               ),
      .i_btx_axis_tready                 ( brx_axis_tready          [i]               ),
      //Low Speed AXIS Interface to datapath
      .o_ls_axis_tvalid                  ( lsi_axis_tvalid          [i]               ),
      .o_ls_axis_tdata                   ( lsi_axis_tdata           [i]               ),
      .o_ls_axis_tlast                   ( lsi_axis_tlast           [i]               ),
      .o_ls_axis_tuser                   ( lsi_axis_tuser           [i]               ),
      .o_ls_axis_tkeep                   ( lsi_axis_tkeep           [i]               ),
      .i_ls_axis_tready                  ( lsi_axis_tready          [i]               )
    );

    assign s_apb_s2m_host [(i*num_host_mod)+ctrl_evt].pready   = 0;
    assign s_apb_s2m_host [(i*num_host_mod)+ctrl_evt].prdata   = 0;
    assign s_apb_s2m_host [(i*num_host_mod)+ctrl_evt].pserr    = 0;

  end
endgenerate

包含具有低速控制帧解析、IP/MAC 管理、事件上报功能的rx_ls_parser IP 核;

复制代码
rx_ls_parser #(
  .AXI_DWIDTH                         ( `HOST_WIDTH                               ),
  .AXI_LS_DWIDTH                      ( 8                                         ),
  .ENUM_DWIDTH                        ( ENUM_DWIDTH                               ),
  .MTU                                ( `HOST_MTU                                 ),
  .NUM_LS_RX_INST                     ( NUM_LS_RX_INST                            ),
  .NUM_LS_TX_INST                     ( NUM_LS_TX_INST                            ),
  .NUM_HOST                           ( `HOST_IF_INST                             ),
  .UUID                               ( `UUID                                     ),
  .SYNC_CLK                           ( SYNC_CLK_HIF_APB                          )
) u_rx_ls_parser (
  .i_pclk                             ( i_hif_clk                                 ),
  .i_prst                             ( o_hif_rst                                 ),
  .i_aclk                             ( i_apb_clk                                 ),
  .i_arst                             ( o_apb_rst                                 ),
  .i_apb_m2s_ecb                      ( s_apb_m2s_dev [3]                         ),
  .o_apb_s2m_ecb                      ( s_apb_s2m_dev [3]                         ),
  .i_apb_m2s_evt                      ( s_apb_m2s_dev [2]                         ),
  .o_apb_s2m_evt                      ( s_apb_s2m_dev [2]                         ),
  .o_apb_m2s_evt                      ( m_apb_m2s     [3]                         ),
  .i_apb_s2m_evt                      ( m_apb_s2m     [3]                         ),
  .i_apb_m2s_ram                      ( s_apb_m2s_ram [1]                         ),
  .o_apb_s2m_ram                      ( s_apb_s2m_ram [1]                         ),
  //Low Speed AXIS Interface to Packet proc
  .i_axis_tvalid                      ( lsi_axis_tvalid                           ),
  .i_axis_tdata                       ( lsi_axis_tdata                            ),
  .i_axis_tlast                       ( lsi_axis_tlast                            ),
  .i_axis_tuser                       ( lsi_axis_tuser                            ),
  .i_axis_tkeep                       ( lsi_axis_tkeep                            ),
  .o_axis_tready                      ( lsi_axis_tready                           ),
  // Input Control Data
  .i_init_done                        ( init_done_hif_clk                         ),
  .i_ptp_clk                          ( i_ptp_clk                                 ),
  .i_ptp_rst                          ( o_ptp_rst                                 ),
  .i_ptp                              ( {ptp_sec, ptp_nano_sec}                   ),
  .i_ptp_hif                          ( {ptp_sec_sync_hif, ptp_nano_sec_sync_hif} ),
  .i_dev_mac_addr                     ( dev_mac_addr                              ),
  .i_eeprom_ip_addr                   ( eeprom_base_ip_addr                       ),
  .i_eeprom_ip_addr_vld               ( eeprom_ip_addr_vld_hif_clk                ),
  .i_hsb_stat                         ( hsb_stat                                  ),
  .o_dev_ip_addr                      ( dev_ip_addr                               ),
  .i_enum_data                        ( enum_data                                 ),
  .i_evt_vec                          ( event_vec                                 ),
  .i_pkt_inc                          ( pkt_inc                                   ),
  .i_pps                              ( pps                                       ),
  // APB interface
  .o_apb_m2s_ecb                      ( m_apb_m2s [0]                             ),
  .i_apb_s2m_ecb                      ( m_apb_s2m [0]                             ),
  //Low Speed AXIS Interface to ethernet output at full speed
  .o_axis_tvalid                      ( lso_axis_tvalid                           ),
  .o_axis_tdata                       ( lso_axis_tdata                            ),
  .o_axis_tlast                       ( lso_axis_tlast                            ),
  .o_axis_tuser                       ( lso_axis_tuser                            ),
  .o_axis_tkeep                       ( lso_axis_tkeep                            ),
  .i_axis_tready                      ( lso_axis_tready                           )
);

包含具有发送端优先级调度(数据面 > PTP > 控制 > 流控 > 桥接)的IP 核;

复制代码
generate
  for (i=0; i<`HOST_IF_INST; i++) begin: gen_eth_pkt

    assign tx_axis_tvalid[i]             = {btx_axis_tvalid                [i],  // bridge
                                            pause_axis_tvalid              [i],  // pause
                                            lso_axis_tvalid                [i],  // arp/icmp/udp_loopback
                                            ptp_tx_axis_tvalid_gated       [i],  // ptp
                                            dp_axis_tvalid                 [i]}; // sensor data

    assign tx_axis_tlast[i]              = {btx_axis_tlast                 [i],
                                            pause_axis_tlast               [i],
                                            lso_axis_tlast                    ,
                                            ptp_tx_axis_tlast              [i],
                                            dp_axis_tlast                  [i]};

    assign tx_axis_tdata[i]              = '{ dp_axis_tdata                  [i],
                                              ptp_tx_axis_tdata             [i],
                                              lso_axis_tdata                   ,
                                              pause_axis_tdata              [i],
                                              btx_axis_tdata                [i]};

    assign tx_axis_tkeep[i]              = '{ dp_axis_tkeep                  [i],
                                              ptp_tx_axis_tkeep             [i],
                                              lso_axis_tkeep                   ,
                                              pause_axis_tkeep              [i],
                                              btx_axis_tkeep                [i]};

    assign tx_axis_tuser[i]              =  { btx_axis_tuser                 [i],
                                              pause_axis_tuser              [i],
                                              lso_axis_tuser                   ,
                                              ptp_tx_axis_tuser             [i],
                                              dp_axis_tuser                 [i]};

    assign {btx_axis_tready               [i],
            pause_axis_tready             [i],
            lso_axis_tready               [i],
            ptp_tx_axis_tready            [i],
            dp_axis_tready                [i]} = tx_axis_tready[i];

    eth_pkt #(
      .N_INPT                   ( PORT_NUM                                  ),
      .W_DATA                   ( `HOST_WIDTH                               ),
      .SYNC_CLK                 ( SYNC_CLK_HIF_APB                          )
    ) u_eth_pkt  (
      .i_pclk                   ( i_hif_clk                                 ),
      .i_prst                   ( o_hif_rst                                 ),
      // Register Map, abp clk domain
      .i_aclk                   ( i_apb_clk                                 ),
      .i_arst                   ( o_apb_rst                                 ),
      .i_apb_m2s                ( s_apb_m2s_host [(i*num_host_mod)+eth_pkt] ),
      .o_apb_s2m                ( s_apb_s2m_host [(i*num_host_mod)+eth_pkt] ),
      .o_pkt_inc                ( pkt_inc                 [i]               ),
      //PTP Timestamp
      .o_ptp_val                ( ptp_val                 [i]               ),
      .o_del_req_val            ( del_req_val             [i]               ),
      // AXIS From Multiple Sources
      .i_axis_tvalid            ( tx_axis_tvalid          [i]               ),
      .i_axis_tlast             ( tx_axis_tlast           [i]               ),
      .i_axis_tkeep             ( tx_axis_tkeep           [i]               ),
      .i_axis_tdata             ( tx_axis_tdata           [i]               ),
      .i_axis_tuser             ( tx_axis_tuser           [i]               ),
      .o_axis_tready            ( tx_axis_tready          [i]               ),
      // AXIS to MAC
      .o_axis_tvalid            ( o_hif_axis_tvalid       [i]               ),
      .o_axis_tlast             ( o_hif_axis_tlast        [i]               ),
      .o_axis_tdata             ( o_hif_axis_tdata        [i]               ),
      .o_axis_tkeep             ( o_hif_axis_tkeep        [i]               ),
      .o_axis_tuser             ( o_hif_axis_tuser        [i]               ),
      .i_axis_tready            ( i_hif_axis_tready       [i]               )
    );

  end
endgenerate

3、传感器接口(SIF)子系统

  • packetizer_top:传感器数据分片、虚拟端口(VP)打包
  • dp_pkt_top:数据面封装(ETH+IP+UDP 头、PTP 时间戳插入)
  • sensor_tx_pkt_proc:控制帧转发到传感器
  • tx_stream_buffer:传感器输出流控与缓冲

4、PTP 时间同步子系统

  • ptp_top:IEEE 1588-2008 PTPv2 协议栈
  • 输出:秒 / 纳秒 / 1PPS
  • 跨时钟域同步到 HIF/APB

5、控制与外设子系统

  • apb_intc_top:APB 总线中央路由
  • sys_init + eeprom_info:上电初始化、MAC / 序列号读取
  • glb_ctrl_top:全局寄存器、GPIO、软件复位
  • SPI/I2C/UART:外设控制器
  • 桥接(BRIDGE):FPGA-FPGA 数据转发、路由表

6、模块间关系(逻辑接口)

  • 所有模块通过 AXI-Stream 互联(tvalid/tlast/tdata/tkeep/tuser)
  • 所有配置通过 APB 总线完成
  • 时钟复位由 reset_gen 统一分发

三、总结

上面总结一句话就是告知系统要做什么、由哪些功能模块组成、以及模块间接口关系。

由于代码与内容篇幅比较长,后面三部分做简单的总结,全部代码可加vx hope_0793一起讨论咨询;

相关推荐
思麟呀5 小时前
C++工业级日志项目(六)异步日志器
linux·c++·windows
s_w.h5 小时前
【 linux 】文件系统
linux·运维·服务器·算法·bash
都在酒里6 小时前
Linux字符设备驱动开发(七):输入子系统——驱动GPIO按键并上报事件
linux·驱动开发·交互
风曦Kisaki6 小时前
# Linux运维Day06:HAproxy负载均衡(代理调度软件对比)、Tomcat服务部署与LNMJ架构
linux·运维·负载均衡
largecode6 小时前
座机号码认证如何操作?申请热线实名名片,树立统一官方客服形象
linux·sql·华为·c#·.net·wpf·harmonyos
杨云龙UP6 小时前
ODA/Oracle RAC 节点 Load 100+ 排查:一个 lsof 残留进程引发的负载虚高问题 2026-05-27
linux·数据库·oracle·centos·误操作
底层开发智库6 小时前
获取编译并运行ARM64可信系统软件栈(TF-A+OP-TEE+UEFI+Linux)
linux·optee·arm64·可信软件
用户2367829801687 小时前
Linux curl 命令深度解析:从 HTTP 请求到网络调试实战
linux
怎么没有名字注册了啊7 小时前
fedora 换源教程
linux·运维·服务器