FPGA高速安全状态机设计:编码、时序优化与安全机制
1. 为什么高速场景下的状态机需要重新设计很多人做FPGA状态机脑子里第一反应就是写个case语句把状态跳转列清楚综合器一跑时序过了就完事。低速逻辑里这套做法确实没毛病几十兆赫兹的时钟下状态机的跳转路径再长也能在一个周期内稳定下来。但一旦时钟频率推到两百兆以上或者状态机需要处理跨时钟域的事件、需要做安全校验、需要在单周期内完成多路条件判断原来那套写法就开始出问题了——要么时序收敛不了要么跑起来偶发死锁要么综合出来的电路面积大得离谱。我接触过不少项目状态机出问题的表现往往很隐蔽。仿真全过上板之后跑几个小时才出现一次异常跳转或者在某些特定输入组合下卡死在某个状态出不来。这类问题排查起来极其痛苦因为它的触发条件往往和温度、电压、时序余量都有关系。所以高速安全状态机的设计核心不是能不能跑通而是在所有工艺角、所有输入组合下都能可预测地运行。这篇文章想聊的就是这件事当状态机被放进高速时钟域同时还要承担安全关键职责的时候我们的设计思路应该怎么调整。我会从状态编码的选择、跳转逻辑的时序优化、安全机制的内建、跨时钟域事件的处理、以及验证策略这几个维度展开把每个决策背后的取舍讲清楚。适合已经写过基础状态机、但在高速或高可靠性场景下踩过坑的FPGA开发者参考。2. 状态编码方式对时序和面积的实际影响2.1 二进制、格雷码与独热码的取舍逻辑状态编码看起来是个小问题但它直接决定了跳转逻辑的组合深度和寄存器数量。二进制编码用最少的触发器N个状态只需要log2(N)个寄存器但状态译码逻辑复杂组合路径长。独热码每个状态一个触发器译码简单到只需要看一根线但寄存器数量随状态数线性增长。格雷码介于两者之间相邻状态只有一位变化适合状态按顺序迁移的场景。在高速设计里我通常优先考虑独热码原因很直接译码逻辑浅关键路径短时序容易收敛。代价是寄存器多但对于现代FPGA来说触发器资源相对充裕用面积换时序是划算的。不过独热码有个前提——状态数不能太多。如果状态数超过三十二个独热码的寄存器开销和布线压力就开始变得不可忽视这时候要重新评估。编码方式寄存器数译码逻辑深度适用场景二进制log2(N)深低速、状态多、面积敏感格雷码log2(N)中等顺序迁移为主、低功耗独热码N浅高速、状态少、时序敏感实际选型的时候我一般会先看时钟频率和状态数。时钟超过两百兆、状态数在十六个以内独热码基本是默认选择。如果状态数超过三十二个我会考虑分组独热或者二进制加流水线译码的方式。2.2 编码选择与综合工具的交互这里有个容易被忽略的点综合工具对状态机的识别和优化。如果你用parameter定义状态用case写跳转综合器会自动识别这是状态机然后根据你给的约束或者它自己的启发式规则重新编码。有时候你明明写了独热码综合出来却变成了二进制时序反而变差。我的做法是显式控制编码方式。在Verilog里可以用综合属性指定比如(* fsm_encoding one-hot *)或者直接在综合脚本里设置fsm_encoding选项。更重要的是综合完之后一定要看报告确认状态机的实际编码方式和你想的一致。我踩过一次坑代码里写了独热码综合器自作主张优化成了二进制时序报告显示关键路径在状态译码上查了半天才发现是综合选项没锁死。提示综合工具的状态机识别依赖于代码风格。如果case语句里混入了非状态跳转的逻辑或者状态寄存器有异步复位之外的额外赋值工具可能就不认这是状态机了优化策略也会完全不同。2.3 状态寄存器的复位策略高速状态下状态机的复位策略也需要仔细考虑。同步复位对时序更友好但需要时钟在复位期间保持运行。异步复位不依赖时钟但复位释放时的亚稳态风险需要处理。我的习惯是状态寄存器用异步复位、同步释放的方式既保证复位可靠又避免释放时的亚稳态传播。具体实现上复位信号先经过两级触发器同步再用同步后的信号去复位状态寄存器。这样复位断言是异步的释放是同步的兼顾了两方面的需求。在高速时钟域里这个细节能避免很多偶发的复位异常。3. 跳转逻辑的时序优化与流水线设计3.1 组合逻辑深度的控制状态机的关键路径通常出现在跳转条件的判断上。如果跳转条件依赖多个输入信号的组合比如if (a b (c || d) e)综合出来的组合逻辑深度可能有好几级在高速时钟下就成了瓶颈。优化思路有两个方向。一是把复杂的跳转条件提前计算在状态寄存器之前打一拍把组合逻辑切成两段。代价是跳转决策延迟一个周期但对于大多数控制逻辑来说一个周期的延迟是可以接受的。二是把跳转条件分解用多个周期逐步判断适合那些不需要单周期响应的场景。我一般会先看时序报告找到关键路径的具体位置。如果确实是跳转条件造成的再决定用哪种方式优化。盲目加流水线会增加延迟和面积不是所有场景都值得。3.2 输出逻辑与状态跳转的解耦另一个常见的时序问题是输出逻辑和状态跳转耦合在一起。如果输出信号直接由状态和输入组合产生组合路径会很长。更好的做法是把输出逻辑和状态跳转分开输出用寄存器打一拍或者用状态寄存器的值直接译码。Moore型状态机的输出只依赖当前状态天然比Mealy型更容易做时序优化。在高速场景下我倾向于用Moore型虽然响应会慢一个周期但输出路径干净时序余量大。如果确实需要Mealy型的快速响应可以把组合输出限制在少数几个关键信号上其余输出仍然用寄存器。3.3 流水线状态机的设计模式对于特别复杂的跳转逻辑可以考虑流水线状态机。把状态跳转拆成多个阶段每个阶段处理一部分条件判断最后汇总决定下一个状态。这种设计模式在通信协议处理、数据包解析等场景里很常见。流水线状态机的代价是控制复杂度上升需要仔细处理各阶段之间的握手和冲突。如果两个阶段同时想修改状态需要有仲裁机制。我在做高速数据通路控制的时候用过这种模式效果不错但调试难度确实比普通状态机高不少。4. 安全机制的内建从死锁防护到状态校验4.1 非法状态检测与自动恢复安全状态机的第一道防线是非法状态检测。无论用哪种编码方式总有一些编码组合是不合法的。比如独热码里合法状态只有一个位是1如果出现多个位同时为1或者全为0就是非法状态。检测逻辑很简单对状态寄存器的值做校验发现非法就触发恢复机制。恢复策略可以是强制跳转到初始状态也可以是跳转到最近的安全状态。我通常会在状态机里加一个default分支把所有非法状态都导向一个安全的复位状态同时拉高一个错误标志供上层逻辑感知。// 非法状态检测与恢复示例 always (posedge clk or negedge rst_n) begin if (!rst_n) begin state IDLE; error_flag 1b0; end else begin case (state) IDLE: state ...; RUN: state ...; // ... 其他合法状态 default: begin state IDLE; // 非法状态强制恢复 error_flag 1b1; // 上报错误 end endcase end end这个default分支看起来简单但在实际项目里救过我好几次。有一次上板测试状态机在特定输入序列下跑飞了就是因为没有非法状态保护卡在一个不存在的状态里出不来。加上default之后即使跑飞也能自动恢复系统至少不会完全挂死。4.2 超时保护与看门狗机制有些状态机在正常工作时会在某个状态停留较长时间但如果停留时间超过预期往往意味着出了问题。超时保护就是给每个状态或者整个状态机加一个计时器超时后强制跳转到安全状态。实现方式很简单一个计数器在状态跳转时清零如果计数值超过阈值就触发超时。阈值需要根据实际业务逻辑来定太短会误触发太长则失去保护意义。我一般会在仿真阶段统计每个状态的最长停留时间然后留出足够的余量作为阈值。看门狗机制和超时保护类似但作用范围更大。它监控的是整个状态机的活跃度如果状态机长时间没有任何跳转就认为它挂死了触发全局复位。在安全关键系统里看门狗几乎是标配。4.3 状态跳转的合法性校验除了检测非法状态还需要校验跳转的合法性。有些状态之间的跳转在业务逻辑上是不允许的如果发生了说明控制逻辑出了问题。比如一个空闲状态不应该直接跳到发送完成状态中间必须经过发送中。校验方式可以是在跳转逻辑里加断言也可以用一个独立的校验模块并行检查。断言的方式在仿真时能快速发现问题但综合后会被优化掉。如果需要上板后仍然有效就得用独立的校验逻辑把非法跳转记录下来或者触发保护。我在做安全相关设计时会把跳转合法性校验做成一个独立的查找表每个状态允许跳转到哪些状态预先定义好实际跳转时查表验证。这样即使控制逻辑被单粒子翻转影响非法跳转也能被拦截。5. 跨时钟域事件在状态机中的处理5.1 异步输入的同步化处理高速状态机经常需要处理来自其他时钟域的事件信号。这些信号如果直接进入状态机的跳转逻辑亚稳态风险极高。必须先用两级触发器同步把异步信号变成当前时钟域的同步信号。同步化会引入延迟通常是两到三个时钟周期。对于状态机来说这意味着事件响应会慢几拍。在大多数控制场景下这个延迟可以接受。但如果事件本身是脉冲信号还需要做脉冲展宽或者边沿检测确保同步后不会丢失。// 异步事件同步化 reg [1:0] sync_chain; always (posedge clk or negedge rst_n) begin if (!rst_n) sync_chain 2b00; else sync_chain {sync_chain[0], async_event}; end wire event_synced sync_chain[1];这段代码看起来简单但有个细节要注意如果async_event是窄脉冲可能在被同步之前就消失了。所以对于脉冲型事件我会先用一个锁存器把事件锁住同步后再解锁确保不丢事件。5.2 跨时钟域握手协议的设计如果状态机需要和另一个时钟域的状态机协同工作就需要握手协议。最简单的握手是四相握手请求、确认、撤销请求、撤销确认。每一步都需要同步化处理所以整个握手过程会消耗多个时钟周期。在高速设计里握手协议的开销不能忽视。如果两个时钟域频率差异很大握手可能成为性能瓶颈。这时候可以考虑用异步FIFO来传递事件把握手细节封装在FIFO内部状态机只需要读写FIFO即可。我做过一个项目两个时钟域分别是两百兆和五十兆用四相握手的时候每次交互要等十几个慢时钟周期吞吐量上不去。后来改成异步FIFO状态机只管往FIFO里写事件另一个时钟域自己去读整体吞吐量提升了好几倍。5.3 多事件并发的仲裁策略当多个跨时钟域事件同时到达时状态机需要决定先处理哪个。仲裁策略可以是固定优先级也可以是轮询。固定优先级实现简单但可能导致低优先级事件饿死。轮询公平但逻辑复杂一些。在安全关键场景下我倾向于用固定优先级加超时提升的方式。高优先级事件优先处理但如果低优先级事件等待超过一定时间就临时提升它的优先级。这样既保证了关键事件的响应又避免了低优先级事件被无限期延迟。6. 验证策略如何确保状态机在所有角落都安全6.1 形式验证在状态机中的应用仿真只能覆盖你想到的场景形式验证可以穷举所有可能的状态和输入组合。对于状态机这种状态空间有限的设计形式验证特别有效。它可以证明状态机永远不会进入非法状态永远不会死锁某些跳转永远不会发生。常用的形式验证属性包括状态机永远不会同时处于两个状态独热码的互斥性、从任何状态出发都能回到初始状态可达性、非法状态永远不会被进入安全性。这些属性用SVA或者PSL描述然后交给形式验证工具去证明。我用形式验证查过好几次状态机的边界问题。有一次仿真跑了几百万个周期都没问题形式验证一跑就发现某个状态在特定输入组合下会死锁。这种问题靠仿真很难发现因为触发条件太苛刻了。6.2 覆盖率驱动的仿真验证形式验证虽然强大但不能完全替代仿真。仿真可以验证状态机在真实激励下的行为特别是和外部模块的交互。覆盖率是衡量仿真充分性的重要指标包括状态覆盖率、跳转覆盖率、条件覆盖率等。我的习惯是先把状态覆盖率和跳转覆盖率跑到百分之百确保每个状态都进过每条跳转都走过。然后再看条件覆盖率把跳转条件里的每个分支都覆盖到。最后做交叉覆盖检查状态和条件的组合是否都覆盖了。覆盖率报告里那些没覆盖到的点往往就是潜在的问题所在。有一次跳转覆盖率显示有一条跳转从来没走过查了半天发现是跳转条件写错了那个条件永远不可能为真。如果没有覆盖率检查这个bug可能就漏到上板了。6.3 上板后的在线监测与调试仿真和形式验证都过了不代表上板就没问题。实际运行环境里的温度、电压、电磁干扰都可能影响状态机的行为。所以上板后的在线监测很重要。我通常会在状态机里嵌入一个轻量级的监测模块记录状态跳转的历史和异常事件。通过一个调试接口把数据读出来分析状态机的实际运行轨迹。如果发现异常跳转或者非法状态就能快速定位问题。在线监测的逻辑要尽量简单避免影响状态机本身的时序。我一般只记录状态编号和跳转时间戳用一个小FIFO缓存满了就覆盖最旧的数据。这样既不会占用太多资源又能提供足够的调试信息。7. 一个高速安全状态机的完整实现框架7.1 模块划分与接口定义把前面聊的这些点整合起来一个高速安全状态机的实现框架大概包含这几个部分状态寄存器、跳转逻辑、输出逻辑、非法状态检测、超时保护、跨时钟域同步、以及在线监测。状态寄存器用独热码异步复位同步释放。跳转逻辑用流水线方式把复杂条件判断切成两段。输出逻辑用Moore型关键输出打一拍。非法状态检测用default分支加独立校验。超时保护用一个计数器。跨时钟域事件先同步再进入跳转逻辑。在线监测用一个浅FIFO记录跳转历史。接口方面除了常规的时钟、复位、输入事件、输出控制之外还需要预留错误标志和调试接口。错误标志供上层逻辑感知状态机异常调试接口用于读取监测数据。7.2 关键代码片段与注释// 独热码状态定义 localparam IDLE 5b00001; localparam WAIT 5b00010; localparam RUN 5b00100; localparam DONE 5b01000; localparam ERROR 5b10000; // 状态寄存器异步复位同步释放 reg [4:0] state; reg [4:0] next_state; // 跳转逻辑流水线第一级预计算条件 reg cond_ready; reg [1:0] cond_result; always (posedge clk or negedge rst_n) begin if (!rst_n) begin cond_ready 1b0; cond_result 2b00; end else begin cond_ready 1b1; cond_result {input_a input_b, input_c | input_d}; end end // 跳转逻辑流水线第二级根据预计算条件决定下一状态 always (*) begin next_state state; case (state) IDLE: if (start) next_state WAIT; WAIT: if (cond_ready cond_result[1]) next_state RUN; RUN: if (cond_ready cond_result[0]) next_state DONE; DONE: next_state IDLE; default: next_state IDLE; // 非法状态恢复 endcase end // 状态更新 always (posedge clk or negedge rst_n) begin if (!rst_n) state IDLE; else state next_state; end这段代码展示了几个关键点独热码编码、流水线跳转条件、非法状态恢复。实际项目里还需要加上超时计数器、跨时钟域同步、在线监测等模块但核心结构就是这样。7.3 资源开销与时序余量的实测数据在一个中等规模的FPGA上这个状态机框架的资源开销大概是状态寄存器五个触发器跳转逻辑几十个查找表超时计数器一个加法器在线监测一个浅FIFO。整体资源占用很小对大多数设计来说都可以接受。时序方面在两百兆时钟下关键路径的建立时间余量大概有零点几纳秒保持时间余量更充裕。如果时钟再往上推可能需要进一步优化跳转逻辑比如把条件判断再切一级流水线。我在实际项目里跑过两百五十兆时序收敛没问题但余量已经比较紧张了。如果要做更高频率建议把跳转逻辑拆得更细或者用更快的器件。8. 几个容易踩的坑和我的处理习惯第一个坑是综合器自动优化状态编码。前面提过解决办法是显式指定编码方式综合后检查报告确认。第二个坑是异步复位释放时的亚稳态。解决办法是异步复位同步释放复位路径上加两级触发器。第三个坑是跨时钟域事件丢失。解决办法是对脉冲事件先锁存再同步确保不丢事件。第四个坑是仿真覆盖不全导致上板才发现问题。解决办法是形式验证加覆盖率驱动仿真双管齐下。第五个坑是状态机跑飞后无法恢复。解决办法是加非法状态检测和超时保护确保任何异常都能自动恢复。我个人的习惯是任何状态机设计完成后先跑形式验证证明安全性再跑覆盖率仿真验证功能最后上板做在线监测。这三步走下来状态机的可靠性基本就有保障了。高速安全状态机的设计没有什么银弹靠的就是对每个细节的仔细推敲和多重验证手段的叠加。

相关新闻

基于MP2642GR-Z与PIC18F87J50的两串电池主动均衡方案设计与实现

基于MP2642GR-Z与PIC18F87J50的两串电池主动均衡方案设计与实现

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

2026/10/16 4:28:20 阅读更多 →
MNIST模型压缩实战:886个参数实现98.2%准确率

MNIST模型压缩实战:886个参数实现98.2%准确率

1. 项目缘起与核心思路拆解1.1 为什么要在 MNIST 上死磕参数量MNIST 手写数字识别大概是每个接触深度学习的人绕不开的第一个项目。LeNet-5 在 1998 年就能把它做到 99% 以上,现在随便搭一个三层卷积网络,几分钟训练就能摸到 99.2% 的准确率。也正因为如…

2026/10/16 4:28:20 阅读更多 →
深入理解Linux sync命令:从延迟写入到数据落盘

深入理解Linux sync命令:从延迟写入到数据落盘

1. 为什么需要sync:先看懂内核的延迟写入机制1.1 数据进入page cache之后发生了什么在Linux日常维护里,sync大概是看起来最不起眼的一个命令。它不像top、ps那样天天见,执行起来往往一秒不到就回到提示符,很多刚接触Linux的人甚至…

2026/10/16 4:28:20 阅读更多 →

最新新闻

C++十进制转十六进制:从手写算法到标准库全解析

C++十进制转十六进制:从手写算法到标准库全解析

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

2026/10/16 5:07:31 阅读更多 →
pegasusWMS:用Python与Jupyter拆解仓库管理系统核心流程

pegasusWMS:用Python与Jupyter拆解仓库管理系统核心流程

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

2026/10/16 5:07:31 阅读更多 →
ICRA 2020三维重建论文盘点:从实时融合到动态场景的工程实践

ICRA 2020三维重建论文盘点:从实时融合到动态场景的工程实践

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

2026/10/16 5:07:31 阅读更多 →
两节串联电池主动均衡方案:基于MP2642GR-Z与MK24FN1M0VDC12的备电系统设计

两节串联电池主动均衡方案:基于MP2642GR-Z与MK24FN1M0VDC12的备电系统设计

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

2026/10/16 5:07:31 阅读更多 →
基于MP2642GR-Z与PIC18F8722的2S电池均衡系统设计

基于MP2642GR-Z与PIC18F8722的2S电池均衡系统设计

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

2026/10/16 5:07:31 阅读更多 →
基于IGH开源主站与汇川SV660N的EtherCAT实时运动控制实现

基于IGH开源主站与汇川SV660N的EtherCAT实时运动控制实现

简介:这份资源面向工业自动化与运动控制方向的开发者,提供基于IGH EtherCAT主站控制汇川SV660N伺服电机的C语言实现代码,重点解决主站与伺服之间位置控制模式(PP模式)下的通信与指令下发问题,适合已具备Eth…

2026/10/16 5:06:30 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →