FPGA设计核心:时空资源权衡与并行架构实践指南
如果你问一个FPGA工程师FPGA设计的本质是什么可能会得到各种答案有人说是硬件描述语言编程有人说是数字电路设计还有人说是并行计算架构。但真正深入做过FPGA项目的人会告诉你FPGA设计的本质其实是在时间与空间维度上的资源权衡艺术。这个判断可能听起来有些抽象但却是FPGA工程师每天都在面对的现实。与软件编程不同FPGA设计需要在有限的硬件资源内通过精巧的时序控制和空间布局实现特定的功能目标。这种时空权衡的思维模式正是区分FPGA新手与资深工程师的关键所在。1. 为什么FPGA设计思维如此独特1.1 从软件思维到硬件思维的转变大多数工程师最初接触的是软件编程其核心是顺序执行代码一行接一行地运行CPU按照指令顺序处理任务。但FPGA完全不同它所有的逻辑单元理论上可以同时工作这种并行性带来了巨大的性能优势也带来了全新的设计挑战。软件思维的特征关注算法的时间复杂度依赖CPU的串行处理能力通过函数调用组织代码结构内存管理相对透明FPGA思维的核心同时考虑时序收敛和资源利用率所有逻辑单元并行工作通过数据流和状态机组织逻辑需要显式管理存储和布线资源1.2 真实项目中的思维差异体现假设要实现一个图像滤波算法软件工程师可能会这样写// 软件实现 - 顺序执行 for (int i 0; i height; i) { for (int j 0; j width; j) { output[i][j] filter_3x3(input, i, j); } }而FPGA工程师的思考方式完全不同// FPGA实现 - 并行流水线 module image_filter ( input clk, input reset, input [7:0] pixel_in, output [7:0] pixel_out ); // 3x3窗口寄存器阵列 reg [7:0] line_buffer [0:2][0:IMAGE_WIDTH-1]; reg [7:0] window [0:2][0:2]; // 实时更新滤波窗口 always (posedge clk) begin if (reset) begin // 初始化缓冲区 end else begin // 流水线移位更新窗口 window[0][0] window[0][1]; window[0][1] window[0][2]; window[0][2] line_buffer[0][col1]; // ... 更多窗口更新逻辑 end end // 并行计算滤波结果 assign pixel_out (window[0][0] window[0][1] ... ) / 9; endmodule这种思维转变是FPGA学习过程中最大的挑战也是最重要的突破点。2. FPGA设计的核心概念解析2.1 时序概念FPGA设计的生命线时序是FPGA设计中最为关键的概念它直接决定了设计能否正常工作。时序问题也是新手最容易忽视的陷阱。建立时间Setup Time和保持时间Hold Time建立时间时钟边沿到来之前数据必须稳定的最小时间保持时间时钟边沿到来之后数据必须保持稳定的最小时间// 时序敏感的触发器示例 module timing_critical ( input clk, input data_in, output reg data_out ); // 这个简单的赋值背后涉及复杂的时序分析 always (posedge clk) begin data_out data_in; // 这里必须满足建立和保持时间要求 end endmodule2.2 资源类型FPGA的硬件基础理解FPGA内部资源是进行有效设计的前提。主流FPGA通常包含以下资源资源类型功能描述设计考虑LUT查找表实现组合逻辑逻辑复杂度与LUT数量的平衡触发器FF实现时序逻辑时钟域交叉和时序收敛Block RAM片上存储存储深度与带宽的权衡DSP Slice数学运算算法并行度与资源限制时钟资源时钟管理和分配时钟域设计和时序约束2.3 设计层次从行为级到物理级FPGA设计通常包含多个抽象层次行为级描述关注算法功能不涉及具体实现细节RTL级描述寄存器传输级描述数据在寄存器间的流动门级网表逻辑综合后的基本逻辑单元连接物理实现布局布线后的实际硬件映射3. FPGA设计环境与工具链准备3.1 主流开发工具选择目前市场上主流的FPGA开发工具包括Xilinx Vivado用于Xilinx/AMD器件功能全面Intel Quartus Prime用于Intel FPGA器件界面友好开源工具链Yosys nextpnr适合学术和小项目3.2 环境配置要点以Vivado为例基础环境配置包括# Vivado脚本示例 - 项目创建和基本设置 create_project fpgadesign_basic ./fpgadesign -part xc7a100tcsg324-1 set_property board_part digilentinc.com:arty-a7-100:part0:1.0 [current_project] # 添加源文件 add_files -norecurse { ./src/top_module.v ./src/image_processing.v ./src/fifo_controller.v } # 时序约束 create_clock -period 10.000 -name clk [get_ports clk] set_input_delay -clock clk 2.000 [get_ports data_in*] set_output_delay -clock clk 3.000 [get_ports data_out*]3.3 版本控制策略FPGA项目同样需要规范的版本管理# 典型的FPGA项目目录结构 fpga_project/ ├── src/ # 源代码 ├── constraints/ # 约束文件 ├── ip/ # IP核 ├── sim/ # 仿真文件 ├── build/ # 构建输出 └── doc/ # 文档4. FPGA设计核心流程详解4.1 需求分析与架构设计在开始编码前必须明确设计目标性能指标吞吐量、延迟、功耗要求接口规范输入输出接口类型和时序资源预算预估的LUT、FF、BRAM使用量时钟架构时钟域规划和时钟频率目标4.2 RTL编码最佳实践模块化设计原则// 好的模块化设计示例 module image_pipeline ( input clk, input reset_n, input [23:0] pixel_data, input data_valid, output [23:0] processed_data, output data_ready ); // 子模块实例化 - 清晰的流水线结构 pixel_buffer u_buffer (.clk(clk), .reset_n(reset_n), .*); color_converter u_color_conv (.clk(clk), .reset_n(reset_n), .*); filter_engine u_filter (.clk(clk), .reset_n(reset_n), .*); output_interface u_output (.clk(clk), .reset_n(reset_n), .*); endmodule同步设计准则// 推荐同步复位设计 always (posedge clk or negedge reset_n) begin if (!reset_n) begin state IDLE; counter 8h0; end else begin state next_state; counter next_counter; end end // 避免异步逻辑带来的时序问题 // always (posedge clk or posedge async_signal) // 不推荐4.3 功能仿真与验证仿真是在投入硬件前发现问题的关键步骤// 简单的测试平台示例 module tb_image_filter; reg clk, reset_n; reg [7:0] test_pixel; wire [7:0] result; // 时钟生成 always #5 clk ~clk; // 实例化被测设计 image_filter uut (.clk(clk), .reset_n(reset_n), .pixel_in(test_pixel), .pixel_out(result)); initial begin clk 0; reset_n 0; test_pixel 0; #100 reset_n 1; // 测试用例 for (int i 0; i 256; i) begin (posedge clk); test_pixel i; end #1000 $finish; end endmodule4.4 综合与实现综合是将RTL代码转换为门级网表的过程需要关注# 综合策略配置 set_property strategy Flow_AreaOptimized_high [get_runs synth_1] set_property STEPS.SYNTH_DESIGN.ARGS.FLATTEN_HIERARCHY rebuilt [get_runs synth_1] # 实现约束 set_property strategy Performance_RefinePlacement [get_runs impl_1]5. 完整设计示例基于FPGA的实时图像处理系统5.1 系统架构设计让我们通过一个完整的实例来理解FPGA设计的本质。这是一个实时图像处理系统接收摄像头数据进行边缘检测然后输出显示。// 顶层模块 - 体现时空权衡设计 module real_time_image_processor ( input clk_100m, // 100MHz主时钟 input reset_n, // 异步复位 // 摄像头接口 input cam_pclk, // 像素时钟 input cam_vsync, // 场同步 input cam_href, // 行有效 input [7:0] cam_data, // 像素数据 // 显示接口 output vga_clk, // VGA时钟 output vga_hsync, // 行同步 output vga_vsync, // 场同步 output [7:0] vga_rgb // RGB输出 ); // 时钟域交叉处理 wire clk_cam, clk_vga, clk_proc; clock_manager u_clk_mgr ( .clk_in(clk_100m), .clk_cam(clk_cam), // 24MHz摄像头时钟 .clk_vga(clk_vga), // 25.175MHz VGA时钟 .clk_proc(clk_proc) // 50MHz处理时钟 ); // 图像采集模块 wire [23:0] rgb_data; wire data_valid; image_capture u_capture ( .pclk(cam_pclk), .reset_n(reset_n), .vsync(cam_vsync), .href(cam_href), .data_in(cam_data), .rgb_out(rgb_data), .valid_out(data_valid) ); // 异步FIFO - 时钟域隔离 wire [23:0] proc_data; wire proc_valid; async_fifo #(.DWIDTH(24), .DEPTH(1024)) u_fifo ( .wr_clk(clk_cam), .rd_clk(clk_proc), .wr_data(rgb_data), .wr_en(data_valid), .rd_data(proc_data), .rd_en(proc_valid) ); // 图像处理流水线 wire [23:0] edge_data; wire edge_valid; edge_detection_pipeline u_processor ( .clk(clk_proc), .reset_n(reset_n), .pixel_in(proc_data), .valid_in(proc_valid), .pixel_out(edge_data), .valid_out(edge_valid) ); // 显示输出 vga_controller u_vga ( .clk(clk_vga), .reset_n(reset_n), .pixel_data(edge_data), .data_valid(edge_valid), .vga_clk(vga_clk), .vga_hsync(vga_hsync), .vga_vsync(vga_vsync), .vga_rgb(vga_rgb) ); endmodule5.2 关键处理模块实现边缘检测流水线设计module edge_detection_pipeline ( input clk, input reset_n, input [23:0] pixel_in, input valid_in, output reg [23:0] pixel_out, output reg valid_out ); // 灰度转换 reg [7:0] gray_pixel; always (posedge clk) begin if (valid_in) begin // RGB转灰度: Y 0.299R 0.587G 0.114B gray_pixel (pixel_in[23:16] * 8d76 pixel_in[15:8] * 8d150 pixel_in[7:0] * 8d29) 8; end end // 3x3卷积窗口 - 空间权衡的体现 reg [7:0] line0 [0:639]; // 行缓冲区0 reg [7:0] line1 [0:639]; // 行缓冲区1 reg [7:0] line2 [0:639]; // 行缓冲区2 reg [7:0] window [0:2][0:2]; // 3x3卷积窗口 reg window_valid; always (posedge clk) begin if (!reset_n) begin window_valid 1b0; end else if (valid_in) begin // 更新行缓冲区 line0 {line0[1:639], gray_pixel}; line1 line0; line2 line1; // 更新卷积窗口 window[0][0] window[0][1]; window[0][1] window[0][2]; window[0][2] line0[639]; window[1][0] window[1][1]; window[1][1] window[1][2]; window[1][2] line1[639]; window[2][0] window[2][1]; window[2][1] window[2][2]; window[2][2] line2[639]; window_valid (col_count 1 row_count 1); end end // Sobel边缘检测 - 时间权衡的体现 wire [10:0] gx, gy; reg [7:0] edge_magnitude; always (posedge clk) begin if (window_valid) begin // Gx (-1)*window[0][0] (-2)*window[1][0] ... gx (window[0][2] 2*window[1][2] window[2][2]) - (window[0][0] 2*window[1][0] window[2][0]); // Gy (-1)*window[0][0] (-2)*window[0][1] ... gy (window[2][0] 2*window[2][1] window[2][2]) - (window[0][0] 2*window[0][1] window[0][2]); // 梯度幅度计算 edge_magnitude (|gx| |gy|) 8d128 ? 8hFF : 8h00; end end // 输出处理 always (posedge clk) begin valid_out window_valid; pixel_out {edge_magnitude, edge_magnitude, edge_magnitude}; end endmodule6. 时序约束与优化策略6.1 基础时序约束方法正确的时序约束是设计成功的关键# 时钟约束 create_clock -name clk_100m -period 10.0 [get_ports clk_100m] create_clock -name clk_cam -period 41.667 [get_pins u_clk_mgr/clk_cam] create_clock -name clk_vga -period 39.721 [get_pins u_clk_mgr/clk_vga] # 时钟域约束 set_clock_groups -asynchronous -group {clk_100m clk_proc} -group {clk_cam} -group {clk_vga} # 输入输出延迟约束 set_input_delay -clock clk_cam -max 3.0 [get_ports cam_data] set_output_delay -clock clk_vga -max 2.0 [get_ports vga_rgb]6.2 时序优化技巧当时序不满足时可以尝试以下优化策略流水线重定时在组合逻辑中插入寄存器逻辑重构优化关键路径的逻辑结构寄存器复制减少高扇出网络的负载物理约束引导布局布线工具优化关键路径// 优化前长组合逻辑路径 always (posedge clk) begin result (a b) * c - d / e f * g; // 单周期长路径 end // 优化后流水线设计 always (posedge clk) begin // 第一级流水 stage1_add a b; stage1_div d / e; stage1_mul1 f * g; // 第二级流水 stage2_mul stage1_add * c; stage2_sub stage1_mul1 - stage1_div; // 第三级流水 result stage2_mul stage2_sub; end7. 资源优化与面积权衡7.1 资源共享技术当资源紧张时可以通过时间换空间// 资源浪费的实现 module resource_waste ( input clk, input [7:0] a, b, c, d, output reg [15:0] result1, result2 ); // 两个独立的乘法器 - 占用更多DSP资源 always (posedge clk) begin result1 a * b; // 使用一个DSP result2 c * d; // 使用另一个DSP end endmodule // 资源共享的实现 module resource_share ( input clk, input [7:0] a, b, c, d, input sel, // 选择信号 output reg [15:0] result ); reg [15:0] temp1, temp2; // 分时复用单个乘法器 always (posedge clk) begin if (sel) begin temp1 a * b; // 第一个乘法 end else begin temp2 c * d; // 第二个乘法 end result sel ? temp1 : temp2; end endmodule7.2 存储器优化策略Block RAM的有效使用可以显著影响性能// 高效的BRAM使用示例 module bram_optimized #( parameter DATA_WIDTH 32, parameter ADDR_WIDTH 10 )( input clk, input we, input [ADDR_WIDTH-1:0] addr, input [DATA_WIDTH-1:0] din, output [DATA_WIDTH-1:0] dout ); // 使用真正的BRAM原语而不是分布式RAM (* ram_style block *) reg [DATA_WIDTH-1:0] ram [(2**ADDR_WIDTH)-1:0]; always (posedge clk) begin if (we) begin ram[addr] din; end dout ram[addr]; // 输出寄存器提高时序 end endmodule8. 常见设计问题与解决方案8.1 时序违例排查指南问题现象可能原因排查方法解决方案建立时间违例组合逻辑延迟过长查看时序报告关键路径插入流水线寄存器保持时间违例时钟偏斜过大检查时钟网络约束增加缓冲或调整布局时钟域交叉问题异步信号直接使用检查CDC报告添加同步器或FIFO高扇出网络控制信号负载过重查看扇出报告寄存器复制或全局缓冲8.2 功能错误调试技巧使用ILA进行在线调试# 在Vivado中插入ILA核 create_debug_core u_ila ila set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila] set_property C_TRIGIN_EN false [get_debug_cores u_ila] # 添加探测信号 set_property PORT_WIDTH 1 [get_debug_ports u_ila/clk] connect_debug_port u_ila/clk [get_nets clk_100m] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila/probe0] connect_debug_port u_ila/probe0 [get_nets u_processor/window_valid]仿真调试策略// 添加调试信息输出 initial begin $dumpfile(waveform.vcd); $dumpvars(0, tb_image_filter); // 关键信号监控 $monitor(Time%0t, pixel_in%h, pixel_out%h, $time, test_pixel, result); end9. FPGA设计的最佳实践总结9.1 设计方法论要点同步设计原则始终使用同步复位和时钟使能模块化思维功能分解清晰接口定义明确时序优先早期进行时序约束和分析资源预估在设计初期评估资源使用情况验证驱动边开发边验证及早发现问题9.2 工程化建议团队协作规范统一的编码风格和命名规范模块接口文档化版本控制分支策略持续集成环境搭建项目管理要点明确的需求和验收标准合理的里程碑规划风险识别和应对计划知识沉淀和文档维护9.3 性能优化层次从高到低的优化优先级架构优化算法选择和系统架构微架构优化流水线设计和资源分配RTL优化代码级性能提升工具优化综合和实现策略调整物理优化布局布线约束优化FPGA设计的本质确实是在时间与空间维度上的权衡艺术。这种思维方式需要在实际项目中不断磨练从最初的模仿到最终的理解和创新。每个成功的FPGA设计都是资源约束、性能要求和开发成本之间的精巧平衡。掌握这种平衡能力才能真正发挥FPGA在并行处理、实时性能和能效方面的独特优势。建议将本文中的设计思路和代码示例作为起点在实际项目中不断实践和优化。FPGA设计能力的提升没有捷径只有通过持续的项目积累和问题解决才能逐渐内化这种独特的硬件设计思维。

相关新闻

LCD1602驱动全解析:从HD44780时序到跨平台实战避坑指南

LCD1602驱动全解析:从HD44780时序到跨平台实战避坑指南

1. 项目概述:从点亮第一行字符开始拿到一块单片机开发板,旁边放着一块小小的LCD1602液晶屏,这几乎是每个嵌入式初学者都会经历的经典场景。这块屏幕不大,只能显示两行,每行16个字符,但它却是连接我们代码世…

2026/10/14 19:14:20 阅读更多 →
三拓化学:附着力促进剂企业,深耕广东布局华南等地区,赋能化工产业升级

三拓化学:附着力促进剂企业,深耕广东布局华南等地区,赋能化工产业升级

当前国内高端制造产业快速发展,涂料、油墨、胶粘剂等功能性材料的性能要求持续提升,作为影响产品最终效果的核心配套材料,助剂类产品已从普通添加剂升级为决定产品外观、性能、使用寿命的关键要素。其中附着力促进剂作为改善涂层附着性能的核…

2026/10/14 9:38:17 阅读更多 →
2026年模板建站哪个平台好?模板质量、编辑能力与适用场景对比

2026年模板建站哪个平台好?模板质量、编辑能力与适用场景对比

很多企业搜索“模板建站哪个平台好”,会先比较模板数量和页面效果。但模板只是起点,真正影响网站长期使用的,是模板能否修改、内容能否持续更新,以及移动端、SEO和获客功能是否完整。如果只是选择一个好看的模板,却无法…

2026/10/4 22:13:11 阅读更多 →

最新新闻

CPR 1.3.0 C++ HTTP库构建与链接避坑指南

CPR 1.3.0 C++ HTTP库构建与链接避坑指南

简介:本资源为C开发者快速集成HTTP客户端功能提供的预编译cpr库(1.3.0版本),面向使用Visual Studio 2015进行Windows平台C开发的中初级工程师及学习者,有效规避源码编译依赖复杂、环境配置繁琐等常见痛点。压缩包共27个…

2026/10/14 19:13:23 阅读更多 →
T3 Stack全栈类型安全实战:tRPC+Prisma+Next.js开发指南

T3 Stack全栈类型安全实战:tRPC+Prisma+Next.js开发指南

1. 项目缘起与整体设计思路1.1 t3code是什么:一个围绕T3 Stack落地的全栈类型安全项目t3code这个名字,第一眼容易让人疑惑——T3指的是什么?code肯定离不开写代码,但T3到底是什么?这里我得先把背景交代清楚。T3 Stack是…

2026/10/14 19:13:23 阅读更多 →
商业综合体智能安防方案:架构设计、参数配置与避坑指南

商业综合体智能安防方案:架构设计、参数配置与避坑指南

简介:这份资源是海康威视面向商业综合体场景推出的智能安防整体解决方案文档,适合商业地产开发、物业管理及安防工程设计实施人员参考。方案围绕视频监控、门禁一卡通、停车场管理、报警等子系统展开,重点讲解高清IPC与视频智能分析&#xff…

2026/10/14 19:13:23 阅读更多 →
移动点餐源代码完整链路解析:从扫码到出单的工程实践

移动点餐源代码完整链路解析:从扫码到出单的工程实践

简介:这是一份面向Android初学者与餐饮类应用开发练习者的移动点餐项目源码,包含ph2移动客户端与ph2web服务端两部分,可用于理解从界面交互到后台数据交换的完整链路。客户端侧涉及菜单展示、购物车与订单提交、网络通信及本地数据保存等典型…

2026/10/14 19:13:23 阅读更多 →
Font Awesome 4.6.3资源包:老项目图标字体的稳定方案

Font Awesome 4.6.3资源包:老项目图标字体的稳定方案

简介:Font Awesome 4.6.3 是一套面向 Web 前端开发与界面设计的成熟图标库资源包,适用于需要在网站或应用中快速引入矢量图标的开发者与设计师。相比图片图标,它基于字体技术实现,可通过 CSS 调整大小、颜色、旋转与动画&#xff…

2026/10/14 19:13:23 阅读更多 →
H-Trp-Asn-OH ;175027-11-9

H-Trp-Asn-OH ;175027-11-9

基本性质英文名称:H-Trp-Asn-OH中文名称:色氨酰 - 天冬酰胺二肽CAS 号:175027-11-9类别:线性二肽分子式:C₁₅H₁₈N₄O₄分子量:318.33 Da等电点 pI:约 7.06溶解性:可溶于水、稀醋酸…

2026/10/14 19:12:22 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →