ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

软件可编程FPGA开发实战:HLS、软核与收发器配置要点

软件可编程FPGA开发实战:HLS、软核与收发器配置要点 这几年我明显感觉到一个变化身边越来越多软件背景的同事开始碰FPGA而不少硬件工程师也在学着用C和Python去描述逻辑。我最初对Software-Programmable FPGAs这个词是有点抗拒的总觉得FPGA的价值就在底层可控性软件化会不会把它的优势抹掉。但当我真正在Zynq上跑起Linux用MicroBlaze挂一堆外设又用Vitis HLS把一段图像算法从C代码在几小时内变成可综合的RTL之后我承认这个方向不是营销概念而是FPGA工程方法的一次实质演进。Software-Programmable FPGAs直译是软件可编程FPGA但它并不是指某颗新芯片而是一整套开发范式的总称让FPGA里越来越多的子系统能够用软件工程师熟悉的语言、工具链和抽象层级来定义而不是所有东西都从端口级HDL和时序波形开始抠。这篇文章我想把这几年在这个方向上积累的选型经验、实操细节和踩坑记录整理出来。重点会覆盖三条主流路线——HLS、软核处理器、异构SoC同时会花相当篇幅聊一个几乎所有FPGA项目都绕不开的硬骨头高速收发器Transceiver的配置尤其是7系列和UltraScale这两代器件在收发器Wizard上的差异因为收发器往往是软件化开发链路里最不软件、最容易卡住人的那一段。1. 软件可编程FPGA一个被叫宽了的概念1.1 FPGA本身不就是可编程的吗很多刚入行的朋友会困惑FPGA不是本来就能编程吗Verilog、VHDL不都是编程语言这里要先把概念捋清楚。传统意义上的FPGA编程指的是用硬件描述语言HDL去定义数字电路的结构。你把一组always块、assign语句、状态机写下去工具链最终把它们映射成LUT、FF、BRAM和DSP这些底层资源之间的连接。本质上你是在设计电路只不过设计输入是文本形式的。这就像用汇编甚至微码去写程序每一行都直接对应硬件的具体动作。而软件可编程希望做到的是让开发者用C/C、 Python甚至运行时脚本去描述这个系统应该做什么而把怎么映射成电路这件苦差事交给工具链。前者关注行为后者关注结构。这个抽象层次的提升正是整个概念的核心。打一个生活化的比方传统HDL开发像是一家餐厅从种植蔬菜、养鱼、搭灶台开始准备一桌菜软件化开发则是你直接写好一份菜谱交给一个成熟的后厨团队他们知道怎么买菜、切配、掌勺。代价是后厨团队工具链会拿走一部分控制权你对每一粒盐的去向不再完全清楚。1.2 三个技术栈撑起了软件化目前行业里真正落地的软件可编程FPGA技术栈我认为可以分成三路。第一路是高层综合HLS代表工具是AMD的Vitis HLS早年叫Vivado HLS。它把C/C函数编译成RTL模块配合pragma编译指令控制流水线、数组分割、数据流等关键结构。这一路的典型场景是算法密集型任务比如图像处理、信号处理、神经网络推理中的卷积层加速。第二路是嵌入式处理器包括软核MicroBlaze、RISC-V软核和FPGA SoC里的硬核Zynq的Cortex-A9、UltraScale的Cortex-A53。它们把FPGA的PL可编程逻辑当成一个可定制的协处理外设软件通过AXI总线去读写寄存器、搬运数据。这一路最贴近传统嵌入式开发也是软件工程师上手最快的路径。第三路是运行时调度与覆写Overlay典型代表是PYNQ——它直接在Zynq上跑一个Linux发行版把PL侧的bitstream封装成Python可调用的硬件库。你可以像调用NumPy函数一样调用一个FPGA加速器。虽然生产级项目很少直接用PYNQ但它极大降低了评估和原型验证的门槛。1.3 为什么这几年才形成趋势软件可编程FPGA的概念并不新HLS在上世纪90年代就有学术原型MicroBlaze更是2002年就发布了。但真正成为主流趋势我认为有三个推手。第一个是人才结构倒逼。合格的RTL工程师远少于软件工程师而AIoT、边缘计算、通信基站的硬件加速需求却在猛增。企业发现与其让每个项目都等一个稀缺的RTL高手不如让算法工程师用C把逻辑写出来再用工具链转换成电路RTL工程师只去啃那些工具处理不了的硬骨头。第二个是FPGA容量密度到了足够大的量级。7系列、UltraScale动辄几十万到上百万的逻辑单元你不可能全部手写RTL也没有必要。把控制面、状态管理这类软件味很重的逻辑用软核跑把数据面、DSP密集运算用HLS或RTL实现才是经济合理的分工。第三个是异构SoC的成熟。Zynq把ARM处理器和FPGA fabric做到同一颗芯片里片内AXI互联把两个世界的通信延迟降到纳秒级这让软件为主、FPGA为辅的产品架构成为可能。如果你回到10年前要用两颗芯片加板级总线实现类似架构成本和复杂度都高得多。2. 先选路线再动手HLS、软核与异构SoC怎么选2.1 HLS适合算法密集型、吞吐优先的场景HLS最大的价值是把算法描述和微架构实现解耦。你的核心工作是写清楚算法逻辑然后通过pragma告诉工具这里要流水线、那里要并行拷贝、这个数组要拆成多少块剩下的调度和绑定由Vitis HLS完成。举个我做过的小例子一个N点滑动平均滤波器。手写RTL大概要画一个状态机、一组移位寄存器、一个累加器稍微复杂点还要处理流水线气泡。而用HLS写核心代码就几行void moving_average(int data_in[N], int acc[N]) { #pragma HLS PIPELINE II1 static int shift_reg[DEPTH]; int sum 0; for (int i 0; i DEPTH; i) { sum shift_reg[i]; } acc[0] sum / DEPTH; for (int i DEPTH - 1; i 0; i--) { shift_reg[i] shift_reg[i - 1]; } shift_reg[0] data_in[0]; }这段代码对CPU来说是个普通循环对HLS来说就是告诉它我希望每隔一个时钟周期就能处理一个新样本II1数据路径按你的布局布线能力自行优化。实际综合下来流水线的资源开销完全在可接受范围内开发时间比手写RTL至少省一半。但HLS不适合所有东西。凡是涉及复杂握手协议、精确到周期的接口时序、跨时钟域的精细控制比如去实现一个自定义的总线从机、一个需要逐周期对齐的通信MAC层HLS生成的代码就非常难调。这种场景我始终坚持直接用RTL。2.2 软核适合做胶水逻辑与系统控制面MicroBlaze这类软核处理器在FPGA里的角色更像是板上的小大脑管理外设初始化、解析协议帧、做链路训练状态机偶尔处理一些低速率的数据搬移。它的价值不是算力而是把复杂的状态管理从RTL状态机里解放出来。在7系列上MicroBlaze跑150MHz左右是比较稳妥的UltraScale上可以到200MHz。配上AXI互联它可以访问BRAM、GPIO、UART、SPI、I2C、中断控制器还能通过AXI DMA去搬运数据流。对于以太网管理、设备状态上报这类低速率、高复杂度控制的任务软核几乎是完美的。我习惯把软核用在一个收尾场景RTL把高速数据流变成了缓冲区里的数据包软核负责检查包头的格式、把错误包过滤掉、维护统计计数、把有效数据通过以太网口或者串口上报。这套方案比用状态机实现同一个功能代码量少一截而且逻辑清晰得多后期维护体验好很多。2.3 异构SoC是当前最软的玩法Zynq和UltraScale把双核/四核ARM和FPGA放进同一颗芯片PS处理系统和PL可编程逻辑之间通过AXI高速总线互联。这种架构下软件的主导权更大Linux跑在PS侧FPGA当成PCIe加速卡那样去用驱动程序通过AXI把寄存器映射到内存空间用户态程序直接mmap或read/write。我早期用Zynq做的一个项目PS端跑LinuxPL端放了3个加速器一个FFT IP、一个自研的滤波RTL模块、一个HLS生成的图像缩放模块。所有加速器通过AXI-Lite接口暴露寄存器软件侧做的事情就是初始化时设置参数运行时用AXI DMA把数据从DDR搬到PL计算完再搬回来。软件侧的代码本质上和操作一张网卡或GPU差不多#include fcntl.h #include sys/mman.h int fd open(/dev/axi_gpio, O_RDWR | O_SYNC); unsigned char *base mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); // 配置加速器的起始地址、长度和模式 *(volatile uint32_t *)(base 0x00) src_addr; *(volatile uint32_t *)(base 0x04) dst_addr; *(volatile uint32_t *)(base 0x08) length; *(volatile uint32_t *)(base 0x0C) 0x01; // start这套写法的好处是团队里的软件工程师可以独立维护系统应用层面硬件工程师只需要保证PL侧加速器行为正确接口做到固定的AXI寄存器规范即可。两边不需要每天对着同一份HDL代码。2.4 三条路线怎么选我的判断框架我不想给一个放之四海皆准的答案但可以分享我自己的选型判断顺序判断要点选HLS选软核选异构SoC核心任务是否是密集计算是否混合是否需要跑复杂协议栈/OS否轻量即可是团队主力是软件还是硬件工程师软件为主软件为主两者都有功耗和成本约束中低中高最终产品形态灵活FPGA控制器/桥接嵌入式计算平台如果只是在一个纯FPGA板卡上做算法加速不需要OSHLS加一个简单的MicroBlaze做控制是性价比最高的组合。如果想做带网络管理、文件系统、用户界面的设备Zynq/UltraScale是更稳的选择。至于软核我几乎每个纯FPGA项目都会塞一个哪怕只用来做上电初始化、星座图统计和固件升级都能省下大量RTL工时。3. 收发器Wizard实操7系列与UltraScale的完整配置链路3.1 为什么收发器是软件化开发绕不开的硬骨头高速串行收发器Transceiver可能是整个FPGA开发里最不软件化的部分。它涉及模拟前端、CDR时钟数据恢复、均衡器、编解码、弹性缓冲、PLL配置等一堆底层细节任何一个参数不对链路就是不通。而偏偏几乎所有带通信接口的项目都离不开它——PCIe、千兆/万兆以太网、CPRI、JESD204B、SATA、DisplayPort这些协议在FPGA侧最终都要落到一串GTP/GTX/GTH/GTY引脚上。好消息是AMD提供的收发器Wizard把这些底层配置做成了可视化界面并且针对7系列和UltraScale分别有对应的IP。坏消息是Wizard的界面选项非常多文档看得人头晕而且7系列和UltraScale两代工具的参数名称、生成接口和复位方式差异很大很容易拿着上一代的经验套下一代结果就是板子调不通。3.2 7系列GT Wizard的关键配置项在Vivado里搜索7 Series FPGAs Transceivers Wizard打开后第一屏是Transceiver Type。7系列根据器件不同会有GTP、GTX、GTZ三种最好记的区分是Artix-7一般用GTP速率最高到6.6Gbps左右Kintex-7和Virtex-7多用GTX最高到12.5GbpsGTZ只出现在带高速接口的Virtex-7 HT器件上日常项目很少碰到。这个选择直接决定了后续可配置的线速率范围选错的话后面所有选项都会受到限制。接下来几个关键页面我用一句话概括每一页的作用Line Rate目标线速率比如3.125Gbps、6.6Gbps、10.3125Gbps。这个值决定了PLL的分频系数以及参考时钟的要求。Reference Clock给收发器提供基础时钟的差分输入引脚MGTREFCLK0/MGTREFCLK1频率必须和线速率匹配比如GTX跑10.3125Gbps时参考时钟通常是156.25MHz。Wizard会提示你当前配置需要的参考时钟频率范围。Encoding and Framing8B/10B或64B/66B编码、comma对齐、字节顺序等。大多数协议都有预设比如选Ethernet预设会自动帮你把comma对齐和字节顺序配好。TX/RX Settings发送端的差分电压摆幅、预加重Pre-Emphasis接收端的均衡器RX Equalizer、终端电阻。这些参数直接影响信号完整性高速率下尤其敏感。Shared Logic7系列Wizard里有个Shared Logic in Example Design和In the Core的选择。多通道设计时QPLL、复位逻辑、时钟资源是可以在多个通道间共享的。我第一次用的时候选了In the Core结果每个通道例化了独立的PLL资源和功耗白白翻了几倍后来改成共享才正常。PLL Selection7系列GT有CPLL和QPLL两种。低速、单通道场景用CPLL就够高速一般超过6.6Gbps或需要多通道共同时钟时必须用QPLL。协议预设一般会自动选好但手动配置时要注意。生成IP后你会得到一个例化模板里面有一堆gt0_开头的端口。其中最常见的几个信号我直接列出来gt0_txusrclk_out/gt0_rxusrclk_out发送/接收用户时钟用于驱动用户逻辑的数据通路。gt0_txdata_in发送数据总线位宽由线速率和编码方式决定典型16位或32位。gt0_rxdata_out接收数据总线。gt0_txresetdone_out/gt0_rxresetdone_out复位完成信号必须在逻辑里检测到这两个信号都为高才能开始正常收发。很多第一次用7系列GT的朋友把Wizard生成的例化代码贴进去发现txusrclk_out没有任何时钟输出第一反应是查时钟约束其实最可能是复位时序没搞对。这里我先埋个伏笔后面排障章节会详细展开。3.3 UltraScale收发器Wizard的差异点UltraScale系列对应的是UltraScale FPGAs Transceivers Wizard。从这一代开始Vivado统一了收发器IP的接口命名方式改成了一套gtwiz_前缀的信号这是和7系列最大的直观差异。首先物理层收发器类型变了。UltraScale上叫GTHUltraScale上叫GTY加上更高速的GTM。GTH最高到16.3GbpsGTY可以到32.75Gbps左右GTM则面向58Gbps以上的超高速场景。gtwiz_接口带来一个我看来的最大好处复位和时钟管理被标准化了。这是UltraScale Wizard生成的顶层接口里我每次都会特别检查的几根线gtwiz_reset_all_in总复位输入复位整个收发器。gtwiz_userclk_tx_userclk_out/gtwiz_userclk_rx_userclk_out最终给用户逻辑使用的发送/接收时钟。gtwiz_userclk_tx_active_in/gtwiz_userclk_rx_active_in用户时钟有效指示不拉高的话复位逻辑不会退出。gtwiz_reset_tx_done_out/gtwiz_reset_rx_done_out复位完成信号类似7系列的txresetdone/rxresetdone。gtwiz_rxdata_out/gtwiz_txdata_in接收/发送数据总线。和7系列相比UltraScale的复位处理明显更自动了。导入IP后它会附赠一个gt_usrclk_source模块和一个gtwiz_reset模块只要你把参考时钟和复位信号接对工具帮你处理大部分复位时序。这其实是软件化思想在硬件IP层的体现——把复杂的状态机藏起来对外只暴露几个清晰的握手信号。在PLL配置上UltraScale也有变化。7系列是CPLL/QPLL二选一UltraScale每个Quad有QPLL0和QPLL1两个锁相环还有一个LCPLL可以给没有独立参考时钟的通道提供内部参考。Wizard页面里会让你选QPLL0还是QPLL1多通道项目要留意你选的是不是和例化Quad的可用PLL一致这个我后面会讲一个具体案例。3.4 从Wizard到软件可编程系统收发器只是最底层的物理通道真正让它变成软件可编程FPGA系统里的一部分需要把它接进上层的数据通路。这里我建议的架构是GT收发器→协议层PCS/PMA或者自研的链路层→AXI-Stream FIFO→AXI DMA→MicroBlaze或Zynq PS的DDR最后由软件处理数据。在7系列上如果你不想自己写PCS可以再挂一个对应的协议IP比如Aurora 8B/10B、Ethernet PCS/PMA、JESD204B。这些IP的输出天然是AXI-Stream接口直接就能接到AXI DMA上。软件侧做的事情就变成配置DMA描述符、启动传输、收到中断后取数据。我在一个项目里用MicroBlaze实现对Aurora链路的监控软件里定期读GT的状态寄存器包括CPLL锁定状态、复位完成状态、通道极性配置#include xil_io.h #define GT_STATUS_BASE 0x44A00000 void report_gt_status(void) { u32 cpll_locked Xil_In32(GT_STATUS_BASE 0x0) 0x1; u32 tx_reset_done Xil_In32(GT_STATUS_BASE 0x4) 0x1; u32 rx_reset_done Xil_In32(GT_STATUS_BASE 0x8) 0x1; xil_printf(GT: CPLL%d TXRST%d RXRST%d\r\n, cpll_locked, tx_reset_done, rx_reset_done); }这个寄存器组是我在PL侧用AXI-Interconnect把GT状态寄存器映射到某个地址后暴露给MicroBlaze的。整个链路拉通后软件工程师完全不需要关心GT的模拟参数只需要读这几个软件可读的状态位来诊断链路健康度。这其实就是软件可编程FPGA的一个缩影物理层复杂细节被封装在IP里软件只面对干净的寄存器接口。4. 收发器上电不工作的排障链路7系列与UltraScale差异4.1 先把症状归类收发器的问题通常分几类我建议先观察现象再动手查。最常见的有四种上电后txusrclk_out完全不输出或者UltraScale上的gtwiz_userclk_tx_userclk_out不产生时钟。txresetdone/rxresetdone一直为低或者UltraScale的gtwiz_reset_tx_done_out/gtwiz_reset_rx_done_out不拉高。复位正常完成但链路对端显示信号丢失RX侧无法同步不停地重新对齐。能同步但误码率很高或者眼图很烂。第四类问题大多是信号完整性和参数问题第三类多半是编码/对齐参数不匹配前两类则十有八九出在时钟和复位链路上。下面按排查顺序展开。4.2 第一步从参考时钟查起参考时钟是收发器工作的起点。检查顺序非常固定我基本不跳步。先在原理图或板级文件里确认MGTREFCLK引脚是否真的接到了对应Quad的专用参考时钟引脚而不是接到普通BANK的差分对。7系列和UltraScale都有专门的MGTREFCLK0/MGTREFCLK1引脚只有接在专用引脚上GT的PLL才能直接使用接在普通引脚上即使能布线通过也常常因路径延迟和抖动过大导致锁定失败。然后查Wizard里的Reference Clock是否和实际板上给的时钟频率一致。比如你板上提供的是125MHz参考时钟但Wizard里为了某个线速率要求可能提示你用156.25MHz这两者不匹配的话QPLL或CPLL根本锁不上。这个问题在7系列和UltraScale上我都会遇到而且工具不会报错只是PLL锁定信号永远为低。在UltraScale上还要多查一步如果你用的是QPLL确认参考时钟是否被接到了正确的QPLL参考时钟输入。UltraScale每个Quad有两组参考时钟输入QPLL0和QPLL1可以选择用哪一组。我在一个项目里把参考时钟接在了MGTREFCLK0但Wizard里给通道选了QPLL1并且让它用RefClk1结果自然锁不上IBERT里看参考时钟状态是unlocked。把QPLL1的参考时钟源改成RefClk0后问题就消失了。4.3 第二步检查复位握手信号PLL锁上、时钟起来之后最常踩的坑是复位时序。7系列的GT Wizard生成的例化代码里通常会包含一个gt_tx_reset和gt_rx_reset子模块它们负责把用户侧的复位信号转换成一长串内部复位序列。如果你没用例化模板里给的复位逻辑而是自己随便拉了一个复位信号到gt_tx_rst那txresetdone大概率永远起不来。正确做法是使用Wizard例化模板自带的复位模块或者在用户逻辑里严格等待内部状态机的复位完成信号。7系列上用户逻辑应该在检测到gt0_txresetdone_out和gt0_rxresetdone_out都拉高之后才开始向GT发送数据或接收数据。发送端尤其重要数据通路还没就绪就灌数会导致CDR混乱。UltraScale的复位逻辑更复杂但也更规范。Wizard生成的gtwiz_reset模块内部分了几级先做PLL复位再做用户时钟复位最后做数据通路复位。外部只需要给一个脉冲到gtwiz_reset_all_in然后等gtwiz_reset_tx_done_out和gtwiz_reset_rx_done_out拉高。这里有个新手几乎必踩的坑gtwiz_userclk_tx_active_in和gtwiz_userclk_rx_active_in这两根线不能一直为低。它们的作用是告诉复位逻辑用户时钟已经稳定如果这两个信号没拉高复位模块会一直停在那里等导致gtwiz_reset_tx_done_out永远不拉高。我排查过不止一个UltraScale项目现象是PL加载后GT怎么都不工作最后发现是工程师把gtwiz_userclk_tx_active_in接到了固定低电平。正确接法是参考时钟稳定后用MMCM的locked信号或者自己打几拍延时把它拉高。4.4 第三步用IBERT给物理层做体检如果时钟和复位都正常但链路还是不通或误码高这时候就别猜了直接用IBERT工具。Vivado里有IBERT 7 Series GTX和IBERT UltraScale GTH/GTYIP叫法是跟着器件走的。把这个IP加入到工程里它会自动扫描当前器件上的GT位置生成一个专门用于物理层测试的bitstream。把bitstream下载到板子后在Vivado Hardware Manager里打开Serial I/O Analyzer你就能看到所有GT通道的实时状态。IBERT能做的事非常关键检查每个通道的MPLL/QPLL锁定状态。查看TX和RX的摆幅、均衡器设置。做回环测试近端回环、远端回环确定问题是出在板级链路还是FPGA侧。扫眼图能看到接收端的眼高、眼宽、水平容限这是判断信号完整性最直观的手段。我在一个GTX跑10.3125Gbps的项目里对端接收老是不稳定IBERT一测发现在目标频率上的眼图接近闭合。调了两档RX均衡器、加大TX差分摆幅之后眼图重新打开问题消失。这种问题靠仿真根本复现不出来只能靠IBERT在真实板卡上测。4.5 7系列和UltraScale的排障差异总结排障逻辑大体一致但两代器件的表现形式不同我简单总结排障点7系列表现UltraScale表现参考时钟错误QPLL/CPLL锁定信号低PLL锁定信号低IBERT显示unlocked复位时序错误txresetdone/rxresetdone不拉高gtwiz_reset_tx_done/rx_done不拉高用户时钟未激活无对应信号主动检查gtwiz_userclk_tx_active_in未拉高导致复位卡死多通道PLL分配共享QPLL需手动配QPLL0/QPLL1选择错误外加一个跨两代通用的心得拿到一个全新的收发器板卡第一件事永远是用IBERT做一遍全通道扫描而不是先跑业务逻辑。IBERT把物理层和逻辑层分开验证能帮你省掉后面至少一半的排查时间。5. 软件化FPGA的性能边界与我的工程体会5.1 HLS和手写RTL的差距到底有多大很多硬件工程师对HLS的疑虑是性能。我自己的实测数据一个中等复杂度的图像滤波算法手写RTL综合后的LUT/FF用量如果算作1Vitis HLS默认优化下大概是1.3到1.8倍通过仔细的pipeline和数组分割pragma优化可以压到1.2倍以下。时钟频率方面如果数据通路足够规范HLS跑到和手写RTL接近的频率比如200MHz是常见的但追求极限频率300MHz时HLS生成代码的布局布线经常成为瓶颈。我的结论是HLS比较适合算法架构期和快速交付期。如果项目生命周期很长或者这个模块会一直待在性能关键路径上那手写RTL依然值得如果模块只占整个系统的一小部分算法还可能频繁迭代HLS的维护成本优势是非常明显的。我现在的做法是混合核心数据通路RTL周边计算和协议适配HLS控制逻辑交给软核。5.2 软件工程师容易忽视的时序约束软件背景的工程师第一次完整做一个FPGA工程最常翻车的地方其实是约束。软件里你写一个函数编译器自动帮你分配栈和寄存器FPGA里你写一段逻辑工具链必须知道每个信号应该被约束在哪个时钟域、是否需要跨时钟同步否则它会在一个看起来没问题的路径上做出错误的优化。举一个我见过很多次的错误软件工程师把HLS生成的IP接入到一个AXI系统里觉得功能仿真都过了就直接上板结果实际运行偶发数据错误。最后查下来是HLS IP的主时钟和AXI互联时钟不是同一个MMCM输出两个时钟域之间的异步FIFO没做好约束导致时钟关系被工具错误假设为同步布局布线时出现亚稳态风险。所以在软件化FPGA项目里我会建议软件背景的同事至少掌握三件事一是给每个时钟域命名并正确声明create_clock二是跨时钟域的同步器要显式地加set_false_path或set_clock_groups -asynchronous三是用set_input_delay/set_output_delay约束外部接口时序。这三步不需要很深的理论但能避开90%的上板稳定性问题。5.3 软件化FPGA最终的落点在哪里聊了这么多我最想表达的一点是软件可编程FPGA并不是要用C替代Verilog也不是要让软件工程师取代硬件工程师而是把工程分工重新划了一条线。Fabric的基础逻辑、高速收发器的物理链路、时序收敛这些硬能力依然需要懂底层的人来保证但系统架构、协议处理、设备管理、算法验证这些软能力可以放心地交给软件侧的团队。回想这几年我觉得这套范式真正的价值是让FPGA从一个只有少数硬件专家能驾驭的器件变成了一个软件团队也能用起来的加速平台。这也是我认为Software-Programmable FPGAs这个方向会持续走下去的原因。最后分享一个小建议如果你正要从纯RTL转向软件化开发别一上来就学一堆工具。先从MicroBlaze加AXI GPIO跑通一个串口点灯开始再在Zynq上用PYNQ跑一个Python控制的LED闪烁然后再用Vitis HLS把一个简单的FIR滤波器跑起来。这三步走完你对软件控制硬件的直觉就建立起来了后面再回头去啃收发器Wizard、时序约束这些硬骨头你至少知道它们在整个系统里处于什么位置。这套路我带着好几个完全没有FPGA经验的人走过基本都能在两个月内上手做项目。
返回列表