FPGA入门必做:可逆计数器设计详解与上板调试
1. 为什么可逆计数器是FPGA入门的“第一道硬菜”很多人刚开始学FPGA的时候第一个实验通常是点灯。点灯确实能让人快速看到效果但说实话它只能验证工具链是否装好、引脚约束是否写对真正涉及数字逻辑设计的核心思维——时钟、复位、状态跳转、方向控制——几乎都没碰到。而可逆计数器就不一样了它麻雀虽小五脏俱全把时序逻辑里最关键的几个概念全串起来了。所谓可逆计数器就是既能做加法计数、又能做减法计数的计数器。一个方向控制信号决定它下一秒是加一还是减一。听起来简单但你在FPGA上把它跑通需要处理的问题包括时钟边沿检测、同步复位与异步复位的取舍、方向信号的亚稳态处理、计数值的位宽选择、以及溢出后的行为定义。这些东西在后续做更复杂的系统时一个都绕不开。我见过不少初学者点灯实验做完之后直接跳到状态机或者通信协议结果在时序问题上反复栽跟头。其实如果老老实实把可逆计数器吃透很多坑在入门阶段就能填平。这篇文章我会从设计思路、代码实现、仿真验证、上板调试几个维度把可逆计数器这个实验彻底讲清楚同时补充一些实际项目中总结出来的经验让你不只是“跑通”而是真正理解每一步为什么这么做。适合阅读这篇文章的人刚接触FPGA不久、已经会写基本的Verilog或VHDL、手里有一块入门级开发板、想通过一个小实验把时序逻辑的基础打牢的读者。如果你连开发环境都还没搭好建议先把工具链跑通再来看这篇效果会更好。2. 可逆计数器的核心逻辑拆解与设计决策2.1 计数器本质一个带反馈的加法器计数器的底层结构其实就是一个加法器加上一组寄存器。每个时钟上升沿到来时寄存器把当前值锁存加法器根据方向信号决定是加一还是减一结果再送回寄存器的输入端。这个反馈环路就是计数器工作的全部秘密。在FPGA里实现这个逻辑非常自然因为FPGA的基本单元就是查找表LUT和触发器FF。LUT负责实现组合逻辑比如加法器和多路选择器FF负责存储当前计数值。你写的每一行时序逻辑代码最终都会被综合工具映射到这些底层资源上。理解这一点很重要因为它解释了为什么计数器在FPGA上跑得特别快——整个逻辑路径很短从寄存器输出经过一个加法器再回到寄存器输入延迟极小。在入门级器件上一个32位计数器跑到一两百兆赫兹通常没什么压力。2.2 方向控制信号的两种处理方式方向控制信号决定了计数器是加还是减。这里有一个关键的设计选择方向信号是同步处理还是异步处理如果你直接把方向信号接到组合逻辑里参与加减判断那么当方向信号在时钟边沿附近发生变化时加法器的输出可能会出现毛刺导致计数器跳变到错误的值。这就是典型的亚稳态和竞争冒险问题。正确的做法是把方向信号先用一级寄存器同步到时钟域内再用同步后的信号去控制加减。多花一个触发器换来的是整个系统的稳定性。在实际项目中任何来自外部引脚或者跨时钟域的信号都应该先做同步处理这个习惯从入门阶段就要养成。2.3 位宽选择与溢出行为定义计数器位宽选多少这取决于你的应用需求。4位计数器最大计到158位最大25516位最大65535。位宽越大消耗的寄存器资源越多但通常这不是瓶颈因为FPGA里触发器资源相对充裕。更需要注意的是溢出行为。当计数器计到最大值再加一会怎样当计到零再减一会怎样常见的处理方式有两种一种是自然回绕比如8位计数器255加一变00减一变255另一种是饱和处理计到最大值就停住不动计到零也停住。两种方式没有优劣之分完全看应用场景。在可逆计数器实验里我建议先用自然回绕的方式实现因为逻辑最简单也最容易验证。等基础版本跑通了再尝试加入饱和模式作为扩展练习。2.4 复位策略同步复位还是异步复位复位方式的选择是FPGA设计里的经典话题。异步复位的好处是复位信号一来立刻生效不依赖时钟坏处是复位释放时如果离时钟边沿太近可能引发亚稳态。同步复位则相反复位释放是安全的但复位生效需要等一个时钟周期。对于入门实验我推荐使用同步复位。原因很简单同步复位的时序分析更简单不容易出问题而且大多数现代FPGA的复位资源本身就是同步的。你只需要在always块的敏感列表里只写时钟边沿然后在块内部判断复位信号即可。如果你用的是异步复位敏感列表里要同时包含时钟边沿和复位边沿代码稍复杂一些而且综合工具可能会插入额外的逻辑来同步复位释放。入门阶段没必要给自己增加这个复杂度。3. Verilog实现从代码到综合的完整路径3.1 模块接口定义与参数化设计先来看模块的接口。一个可逆计数器至少需要时钟、复位、方向控制这几个输入以及计数值输出。为了让模块更通用我会把位宽做成参数这样同一个模块可以在不同场景下复用。module up_down_counter #( parameter WIDTH 8 )( input wire clk, input wire rst_n, input wire dir, // 1: 加法, 0: 减法 output reg [WIDTH-1:0] count );这里dir信号我定义为高电平加法、低电平减法这是一种约定你也可以反过来定义但一定要在注释里写清楚否则过两天自己都忘了。参数化设计的好处是显而易见的。你写测试平台的时候可以把位宽改小比如改成4位这样仿真波形看起来更直观计数值的变化一目了然。上板的时候再改回8位或更大代码不需要任何其他改动。3.2 同步方向信号与计数逻辑接下来是核心的时序逻辑块。我先把方向信号同步一级然后再做加减判断。reg dir_sync; always (posedge clk) begin if (!rst_n) begin dir_sync 1b1; count {WIDTH{1b0}}; end else begin dir_sync dir; if (dir_sync) count count 1b1; else count count - 1b1; end end这段代码有几个细节值得展开说。第一dir_sync的复位值我设成了1这样上电后默认是加法计数行为可预期。如果你设成0上电后计数器会从0开始往下减变成最大值虽然逻辑上没问题但看起来会有点奇怪。第二count的复位值设成全零。{WIDTH{1b0}}是Verilog里的位拼接语法表示把WIDTH个1位零拼在一起生成一个WIDTH位的零值。这种写法比直接写0更规范因为不同位宽下0的默认位宽可能引起警告。第三注意dir_sync是在时钟边沿更新的而count的加减判断用的是上一拍同步后的dir_sync值。这意味着方向信号变化后需要两个时钟周期才能反映到计数方向上。一个周期用于同步一个周期用于计数更新。这个延迟在大多数应用里完全可以接受而且换来了稳定性。3.3 综合结果分析与资源估算把这段代码放到综合工具里跑一下你可以看看资源报告。一个8位可逆计数器通常会消耗8个触发器加若干个查找表。加法器/减法器会被映射到LUT和进位链上具体数量取决于器件架构。在入门级FPGA上这点资源消耗几乎可以忽略不计。但养成看综合报告的习惯很重要它能帮你建立代码和硬件之间的直觉。比如你看到加法器占用了进位链资源就会理解为什么FPGA做加法特别高效看到方向信号同步多消耗了一个触发器就会明白时序和面积之间的权衡。综合工具通常还会给出时序报告告诉你最高能跑多快。对于这个计数器限制频率的关键路径就是“寄存器输出→加法器→寄存器输入”这条路径。如果你发现时序不满足可以尝试插入流水线寄存器把加法器拆成两级代价是输出延迟增加一个周期。3.4 测试平台编写与仿真波形解读代码写完了不仿真就上板等于闭着眼睛开车。测试平台的作用就是给模块提供激励信号观察输出是否符合预期。timescale 1ns/1ps module tb_up_down_counter; reg clk; reg rst_n; reg dir; wire [3:0] count; up_down_counter #(.WIDTH(4)) uut ( .clk (clk), .rst_n (rst_n), .dir (dir), .count (count) ); initial begin clk 0; forever #5 clk ~clk; end initial begin rst_n 0; dir 1; #20 rst_n 1; #100 dir 0; #100 dir 1; #100 dir 0; #200 $finish; end endmodule这个测试平台做了几件事产生一个周期为10纳秒的时钟先复位一段时间然后让方向信号在加法、减法、加法、减法之间切换观察计数值的变化。仿真跑起来之后重点看几个地方。复位期间计数值是否为零复位释放后是否开始加法计数方向切换后计数值是否按照预期改变增减方向方向切换的那一拍计数值有没有出现异常跳变。如果方向切换时计数值出现了一个不该有的变化那多半是方向信号没有同步导致的回头检查代码。我个人的习惯是仿真波形一定要放大到每一个时钟周期去看不要只看整体趋势。很多问题就藏在某一个时钟边沿上整体看波形是看不出来的。4. 上板验证从仿真波形到物理世界4.1 引脚约束与时钟输入处理仿真通过之后下一步就是上板。上板之前需要写约束文件把模块的端口映射到FPGA的实际引脚上。时钟输入通常来自板载晶振复位可以映射到一个按键方向控制可以映射到另一个按键或拨码开关计数值输出可以映射到LED灯或者数码管。约束文件里最关键的是时钟约束。你需要告诉工具时钟的频率是多少它才能做正确的时序分析。比如板载晶振是50兆赫兹周期就是20纳秒约束文件里要写清楚。create_clock -period 20.000 -name sys_clk [get_ports clk]如果你忘了写时钟约束工具可能会按默认频率去分析结果要么过于乐观导致上板不稳定要么过于悲观导致报告一堆时序违例。这个坑我踩过不止一次后来养成了习惯约束文件先写时钟再写引脚顺序不颠倒。4.2 按键消抖仿真里没有的真实问题仿真的时候方向信号是理想的高低电平切换干净利落。但真实世界里的按键是有抖动的按下和释放的瞬间会产生一连串快速跳变。如果你直接把按键信号接到方向控制上计数器可能会在按键按下的瞬间来回加减好几次看起来就像随机跳数。解决办法是加消抖逻辑。最简单的做法是用一个计数器对按键信号进行采样连续采样到相同值超过一定次数才认为按键状态稳定。比如用20毫秒的消抖时间在50兆赫兹时钟下就是一百万个时钟周期需要一个20位的计数器。消抖逻辑本身也是一个很好的练习它让你理解采样、计数、状态判断这些概念如何组合起来解决实际问题。而且消抖模块是高度可复用的以后做任何带按键的项目都可以直接拿来用。4.3 LED显示与计数速度的人眼适配把计数值输出到LED上你会遇到另一个问题计数器跑得太快了。50兆赫兹时钟下8位计数器每256个时钟周期就完成一次溢出也就是大约5微秒。人眼根本来不及看清只能看到LED在快速闪烁。解决办法是加一个分频器把计数器的时钟降下来。比如分频到1赫兹计数值每秒变化一次人眼就能清楚地看到加减计数的过程。分频器的实现很简单就是一个更大的计数器计到某个值翻转一次输出。这里有一个设计选择是分频时钟去驱动计数器还是用使能信号控制计数器更新我强烈推荐后者。分频时钟会产生一个新的时钟域带来跨时钟域的问题而使能信号只是在原时钟域里控制计数器是否更新简单又安全。reg [23:0] div_cnt; wire tick; always (posedge clk) begin if (!rst_n) div_cnt 0; else if (div_cnt 24d9_999_999) div_cnt 0; else div_cnt div_cnt 1b1; end assign tick (div_cnt 24d9_999_999);然后在计数逻辑里加上if (tick)的判断只有tick有效时才更新计数值。这样计数器还是在50兆赫兹时钟域里但更新频率变成了每秒一次。4.4 实测中遇到的意外与排查思路上板之后即使仿真通过了也可能遇到各种意外。我总结几个常见的情况和排查思路。第一种情况LED完全不亮。先检查约束文件里的引脚分配对不对再检查复位信号是不是一直有效。有些开发板的按键是低电平有效你如果按高电平有效去写复位就永远释放不了。第二种情况计数值变化方向反了。这通常是方向信号的定义和你预期相反或者按键的默认电平和你想象的不一样。用万用表或者示波器量一下按键未按下时的电平确认默认状态。第三种情况计数速度不对。检查分频计数器的比较值是否算对了。50兆赫兹时钟下要分频到1赫兹比较值应该是50_000_000减1也就是49_999_999。如果你写成了50_000_000实际分频比会差一个周期虽然影响不大但养成精确计算的习惯很重要。第四种情况按键按下后计数值跳了好几个数。这就是前面说的抖动问题加消抖逻辑就能解决。排查问题的顺序建议是先确认电源和时钟再确认复位然后确认输入信号最后看输出。这个顺序能帮你快速定位问题出在哪一级。5. 从可逆计数器延伸出的进阶练习5.1 加入预置数功能基础版的可逆计数器只能从零开始计数。实际应用中计数器通常需要支持预置数也就是可以加载一个初始值从那个值开始计数。实现预置数功能需要增加一个加载信号和一个加载数据输入。当加载信号有效时计数器在下一个时钟边沿把加载数据锁存到计数值寄存器里而不是做加减操作。这个优先级通常是最高的高于加减计数。if (load) count load_data; else if (dir_sync) count count 1b1; else count count - 1b1;这个改动很小但让计数器的实用性大大提升。很多分频器、定时器、位置控制的应用都需要预置数功能。5.2 可编程模数计数器的实现思路模数计数器是指计数到某个特定值就回绕而不是计到最大值才回绕。比如一个模10计数器计数序列是0到9然后回到0不管位宽是多少。实现模数计数器需要增加一个模数参数或者模数输入。计数逻辑里判断当前值是否等于模数减一如果是且方向为加下一个值回到零如果是且方向为减下一个值变成模数减一。这个功能在分频、波特率生成、PWM生成等场景里非常常用。你可以把模数做成参数也可以做成运行时可通过寄存器配置的输入后者更灵活但消耗更多资源。5.3 级联多个计数器扩展位宽如果你需要更大位宽的计数器比如32位甚至64位而手头的器件资源有限可以考虑级联多个小位宽计数器。低位的计数器每溢出一次给高位计数器一个使能脉冲高位计数器加一或减一。级联的关键是进位/借位信号的生成。加法方向下低位计到最大值时产生进位减法方向下低位计到零时产生借位。高位计数器根据进位/借位信号和方向信号决定自己的加减。这种结构在资源受限的场景下很有用而且它让你理解计数器本质上是可组合的不是只能作为一个整体来用。5.4 用状态机重构计数器的思路可逆计数器本身也可以用状态机的方式来实现。把加法计数和减法计数看作两个状态方向信号作为状态转移条件每个状态下执行对应的计数操作。用状态机实现计数器看起来有点杀鸡用牛刀但它的价值在于帮你建立状态机的思维模式。当你以后遇到更复杂的控制逻辑时状态机的组织方式会让代码更清晰、更易维护。从简单的计数器开始练习状态机比直接上手复杂状态机要容易得多。6. 入门阶段值得养成的几个设计习惯6.1 信号命名与注释的规范性我见过太多初学者的代码信号名是a、b、c、tmp1、tmp2过两天自己都看不懂。好的命名习惯应该从第一个实验就开始培养。时钟叫clk复位叫rst_n方向叫dir计数值叫count一看就明白。注释也很重要。每个模块的头部写清楚功能、端口含义、参数说明关键逻辑处写清楚为什么这么做而不是做了什么。比如“同步方向信号避免亚稳态”就比“同步dir信号”有价值得多。6.2 仿真覆盖率的基本意识仿真不是跑一遍波形看看就完了。你要有意识地覆盖各种情况复位期间、复位释放、方向切换、计数值溢出、计数值下溢。每一种情况都要在波形里确认行为正确。入门阶段不需要追求形式化的覆盖率指标但脑子里要有这个意识我的测试平台有没有覆盖所有重要的场景如果某个场景没测到上板后它就可能成为意外。6.3 时序约束不是可选项很多初学者觉得时序约束是高级话题入门实验不需要。这个想法很危险。即使是一个计数器如果你不写时钟约束工具就不知道你的时钟频率时序分析就是走过场。上板后可能因为时序问题出现随机错误而你还以为是代码逻辑问题白白浪费大量时间。养成习惯每个工程都写时钟约束哪怕只是一个简单的计数器实验。这个习惯会让你在后续做更复杂的设计时少走很多弯路。6.4 版本管理与实验记录最后说一个容易被忽视的习惯版本管理和实验记录。每做完一个实验把代码、约束文件、仿真波形、上板照片整理到一个文件夹里写一个简单的README说明这个实验做了什么、遇到了什么问题、怎么解决的。这些记录在你以后回顾的时候价值巨大。我当时学FPGA的时候很多当时觉得理所当然的细节过几个月就忘了。幸好有记录才能快速回忆起来。而且这些记录整理一下就是很好的技术博客素材一举两得。可逆计数器这个实验代码量不大但涉及的知识点很密集。把它做透比匆匆忙忙做十个实验更有价值。我在实际带新人的时候通常会让他们把这个实验反复做三遍第一遍照着教程跑通第二遍不看教程自己写第三遍加入消抖、预置数、模数控制等扩展功能。三遍下来时序逻辑的基本功就扎实了。

相关新闻

外贸企业如何借助社交媒体拓展海外市场

外贸企业如何借助社交媒体拓展海外市场

一、行业现状:海外社交媒体成为外贸获客新渠道近年来,随着数字技术的发展和全球消费习惯的变化,海外社交媒体已不再仅仅是个人社交娱乐的平台,而是逐步成为外贸企业触达海外客户、展示品牌形象、获取商业询盘的重要渠道。Facebook…

2026/10/13 6:41:49 阅读更多 →
Modbus TCP设备通信代码

Modbus TCP设备通信代码

一、核心前置知识点:Modbus TCP协议帧格式(必考背诵)1.1 请求报文(Rx 读取请求帧)帧示例:00 01 00 00 00 06 01 03 00 00 00 04字节段含义说明00 01事务ID(Transaction ID)请求与响应必须一致,用…

2026/10/13 6:41:49 阅读更多 →
Apache Calcite 1.4.0-incubating 发布解析:RelBuilder 关系代数构建器 API 的诞生

Apache Calcite 1.4.0-incubating 发布解析:RelBuilder 关系代数构建器 API 的诞生

后端数据库 【免费下载链接】calcite Apache Calcite 项目地址: https://gitcode.com/gh_mirrors/ca/calcite 点击查看 免费下载 2015 年 9 月 2 日,Apache Calcite(Incubating)发布 1.4.0-incubating 版本,这一版本在…

2026/10/13 6:41:49 阅读更多 →

最新新闻

Clover_v5.0_r5122_X64黑苹果引导实战:从U盘制作到多系统配置

Clover_v5.0_r5122_X64黑苹果引导实战:从U盘制作到多系统配置

简介:Clover_v5.0_r5122_X64 是一款面向黑果(Hackintosh)爱好者的四叶草启动引导程序,专为64位体系结构设计,核心作用是模拟苹果原生启动管理器,让非苹果硬件也能识别并加载 macOS 内核,尤其适配…

2026/10/13 7:21:01 阅读更多 →
后端程序注册Windows服务:sc.exe与NSSM实操指南

后端程序注册Windows服务:sc.exe与NSSM实操指南

最近帮一个朋友迁移旧项目,对方有一台还在服役的 Windows Server 2012 服务器,上面跑着几个内部用的后端程序。因为平时是人工启动、命令行窗口挂着,结果清明假期服务器半夜自动更新重启了一次,第二天业务系统全部瘫痪&#xff0c…

2026/10/13 7:21:01 阅读更多 →
人生噪音断舍离:像庖丁解牛一样清理信息过载与情绪内耗

人生噪音断舍离:像庖丁解牛一样清理信息过载与情绪内耗

人生噪音断舍离的庖丁解牛你有没有过这样的状态?手机里躺着上千条未读消息,通讯录里堆着几百个根本想不起是谁的联系人,订阅号每天刷出几十篇“不看就亏”的文章,桌面上摆满了“以后可能用得上”的杂物,脑子里同时转着…

2026/10/13 7:21:01 阅读更多 →
仿Hypixel起床战争服务端搭建指南:Paper插件开发核心思路与避坑实践

仿Hypixel起床战争服务端搭建指南:Paper插件开发核心思路与避坑实践

简介:一套面向《我的世界》服务器管理与联机爱好者的仿Hypixel起床战争(BedWars)服务端资源包,适合希望搭建多人竞技小游戏服、体验起床战争玩法的玩家或服主使用。资源为ZIP压缩包,共663个文件,约393.29MB…

2026/10/13 7:21:01 阅读更多 →
多Agent串行流水线:从任务拆解到断点续跑的工程实践

多Agent串行流水线:从任务拆解到断点续跑的工程实践

先说一个很多人都会踩的坑:你以为把任务丢给一个大模型,加上上下文提示词,它就能帮你把一个十步的活儿一口气干完。实际上,大模型单次输出经常在中间某个环节悄悄跑偏,或者直接因为超过了输出上限给你半截结果。一旦出…

2026/10/13 7:21:01 阅读更多 →
85GB期货TICK数据处理实战:清洗、加载与特征工程

85GB期货TICK数据处理实战:清洗、加载与特征工程

简介:本资源提供2013至2015年国内期货市场高频TICK级原始行情数据的种子文件集合,面向量化交易研究者、金融工程学习者及算法交易开发者,用于回测策略、构建tick级价量模型或训练时序预测模型。资源包共335个文件,主体包含108个Py…

2026/10/13 7:20:01 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →