首页/新闻资讯/正文详情

picoRV32+PYNQ-Z2:RISC-V SoC硬件结构设计与上板验证

发布时间:2026/11/2 16:15:46 来源:云帆数科 栏目:资讯中心
picoRV32+PYNQ-Z2:RISC-V SoC硬件结构设计与上板验证
简介这份《硬件结构设计》综合实验报告面向计算机组成原理、嵌入式系统与FPGA课程的学习者围绕在PYNQ-Z2开发板上基于开源RISC-V核picoRV32搭建完整SoC并完成上层软件编程这一任务展开适合需要完成课程综合实验、理解软硬件协同设计的中高年级本科生对照参考。压缩包内共1个docx文档约3.01MB正文29页按实验说明与所用框架PYNQ架构、嵌入式系统设计流程、硬件与软件设计方案、运行结果及分析、实验心得等章节组织结果部分细化到模块设置与IP核包装、IP与组件互联、生成并覆盖比特流文件、oDisk解压、指定文件夹放置以及在云平台上验证RISC-V可用性等环节并附有过程说明。目前已有1583人学习。读者可据此获得一套可复现的SoC搭建路线、Vivado工程操作要点与联调排错思路也可作为实验报告写作的体例参照。1. 从跑个灯到跑通一颗 RISC-V 核这套硬件结构设计到底在解决什么多数人做计算机组成原理实验停在了让流水线在仿真波形里跑出几条指令而真正让人卡住的地方是把一颗开源 RISC-V 核从 Verilog 源码一路推到板子上跑起自己的 C 程序。这份《硬件结构设计》综合实验报告要解决的正是这个问题以 picoRV32 为处理器核心在 PYNQ-Z2 上搭一个可用 SoC再借 RISC-V-On-PYNQ Overlay 在 Jupyter Notebook 里完成编译、下载与验证。它适合正在做硬件结构设计课设、SoC 毕设的本科生也适合想摸清 FPGA 软硬协同流程的从业者。硬件结构设计这件事光看架构图永远学不会必须手上有一块板子、一套能覆盖原文件的比特流。2. 总体方案设计三层框架与四类模块的职责划分动手之前先想清楚一件事这套系统里到底有哪些角色各自负责什么。实验报告的框架选型其实已经给出答案PYNQ 的三层结构加上 SoC 内部的四类模块构成了整份方案的结构框架。把这两层分层关系理顺了后面写 Verilog、连线、跑程序才不会乱。2.1 PYNQ 三层框架硬件层、软件层、应用层怎么配合按照报告里的划分PYNQ 系统分为三层。硬件层是以 FPGA 设计为主的 PL 部分承载 Overlay 比特流也就是我们真正用 Vivado 综合出来的 picoRV32 SoC软件层是 Linux 内核加 Python 运行环境跑在 Zynq 的 PS 侧 ARM 核上提供访问 FPGA 资源的 library应用层是浏览器里的 Jupyter Notebook用户在这里写代码、发指令。这个分层的价值在于职责隔离。写 C 程序的人待在应用层不需要知道 AXI 总线的时序做硬件的人在硬件层不需要关心上层 Python 怎么调用。中间那层 Python API 就是二者之间的约定接口。我在搭类似方案时习惯先把这三层的边界画在纸上标清楚哪些信号跨层、跨层的接口叫什么名字后面调试时一旦出问题能立刻判断是硬件没加载、驱动没识别还是程序本身写错。需要强调的是PYNQ 基于 Ubuntu 发行版的 Linux 构建可以直接使用 apt 包管理工具也就是说 Ubuntu 生态里几乎所有的软件库都能直接用。代价是镜像体积和部署效率换来的是开发速度——对于课设这种时间紧、要快速把工具链跑起来的场景这个取舍是划算的。2.2 SoC 内部四类模块处理器核、存储、外设、互联把镜头拉近到 PL 里那颗 SoC模块可以归成四类模块类别具体组成职责处理器核picoRV32picorv32 或 picorv32_axi 变体取指、译码、执行 RV32IMC 指令存储器本地 RAM / ROM存放指令与数据通过 mem_valid/mem_ready 握手访问外设GPIO、中断控制器、PCPI 协处理器等与外界交互、扩展非分支指令互联原生存储器接口或 AXI-4 Lite连接核与外设跨时钟域对接 PSpicoRV32 提供两种核心变体这个选择直接决定互联方案。picorv32提供简单的本机内存接口适合简单环境picorv32_axi提供 AXI-4 Lite Master 接口可以方便地与已经使用 AXI 标准的系统集成。另外还有一个picorv32_axi_adapter专门用来桥接原生存储器接口和 AXI4。如果你的 SoC 里要挂多个 picoRV32 核加本地 RAM、ROM 和内存映射外设让它们用本机接口互相通信、再通过 AXI4 与外部世界对话那么 adapter 就是必需的中间件。2.3 嵌入式系统设计流程从需求到联调的六个阶段报告里给的流程可以拆成六步需求分析、体系结构设计、模块划分、IP 核选择与集成、系统联调、验证。这条链路不是线性的实际做的时候会在联调和模块划分之间来回跳。具体到本项目需求是在 PYNQ-Z2 上跑起 RISC-V 并执行用户程序体系结构定成 PS 跑 Linux 管全局、PL 里放 picoRV32 SoC模块划分按上一节的四类走IP 核选择包括 picoRV32 本体、时钟复位、以及 AXI 相关的互联 IP集成阶段在 Vivado 里连线、约束、综合、实现、生成比特流联调阶段则是把比特流送上板、验证指令能否正确执行。提示流程里最容易被低估的是约束这一步。时钟频率、引脚分配、时序例外如果写错综合能过、实现能过但上板就是跑不起来而且现象往往很隐蔽。3. 核心 IP 实现picoRV32 的接口时序与配置裁剪这一章是全篇最硬的部分。picoRV32 之所以适合做课设是因为它的接口足够简单简单到你可以用几十行 Verilog 就给它接上一块存储器但简单不等于可以糊弄握手时序搞错程序就会静默跑飞连个报错都不给。3.1 存储器接口时序mem_valid 与 mem_ready 的握手规则picoRV32 的内存接口信号定义如下信号方向位宽含义mem_validoutput1本次访问有效mem_instroutput1该访问为取指mem_readyinput1从设备确认完成mem_addroutput32访问地址mem_wdataoutput32写数据mem_wstrboutput4写字节选通读时为 0mem_rdatainput32读回数据读传输时mem_wstrb为 0mem_wdata不使用存储器在mem_ready为高电平的那个周期把读数据放到mem_rdata上即可。关键点在于不需要外部等待周期。存储器可以异步实现让mem_ready与mem_valid在同一周期变高甚至直接把mem_ready绑成常数 1。写传输同理存储器把mem_wdata写到mem_addr然后通过置位mem_ready确认。注意把mem_ready恒接 1 是最省事也最容易出问题的做法。组合逻辑路径一旦过长高频下时序收敛会翻车。我一般会在关键路径上加一级寄存器延迟响应宁可多一个周期也不能让时序报告飘红。3.2 PCPI 协处理器接口非分支指令的外部扩展PCPIPico 协处理器接口是 picoRV32 一个很有设计感的机制允许在外部内核里实现非分支指令。信号包括pcpi_valid、pcpi_insn、pcpi_rs1、pcpi_rs2输出以及pcpi_wr、pcpi_rd、pcpi_wait、pcpi_ready输入。工作流程是这样的当遇到一个不支持的指令且 PCPI 特性被激活时pcpi_valid置起pcpi_insn输出指令字本身rs1和rs2字段被解码后寄存器值从pcpi_rs1和pcpi_rs2输出。外部 PCPI 内核解码、执行完成时拉高pcpi_ready可选地把结果写到pcpi_rd并拉高pcpi_wr主核随后把值写回对应寄存器。这里有一个 16 个时钟周期的超时保护如果外部内核在 16 个周期内没有确认会触发非法指令异常并调用对应处理程序。需要多周期执行的指令必须在成功解码后立即拉高pcpi_wait并一直保持直到pcpi_ready拉高这样才能避免被误判为非法指令。// PCPI 外部内核响应骨架多周期指令的标准写法 always (posedge clk) begin if (rst) begin pcpi_wait 1b0; pcpi_ready 1b0; pcpi_wr 1b0; end else begin // 检测到有效且属于本协处理器支持的指令 if (pcpi_valid is_my_opcode(pcpi_insn)) begin pcpi_wait 1b1; // 立刻宣告需要多个周期 // 移位器/乘法器等运算在此推进 if (op_done) begin pcpi_ready 1b1; pcpi_wr 1b1; pcpi_rd result; // 结果回写给主核 pcpi_wait 1b0; end end else begin pcpi_ready 1b0; pcpi_wr 1b0; end end end这段代码的重点不在逻辑本身而在pcpi_wait的时序位置必须在第一个周期就拉起来不能等运算做完了再拉。很多同学在这里翻车现象是程序跑着跑着进了异常处理还找不到原因——因为 16 周期一到主核已经把这条指令当成非法指令了。3.3 配置裁剪small / regular / large 三档怎么选picoRV32 的配置参数直接决定面积和性能报告里给了三档参考small不启用计数类指令模块无两阶段流水变化外部锁存mem_rdata对未对齐存储器访问和非法指令不做醒目处理。面积最小。regular默认配置功能与面积的平衡点。large启用 PCPI、IRQ、MUL、DIV、BARREL_SHIFTER 和 COMPRESSED_ISA 全部功能。指令周期数上有个容易忽略的细节当ENABLE_MUL激活时一条 MUL 指令在 40 个周期内执行当ENABLE_DIV激活时除法同样 40 个周期BARREL_SHIFTER激活后移位操作与其它 ALU 操作同样处理。这几个数字说明什么说明在没开硬件乘除的情况下乘除法是靠软件模拟的周期数会高一个数量级。如果你的程序里有大量乘法运算却选了 small 配置跑出来的性能会让你怀疑人生。// 综合配置示例课设场景常用的折中档 picorv32 #( .ENABLE_COUNTERS (1), // 需要性能计数器做 profiling 就打开 .ENABLE_COUNTERS64 (1), .ENABLE_REGS_16_31 (1), // RV32I 通用寄存器 x16-x31 .ENABLE_REGS_DUALPORT(1), // 双端口寄存器堆性能更好 .LATCHED_MEM_RDATA (0), // regular 档不锁存 .TWO_CYCLE_ALU (0), // 关键路径吃紧时置 1多一拍换时序 .COMPRESSED_ISA (1), // 支持 RV32C代码体积更小 .ENABLE_MUL (1), // 硬件乘法40 周期 .ENABLE_DIV (1), // 硬件除法40 周期 .BARREL_SHIFTER (1), // 桶形移位器 .ENABLE_PCPI (0), // 不用协处理器就关掉省面积 .ENABLE_IRQ (1) // 需要中断就打开 ) u_cpu ( .clk (clk), .resetn (resetn), .mem_valid (mem_valid), .mem_instr (mem_instr), .mem_ready (mem_ready), .mem_addr (mem_addr), .mem_wdata (mem_wdata), .mem_wstrb (mem_wstrb), .mem_rdata (mem_rdata) );参数怎么改判断依据很简单先看功能是否需要PCPI、IRQ、压缩指令再看性能是否吃紧MUL/DIV/BARREL_SHIFTER最后看时序有没有余量TWO_CYCLE_ALU。寄存器堆单端口还是双端口前者核更小、后者性能更好课设阶段资源不紧张就选双端口。4. 硬件集成与上板落地从 IP 打包到 PYNQ 验证的六步设计写完真正的考验才开始。这一章的六步是报告里运行结果部分的完整路径每一步都有它的坑。4.1 模块设置与 IP 核包装在 Vivado 里把写好的 picoRV32 SoC 顶层封装成 IP 核。封装的目的不是好看而是让它在 Block Design 里以图形化方式与其他组件连接同时自动生成地址映射和驱动信息。封装时要确认三件事顶层端口全部声明完整时钟和复位接口按 Vivado 的规范命名一般是s00_axi_aclk、s00_axi_aresetn这类以及接口协议类型标注正确AXI、时钟、复位分别用对应的 interface 类型。这三点缺一个BD 里就连不上线或者连上了但地址分配报错。4.2 将生成的 IP 与其他组件相连在 Block Design 中把封装好的 IP 与 Zynq Processing System 相连。典型的连接关系是PS 的 AXI Master 口连到 picoRV32 SoC 的 AXI Slave 口PS 提供时钟和复位SoC 的存储器映射地址由 Vivado 自动分配。这一步常见的错误是地址冲突。如果 BD 里已经有别的 IP 占用了同一段地址Vivado 会直接标红。解决方式是打开 Address Editor看 Assign 状态冲突的重新分配。另外 PL 侧的时钟频率要和 SoC 内部逻辑的设计频率对齐否则上板就是时序违例。4.3 生成比特流文件并覆盖原文件综合、实现、生成比特流。这一套跑下来十几分钟到几十分钟不等取决于工程规模。生成后得到.bit文件和.hwh硬件描述文件早期版本是 Tcl 文件两个都要保留——前者是配置 FPGA 的比特流后者告诉 PYNQ 的 Python API 这个设计里有哪些 IP、地址在哪。覆盖原文件指的是用新生成的 bit/hwh 覆盖板子上原有的 overlay 文件。如果不覆盖Overlay(xxx.bit)加载的还是旧设计你会在 Notebook 里怎么调都没反应还以为是程序写错了。4.4 oDisk 解压与文件放置把生成的比特流和相关文件通过板子的文件共享通道传上去解压后放到指定文件夹。这一步本身没有技术含量但路径写错是最常见的失败原因之一。建议在 Notebook 里先用绝对路径确认文件存在再加载from pynq import Overlay import os BIT_PATH /home/xilinx/jupyter_notebooks/riscv/design_1.bit print(os.path.exists(BIT_PATH)) # 先确认为 True 再往下走 overlay_design Overlay(BIT_PATH) # 实例化即默认下载比特流并解析 hwh print(overlay_design.ip_dict.keys()) # 打印 IP 列表确认 SoC 被识别Overlay类通过指定比特流文件名实例化实例化动作本身就会下载 bitstream 并解析硬件描述文件。所以ip_dict里能不能看到你的 SoC是判断硬件是否真的加载成功的第一道关卡。4.5 交叉编译与二进制下发RISC-V 程序在主机侧或板子上用交叉工具链编译。报告强调的便利之处在于整个编译、调试、验证都可以在 Jupyter Notebook 里完成写一段 C/C/RISC-V 汇编编译成二进制放到 picoRV32 上运行。# 以裸机程序为例编译并生成可加载的二进制 riscv32-unknown-elf-gcc -marchrv32imc -mabiilp32 \ -nostdlib -T linker.ld -o firmware.elf firmware.S riscv32-unknown-elf-objcopy -O binary firmware.elf firmware.bin-marchrv32imc必须和你在 Verilog 里打开的配置对上开了 COMPRESSED_ISA 才能用 c 扩展开了 MUL/DIV 才能用 m 扩展。工具链的架构选项和硬件配置不匹配编译能过跑起来就是非法指令异常。-mabiilp32对应 32 位整型调用约定配 RV32 是对的。4.6 在 PYNQ-Z2 云平台上验证 RISC-V 是否可用最后一步是验证。把firmware.bin写入 picoRV32 可访问的存储器区域启动核观察输出。报告记录的结论是运行成功实验成功。验证要分层做别一上来就跑完整程序。第一层确认 overlay 加载后 IP 列表里有 SoC第二层往存储器写一个已知值再读回来确认读写通路正常第三层跑一条最简单的不涉及外设的指令序列比如几条加法确认核在动第四层才跑带输出的完整程序。这样出问题时能立刻定位到是哪一层断的而不是对着一个没输出干瞪眼。5. 避坑清单这套 SoC 方案里最容易翻车的五个点5.1 现象Notebook 里调用 IP 报属性不存在原因通常是 hwh 文件没跟着 bit 一起更新或者加载路径指向了旧的 overlay。PYNQ 的 Python API 靠 hwh 里的描述生成 IP 对象描述过期对象自然对不上。解决方式是每次重新生成比特流后把 bit 和 hwh 成对覆盖实例化后打印ip_dict核对。5.2 现象程序运行后无任何输出也没有异常先怀疑存储器接口。最常见的是mem_ready恒 1 但组合路径太长或者读写地址译码有误导致写入落在无效区域。排查手段是把mem_valid、mem_addr、mem_wstrb引到 ILA 上抓波形看第一条取指的地址是不是复位向量指向的位置。地址错一步后面全错。5.3 现象用了乘除法后程序行为异常回到配置检查ENABLE_MUL/ENABLE_DIV是否真的打开以及工具链-march是否包含m。二者必须同时满足硬件没开而软件用了 m 扩展指令触发非法指令硬件开了而工具链按 rv32i 编译则白白浪费了硬件资源。这个不一致不会报编译错误只会运行时炸。5.4 现象时序报告 Critical Warning上板偶发挂死多半是时钟约束没写对或者跨时钟域信号没做同步。PS 侧时钟和 PL 侧时钟是两套域任何跨域的控制信号都要经过两级触发器同步。我一般会在 BD 里显式加复位同步模块宁可多几个触发器也不靠应该没问题。5.5 现象换一台机器重新综合结果不一致工程里残留了旧的 IP 缓存或者约束文件。Vivado 工程的.xpr、IP 目录、约束目录任何一个版本对不上综合结果就会飘。解决办法是归档时把工程目录整体打包别只拷源码重新打开工程后先跑一次 Reset Output Products 再综合。6. 验收与答辩怎么用一份可复现的证据链讲清这套设计验收这件事最怕的是我说它能跑。老师或评审不会只看你演示一遍他们会问你怎么证明跑的是你设计的 SoC而不是板子上原有东西所以答辩准备的核心不是 PPT 好看而是证据链完整。我一般会按四段组织材料。第一段是设计证据Vivado 的资源利用率报告、时序报告截图说明 picoRV32 在你的配置下占了多少 LUT/FF/BRAM最高能跑多少频率。这一页能直接回应你做了什么的追问。第二段是集成证据Block Design 截图加地址映射表标清每个 IP 的基地址和范围证明互联关系是清晰的。第三段是运行证据Notebook 里从加载 overlay 到打印 IP 列表、再到程序输出的完整执行记录最好保留中间步骤的打印信息让人看到你不是一把梭。第四段是对比证据同一段程序在 small 和 large 两种配置下的周期数差异用数据说明配置裁剪的影响。答辩时高频被问的三个问题提前准备好答案可能的问题回答要点为什么选 picoRV32 而不是别的核接口简单、可裁剪、有 AXI 变体、资源占用小适合在课设周期内跑通全流程你的 SoC 和直接用现成 IP 有什么区别存储器接口、地址译码、PCPI 扩展这些是自己写的能讲清每一根信号的作用程序跑飞了怎么定位分层验证法overlay 加载 → 读写回环 → 单指令 → 完整程序逐层排除还有一个小技巧演示前把整个流程在干净环境下重跑一遍包括重新生成比特流、重新上传文件、重新打开 Notebook。血泪经验是很多演示翻车不是设计有问题而是某个中间文件忘了更新现场手忙脚乱去找。把这条路径走顺了答辩就稳了一半。从那以后我每次做这类软硬协同的项目都会强制走一遍干净环境复现——新建目录、只拷交付物、按文档从头跑。这一步花二十分钟能省掉现场两小时的尴尬。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

零售数字化转型:HiveLink云宽带技术解析与应用
零售数字化转型:HiveLink云宽带技术解析与应用

1. 项目背景与行业痛点 连锁零售行业正面临前所未有的数字化转型压力。根据中国连锁经营协会最新数据,2022年零售企业数字化投入同比增长23%,但仍有67%的企业表示系统孤岛、数据割裂是最大障碍。传统零售门店通常存在三大典型问题: 多系统并… · 2026/11/2 16:15:46

私有化部署 vs 公有云:成本、安全、性能三维决策框架
私有化部署 vs 公有云:成本、安全、性能三维决策框架

企业选部署方式这件事,我见过太多团队在会议室里吵得不可开交,最后拍板的理由往往不是技术评估,而是"老板觉得云上不安全"或者"隔壁公司都上云了"。这两种决策方式都挺危险的。私有化部署和公有云不是信仰之争&#xff0… · 2026/11/2 16:15:46

AI新闻播报系统:多源验证与个性化语音合成技术解析
AI新闻播报系统:多源验证与个性化语音合成技术解析

1. 项目概述:AI早间新闻播报系统的设计初衷每天早上7点,我的手机都会准时响起一段由AI生成的语音新闻简报。这个习惯始于三年前我尝试用Python脚本抓取RSS订阅源,如今已演变成一套完整的个性化新闻播报系统。2026年3月6日这天的早间新闻特别值… · 2026/11/2 16:15:46

具身智能创新架构解析(2):从TVA智能体到TVA-EIS框架的协同进阶研究
具身智能创新架构解析(2):从TVA智能体到TVA-EIS框架的协同进阶研究

前沿技术探索:TVA智能体(简称TVA) TVA智能体(Transformer-based Vision Agent)是依托Transformer架构与“因式智能体”理论构建的新型工业视觉系统,也是当前最具代表性的具身视觉技术之一。它有机融合深度强化学习(DRL)、卷积神经网络(CNN)与因式分解算法(FRA),构… · 2026/11/3 2:15:22

具身智能创新架构解析(78):TVA-EIS端云协同算力卸载优化方案研究
具身智能创新架构解析(78):TVA-EIS端云协同算力卸载优化方案研究

前沿技术探索:TVA智能体(简称TVA) TVA智能体(Transformer-based Vision Agent)是依托Transformer架构与“因式智能体”理论构建的新型工业视觉系统,也是当前最具代表性的具身视觉技术之一。它有机融合深度… · 2026/11/3 2:15:22

具身智能创新架构解析(74):TVA-EIS适配国产算力的关键技术研究
具身智能创新架构解析(74):TVA-EIS适配国产算力的关键技术研究

前沿技术探索:TVA智能体(简称TVA) TVA智能体(Transformer-based Vision Agent)是依托Transformer架构与“因式智能体”理论构建的新型工业视觉系统,也是当前最具代表性的具身视觉技术之一。它有机融合深度强化学习(DRL)、卷积神经网络(CNN)与因式分解算法(FRA),构… · 2026/11/3 2:15:22

具身智能创新架构解析(76):TVA-EIS三重防线构建物理模型安全推演
具身智能创新架构解析(76):TVA-EIS三重防线构建物理模型安全推演

前沿技术探索:TVA智能体(简称TVA) TVA智能体(Transformer-based Vision Agent)是依托Transformer架构与“因式智能体”理论构建的新型工业视觉系统,也是当前最具代表性的具身视觉技术之一。它有机融合深度… · 2026/11/3 2:15:22

具身智能创新架构解析(77):从TVA智能体到TVA-EIS框架的范式进阶逻辑
具身智能创新架构解析(77):从TVA智能体到TVA-EIS框架的范式进阶逻辑

前沿技术探索:TVA智能体(简称TVA) TVA智能体(Transformer-based Vision Agent)是依托Transformer架构与“因式智能体”理论构建的新型工业视觉系统,也是当前最具代表性的具身视觉技术之一。它有机融合深度… · 2026/11/3 2:15:22

Java-类的继承
Java-类的继承

1.继承1.1为什么要继承Java中使用类,类经过实例化之后的产物对象,则可以用来表示现实中的实体,事物之间可能会存在一些关联,在设计程序中需要考虑事物(类)之间的关联,从而使代码更方便&#xff… · 2026/11/3 2:13:22

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

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

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

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

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

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

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码