FPGA高扇出网络时序优化:从XDC约束到RTL寄存器复制的完整实战
做FPGA设计久了你会发现一个特别有意思的现象同一段RTL不同的人做的约束策略不一样出来的时序结果可能天差地别。有一回我排查一个图像缩放工程的关键路径查来查去最后发现罪魁祸首就是一个扇出fanout超过500的使能信号。当时我就在Vivado里写了一条set_property MAX_FANOUT的XDC约束但综合、实现跑完时序没改善多少问题根本没解决。后来才搞清楚扇出约束这事儿远不是写一行约束那么简单它牵扯到综合策略、实现阶段的物理优化、代码里寄存器的组织方式甚至复位信号的专门处理。这篇文章就把我从XDC约束写到代码优化的完整排查经验梳理一遍把扇出约束这个专题讲透。1. 扇出到底指什么一个信号驱动到底有多难1.1 先搞清楚工具里的Fanout是怎么统计的扇出的字面意思很直白就是一个寄存器输出端信号所驱动的负载单元数量。但FPGA里负载不完全等于LUT端口它还包括DSP、BRAM、进位链、甚至IOB等资源。比如一个寄存器输出同时接到了20个LUT的输入、5个DSP的CE端口、还有8个触发器复位端那这个网络的扇出就是33。在Vivado里看扇出最直接的方式是打开综合后的原理图Schematic选中任意一根网络属性面板里就会显示Fanout值或者用Tcl命令查询get_property FANOUT [get_nets valid_global]不过要注意综合阶段的扇出统计和布局布线后的扇出统计不完全一致。综合工具看到的逻辑连接关系是理想化的而布局布线后由于物理优化phys_opt_design可能复制寄存器、重映射逻辑网络的扇出会有变化。所以排查时序问题时应该以实现后的报告为准尤其是report_design_analysis里列出的高扇出网络High Fanout Nets。1.2 高扇出为什么会让时序爆炸扇出高为什么会影响时序我用一句话概括驱动一个负载和驱动五百个负载信号翻转时需要充放电的电容差了两个数量级延迟自然就上去了。放到FPGA内部看这个过程会更具体。一个寄存器的输出Q要送到下一级寄存器的D端口信号从Q端出来后会先走一段可控的布线资源经过可编程开关矩阵Switch Matrix中转再逐级扇出到各个LUT的输入。扇出越高需要经过的开关节点越多RC寄生效应越明显网络延迟Net Delay就会变大。这个Net Delay在时序报告里体现得很直观——路径延迟从几百皮秒涨到几纳秒配合组合逻辑延迟直接吃掉整个时钟周期的预算。另外高扇出还会带来一个隐蔽问题叫偏移Skew。信号驱动多个负载时由于各负载的布线路径长度不一致信号到达各自负载的时间会有差异。对数据信号来说这个Skew会让后一级的建立时间裕量变差对复位信号来说Skew会让不同寄存器的复位释放时刻不一致严重时直接导致功能错误。我个人的经验阈值是这样的普通数据信号扇出超过100就该留心使能类信号、复位信号、模式配置信号只要上200就建议主动干预。Vivado默认把扇出超过1000的网络定义成High-Fanout Net但如果真想等项目跑到那一步再去优化时序早就飞了。2. XDC扇出约束的正确写法set_property MAX_FANOUT的语法与生效范围2.1 约束语法和作用对象XDC扇出约束的核心命令就一条语法非常简洁set_property MAX_FANOUT 50 [get_nets valid_global]这里MAX_FANOUT指定的数值是工具允许保留的最大扇出数等于告诉综合器和实现工具这个网络驱动超过50个负载时你就要想办法复制源端寄存器把负载拆开。这个属性的作用对象比较灵活可以是网络net、单元引脚cell pin、甚至是顶层端口port。日常用得最多的是网络和引脚。比如约束某个寄存器输出引脚的扇出set_property MAX_FANOUT 20 [get_pins u_ctrl_sync/en_ff_reg/C]注意这里的引脚指的是驱动管的输出引脚不是负载端的输入引脚。如果手滑选成了负载端的输入引脚这条约束基本不会生效因为工具复制寄存器时关心的是源端驱动能力。2.2 综合阶段和实现阶段的约束行为差异很多人以为写了XDC约束综合和实现都会自动遵守。但实际Vivado处理MAX_FANOUT的方式有阶段差异综合阶段Vivado综合器Vivado Synthesis会把MAX_FANOUT当作逻辑复制的参考依据。综合时遇到高扇出网络如果设置了MAX_FANOUT工具会自动复制源端寄存器生成多份逻辑相同的寄存器来分担负载。实现阶段布局布线前Vivado会对整个设计做时序预估。这里的物理优化phys_opt_design也会根据MAX_FANOUT做进一步的寄存器复制或合并。但物理优化更关注实际布局的拥塞程度和时序瓶颈它可能会把综合阶段复制出来的寄存器重新合并——如果它判断复制反而会导致布局更拥挤、路径更长。布局布线后布线阶段基本不再做寄存器复制。这个阶段再大量调整逻辑结构已经不现实了所以扇出约束必须在布局前完成布局。这个阶段差异直接影响了你排查问题的思路。比如综合后打开原理图扇出已经变小了但实现完一查又变回去了那大概率是物理优化重新合并了这些复制寄存器的结果。2.3 一个典型的约束配置案例假设工程里有一个时钟使能信号ce_mult驱动了96个乘法器的CE端口时序报告显示这条路径是瓶颈。我的常见做法是分两步走第一步先在XDC里添加MAX_FANOUT约束set_property MAX_FANOUT 32 [get_nets ce_mult]第二步在综合设置里确认没有强制关闭高扇出优化。如果是用综合策略Synthesis Strategy默认的Flow_PerfOptimized_high高扇出复制默认开启如果用了某些追求面积的策略工具可能会优先省寄存器而不主动复制。接着跑综合看综合网表里该网络的扇出是否降到了32以内。如果降下来了说明综合阶段约束生效如果没降需要进入下一章的排查流程。3. 写了约束却没效果的常见原因约束失效的完整排查链路3.1 排查链路第一步确认约束有没有作用到目标对象上我自己踩过的一个坑是在XDC里写了set_property MAX_FANOUT 50 [get_nets valid_global]但综合后打开原理图一看valid_global网络还是三百多负载。排查第一步就是检查get_nets到底选中了什么对象。综合器在处理RTL时会给很多中间信号自动生成新名字原始RTL里的信号名可能被加了后缀比如valid_global_reg_0_0。这个时候你用get_nets valid_global可能选中的是一个中间层次的名字而驱动负载的实际网络名已经变了。解决办法是用通配符set_property MAX_FANOUT 50 [get_nets -hierarchical *valid_global*]-hierarchical选项会递归寻找所有层级的网络通配符*能匹配中间生成的名称。加了这个选项之后大概率能选中真实的目标网络。3.2 排查链路第二步区分综合阶段和实现阶段的布局行为还有一种情况综合阶段约束确实生效了原理图里网络扇出变成了50以内但实现完查看最终布线结果扇出又涨回去了。原因就是我在第2章提到的物理优化重新合并了寄存器。这时候你需要查实现日志搜索关键词replicating register或者register duplication。Vivado的phys_opt_design在判断某个寄存器复制后对时序无益或让布线拥塞恶化时会撤销综合阶段的复制。常见触发条件是复制出的寄存器分散太远导致源端到各副本的路径变长或者布局资源紧张副本没有合适位置放置。面对这种情况我的建议是不要只依赖MAX_FANOUT约束改用下一章的代码优化手段把寄存器复制落实到RTL层面。3.3 排查链路第三步检查OOC模块综合的XDC加载情况这条经验主要针对使用Out-Of-ContextOOC方式综合子模块的工程。OOC模式单独综合子模块时主工程的XDC约束默认是不加载进来的。这意味着你在顶层XDC里写的MAX_FANOUT约束对OOC子模块内部网络根本不生效。如果子模块内部确实有高扇出网络需要在子模块的XDC文件里单独设置约束或者在综合设置中将该模块的XDC文件加入。Vivado的OOC综合有一个选项叫-include_optimization或者在子模块的约束文件里直接加同一条MAX_FANOUT属性。这一步非常容易漏我见过不少团队因为OOC子模块的扇出约束缺失导致综合结果和全工程实现结果不一致。排查这条链路时一个直接的手段是在综合后打开子模块原理图检查目标网络的扇出。如果约束没加载就该去子模块的XDC里补上。4. 代码层面的扇出优化手段从源头拆解高扇出网络4.1 手动复制寄存器最直接的拆分方式很多人把扇出优化的希望全寄托在工具的自动复制上但工具毕竟是工具它不会理解设计的功能意图复制的时机、位置也不一定理想。到项目后期遇到反复无法收敛的扇出问题我的做法往往是回到RTL手动复制寄存器。看一个例子原始代码里有一个全局使能信号always (posedge clk) begin if (~rst_n) begin valid_ff 1b0; end else begin valid_ff valid_src; end end // valid_ff 输出驱动了200多个运算单元的使能端口要把它拆成4份用generate循环可以少写很多重复代码(* KEEP TRUE *) reg [3:0] valid_ff; genvar i; generate for (i 0; i 4; i i 1) begin : valid_copy_gen always (posedge clk) begin if (~rst_n) begin valid_ff[i] 1b0; end else begin valid_ff[i] valid_src; end end end endgenerate复制出来后每个valid_ff[i]只驱动四分之一负载扇出直接从200降到50左右。需要注意两点第一(* KEEP TRUE *)属性告诉综合器保留这组寄存器不要因为逻辑等价又把它合并回去。我见过不写这个属性综合器自作主张把4份寄存器合并成1份扇出问题原样复现。第二复制出的多份寄存器之间会存在时钟Skew但对使能类控制信号来说几百皮秒的偏差通常不影响功能。如果是对时序敏感的跨时钟域信号不建议这样简单复制需要另行设计。手动复制寄存器在物理上还有额外好处你可以在RTL里就有意识地规划寄存器摆放位置。比如最好把4份寄存器分散在运算阵列的不同象限这样到各自负载的布线会比较短。工具复制的时候不一定能完美做到这一点。4.2 复位信号的扇出处理一套专门的打法复位信号是FPGA里最容易出现超高扇出的网络没有之一。芯片上电后一个全局复位要同时驱动几万个触发器这种扇出用普通的MAX_FANOUT约束根本处理不了——你不可能让工具复制几十万份复位寄存器那会让资源爆炸。处理复位信号的头号选择是用全局时钟资源。Vivado里全局复位信号通常会建议走BUFG网络或者直接映射到专用复位引脚这样可以借助全局布线网络的强驱动能力大幅降低复位网络的延迟。XDC里的写法通常是set_property MAX_FANOUT 200000 [get_nets rst_n]注意这里是故意给一个非常大的值意思是不希望综合器对这个复位网络做复制让它走全局资源。因为全局复位信号的负载本来就有几万、十几万如果约束值设得太小综合器可能尝试复制一堆寄存器结果布局资源被浪费时序反而更差。对于局部复位情况又不同。一个模块内部的模块级复位信号扇出一般在上千左右。这种场景我建议做一个复位同步器把全局复位转换为两级同步后的局部复位再进模块。复位同步器的标准结构是reg [1:0] rst_sync; always (posedge clk) begin if (~rst_async_n) begin rst_sync 2b00; end else begin rst_sync {rst_sync[0], 1b1}; end end assign rst_sync_n rst_sync[1];这个同步器既解决了异步复位的亚稳态问题又给内部逻辑提供了一个干净的同步复位信号。配合上模块的局部使用扇出范围还是可以控制的。关于复位信号与扇出还有个常见困惑既然复位不能高扇出那能不能干脆不做全局复位全靠上电初始值我的建议是功能模块可以依赖初始值但控制通路里的状态机、FIFO指针、握手信号这些地方还是老老实实上复位信号不然仿真和上电后行为会很难一致。4.3 逻辑重构与使能链路的优化思路除了寄存器复制和复位处理代码层面的逻辑重构也是降低扇出的有力手段。高扇出信号不一定非得被直接复制如果能在逻辑上把广播变成局部共享效果会更好。最常见的一种重构是拆分条件表达式。假设有一个模式配置信号mode_cfg它的每一位都被几十个模块共同用来控制运算模式。如果每个模块都去读取mode_cfg扇出必然很高。一种做法是在每个子模块的入口处把mode_cfg打一拍存成局部寄存器always (posedge clk) begin if (mode_valid) begin mode_cfg_local mode_cfg; end end这样一来顶层的mode_cfg只需要驱动每个子模块入口的一两个寄存器而不是每一路组合逻辑。子模块内部使用打拍后的mode_cfg_local扇出就被限制在局部范围内。这个手法的本质是让配置信息的传播路径结构化而不是让它像洪水一样漫到整个设计里。另一种重构思路针对多路选择器。当一个选择信号控制几十个MUX时扇出同样爆炸。优化方向是把这种一刀切的选择信号改成先局部寄存再逐级传递的形式。比如在通道化数据链路中可以把使能信号与数据流同步移位让每一级处理单元不再共享同一个长距离使能信号而是使用靠近自己的延迟后的使能副本。虽然代价是多了一些移位寄存器但在时序收敛面前这点资源开销完全值得。还有一个细节值得留意扇出优化时不要脑子一热把负载数压得太低。有些工程师上来就写MAX_FANOUT 10结果综合器复制了上百份寄存器布局资源、布线资源全线告急时序不升反降。经验上把扇出控制在30到50之间是比较稳妥的区间除非你的布局结构天然支撑更低的扇出。5. 一个图像处理工程的扇出修复实战从时序违例到收敛5.1 问题现场一个300负载的使能信号去年做一个图像缩放加速模块时钟跑到200MHz综合和实现都能过但时序收敛不干净。Vivado时序报告里WNS最差负裕量是-0.42ns关键是这个负裕量对应的路径重复出现在好几条路径上显示的都是同一个网络valid_global。打开report_design_analysis找到高扇出网络列表valid_global赫然挂着300多个负载。它的驱动源是图像处理流水线里的数据有效信号这个信号同时控制整条流水线200多个乘加单元的CE端口外加若干状态机的跳变条件。路径上组合逻辑本身不长但Net Delay因为扇出太大被拉到了1.8ns加上源端寄存器的Clk-to-Q和目的端的建立时间一个周期下来刚好差了口气。5.2 第一次尝试XDC约束为什么没有达到预期我先按照常规思路在顶层XDC里加了约束set_property MAX_FANOUT 50 [get_nets valid_global]跑完综合打开网表原理图检查扇出确实降到了50左右综合器复制出了6份valid信号寄存器。但继续跑布局布线实现后的时序报告显示WNS仍然是负的虽然不是-0.42ns那么差但也只到了-0.2ns左右。再次实现后检查网络扇出发现综合阶段复制出的6份寄存器的布局情况很不理想——其中3份被摆到了离负载很远的地方布线的绕线增加了净延迟的改善远不如预期。我观察到实现日志里还出现了merge register的记录意味着物理优化认为部分复制不划算又把它们合并了。这其实暴露了纯靠XDC约束的短板工具自动复制但它不会站在功能结构的角度做最优布局。它复制的逻辑可能覆盖到了不合理的层级也可能因为资源摆放导致副本间的布线互相干扰。5.3 第二次尝试RTL手动复制与结构重构被这次失败刺激之后我决定回到RTL做手动复制彻底控制寄存器的数量和位置。具体动作分三步第一步把RTL里唯一的valid_ff拆成4份用generate循环生成并用(* KEEP TRUE *)属性锁住。4份正好对应流水线运算阵列的四个象限。第二步在RTL里用(* DONT_TOUCH TRUE *)或者(* KEEP_HIERARCHY TRUE *)把复制逻辑和负载逻辑包在同一个子模块里防止综合器做跨层优化时又把它们合并。第三步写了一条placement约束把这4份寄存器手工锁定到四个象限的空白区域。Vivado允许用set_property LOC或Pblock来做位置约束我这里用Pblock把4份寄存器分别圈住create_pblock valid_copy_0 add_cells_to_pblock [get_pblocks valid_copy_0] [get_cells {u_scale_core/valid_copy_gen[0].valid_ff_reg[*]}] resize_pblock [get_pblocks valid_copy_0] -add {SLICE_X20Y40 SLICE_X30Y70}虽然写Pblock需要一定后端经验但这一步是让扇出优化真正落实到物理层面的关键。改完代码、加上位置约束后重新跑综合和实现结果如下表优化阶段扇出数WNSNet Delay (关键路径)初始状态320-0.42ns1.82ns仅XDC约束50综合后/ 128实现后-0.21ns1.46nsRTL复制位置约束320.08ns0.94ns扇出从320降到32关键路径的Net Delay从1.82ns降到0.94nsWNS由负转正。整体实现后的资源占用率只增加了约1.5%完全可接受。5.4 修复后的复盘与经验沉淀这个项目结束之后我总结出了几条处理扇出问题的核心原则先看路径构成再动手。如果时序报告里Net Delay只占很小的比例组合逻辑Delay是主导那扇出不是瓶颈不必费劲去优化。如果Net Delay占了一半以上且对应网络负载数量巨大再考虑扇出优化。工具自动复制是备选而不是首选。XDC的MAX_FANOUT可以快速试水但效果不稳定因为它不理解设计的布局意图。对关键的时序路径手动RTL复制配合位置约束才是可控的手段。要防综合器好心办坏事。逻辑等价寄存器的大规模复制是综合器的合法优化但对我们来说往往是噪声。关键信号靠KEEP、DONT_TOUCH锁住能让综合器的自由度缩小到可控范围归档报告也更容易解释。复位信号另外对待。全局复位不要设小的MAX_FANOUT值走全局时钟资源才是正解局部复位置务必同步不要图省事从全局复位直接拉线。我现在做新项目时已经把扇出检查前置到了RTL Review阶段。综合跑完第一版第一件事就是用report_design_analysis批量看高扇出网络列表超过200扇出的网络全部过一遍确定是主动放任还是动手优化。提前干预一小时比项目后期反复跑实现省一整天这个账非常划算。最后再分享一个小技巧在Vivado里选中一个高扇出网络按F9可以高亮所有负载这时图形界面会非常直观地展示这些负载在芯片上的分散程度。如果负载密密麻麻挤成一片布局问题不大如果负载散布在芯片四角那无论怎么复制寄存器布线长度都很难压下来这时候要优先考虑逻辑重构把信号传播路径拉近而不是纯粹靠复制解决问题。

相关新闻

Agent-Reach:轻量级 DeepSeek CLI 调用工具

Agent-Reach:轻量级 DeepSeek CLI 调用工具

1. 项目概述:一个轻量级、开箱即用的智能体调用 CLI 工具Agent-Reach 不是一个抽象概念,也不是某个大厂闭源平台的代号——它是一个真实存在的、托管在 GitHub 上的开源命令行工具,核心目标非常朴素:让开发者能像敲curl一样&#…

2026/10/7 6:38:59 阅读更多 →
大模型多轮对话的上下文模式设计:从选型到状态机实战

大模型多轮对话的上下文模式设计:从选型到状态机实战

1. 先看三个翻车现场:没有上下文模式会怎样context-mode这个词,最近在 LLM 应用开发的圈子里被频繁提起。我最早看到它的时候,以为只是一个简单的开关——开一下,AI 就能记住对话,关一下,就是普通的单轮问答…

2026/10/7 6:38:59 阅读更多 →
AI Agent从零搭建实战:任务拆解、工具调用与状态管理全复盘

AI Agent从零搭建实战:任务拆解、工具调用与状态管理全复盘

做了半年AI Agent,我把踩过的坑和最终跑通的方案写下来。如果你正打算从零搭建一个自己的智能体,或者已经在折腾却总感觉差一口气,这篇内容应该能让你少走不少弯路。先说清楚“Agent-Reach”是个什么东西。它的名字拆开看就挺直白&#xff1a…

2026/10/7 6:38:58 阅读更多 →

最新新闻

Cursor settings.json 快捷键与 Markdown/KaTeX 渲染配置指南:TaoToken 统一 Key 接入实践

Cursor settings.json 快捷键与 Markdown/KaTeX 渲染配置指南:TaoToken 统一 Key 接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 7:05:14 阅读更多 →
2024年中国大模型发展指数报告(总第3期):从DeepSeek到Manus,开发者如何用TaoToken统一Key跑通MoE与AI Agent

2024年中国大模型发展指数报告(总第3期):从DeepSeek到Manus,开发者如何用TaoToken统一Key跑通MoE与AI Agent

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 7:05:14 阅读更多 →
联想开天M99h G1t-D533装Win10:驱动安装与排错实战指南

联想开天M99h G1t-D533装Win10:驱动安装与排错实战指南

简介:联想开天M99h G1t-D533台式机从银河麒麟V10切换至Windows 10专业版后,常因Hygon C86-3G处理器、Glenfly Arise 1020显卡、KaiTian KHG3X00MB1主板等专有硬件而出现驱动兼容问题。这份驱动包正是针对上述机型与系统场景整理,内含驱动精灵…

2026/10/7 7:05:14 阅读更多 →
马尾辫动态模拟技术原理与工程实践

马尾辫动态模拟技术原理与工程实践

我无法根据当前输入生成符合要求的博文。原因如下:项目标题“ponytail”是一个英文单词,直译为“马尾辫”,属于常见发型术语,但未提供任何具体项目背景、技术指向、应用场景或领域归属(如时尚造型教程、3D建模中的头发…

2026/10/7 7:05:14 阅读更多 →
HTML5年会抽奖源码:从公平抽奖算法到大屏视觉特效完整实现

HTML5年会抽奖源码:从公平抽奖算法到大屏视觉特效完整实现

简介:html5公司年会抽奖源码,面向企业行政、活动策划及前端开发者,解决年会互动抽奖中员工名单配置繁琐、重复中奖、奖品临时调整难等痛点。代码支持动态配置员工信息,并保证同一人只能中奖一次;奖项既有内置的特等奖、…

2026/10/7 7:05:14 阅读更多 →
2026年6月AI编程格局剧变:从代码补全到自主Agent,四条暗线正在重写规则|TaoToken统一Key视角

2026年6月AI编程格局剧变:从代码补全到自主Agent,四条暗线正在重写规则|TaoToken统一Key视角

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 7:04:14 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 6:26:51 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 1:18:13 阅读更多 →