
1. 异构计算平台选型与整体设计思路1.1 为什么是RK3568加PG2L50H这个组合先说说我为什么盯上这套组合。RK3568是瑞芯微的一款四核Cortex-A55应用处理器主频能跑到2.0GHz自带Mali-G52 GPU和0.8T算力的NPU接口方面有PCIe 3.0、USB 3.0、千兆以太网、CAN FD、MIPI CSI/DSI等一堆外设。而紫光同创的PG2L50H属于Logos-2系列FPGALUT规模大约50K内置DSP Slice和块RAM封装通常是FGG484或者FBG484支持多种高速接口标准。把这两个芯片放在一块板子上本质上是在做一颗“通用处理器可编程逻辑”的异构计算平台。RK3568负责跑操作系统、做上层调度、处理网络协议栈和人机交互PG2L50H负责那些对时序要求极严、或者需要大量并行处理的任务比如多路视频采集的预处理、高速ADC数据流的实时过滤、电机控制的PWM波形生成、工业总线的协议转换等等。我见过不少团队一开始想用纯FPGA方案搞定所有事结果发现跑个Linux系统都费劲网络协议栈更是别想也有团队想用纯SoC方案结果遇到多路高速数据并行采集时就抓瞎了。RK3568PG2L50H这种组合说白了就是让合适的芯片干合适的事。1.2 核心需求解析什么场景下需要这套方案从热搜词里能看到几个典型场景RK3568调试OV5695摄像头、适配EtherCAT IGH主站驱动、SGMII IP核、CAN FD IP核使用。这些需求背后其实指向同一个核心痛点——SoC的原生接口不够用或者不够灵活。举个例子RK3568本身支持MIPI CSI但如果你要接8路以上的摄像头做同步采集MIPI CSI的通道数就不够了。这时候FPGA就能派上用场用PG2L50H做多路LVDS或者MIPI的汇聚和预处理把多路视频流合并成一路高速数据流再通过PCIe或者GMII传给RK3568。另一个典型场景是工业以太网RK3568虽然有千兆网口但要做EtherCAT主站需要精确的时钟同步和帧处理纯软件方案抖动太大用FPGA做硬件加速就稳得多。所以这套方案适合的人群很明确做工业控制、机器视觉、边缘计算网关、多轴运动控制的嵌入式工程师。如果你只是做个简单的数据采集卡那可能用不上这么复杂的架构。1.3 方案选型的几个关键考量选PG2L50H而不是其他FPGA有几个实际原因。第一是国产化需求紫光同创的Logos-2系列在供货稳定性和成本上比进口器件有优势。第二是PDS紫光同创的开发套件的易用性虽然它不像Vivado那么功能全面但基本的IP核配置、时序约束、综合布局布线都能覆盖而且界面逻辑比较直观。第三是PG2L50H的功耗控制不错典型功耗在1W左右适合做嵌入式集成。RK3568这边选它的理由更直接四核A55的性能足够跑Ubuntu或者DebianPCIe 3.0 x2的带宽约2GB/s足够和FPGA做数据交互而且瑞芯微的SDK成熟度在国产SoC里算第一梯队设备树配置、uboot修改、内核驱动都有大量参考。注意PG2L50H的配置模式要提前确定。如果板子上有SPI Flash可以用Master SPI模式如果由RK3568通过SPI或者PCIe来加载bit流那就得用Slave模式。这个选择直接影响硬件设计和后续的启动流程。2. 紫光同创PDS环境搭建与IP核配置核心细节2.1 PDS安装与License配置的实操要点PDS的安装过程本身不复杂但有几个坑我踩过。首先安装路径绝对不要有中文和空格否则综合的时候会报一些莫名其妙的错误。其次License文件的获取需要去紫光同创官网申请一般需要提供MAC地址和公司信息审核周期大概1-2个工作日。安装完成后第一件事是检查环境变量。PDS需要设置PDS_ROOT和PATH在Linux下可以在.bashrc里加export PDS_ROOT/opt/PDS2022.1 export PATH$PDS_ROOT/bin:$PATH export LM_LICENSE_FILE27000your_license_serverWindows下就更简单安装程序会自动配好。但要注意如果你用的是浮动License防火墙得放行27000端口。提示PDS的版本选择很重要。2022.1版本对PG2L50H的支持最稳定2023版本虽然功能更多但有些IP核的兼容性还在完善中。我建议新手先用2022.1。2.2 IP核配置的核心逻辑以SGMII和CAN FD为例紫光同创的IP核库叫PDS IP Compiler里面常用的有SGMII、PCIe、DDR3、CAN FD、FFT等。配置IP核的核心逻辑其实就三步选模板、填参数、生成文件。但每一步都有讲究。以SGMII IP核为例你需要关注这几个参数线速率1.25Gbps还是3.125Gbps、参考时钟频率125MHz还是156.25MHz、是否启用Auto-Negotiation。如果你是要和RK3568的千兆网口对接那线速率必须是1.25Gbps参考时钟用125MHz。如果是要做2.5G的SGMII那线速率就是3.125Gbps参考时钟得用156.25MHz。CAN FD IP核的配置更复杂一些。你需要设置仲裁段波特率和数据段波特率比如仲裁段500Kbps、数据段2Mbps。还要配置采样点位置一般仲裁段采样点设在75%-80%数据段设在70%-75%。这些参数如果设错了通信会时断时续而且很难排查。// CAN FD IP核的例化模板简化版 canfd_ip u_canfd ( .clk (sys_clk), .rst_n (rst_n), .can_tx (can_tx), .can_rx (can_rx), .tx_data (tx_data), .tx_valid (tx_valid), .rx_data (rx_data), .rx_valid (rx_valid) );2.3 时钟与复位设计的注意事项FPGA工程里最容易被忽视的就是时钟和复位。PG2L50H内部有多个PLL可以生成不同频率的时钟。但要注意跨时钟域的信号必须做同步处理否则亚稳态问题会让你痛不欲生。我的习惯是每个时钟域单独用一个复位信号复位释放要同步到对应的时钟域。比如SGMII的125MHz时钟域和系统50MHz时钟域它们的复位信号必须分别同步。PDS里可以用Reset Synchronizer这个IP核来自动生成同步复位省得自己写。另外PLL的锁定信号一定要等。我见过有人不等PLL锁定就直接让逻辑跑起来结果系统时好时坏。正确的做法是wire pll_locked; assign sys_rst_n ext_rst_n pll_locked;这样只有PLL锁定后系统才退出复位。3. 工程集成与RK3568-FPGA联调实操3.1 硬件连接方案与接口选择RK3568和PG2L50H之间的通信接口常见的有三种SPI、PCIe、GMII/RGMII。选哪个取决于你的数据带宽需求。SPI最简单但速度慢适合做配置通道或者低速控制。PCIe 3.0 x2理论带宽约2GB/s适合视频流、高速ADC数据这种大吞吐场景。GMII/RGMII适合网络数据包的转发比如EtherCAT主站。我这次用的是PCIe接口因为要传多路视频数据。硬件上要注意RK3568的PCIe控制器是RC模式PG2L50H要配置成EP模式。PG2L50H的PCIe硬核支持Gen2 x4但实际跑Gen2 x2就够用了。注意PCIe的参考时钟必须从RK3568这边提供100MHz的差分时钟。如果板子上没有时钟缓冲芯片记得在FPGA侧加一个时钟输入引脚。3.2 FPGA工程的目录结构与模块划分一个清晰的工程结构能省很多事。我的习惯是这样分project/ ├── rtl/ │ ├── top.v // 顶层模块 │ ├── pcie_ep.v // PCIe端点逻辑 │ ├── video_pipe.v // 视频预处理流水线 │ └── canfd_ctrl.v // CAN FD控制器 ├── ip/ │ ├── pcie_ip/ // PCIe IP核生成文件 │ ├── sgmii_ip/ // SGMII IP核 │ └── pll/ // PLL配置 ├── constraint/ │ └── top.sdc // 时序约束 └── sim/ └── tb_top.v // 仿真测试平台顶层模块只做例化和互联具体逻辑放在子模块里。这样综合的时候也好做增量编译。3.3 时序约束的编写与收敛技巧时序约束是FPGA工程里最考验经验的部分。PDS的约束语法和SDC兼容基本的create_clock、set_input_delay、set_output_delay都要写。对于PCIe接口参考时钟100MHz数据速率5GT/s约束要这样写create_clock -name pcie_refclk -period 10.0 [get_ports pcie_refclk_p] set_input_delay -clock pcie_refclk -max 2.0 [get_ports pcie_rx_p] set_output_delay -clock pcie_refclk -max 2.0 [get_ports pcie_tx_p]如果时序不收敛先看关键路径在哪里。PDS的Timing Analyzer会给出详细的路径报告。常见的优化手段有插入流水线寄存器、降低组合逻辑级数、用DSP硬核替代逻辑乘法。我遇到过一次SGMII接口时序不收敛后来发现是跨时钟域的信号没做约束。加上set_clock_groups -asynchronous之后问题就解决了。3.4 RK3568侧的驱动适配与设备树修改RK3568跑LinuxFPGA作为一个PCIe设备挂载。设备树里要添加PCIe控制器的节点pcie3x2 { status okay; reset-gpios gpio3 RK_PB0 GPIO_ACTIVE_HIGH; vpcie3v3-supply vcc3v3_pcie; };驱动方面如果FPGA只是做数据透传可以用UIO或者VFIO框架在用户空间直接操作BAR空间。如果要做得规范一些就写一个字符设备驱动注册file_operations实现mmap把BAR空间映射到用户空间。static int fpga_mmap(struct file *filp, struct vm_area_struct *vma) { unsigned long pfn virt_to_phys(fpga_bar0) PAGE_SHIFT; return remap_pfn_range(vma, vma-vm_start, pfn, vma-vm_end - vma-vm_start, vma-vm_page_prot); }提示RK3568的PCIe枚举有时候会失败先检查lspci能不能看到设备。如果看不到用示波器量一下PERST#信号和参考时钟。4. 常见问题排查与实战避坑指南4.1 IP核配置阶段的典型报错与解决问题一PDS综合时报“Cannot find module xxx_ip”这个通常是IP核生成的文件没有添加到工程里。PDS生成IP核后会在指定目录下产生.v和.ngc文件你需要手动把这些文件加入工程。或者用add_files命令批量添加。问题二SGMII IP核仿真时收不到数据先检查参考时钟有没有给对。SGMII的参考时钟必须是125MHz如果给成了100MHzPCS层就工作不正常。另外SGMII的SerDes需要一段时间做时钟数据恢复仿真时至少要等1ms再发数据。问题三CAN FD IP核通信不稳定大概率是采样点设错了。用示波器抓CAN_H和CAN_L的差分波形量一下仲裁段的位时间然后反推采样点位置。如果采样点偏早或偏晚都会导致误码。4.2 硬件联调阶段的排查思路现象RK3568识别不到PCIe设备排查步骤量PERST#信号确认复位释放时序正确量PCIe参考时钟确认100MHz差分信号正常检查FPGA的配置是否加载成功看DONE信号是否拉高用lspci -vvv看链路训练状态如果LTSSM卡在Detect状态说明物理层有问题现象数据传输丢包如果是PCIe传输先看DMA描述符有没有对齐。PCIe的DMA地址必须4KB对齐否则性能会下降甚至出错。如果是SGMII传输检查FIFO的深度是否足够有时候突发流量会把FIFO冲爆。4.3 常见问题速查表问题现象可能原因排查方法解决方案PDS综合报错找不到IPIP文件未加入工程检查工程文件列表手动添加IP生成文件SGMII无数据参考时钟频率错误示波器量时钟改为125MHzCAN FD误码率高采样点设置不当抓波形反推调整采样点至75%PCIe枚举失败PERST#时序不对量复位信号调整复位释放时间时序不收敛跨时钟域未约束看Timing报告加set_clock_groupsFPGA配置失败SPI Flash数据错误读回配置数据重新生成bit流4.4 独家避坑经验分享第一个坑PDS的增量编译有时候会抽风。如果你改了IP核的参数最好把整个工程clean一遍再重新综合不然可能综合出错误的网表。第二个坑PG2L50H的DSP硬核在高温下性能会下降。如果板子工作在工业温度范围-40到85度时序约束要留够余量最好按 worst-case 条件来约束。第三个坑RK3568的PCIe和SATA是复用引脚的。如果你用了PCIeSATA就不能用了。这个在硬件设计阶段就要确定好。第四个坑紫光同创的IP核文档有些地方写得比较简略。遇到不懂的参数直接看IP核生成的Verilog代码里面的注释比文档还详细。5. 性能优化与进阶扩展方向5.1 数据吞吐量的优化手段如果PCIe的带宽跑不满先看DMA描述符的深度。RK3568的PCIe控制器支持多通道DMA每个通道可以配256个描述符。把描述符深度加大能显著提升突发传输效率。另外FPGA侧的FIFO要用Block RAM实现不要用分布式RAM。Block RAM的时序更稳定而且不占用逻辑资源。PG2L50H有大约2.5Mb的Block RAM够做几个大FIFO了。5.2 多IP核协同工作的注意事项当工程里同时有SGMII、PCIe、CAN FD三个IP核时时钟资源会很紧张。PG2L50H内部有4个PLL每个PLL可以生成多个时钟。但要注意PLL的输出时钟不能跨PLL使用也就是说PLL0生成的时钟不能直接给PLL1的时钟域用。我的做法是先规划好所有时钟域然后分配PLL。比如PLL0出125MHz给SGMIIPLL1出100MHz给PCIePLL2出50MHz给系统逻辑PLL3备用。5.3 后续功能扩展的思路这套平台的可扩展性很强。比如你可以加一个FFT IP核做频谱分析或者加一个视频缩放IP核做多路视频的拼接。紫光同创的IP库还在不断更新新的IP核会陆续支持。如果要做EtherCAT主站可以用FPGA实现ESCEtherCAT Slave Controller的硬件逻辑RK3568跑IGH主站协议栈。这样时钟同步精度能做到纳秒级比纯软件方案强太多。最后分享一个小技巧PDS的工程文件可以用Git管理但记得把*.pds和*.pnr文件加入.gitignore这些是临时文件每次综合都会变。只提交.v、.sdc和IP核的配置文件就够了。