FPGA实战:基于MIG的DDR3控制器配置与调试详解
搞FPGA的工程师基本都绕不过DDR3。我第一次在Kintex-7上接DDR3颗粒时天真地想自己写控制器状态机结果光是把刷新、预充电、激活、突发读写的调度规则理清楚就花了一个多星期最后还是回到了Xilinx的MIG IP核这条路。MIGMemory Interface Generator把DDR3控制器和物理层PHY全部封装好用户侧给你AXI4或Native UI接口。这篇文章就是我完整走过一遍之后整理的实战记录从MIG帮你做了什么到Vivado里怎么配置再到仿真、上板、调性能一路的坑我都会展开讲。适合第一次碰MIG、想用AXI接口读写DDR3的FPGA开发者也适合那些已经跑通但总遇到偶发问题、想看排查思路的工程师。1. MIG到底替你干了多少活1.1 为什么自己写DDR3控制器是条回头路DDR3不是一个大SRAM不是给地址、给片选、等一会儿就能读数据。一次完整的读操作要经过激活ACT选行再发CAS选列等待CL列选延迟之后数据才在DQS源同步时钟的配合下回到控制器如果下次要访问的行不在当前打开的bank行里还必须先预充电PRE关闭当前行。这还只是单个操作的时序真正麻烦的是背后的调度每64ms必须完成8192次刷新折合tREFI约7.8us一次超过85摄氏度时刷新间隔还要缩短到3.9us刷新命令的插入时机不能影响正在进行的读写突发也不能因为连续burst太久而把刷新卡住上电后要等颗粒完成ZQ校准之后控制器自己还要做写调平Write Leveling、读训练Read Calibration等一连串初始化。这些逻辑层面的事咬咬牙还能写物理层就没那么简单了。DDR3的数据线是源同步双向的DQS在写的时候是时钟送出去在读的时候又要变成输入采样信号为了信号完整性片内端接ODT必须根据操作方向动态切换。控制器内部要对每个字节通道的延迟做训练和校准才能在高速率下把数据正确采回来。真要从零写一套能上板跑稳的DDR3控制器加PHY业界通常要一个团队干大半年。MIG把控制器、PHY、训练算法、初始化状态机都做好了留给用户的是标准接口这才是它存在的价值。1.2 刷新和仲裁才是DDR的生命线我之前自己写控制器项目死在哪儿其实就死在仲裁。DDR3颗粒要求必须按时刷新否则电容漏电存储单元的数据就丢了而且这种错误不是检错纠错能救回来的是整片数据静默损坏。MIG内部有一个专门的调度器把刷新命令排在优先级较高的位置同时在空闲时隙插入预充电让bank尽可能处于适合下一次访问的状态。在AXI侧感知不到刷新停顿因为MIG会尽量在两次读写之间把刷新插进去实在时间紧张就强制中断一下普通访问。如果自己实现最怕遇到的情况就是某个master发了很长的burst把刷新一直往后挤最后tREFI超时数据全盘崩溃。这种问题和逻辑正确性无关纯粹是长期运行才暴露的可靠性问题也是我后来坚定用MIG的原因之一。1.3 布线等长与颗粒配置是控制器的另一半再强调一点MIG只能保证逻辑和时序训练算法正确DDR3的信号完整性取决于PCB布线。DQ与DQS之间要等长地址控制信号组要等长差分时钟CK/CK#要等长VTT端接电压要稳定ODT阻值要和走线阻抗匹配。我见过一块板子MIG配置、时钟、电源全都正常但init_calib_done信号始终不拉高最后查出来是DQ某一位的走线比其他线长了将近500mil训练算法怎么都收敛不了。所以说DDR3里控制器能解决的事和PCB该解决的事是分不开的。下板之前先确认板厂给的等长约束报告能省掉后面一大半的调试时间。2. 为什么接口要选AXI4而不是Native UI2.1 Native UI接口的原始面貌MIG生成的时候接口类型有很多选择其中原生UIUser Interface直接把控制器的命令和数据总线暴露出来。你会看到一大堆app_开头的信号命令通道有app_addr、app_cmd、app_en、app_rdy写数据通道有app_wdf_data、app_wdf_wren、app_wdf_rdy读数据通道有app_rd_data、app_rd_data_valid。这组接口需要自己维护一个状态机在app_rdy和app_en同时为高时发送命令写数据要按固定burst长度准备好命令通道和数据通道的握手相互独立还得处理命令已经发出但写数据没跟上的情况。每笔访问的burst长度实际上是固定的由地址的低位宏参数决定想变成长度不同的突发也没那么灵活。用这套接口不是不行但所有访问控制、异常处理都要自己写。2.2 AXI4五个通道如何映射到DDR访问接AXI4之后MIG内部已经把这套原生接口封装成了一个标准从机。AXI4 Memory-Mapped协议有5个通道AW通道写地址一次发送一个突发请求的起始地址和长度W通道写数据携带字节使能最后一次传输要拉高WLASTB通道写响应DDR控制器写完数据后返回BVALIDAR通道读地址R通道读数据同样以RLAST标记最后一拍。对用户来说一次DDR写操作就是发AW、发W、等B三个步骤读操作就是发AR、等R逻辑非常清晰。MIG在内部把AXI突发按DDR颗粒的实际组织方式拆成对应长度的访问比如AXI一次32字节突发可能对应DDR3一次BL8的访问。AXI的地址映射到bank、row、column的拆分方式MIG也通过配置项帮你算好了。2.3 实际项目里选AXI的另一个理由生态互通从实际工程角度看选AXI4最大的好处是生态。你的系统里大概率还有MicroBlaze软核、DMA、VDMA、自定义的视频流IP这些IP天然都挂AXI总线。DDR3的MIG用AXI接口整个系统的互联就是统一的AXI拓扑后面换Zynq、换Versal甚至换DDR4的MIG用户逻辑完全不用动。Native UI虽然接口更底层、转换路径更短但一旦换了控制器IP所有访问逻辑都要重写。我在项目里就把底层的DDR访问封装成一个AXI接口的模块上面接的所有master都只认识AXI后续维护非常省心。3. Vivado里逐项配置MIG每步都不踩坑3.1 创建前先定数据位宽、颗粒型号与时钟打开Vivado在IP Catalog里搜索MIG创建IP核之后第一步就是选Memory Type为DDR3。这一步之前心里得先把三件事定下来数据位宽、内存颗粒型号、运行时钟频率。数据位宽和颗粒组织强相关。一个DDR3颗粒通常是x8或x16位宽64位数据总线意味着要并8颗x8颗粒组成一个rank。MIG的AXI数据位宽默认和DDR数据位宽一致如果DDR是32位AXI接口也是32位。视频缓存类应用用32位可能够但如果是DMA大量搬数据或以太网高速收发我建议直接上64位毕竟带宽翻倍带来的收益很直接。颗粒型号要选MIG支持的常用的是Micron的MT41K系列。配置窗口里可以直接搜颗粒型号如果列表里没有还要手动用Add new Part的流程去编辑颗粒参数。时钟频率这块一般DDR3运行在1066MT/s到1600MT/s之间即核心时钟533MHz到800MHz。频率越高时序收敛越难PCB要求也越高不要一上来就冲到最高。3.2 参考时钟、输入时钟与系统时钟的关系MIG配置里有一个很容易看晕的概念Input Clock Period、Reference Clock和System Clock。实际经验是这样理解Input Clock是板子上给MIG提供的基础时钟一般定义成200MHz或100MHz它经过MIG内部的PLL/MMCM倍频出DDR核心时钟在配置页里填的是周期200MHz就是5000ps100MHz就是10000psReference Clock是训练算法使用的相位参考通常要求200MHz的差分或单端信号有的板子上没有200MHz外部时钟可以从Fabric时钟转过来System Clock代表控制器内部时钟也就是MIG用户侧接口比如AXI的时钟ui_clk它的频率一般是DDR核心时钟的1/2或1/4。我习惯把外部提供200MHz差分时钟直接喂给MIG的sys_clk_p/n同时让MIG的ui_clk作为我用户逻辑的主时钟这样时序约束简单也不会有跨时钟域的分叉。配置完成后MIG会把内部锁相环和MMCM的结构生成好用户只需要在顶层例化时保证sys_clk输入有效复位信号aresetn在时钟稳定后再释放即可。3.3 AXI Burst长度与Address Mapping的取舍MIG的AXI接口配置里有Burst Length选项一般DDR3固定BL8也就是一次颗粒突发8个bit位宽的数据。比如DDR3数据位宽32位BL8对应一次颗粒访问是32字节。AXI一侧的突发长度可以是1、2、4、8、16等MIG会把AXI突发拆成一个或多个DDR原子访问。另一个关键配置是Address Mapping。DDR3颗粒内部地址是bank、row、column三层结构AXI地址的哪些bit映射到row、哪些映射到bank、哪些映射到column直接影响顺序访问的page hit率。MIG默认的映射方式在配置文件里能看到例如可能把地址bit[15:13]映射为bank、bit[22:16]映射为row。如果应用是大块顺序数据搬运这种映射通常已经够用但如果访问模式是随机的可以手动调整映射把bank字段放在较低位让连续地址能落在不同bank里从而支持bank交错。具体选哪种好我的办法是先用默认配置上板跑一轮性能测试再用仿真或实际数据带宽数据对比。盲调映射没有意义因为实际性能除了映射还跟outstanding能力、burst长度、刷新策略相关。3.4 生成后值得优先读的文件MIG生成完IP之后只接IP本身也可以但我强烈建议先打开Example Design。在IP Sources里右键MIG选择Open IP Example DesignVivado会生成一个独立的参考工程里面包括example_top.v顶层把DDR3接口、时钟、复位、ILA都连好了traffic_gen模块一个简单的AXI读写发生器能做基本的数据检查和led控制ddr3_model仿真用的DDR3颗粒模型ILA例化把若干关键信号拉出来准备上板调试。读这个工程的价值在于知道MIG例化的正确姿势尤其是时钟和复位怎么连、用户侧数据总线怎么接比自己闷头从头写测试框架快得多。我第一次做的时候直接把example_top里的traffic_gen替换成自己的AXI模块仿真和上板一次性跑通。4. 仿真阶段先把协议跑透别等到上板再学握手4.1 仿真模型怎么选初始化的速度陷阱MIG的example design生成后直接Run Behavioral Simulation就能看到DDR3初始化到读写的完整过程。仿真之所以快是因为example工程里用了DDR3_SIMULATION这类宏定义把内部的一些计数和训练时序缩短了。如果直接在自建工程里例化MIG不做仿真优化DDR初始化的时间在仿真里会非常漫长因为训练算法里面有很多真实的延迟和时钟周期等待。自己搭仿真环境时别忘了把MIG相关仿真宏加上或者干脆先借用example design的tcl脚本和约束改掉顶层模块再跑。仿真成功后你会在波形里看到几个关键节点系统复位释放MIG内部PLL锁定init_calib_done从0跳变到1代表PHY训练和颗粒校准完成之后AXI通道才开始接受事务。如果在仿真里init_calib_done始终不拉高不要急着查业务逻辑先查时钟和复位配置这是所有问题的根源。4.2 在波形里看懂VALID/READY背压AXI协议的流控基础就是VALID和READY握手只有两者同时为高时一拍数据传输才成立。DDR控制器作为从机什么时候拉低READY就是背压信号背后原因基本是内部FIFO满了或者DDR颗粒正忙。仿真时专门去找几段背压波形看写方向主设备拉WVALID但MIG把WREADY拉低此时WVALID和数据必须保持不变直到WREADY拉高完成握手读方向AR通道正常发出后R通道的RVALID可能不会立刻拉高控制器需要时间完成DDR读操作B通道写数据完成后BVALID要等DDR真正写完并返回响应才拉高。我见过不少第一次写AXI主设备的人在WREADY拉低时把WVALID和WLAST丢掉结果仿真报数据不完整或事务挂死。AXI里从机没准备好主设备就得原地等待这个规则非常简单但极其重要仿真是理解它的最好方式。4.3 自己写个简单的AXI主设备做读写回环用example里现成的traffic_gen能跑通仿真但理解不深。我建议自己写一个极简的AXI主设备功能只有三个状态先写一片数据再读回来然后比对。这个模块核心逻辑如下等待init_calib_done和MIG AXI接口的aresetn释放状态0发AW和W地址从0开始数据为递增序列WLAST标记最后一拍状态1等待BVALID返回确认写完成状态2发AR等RVALID收集R数据和RLAST状态3比对读写数据输出通过/失败标志。这个模块别看简单能帮你把AXI写地址、写数据、写响应、读地址、读数据五条通道的时序全部过一遍。在仿真里把变量打出来跑上几百次随机地址比直接上板查ILA效率高太多。4.4 关于AXI VIP的一个小提醒如果是做高性能验证用Synopsys AXI VIP这类商业验证IP当然更专业它可以自动检测协议违例、UVM环境集成、随机约束生成。唯一的烦恼是默认打印太多transaction一条条刷屏。常见的抑制办法是在Vivado或实际工具链里根据VIP版本调整报文打印级别或者在你的test里把事务打印相关的verbosity设高一些让低优先级的transaction日志不再输出。具体参数名以你使用的VIP版本文档为准这里只提思路。5. 上板调试从init_calib_done到数据正确的完整链路5.1 上电后第一个要抓的信号把example design综合、实现、生成bitstream下载到板子上之后第一步不是看读写结果而是用ILA抓c0_ddr3_ui_clk、aresetn、init_calib_done。这三个信号正常了说明DDR控制器自身已经跑起来。ILA的采样时钟建议用MIG的ui_clk这样能直接看到AXI通道上的所有时序不需要跨时钟域。我自己遇到过init_calib_done一直为0的情况排查链路是这样的先用万用表确认DDR3供电VDD 1.5VVTT 0.75VVREF 0.75V。VTT最容易出问题曾经有板子VTT做成1.5VMIG的PHY IO电平都不对训练完全跑不起来确认外部时钟输入用示波器量sys_clk_p/n确认复位芯片时序aresetn是否在时钟稳定后才释放如果以上正常用ILA抓c0_ddr3_init_done这类内部状态信号看卡在training的哪个阶段。5.2 初始化过了但读写失败先查地址映射init_calib_done拉高后最常见的现象是写一个地址读回来数据不对或者全零。这时候第一嫌疑不是时序而是AXI地址到DDR地址的映射没有对齐。MIG把AXI地址映射到DDR行列bank有一套固定规则具体看IP核配置里的Address Mapping。一个典型误区是以为DDR容量16MB所以地址bit[23:0]就是颗粒内部寻址其实bit划分中有一部分会映射到bank或row你写入地址0x0000和0x1000可能落在同一个row的不同column也可能落在不同bank取决于数据宽度和映射表。排查方法是先用一小组地址写读回环把地址差值从小到大遍历找出数据开始错位的地址边界再和MIG提供的映射表对照。我调K7时就是发现0x000到0x7FF正常0x800开始读回全是FF最后对照发现是row映射位算错了调整数据在系统里的起始偏移后立刻正常。5.3 偶发数据错误时序余量不足的典型表现如果读写不是全错而是偶发某一位翻转、某个burst数据错位那基本就是时序余量不够。处理手段从软到硬包括降低DDR运行频率比如1600MT/s降到1333MT/s这是最直观的改善余量的方法调整ODT阻值配置DDR3常见RTT_NOM有RZQ/2120欧、RZQ/460欧、RZQ/640欧不同阻值对信号反射的抑制效果不同具体看PCB走线一般高速板用40或60欧检查训练参数是否到达边界MIG部分版本支持调整Read DQS延迟等级和写调平值仔细看板级SI问题VTT去耦电容是否足够、DQ/DQS等长约束是否真实满足。我的项目曾遇到DDR偶尔死机降到1333MT/s稳定跑了一整夜不会挂后来查出是某个数据组的等长误差太大改版后回到1600MT/s也完全正常。这种问题别指望靠逻辑解决根源就在信号质量。5.4 跨4KB边界的事务一定要处理AXI4协议规定一个burst不能跨越4KB地址边界。这个限制的起因和系统页表有关但在接DDR3时无论什么master都得遵守。如果DMA要搬运一大块数据刚好跨过4KB硬件必须自己把事务拆成两段否则协议违例表现可能是数据错乱或者通道挂死。很多现成DMA IP会在内部做4KB边界分割但自己写的master就很容易忽略。我的建议是所有AXI主设备在发送burst前必须算一下本burst是否会跨4KB边界如果会就缩短到4KB边界处的最后一个节拍。这个逻辑写在发送状态机里代码量不大但能避免一大堆莫名其妙的问题。6. 性能细节从跑通到跑得快6.1 顺序访问与bank交错跑通DDR之后下一个话题是效率。DDR3实际带宽和访问模式强相关顺序地址访问时控制器可以打开一个行然后连续读取带宽能接近理论峰值随机地址访问时几乎每次都要激活新行、预充电旧行吞吐率可能只有顺序访问的三分之一。设计应用时尽量做到一次AXI burst尽量长比如16拍甚至更长而不是频繁发短突发多个master同时访问时让它们访问不同的bank区域MIG的bank调度能自动把不同bank的操作交错起来数据排列上把需要并行处理的数据块放在不同bank起始地址。6.2 outstanding事务数量的作用AXI主设备如果每一笔都等B通道返回再发下一笔DDR控制器就会有空闲周期。打开outstanding能力即不等响应就连续发多笔AW或ARMIG内部FIFO会缓存这些请求并自行调度能显著提高带宽利用。在MIG的AXI配置里可以设置outstanding或可接受outstanding传输的深度上限。主设备侧也要支持这个行为。比如读方向主设备可以连发4笔AR然后一次性接收4笔R数据控制器在内部把这4个读请求排到不同bank或同一行省去中间等待。我做过一个简单测试同样的DDR3每笔读都串行等待时带宽只有约60%开启8笔outstanding后能跑到约85%以上。如果你的性能测试不达标先检查AXI主设备的outstanding能力这一项往往比地址映射的影响还要大。6.3 多master访问DDR时的QoS配置当CPU、DMA、视频流处理器同时通过AXI Interconnect访问DDR时MIG的QoS优先级寄存器就派上用场了。MIG的AXI接口有优先级输入信号可以从高到低设置每个通道的优先级权重低优先级请求在高优先级密集时会被延后。我在一个小型SoC里调试过视频帧率不稳定最后就是把视频DMA对应的AXI端口优先级提高读和写权重都加大CPU做控制平面的访问优先级降一档问题立刻缓解。这里有个容易忽略的点优先级影响的是同一时刻多个等待事务的仲裁顺序如果某个master根本没发事务优先级再高也没用所以要先确认带宽够不够再加QoS。6.4 用ILA看到的几种异常波形上板调试时我总结了几种常见异常WREADY长时间为零MIG写FIFO满或DDR正忙正常情况背压不会超过几个节拍如果长时间卡住检查是否某笔事务没有正确完成RVALID迟迟不拉高读地址是否发出且被接受acc检查ARVALID和ARREADY是否正常握手BVALID一直不返回可能是写数据通道和写地址通道跨了很久比如发了AW但W数据没跟上总线hang死所有通道都停在等待状态大概率是某个从机没有接受或没有响应复位后重新抓波形。调试时ILA采样深度别设太小我一般设16384以上配合触发条件在事务边界去抓波形里能看到完整的事务序列而不是一堆碎片。写到这里DDR3控制器从配置到上板调试的关键环节都过了一遍。最后再说一个我自己的习惯每次接到新板子我不会直接跑业务逻辑而是先让MIG的example design在板子上跑一遍确认DDR训练和基本读写没问题。这个小步骤看起来多花二十分钟但它能帮你把板子/DDR硬件问题和自己逻辑问题清晰隔离开后面排查业务异常时省下的时间远不止二十分钟。DDR3的性能和稳定性是设计出来的不是调出来的配置阶段多想一步上板阶段就能少熬一个夜。

相关新闻

Xbox手柄做遥操作:Robosuite+UR5e 6自由度控制全攻略

Xbox手柄做遥操作:Robosuite+UR5e 6自由度控制全攻略

前阵子我在Robosuite里做机械臂遥操作实验,折腾了一圈键盘、鼠标甚至写了个简陋的Web界面,最后发现最顺手的输入设备居然是我游戏机上吃灰的Xbox手柄。把Xbox手柄和OSC控制器接上之后,UR5e末端在仿真里就像长了眼睛一样,指哪打哪&…

2026/10/7 14:02:59 阅读更多 →
企业级AI应用底座QuickBlue:基于JDK 21与Spring Cloud的微服务架构设计与落地实践

企业级AI应用底座QuickBlue:基于JDK 21与Spring Cloud的微服务架构设计与落地实践

1. 从一个真实困境说起:为什么“能跑通的AI Demo”和“能上线的AI应用”之间隔着一道鸿沟过去一年多,我参与过好几个企业内部的AI应用落地项目,从最早的“拿个大模型API套个壳”到后来正儿八经要接入生产环境,踩的坑几乎能写一本书…

2026/10/7 14:02:59 阅读更多 →
Agent工程实践:从Harness运行循环到Skill与记忆的落地指南

Agent工程实践:从Harness运行循环到Skill与记忆的落地指南

把 Agent 从“能跑通 Demo”推到“能接真实流量”,中间隔着的东西比大多数人想象的多得多。Agent-Reach 这个项目,就是我在这个过程中沉淀下来的一套轻量级 Agent 工程实践。名字很直白:让 Agent 的能力真正 reach 到业务场景,而不…

2026/10/7 14:01:58 阅读更多 →

最新新闻

KNX自动化系统深度拆解:去中心化总线智能家居架构与实战

KNX自动化系统深度拆解:去中心化总线智能家居架构与实战

最近两年总有人在微信上问我同一个问题:设计师推荐了家里做KNX,这个能让灯光窗帘联动的系统到底靠不靠谱?问的人多了,我发现很多人第一次接触智能家居就直接撞上了总线制系统,而“What is KNX automation”这个疑问&am…

2026/10/7 14:32:24 阅读更多 →
多协议RTU如何打通工程监测数据上云链路?4G+Modbus+MQTT详解

多协议RTU如何打通工程监测数据上云链路?4G+Modbus+MQTT详解

做过工程监测的人基本都遇到过这种场面:现场设备各说各话——振弦式渗压计输出频率信号,485水位计走Modbus RTU,旁边电箱里的PLC又用Modbus TCP和上位机通信,天上还飘着一路4G信号要把数据传回机房。一堆设备堆在一起,…

2026/10/7 14:32:24 阅读更多 →
VSCode插件开发实战:用TaoToken统一管理npm包依赖与API调用

VSCode插件开发实战:用TaoToken统一管理npm包依赖与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/7 14:32:24 阅读更多 →
自习室预约系统源码拆解:Spring Boot选座冲突与订单闭环实战

自习室预约系统源码拆解:Spring Boot选座冲突与订单闭环实战

简介:本资源是一套基于Spring Boot与MVC框架开发的自习室管理与预约系统源码,面向计算机专业学生、Java Web初学者及需要课程设计或毕业设计参考的开发者,帮助解决自习室座位预约与后台信息管理的实际需求。压缩包共828个文件,约3…

2026/10/7 14:32:24 阅读更多 →
打通Modbus、4G、MQTT:多协议RTU在工程监测中的落地实践

打通Modbus、4G、MQTT:多协议RTU在工程监测中的落地实践

做工程监测这些年,我越来越确信一件事:搞不定协议,就搞不定现场数据。上个月在一个水库边坡监测项目里,我同时对着三样东西犯愁——渗压计走的是Modbus RTU,4G模组的信号忽高忽低,云端平台却只认MQTT推送。…

2026/10/7 14:32:24 阅读更多 →
Windows上DeepSeek harness报SetNamedSecurityInfoW failed?权限令牌排查与修复实录

Windows上DeepSeek harness报SetNamedSecurityInfoW failed?权限令牌排查与修复实录

凌晨两点的房间,屏幕上还是那行刺眼的报错:setnamedsecurityinfow failed (win32)。我盯着 DeepSeek harness 的日志面板,第七次重新触发那个本该三秒跑完的文件读取 skill,它依然在 Windows 安全 API 这一步直接翻车。说实话&…

2026/10/7 14:31:23 阅读更多 →

日新闻

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/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 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/7 11:43:46 阅读更多 →
黑夜航拍船只数据集训练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/7 13:34:55 阅读更多 →