从C/C++到FPGA硬件加速:Xilinx HLS核心概念与实战优化指南
1. 从软件思维到硬件思维的跨越为什么需要HLS如果你和我一样是从软件或者嵌入式开发转过来接触FPGA的最开始那段时间脑子里肯定充满了各种问号。写惯了C/C习惯了“顺序执行、内存读写”的思维模式突然要面对Verilog/VHDL里那些“并行执行、时钟驱动、资源有限”的概念感觉就像从平地一下子被扔进了迷宫。寄存器、时序、流水线、面积优化……每一个词都像一堵墙。我最初学FPGA时一个简单的矩阵乘法用Verilog写出来动辄几百行调试起来更是痛苦一个时钟没对齐结果就全错了。这就是传统RTL寄存器传输级设计的门槛。它要求开发者必须具备深厚的硬件描述语言功底和硬件架构思维开发周期长验证复杂。而Xilinx HLSHigh-Level Synthesis高层次综合的出现就是为了打破这堵墙。它的核心思想很简单让你用C、C或者SystemC这种高级语言来描述算法功能然后由工具自动将其转换成对应的RTL代码Verilog/VHDL。听起来是不是很美好但别急着把它当成“一键生成硬件”的魔法。HLS不是一个黑盒你写进去垃圾C代码它吐出来的大概率也是垃圾硬件。它的价值在于它提供了一座桥梁让你可以先用熟悉的软件思维快速完成算法建模、功能验证和性能评估然后再用硬件思维去指导HLS工具进行优化。你可以把HLS看作一个“硬件编译器”它理解你的C代码意图并将其“翻译”成并行的硬件电路。你的工作就从手写每一根连线变成了“教”这个编译器如何更高效地翻译。所以这篇笔记不是HLS的官方手册复读机而是我作为一个从软件转过来的学习者在实战中踩坑、总结后梳理出的核心认知和实操要点。我们会避开那些枯燥的理论直接切入“怎么用”和“为什么这么用”目标是让你看完后能真正动手用HLS解决一个实际问题。2. HLS工具链初探Vivado HLS与Vitis HLS的抉择刚开始接触时你可能会被Xilinx的两个工具搞迷糊Vivado HLS和Vitis HLS。它们是什么关系该用哪个简单来说Vivado HLS是“经典版”Vitis HLS是“新一代集成版”。Vivado HLS是一个相对独立的工具专注于将C/C代码综合成RTL IP核然后你可以把这个IP核导入到Vivado Design Suite中进行完整的FPGA系统集成。它的界面、流程都自成一体。而Vitis HLS则是Xilinx统一软件平台Vitis的重要组成部分。它被深度集成在Vitis IDE中不仅支持传统的IP核生成更侧重于面向Vitis平台包含FPGA逻辑和处理器系统的异构计算应用开发。对于纯FPGA逻辑开发两者功能上大部分重叠但Vitis HLS是未来的方向它支持更新的语言特性如C14/17的部分特性并且与Vitis flow尤其是数据中心和边缘AI应用结合得更紧密。我的选择建议是直接上手Vitis HLS。除非你维护的是一个非常老旧的、基于Vivado HLS 2018.3以前版本的项目否则新项目都建议从Vitis HLS开始。它的安装包就包含在Vitis统一安装器中避免了单独安装配置的麻烦。更重要的是熟悉Vitis HLS的流程对你后续探索更广泛的Vitis应用如用AI Engine做主机-设备通信有直接的帮助。安装好Vitis后启动Vitis IDE选择创建“HLS Component”项目你就进入了HLS的开发环境。界面主要分为三块源代码区、综合报告区和调试控制台。别被那些按钮吓到我们最开始只需要关注几个核心文件project_name.cpp和project_name.h这是你的顶层设计文件里面包含了要被综合成硬件的函数。testbench.cpp这是你的测试平台文件用纯软件的方式验证你硬件函数的功能是否正确。这是HLS开发流程中极其重要的一环因为硬件综合耗时很长我们必须先在软件层面保证功能百分百正确。solution.cfg或directives.tcl这里存放着你给HLS工具的“优化指令”Directives比如告诉它某个循环要展开某个数组要用什么类型的存储器实现。这是发挥HLS威力的关键。3. 第一个HLS“Hello World”从函数接口开始理解硬件我们不写“Hello World”那对硬件没意义。我们来做一个有实际硬件意义的入门例子一个带流水线操作的累加器。假设我们需要计算一个数组中所有元素的和。在纯软件里这太简单了int sum_sw(int arr[N]) { int total 0; for(int i 0; i N; i) { total arr[i]; } return total; }在CPU上这个循环会一个接一个地执行。但在硬件里我们可以让每次加法操作几乎同时发生流水线或者让多个加法器并行工作循环展开从而极大提升速度。用HLS来实现第一步是定义硬件接口。// sum_hw.h #ifndef _SUM_HW_H_ #define _SUM_HW_H_ #include ap_int.h // 可选用于定义任意位宽整数如ap_int32 #define N 1024 // 顶层函数将被综合为硬件模块 void sum_hw(int in_arr[N], int* out_sum); #endif// sum_hw.cpp #include sum_hw.h void sum_hw(int in_arr[N], int* out_sum) { #pragma HLS INTERFACE modes_axilite portreturn bundleCTRL // 函数本身作为AXI-Lite从接口 #pragma HLS INTERFACE modes_axilite portin_arr bundleCTRL #pragma HLS INTERFACE modes_axilite portout_sum bundleCTRL int sum 0; for(int i 0; i N; i) { #pragma HLS PIPELINE II1 // 关键指令对循环应用流水线目标初始间隔为1个时钟周期 sum in_arr[i]; } *out_sum sum; }看到那些以#pragma HLS开头的行了吗这就是给HLS编译器的“优化指令”。我们来拆解一下INTERFACE指令它定义了硬件模块与外部世界通信的接口。这里我们指定了modes_axilite即AXI-Lite总线接口。这是连接FPGA逻辑与处理器如ARM Cortex-A最常用、最简单的总线协议。bundleCTRL表示这些信号被打包到一个名为CTRL的接口组里。接口定义是HLS与纯C编程第一个巨大的不同点你必须明确数据怎么进来结果怎么出去。PIPELINE指令这是性能优化的核心。它告诉工具将这个循环体实现为一个流水线。II1是“Initiation Interval”的缩写目标是每1个时钟周期就能开始处理一个新的循环迭代即吞吐率为1。理想情况下处理N个数据大约需要 N 流水线深度 个周期而不是N*单个操作周期。写完硬件函数必须写测试平台验证它// testbench.cpp #include iostream #include sum_hw.h #include sum_sw.h // 软件版本用于对比 int main() { int hw_result, sw_result; int test_array[N]; // 1. 初始化测试数据 for(int i 0; i N; i) { test_array[i] i 1; // 1, 2, 3, ..., N } // 2. 调用软件函数黄金参考 sw_result sum_sw(test_array); // 3. 调用HLS生成的“硬件函数”此时还是在CPU上运行的C仿真 sum_hw(test_array, hw_result); // 4. 对比结果 if(hw_result sw_result) { std::cout TEST PASSED! HW Sum: hw_result std::endl; return 0; } else { std::cout TEST FAILED! SW Sum: sw_result , HW Sum: hw_result std::endl; return 1; } }在Vitis HLS中你首先运行“C Simulation”这会在你的电脑CPU上执行这个测试平台调用你的sum_hw函数此时还是普通的C函数。如果测试通过你才能进入下一步综合。4. 综合、优化与性能评估读懂HLS的报告点击“C Synthesis”工具开始将你的C代码转化为RTL。这个过程可能从几十秒到几十分钟不等取决于设计复杂度。综合完成后重中之重是阅读综合报告。报告里藏着评估你设计好坏的所有秘密。报告通常会告诉你以下几个关键指标时序Timing你的设计能跑到的最高时钟频率Clock TargetvsEstimated Clock Period。如果估计周期大于目标周期说明逻辑路径太长时序违例你需要优化。资源利用率Utilization Estimates使用了多少FPGA上的资源。LUT查找表实现组合逻辑的基本单元。FF触发器存储单元用于寄存器。DSP数字信号处理器硬核乘法器、累加器做乘加运算效率极高。BRAM块RAM片上存储器用于实现数组。性能预估Performance EstimatesLatency延迟从输入有效到输出有效总共需要多少个时钟周期。Interval间隔函数两次被调用之间需要间隔的最小周期数。对于流水线设计这个值应该很小接近1。对于我们这个累加器例子报告可能会显示因为循环依赖下一次累加需要上一次的结果PIPELINE II1的目标可能无法达成工具会报告一个实际的II比如2或3。这意味着由于数据依赖硬件无法真正做到每个时钟都开始一次新的加法。如何优化这时就需要更高级的指令或代码重构。例如我们可以尝试“循环展开Unroll”void sum_hw_unroll(int in_arr[N], int* out_sum) { #pragma HLS INTERFACE modes_axilite portreturn bundleCTRL #pragma HLS INTERFACE modes_axilite portin_arr bundleCTRL #pragma HLS INTERFACE modes_axilite portout_sum bundleCTRL int sum 0; for(int i 0; i N; i4) { // 每次步进4 #pragma HLS UNROLL factor4 // 将循环体复制4份 // 注意为了简单演示这里假设N是4的倍数。实际需要处理边界。 sum in_arr[i] in_arr[i1] in_arr[i2] in_arr[i3]; } *out_sum sum; }UNROLL指令会把循环体复制多份实现并行计算。这能大幅减少延迟但代价是消耗更多的资源4个加法器。你需要根据报告在性能速度和资源面积之间做权衡。这就是硬件设计的核心思维时空权衡。5. 内存架构的映射数组不是数组是RAM或FIFO在C语言里数组就是一块连续的内存。在HLS生成的硬件里一个数组可能被实现成多种不同的硬件结构这对性能和资源影响巨大。默认实现RAM中等大小的数组HLS默认会综合成FPGA上的块RAMBRAM或分布式RAM用LUT实现。访问它像访问内存一样有地址线和数据线。FIFO流接口如果你希望数据像流水一样顺序处理可以使用hls::stream模板类并配合INTERFACE modeaxisAXI-Stream指令。AXI-Stream是高性能数据流的理想选择没有地址概念只有数据、有效和就绪信号。寄存器非常小的数组比如几十个元素可以完全展开成寄存器实现极低的访问延迟。一个关键指令是ARRAY_PARTITIONint buffer[1024]; #pragma HLS ARRAY_PARTITION variablebuffer complete dim1这条指令会把buffer这个数组完全分割complete成1024个独立的寄存器。这彻底消除了访问冲突允许并行访问所有元素但会消耗巨量的寄存器资源通常只用于小的查找表或系数表。更常见的是块分割block或循环分割cyclic#pragma HLS ARRAY_PARTITION variablebuffer block factor4 dim1这会把1024深度的数组分割成4个并行的、每个256深度的存储器。这样在一个时钟周期内最多可以同时访问4个不同的数据元素如果地址合适常用于配合循环展开提升数据供给带宽。我的经验是不要一开始就盲目分区。先让HLS默认综合看报告里哪些数组成为了性能瓶颈访问冲突导致II增大。然后针对性地对关键数组进行适度分区。资源报告会明确告诉你数组被实现成了多少BRAM或LUTRAM。6. 数据类型的精打细算位宽优化在软件中我们习惯用int32位、float单精度浮点。在硬件中每一个比特都消耗资源。HLS支持任意精度的整数类型通过ap_intN,ap_uintN和定点数类型ap_fixedW, I。例如如果你的数据范围在0到1000之间用ap_uint1010位无符号整数就足够了比用32位的int节省22个触发器每个信号位宽减少1节省1个FF。#include ap_int.h void process_data(ap_uint10 input, ap_uint10 *output) { // ... 处理逻辑 }使用更小的位宽不仅能节省存储资源FF、BRAM还能减少数据通路的宽度可能提升时序性能。但要注意位宽缩窄可能导致溢出需要你在算法层面确保安全。HLS工具对ap_int类型的运算支持很好但会生成更复杂的逻辑。对于定点数ap_fixed你需要确定整数位宽I和小数位宽F总位宽WIF。这需要你对数据的动态范围和精度有清晰的了解。定点数运算比浮点数快得多、省资源得多是很多信号处理、图像处理算法的首选。7. 实战避坑指南那些官方手册里不会细说的坑踩过无数坑后我总结了几条血泪教训坑1测试平台Testbench的完备性远比你想象的重要。HLS的C仿真速度很快这是巨大的优势。但如果你的测试平台覆盖不全一个隐藏的bug被综合成硬件后再想调试就难如登天了。硬件调试需要重新综合、布局布线、生成比特流、上板测试一个循环可能几小时就过去了。注意测试平台不仅要测正常数据还要测边界情况如最大值、最小值、空输入、异常数据。对于有数据流的设计要测试背压back-pressure情况即下游模块不ready时上游模块的行为是否正确。坑2理解“仿真”、“综合”、“协同仿真”的区别。C仿真C Simulation在CPU上跑纯软件代码验证算法逻辑。快必须做。C综合C Synthesis将C代码转为RTL生成预估报告。看性能和资源。C/RTL协同仿真Co-Simulation用生成的RTL代码在仿真器如ModelSim、VCS里运行测试平台通过事务级接口与RTL模块通信。最接近真实硬件行为但速度慢。对于复杂设计建议至少对关键模块做协同仿真以验证接口时序是否正确。坑3循环依赖是性能杀手。就像我们累加器的例子如果循环体里本次计算依赖于上一次的结果真依赖流水线的II就很难做到1。解决方法是尝试“循环展平”如果有多层循环或者重构算法减少依赖。有时引入一个小的临时数组做缓冲打破依赖链是值得的。坑4函数内联Inline与层次化。默认情况下HLS会尽量内联函数调用以减少调用开销。但对于大的、重复使用的子功能内联会导致代码重复增大面积。你可以用#pragma HLS INLINE off来禁止内联将其综合成一个独立的硬件模块在顶层例化多次。这有利于资源复用和代码管理。坑5接口协议的理解不到位。如果你选择AXI-Lite接口要记住它是内存映射的每次读写都有地址。主机如CPU需要像写内存一样配置你的IP核。而AXI-Stream是流式的没有地址数据源源不断。混用接口协议会导致系统无法连接。在写驱动或主机代码时必须严格按照你定义的接口协议来操作。8. 从HLS IP到完整系统在Vivado中集成HLS综合成功后会生成一个.zip文件IP核。你可以在Vivado IP Integrator中像添加其他IP一样把它添加到你的Block Design中。在Vivado中点击“Settings - IP - Repository”添加你的HLS项目所在的solution/impl/ip文件夹。在Diagram中右键选择“Add IP”搜索你的IP核名称添加进来。连接时钟、复位以及你定义的接口如AXI-Lite到Zynq处理器的AXI互联网络AXI-Stream连接到其他视频处理IP。运行“Generate Output Products”和“Create HDL Wrapper”。继续完成常规的布局布线、生成比特流。关键一步HLS生成的IP核会带有一个驱动文件.c和.h在SDK或Vitis里开发运行在处理器上的软件程序时需要包含这些驱动文件。驱动里提供了像XYourIp_Initialize(),XYourIp_Start(),XYourIp_Set_input_r()这样的函数让你可以方便地控制这个硬件加速器。走到这一步你就完成了一个完整的、从C算法到FPGA硬件加速器的闭环。当你看到软件调用硬件函数速度获得几十上百倍的提升时那种成就感是单纯写软件无法比拟的。HLS不是一个让你逃避硬件知识的工具而是一个让你能站在更高抽象层次去思考硬件设计的利器。它要求你既懂算法又懂硬件架构的基本约束。最开始的学习曲线可能依然陡峭但一旦你掌握了它FPGA开发的效率和灵活性将得到质的飞跃。我的建议是从一个确定的小算法模块开始比如一个图像滤波器、一个CRC校验模块完整地走通整个流程C建模、测试平台、HLS综合优化、Vivado集成、上板验证。这个完整的成功经验会比看十篇教程都管用。

相关新闻

GPU压力测试终极指南:使用gpu-burn验证硬件稳定性与散热可靠性

GPU压力测试终极指南:使用gpu-burn验证硬件稳定性与散热可靠性

1. 项目概述:为什么我们需要“终极”的GPU压力测试?在深度学习、科学计算和高性能渲染领域,GPU已经成为了不可或缺的核心算力。无论是训练一个百亿参数的大模型,还是进行复杂的流体动力学模拟,一块或多块GPU的稳定性和…

2026/8/13 5:02:32 阅读更多 →
从AI对话到结构化文档:基于提示工程与MCP的自动化生成引擎构建

从AI对话到结构化文档:基于提示工程与MCP的自动化生成引擎构建

你是不是也遇到过这样的场景:花了大半天时间,在 ChatGPT 或 Claude 里和 AI 来回对话,终于打磨出了一份完美的产品需求文档、一份详尽的技术方案,或者一份清晰的会议纪要。然后,你不得不手动复制粘贴对话内容&#xff…

2026/8/13 5:02:30 阅读更多 →
LLM引导式生成实战:用更少Token实现结构化输出控制

LLM引导式生成实战:用更少Token实现结构化输出控制

在大型语言模型(LLM)应用开发中,如何高效、精准地控制模型输出,使其严格遵循预设的格式、逻辑或约束,一直是开发者面临的挑战。传统的提示工程(Prompt Engineering)方法,如详细描述、…

2026/8/13 5:01:30 阅读更多 →

最新新闻

如何用HsMod插件彻底改变你的炉石传说游戏体验:60+功能完全指南

如何用HsMod插件彻底改变你的炉石传说游戏体验:60+功能完全指南

如何用HsMod插件彻底改变你的炉石传说游戏体验:60功能完全指南 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 想在炉石传说中获得前所未有的游戏自由度和个性化体验吗&#xf…

2026/8/13 8:56:56 阅读更多 →
视频编码码率控制模式详解:从CBR到QVBR的实战选型指南

视频编码码率控制模式详解:从CBR到QVBR的实战选型指南

1. 从一次深夜告警说起:为什么码率控制不是玄学 那天凌晨两点,我被一阵急促的告警电话吵醒。线上一个核心直播服务突然出现大规模卡顿,用户投诉像雪花一样涌来。登录监控一看,CDN带宽曲线像过山车一样剧烈波动,峰值时直…

2026/8/13 8:56:56 阅读更多 →
Windows 11右键菜单改回Win10样式:注册表、组策略与第三方工具全解析

Windows 11右键菜单改回Win10样式:注册表、组策略与第三方工具全解析

1. 项目概述:为什么我们总想“回到过去”? 每次操作系统大版本更新,微软总会在用户界面上做一些“大胆”的改动,Windows 11的右键菜单就是最典型的例子。作为一名从Windows 95时代一路用过来的老用户,我对这个新右键菜…

2026/8/13 8:56:56 阅读更多 →
spring-data-jpa-2.3.9 版本 <S extends T> List<S> saveAll(Iterable<S> var1);

spring-data-jpa-2.3.9 版本 <S extends T> List<S> saveAll(Iterable<S> var1);

saveAll 是 JpaRepository 提供的一个用于批量保存实体的方法,其核心功能是:遍历迭代器中的每个实体,根据其 ID 状态决定执行 persist(新增)还是 merge(更新),最终返回所有已保存的实…

2026/8/13 8:56:56 阅读更多 →
spring-data-jpa-2.3.9 版本中,JpaRepository 的 findAllById(Iterable<ID> var1)

spring-data-jpa-2.3.9 版本中,JpaRepository 的 findAllById(Iterable<ID> var1)

spring-data-jpa-2.3.9 版本中&#xff0c;JpaRepository 的 findAllById(Iterable<ID> var1) 方法会根据传入的 ID 集合&#xff0c;查询出所有匹配的实体&#xff0c;并以 List<T> 的形式返回。这个方法的行为很直接&#xff1a;它等价于执行一个 IN 查询&#x…

2026/8/13 8:56:56 阅读更多 →
云苍穹RK3576开发资料大全:嵌入式物联网开发实战指南

云苍穹RK3576开发资料大全:嵌入式物联网开发实战指南

1. 项目概述&#xff1a;为什么你需要一份“云苍穹”开发资料大全&#xff1f; 如果你是一名嵌入式或物联网方向的开发者&#xff0c;最近在项目选型时&#xff0c;肯定对“云苍穹”这个名字不陌生。它不是一个具体的芯片型号&#xff0c;而更像是一个围绕特定核心平台&#xf…

2026/8/13 8:55:56 阅读更多 →

日新闻

Visual Studio新建项目解决方案为空:系统性排查与修复指南

Visual Studio新建项目解决方案为空:系统性排查与修复指南

1. 问题现象与本质剖析如果你是一位.NET开发者&#xff0c;或者正准备踏入这个领域&#xff0c;那么Visual Studio&#xff08;后面简称VS&#xff09;绝对是你绕不开的伙伴。但有时候&#xff0c;这个伙伴会跟你开一个不大不小的玩笑&#xff1a;你满怀期待地点击“创建新项目…

2026/8/13 0:00:09 阅读更多 →
长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

说实话,每次提起“长春建设厅网站”这几个字,我心里都挺有感触的。不是因为它有多高大上,也不是因为那里藏着什么不可告人的秘密,恰恰相反,是因为它太“接地气”了,或者说,它是咱们普通人想要在这个城市好好生活、安稳买房时,必须得翻过的一座“数据山”。很多新朋友第…

2026/8/13 0:00:09 阅读更多 →
Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南&#xff1a;RDPWrap终极解决方案 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 你是否曾为Windows家庭版无法支持多用户远程桌面…

2026/8/13 0:00:09 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑&#xff1a;baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码&#xff08;维护中 rm repo&#xff09; 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片&#xff1a;Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 1:11:09 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身&#xff0c;而应重视模型外的系统搭建&#xff0c;即Harness。提出AgentModelHarness的实用公式&#xff0c;详细介绍Harness的四个层次&#xff1a;持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/12 1:11:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/12 1:11:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →