FPGA Verilog源码工程化复用:从分类到高频模块实战
简介这套Verilog HDL源代码合集面向FPGA工程师、嵌入式开发者及数字电路学习者按实际工程场景分门别类涵盖基本逻辑门、组合逻辑、时序逻辑、数据通路、通信协议SPI/I2C/UART、数字信号处理、存储器与微处理器等设计层次可帮助读者从模块级代码理解FPGA设计方法。资源共355个文件压缩包仅3.31MB其中以287个.v源文件为主体辅以16个.sv、25个.cpp用于仿真测试或C模型、15个.inc、5个.sh脚本及少量头文件便于直接复用与二次开发。源码分类明确学习者能快速定位所需功能并借助代码研究从仿真、综合到布局布线的完整流程。目前已有376人学习浏览既适合FPGA初学者系统参考也适合有经验的工程师快速检索实用模块。1. 下了整整一个分类好的Verilog源码包为什么还是出不了活有人从网上下了一个“大量工程用FPGA的Verilog HDL源代码”合集目录分得清清楚楚接口、存储、算法各归各位结果轮到自己的工程复制进去编译能过上板却不是想要的结果。这个场景我见过太多次问题几乎都不出在代码本身而出在“分门别类”这四个字被理解浅了目录分好了不等于模块能直接被工程复用。源码包解决的是“有没有”工程需要的是“能不能用、怎么改、怎么验证”。一份代码从下载到真正跑进FPGA中间隔着选型、仿真、参数修改、接口适配、时序检查五道关。任何一道关没做代码就只是硬盘里的一个文件而不是工程资产。下面这些内容想解决三件事源码库怎么搭体系、高频模块怎么改、哪些坑最容易让人踩进去。适合那些手头已经攒了一批源码、想把它整理成能反复调用的工程资产的人尤其是刚接触FPGA开发、正在为项目找现成模块的工程师。内容不挑工具工程思路通用。2. 分门别类源码库按功能域拆而不是按难度拆2.1 为什么按功能域分类从“查代码”的路径反推目录结构拿到一份源码包第一件事是分类。很多人的第一反应是按复杂度分简单模块放一堆复杂模块放一堆。这个分法整理的时候很爽真正用起来却很难受。因为你做工程时想的是“我要一个UART发送模块”“我要一个异步FIFO”“我要一个CRC校验”几乎不会想“我要找一个难一点的模块”。查代码的人永远从功能出发所以一级目录应该按功能域分。工程用FPGA里出现频率最高的功能域集中在接口、时钟与复位、存储与缓存、协议与编解码、算法与控制逻辑这几块最后还要给仿真验证单独留一个位置。分完之后任何一份源码拿过来先问一句它属于哪个功能域扔掉“难度”这个维度查找路径一下子就短了。这里面的逻辑是目录结构要跟“找代码时的检索路径”一致而不是跟“写代码时的心情”一致。单模块的粒度也要控制。一个目录里功能相近的模块多了就继续拆二级场景比如接口域下面拆UART、SPI、I2C、并行总线。这样模块数量再多也不会乱评估一个模块能不能用也有了更清晰的对照对象。2.2 一套可以直接抄的目录结构与命名规范下面这个目录结构是我整理源码库时一直在用的可以直接搬走当起点fpga_lib/ ├── 01_interface/ # 各种串行/并行接口 │ ├── uart/ # UART 发送、接收、波特率生成 │ ├── spi/ # SPI 主从模块 │ └── i2c/ # I2C 控制器 ├── 02_clk_rst/ # 时钟分频、门控、复位同步释放 ├── 03_memory/ # 同步FIFO、异步FIFO、单口RAM、双口RAM ├── 04_packet/ # CRC、帧同步、位填充、协议转换 ├── 05_algorithm/ # 定点运算、查表、滤波、编码转换 ├── 06_control/ # 状态机模板、脉冲产生、边沿检测、按键消抖 ├── 07_sim/ # testbench 公共组件时钟生成、数据源、比较器 └── doc/ # 各模块的接口说明与使用注意事项这套结构里有个容易被忽略的点仿真验证单独放一个目录而不是塞进功能模块目录。原因是testbench里那些时钟生成、随机数据源、计数比较器是跨模块通用的复用率极高而具体到某个模块的testbench我习惯和模块源码放同一级目录文件名加tb_前缀比如uart_tx.v对应tb_uart_tx.v一眼就能找到。命名规范上我统一用全小写加下划线。接口方向用tx/rx存储器件用sync/async功能词放最后比如fifo_async.v、crc32_parallel.v。模块内部信号也有约定输入信号用i_前缀输出信号用o_前缀跨时钟域信号必须带cdc_前缀。这样从文件名到信号名都能直接看出模块边界不会打开一个模块先猜半天变量含义。维护上还要留一条铁律每次拿到新模块先归位再入库而不是攒一堆再统一整理。分类这件事习惯比结果重要。doc目录每次同步更新一行写清楚模块的时钟域要求、复位极性、已知限制。这些信息等真正做工程时会救命。2.3 拿到源码后的“四步筛选”仿真、参数、接口、风格分类归位只是第一步一份源码能不能进入工程我按四步筛选顺序固定。第一步是仿真。先看包里有没有自带testbench有就跑一遍没有就自己补一个最小激励。如果代码在仿真里都不能得到预期波形直接放弃不值得逐行修复。这一步能筛掉很大一部分“看起来能用实际根本跑不通”的代码。第二步是参数。看模块可调量是不是抽成了parameter位宽、深度、极性有没有硬编码在always块里。工程里要复用的模块必须能通过例化参数覆盖变量否则换个数据位宽就要改好几处代码后患无穷。硬编码的模块即使功能正确也属于一次性代码不适合进复用库。第三步是接口。时钟和复位是否独立引出握手信号有没有完整的valid/ready或者en/done对。工程用FPGA里接口不清的模块一旦接入总线排查问题的时间会翻倍。尤其要注意复位极性是否统一是高有效还是低有效混用时很容易埋雷。第四步是风格。代码是否可综合有没有在可综合代码里写initial、#10延时、force/release组合逻辑块里有没有不完整的if/case仿真专用语句有没有和综合代码混在一起。这些直接决定模块能不能稳定上板也决定日后好不好维护。对应关系用一张表能看得很清楚功能域典型模块工程场景接口UART/SPI/I2C收发器板级通信、传感器采集时钟与复位复位同步释放、分频器全局复位网络、慢速外设时钟存储与缓存同步FIFO、异步FIFO、双口RAM跨时钟域缓冲、帧缓存协议与编解码CRC32、位填充、8b/10b传输校验、高速串行链路算法与控制CORDIC、滤波器、状态机模板信号处理、流程控制四步筛完真正能留在库里被反复调用的代码往往比下载包里少一大半。留下的每一个都是能放心用的这份筛选成本一定值得投入。3. 三个高频模块拆开讲边沿检测、跨时钟域与同步FIFO3.1 边沿检测把任意信号变成单周期脉冲工程里最常用的控制类小模块是边沿检测。按键按下要产生一个单周期脉冲外部中断到来要捕获一个上升沿数据有效标志跳变时要启动后续逻辑这些都是边沿检测的活。它看起来简单但很多人写出的版本上板后有概率出毛刺原因都在打拍级数不够。module edge_detect #( parameter WIDTH 1 )( input clk, input rst_n, input [WIDTH-1:0] sig_in, output [WIDTH-1:0] rising, output [WIDTH-1:0] falling ); reg [WIDTH-1:0] sig_d1; reg [WIDTH-1:0] sig_d2; always (posedge clk or negedge rst_n) begin if (!rst_n) begin sig_d1 {WIDTH{1b0}}; sig_d2 {WIDTH{1b0}}; end else begin sig_d1 sig_in; sig_d2 sig_d1; end end assign rising sig_d1 ~sig_d2; assign falling ~sig_d1 sig_d2; endmodule逻辑很简单sig_d1采当前输入sig_d2再采一拍两个寄存器的值比较就能知道这一拍之间有没有发生跳变。rising在输入从0变1后的下一拍拉高输出宽度恰好一个时钟周期falling同理。WIDTH参数用来支持多位宽总线边沿检测只关心单bit信号时例化默认值1就行。很多刚入手的人只做一级打拍就判断边沿sig_d1直接参与组合逻辑这样做不行。如果输入来自外部引脚或者另一个时钟域第一级触发器输出仍可能处于亚稳态亚稳态参与组合逻辑会产生毛刺后续电路拿到的是一个不干净的脉冲。这里用两级寄存器第一级负责同步第二级负责给出干净的跳变沿。代价是输出脉冲比原始信号晚两拍做跨时钟域分析和流水设计时要把这个延迟计入。3.2 跨时钟域单bit信号两级触发器还是脉冲同步器跨时钟域是工程用FPGA里绕不开的环节。处理单bit信号时最容易被搜到、也最容易被误用的就是两级触发器同步器。这里是标准的电平同步模板module sync_level #( parameter STAGE 2 )( input clk, input rst_n, input async_in, output sync_out ); reg [STAGE-1:0] sync_reg; always (posedge clk or negedge rst_n) begin if (!rst_n) sync_reg {STAGE{1b0}}; else sync_reg {sync_reg[STAGE-2:0], async_in}; end assign sync_out sync_reg[STAGE-1]; endmoduleSTAGE默认2表示两级同步。实际工程里有人用三级就是为了进一步降低亚稳态概率代价是多一个时钟周期的延迟。这个模块只能用于电平信号的跨时钟域同步它保证的是目标时钟域最终能采到一个稳定的电平值不保证脉冲不丢失。举一个典型场景源时钟域100MHz目标时钟域10MHz源时钟域产生一个宽度10ns的脉冲。目标时钟采样周期100ns这个脉冲在采样沿到来之前就已经消失两级触发器根本看不见它。所以快时钟域往慢时钟域传短脉冲必须先做脉冲展宽让信号在目标时钟域至少保持两个采样周期再送同步器。另一种做法是用脉冲同步器结构在目标时钟域检测边沿而不是电平。我一般按信号类型做选择只关心电平高低用sync_level源时钟域更快或相近、需要传递脉冲用两级同步后加边沿检测目标时钟域明显更慢必须先展宽再同步。能分清这三种场景跨时钟域的一大半问题就解决了剩下的就是要不要做握手的工程取舍。注意两级触发器降低的是亚稳态出现的概率不是根除。同步器输出在极端条件下仍可能出现沿的漂移凡是参与后续时序判断的信号都要再经过一级寄存器对齐后再使用。3.3 同步FIFO指针比较法实现空满判断存储与缓存域里最常被复制的是FIFO同步FIFO在做数据缓冲和模块拼接时几乎是标配。这里给一个工程里真正能用的同步FIFO深度用地址位宽参数控制空满判断采用经典的最高位标志法module fifo_sync #( parameter DATA_WIDTH 8, parameter ADDR_WIDTH 4 )( input clk, input rst_n, input wr_en, input rd_en, input [DATA_WIDTH-1:0] din, output [DATA_WIDTH-1:0] dout, output full, output empty ); reg [DATA_WIDTH-1:0] mem [0:(1ADDR_WIDTH)-1]; reg [ADDR_WIDTH:0] wr_ptr; reg [ADDR_WIDTH:0] rd_ptr; assign dout mem[rd_ptr[ADDR_WIDTH-1:0]]; assign full (wr_ptr[ADDR_WIDTH] ! rd_ptr[ADDR_WIDTH]) (wr_ptr[ADDR_WIDTH-1:0] rd_ptr[ADDR_WIDTH-1:0]); assign empty (wr_ptr rd_ptr); always (posedge clk or negedge rst_n) begin if (!rst_n) begin wr_ptr {(ADDR_WIDTH1){1b0}}; rd_ptr {(ADDR_WIDTH1){1b0}}; end else begin if (wr_en !full) begin mem[wr_ptr[ADDR_WIDTH-1:0]] din; wr_ptr wr_ptr 1b1; end if (rd_en !empty) begin rd_ptr rd_ptr 1b1; end end end endmodule指针比较法的关键点读写指针按地址位宽加1计数最高位用来标识指针是否跨过了一圈。复位后两个指针完全相等空标志拉高当写指针追上读指针且最高位相反时说明存储体被写满满标志拉高。这种空满判断不需要额外计数器同时读写时也不会出现计数逻辑打架的问题是标准做法。参数上ADDR_WIDTH4表示实际存储深度是2的4次方也就是16个数据。因为是2的幂次地址回绕和满判断才能用最高位比较方式。例化需要8深度时把ADDR_WIDTH改成3即可。DATA_WIDTH独立调整不影响指针逻辑。这个模块不能用于跨时钟域数据缓冲跨时钟域要用异步FIFO读写指针分别由两个时钟驱动空满判断还要做格雷码跨时钟处理复杂度高一个量级。如果工程里遇到的是非2次幂深度比如深度5或深度10指针比较法不再适用需要改用计数器法或者直接例化器件厂商提供的FIFO IP。工程现实是能用参数调标准结构就不要自己造非标准存储结构省下的是验证时间。4. 工程复用中的五个常见问题与排查从复制代码到上板为什么总翻车4.1 复位电路为什么仿真一次过上板就乱现象仿真里功能完全正确板上加载后寄存器初值混乱状态机乱跳多按几次复位键又恢复。原因源码包里的模块很多只写always (posedge clk)复位信号直接连寄存器复位端没有做同步释放。异步复位本身没问题但复位释放时如果恰好靠近时钟上升沿寄存器的复位端和时钟端会同时变化输出进入亚稳态整个复位网络上的寄存器状态就不一致了。解决全局复位统一走“异步复位、同步释放”结构。复位有效时立即生效释放时经过两级同步器后再分散到各个模块保证所有寄存器在同一个时钟沿退出复位。最小实现长这样reg rst_n_s1, rst_n_s2; always (posedge clk or negedge rst_n_ext) begin if (!rst_n_ext) begin rst_n_s1 1b0; rst_n_s2 1b0; end else begin rst_n_s1 1b1; rst_n_s2 rst_n_s1; end end assign rst_n rst_n_s2;外部异步复位rst_n_ext一旦拉低内部复位立即生效释放后rst_n_s1先拉高rst_n_s2再拉高整个模块的复位退出沿被推迟到时钟沿之后亚稳态窗口被避开。工程里所有模块的复位端口统一接这个内部rst_n不要再直接接外部引脚。4.2 跨时钟域只打一拍偶发错误查不到现象仿真每跑必对上板后偶发性数据错位只在长时间运行或者某些温度条件下出现看着像接触不良重启又恢复。原因单bit信号跨时钟域只做了一级寄存器同步第一级寄存器输出仍可能处于亚稳态这个不确定值又被组合逻辑直接使用导致后续电路在不同时刻采到不同结果。仿真工具默认寄存器不会产生亚稳态所以波形永远正常问题只在真实芯片上暴露。解决跨时钟域信号至少要经过两级触发器同步后再参与业务逻辑传脉冲要走脉冲同步器或先展宽再同步。最容易忽视的是中断信号很多人只打一拍就去触发状态机建议统一套用第3章的sync_level模板。如果两个时钟域之间有数据总线交互不能只同步控制信号数据总线也要配合握手逻辑否则数据采样时刻对不上照样错。4.3 FIFO深度拍脑袋跑久了就丢数据现象短时间测试正常跑半小时或者处理一个较大突发包后数据开始丢重启又好了。原因FIFO深度是根据“感觉”定的没有对写入侧和读出侧的速率、突发长度做定量计算。当写入端连续写入的数据量大于同一时间段内读走的量多出来的数据没有地方放只能溢出。溢出时读写指针继续走后面的数据把前面的覆盖表现出来就是丢数据。解决按突发场景估算最小深度。最小深度等于一次突发写入的数据量减去突发期间读走的数据量然后留出20%左右的余量。举个例子突发写入32个数据突发期间读侧能读走12个那深度至少要20保险起见做到24到32。工程里更常见的做法是在总线带宽允许的前提下提高读侧速率而不是一味加大FIFO深度因为深度越大资源消耗和延迟都会上升。异步FIFO还要额外考虑跨时钟域指针同步引入的延迟满标志会比真实满提前到达深度估算时要把这个误差算进去。4.4 组合逻辑if没有else综合出一堆锁存器现象综合报告里出现大量Latch警告功能仿真看着没问题上板后某些输出值在特定条件下保持错误状态查波形又很难复现。原因组合逻辑always块里if只有分支没有else或者case没有default信号在条件不满足时没有新赋值。可综合代码里没有“保持”这个语义综合工具只能推断出锁存器来维持旧值而锁存器的时序特性跟寄存器完全不同行为自然不符合预期。解决所有组合逻辑的always块进入时先给每个输出赋一个默认值再写if/case分支case必须带default。改完后重新看综合报告Latch警告清零才算干净。这里有一个常见误用有些人用always (*)写组合逻辑却忘了*只能自动识别敏感信号如果块里引用了未被列出的信号仿真和综合结果可能不一致。组合逻辑块里尽量不要引用非输入信号保持了信号列表的干净锁存器问题也会少一半。4.5 没写时序约束换设备就时序违规现象源码包里的模块在一个器件上跑得好好的换到另一个速度等级或资源布局不同的器件频率提不上去时序报告里红色路径一片。原因源码包本身只含逻辑代码不携带工程级时序约束。没有约束时工具按默认时钟假设做布局布线不会为你的真实时钟频率做优化。模块内部寄存器打拍数量够不够决定关键路径能不能收敛但前提是先让工具知道时钟长什么样、哪些路径是跨时钟域的。解决每个工程开始第一件事是给所有时钟添加约束指定时钟周期和相位。跨时钟域路径按CDC路径处理设置合适的false path或异步组。然后打开时序报告看最大时序余量找出逻辑级数超过预期的路径再决定是在模块内部插流水级还是调整模块接口处的寄存器位置。不要直接把源码包里的模块塞进工程就跑更不要看到时序违规就删除约束那是自欺欺人换一批数据迟早再翻车。5. 把源码库变成你的工程资产仿真、封装与版本管理的三个习惯平时我维护这个源码库其实只做三件事。第一件事给每个模块配一个最小testbench。没有testbench的模块不管代码看起来多漂亮都不往库里放。最小testbench不用复杂能覆盖基本读写、算清楚空满标志就够了。给第3章的同步FIFO配的模板长这样timescale 1ns/1ns module tb_fifo_sync; reg clk 0; reg rst_n 0; reg wr_en 0; reg rd_en 0; reg [7:0] din 0; wire [7:0] dout; wire full; wire empty; fifo_sync #( .DATA_WIDTH(8), .ADDR_WIDTH(4) ) u_fifo ( .clk (clk), .rst_n (rst_n), .wr_en (wr_en), .rd_en (rd_en), .din (din), .dout (dout), .full (full), .empty (empty) ); always #5 clk ~clk; initial begin repeat (2) (posedge clk); rst_n 1b1; repeat (5) (posedge clk); wr_en 1b1; din 8hA5; (posedge clk); din 8h5A; (posedge clk); wr_en 1b0; rd_en 1b1; (posedge clk); rd_en 1b0; repeat (20) (posedge clk); $finish; end endmodule这类模板只要写一次后续每个模块往里面套信号名就行。写完跑一遍把波形里最有代表性的几个点截图或者记录下来作为这个模块的验收依据。第二件事把所有可调参数抽成parameter。例化时在顶层覆盖参数绝不允许在模块内部直接改位宽来适配工程。这样做的好处是同一个模块在不同项目里能以不同位宽存在源代码只有一份。文件头也写一行风险备注记录已知边界比如“此同步器仅适用于电平信号传脉冲需展宽”下次换人调用时不用重新踩一遍坑。第三件事给已验证的模块打版本标记。我用版本管理工具管理整个库每个模块通过仿真并且上板验证后在提交信息里注明测试条件比如“16深度8位宽时钟100MHz连续读写5万次无溢出”。这些测试条件就是模块的“信任边界”超出边界使用时自己心里要有数。以前我把源码一股脑堆在一个大目录项目做到一半找模块能找一下午。后来花了几个晚上按功能域整理、补testbench、规范命名再做工程时基本是“挑模块—跑仿真—看波形—接总线”的固定流程心里有底得多。你的源码库不一定非要一次整理完但每入库一个模块都走一遍这个流程几周之后它就是一份能帮你省下大量时间的工程资产。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

LeetCode 76最小覆盖子串:滑动窗口双指针详解

LeetCode 76最小覆盖子串:滑动窗口双指针详解

/* 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 1:34:03 阅读更多 →
MATLAB可调试SVD分解实战包:Jacobi/QR/分治法三算法可控实现

MATLAB可调试SVD分解实战包:Jacobi/QR/分治法三算法可控实现

/* 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 1:33:02 阅读更多 →
Apollo-11制导计算机源码数字化复原与仿真实践

Apollo-11制导计算机源码数字化复原与仿真实践

/* 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 1:33:02 阅读更多 →

最新新闻

Linux下C/C++动静态库制作与使用实战指南

Linux下C/C++动静态库制作与使用实战指南

长期以来在Linux下做C/C开发,动静态库始终是绕不开的一个核心技能。无论是自己封装模块、分发二进制产物,还是处理第三方依赖,理解库的制作与使用直接决定了你在编译链接这块能不能少掉头发。我见过不少开发者写业务逻辑很熟练,一…

2026/10/15 4:26:50 阅读更多 →
Flutter鸿蒙开发实战:星座应用跨平台全流程解析

Flutter鸿蒙开发实战:星座应用跨平台全流程解析

1. 项目背景与整体设计思路1.1 为什么选 Flutter 做鸿蒙开发聊到跨平台开发,Flutter 这几年的热度一直在线。原因很简单——一套 Dart 代码,同时跑在 Android、iOS、Windows、macOS、Linux 上,现在还要加上鸿蒙。放在以前,鸿蒙应用…

2026/10/15 4:26:50 阅读更多 →
线上故障排查实战指南:从告警到恢复的黄金步骤

线上故障排查实战指南:从告警到恢复的黄金步骤

半夜两点被电话叫醒,睁开眼看到屏幕上一排红色告警,心跳直接拉满。这种场景,几乎所有做过线上系统的开发者都经历过。告警本身不可怕,可怕的是大脑一片空白,不知道该先点哪里,也不知道哪些命令能救命。这篇…

2026/10/15 4:26:50 阅读更多 →
基于SpringBoot+Vue的个人博客系统开发实战

基于SpringBoot+Vue的个人博客系统开发实战

1. 项目概述与整体技术选型1.1 这个博客系统到底解决了什么问题做个人博客这件事,看起来简单,真做起来坑不少。早期用现成框架,比如WordPress或者各类静态站点生成器,总觉得差了点什么——要么太重,装一堆插件才能用&a…

2026/10/15 4:26:50 阅读更多 →
共享内存IPC实战:从零拷贝原理到信号量同步,提升跨进程通信性能

共享内存IPC实战:从零拷贝原理到信号量同步,提升跨进程通信性能

共享内存(shm)这个老牌IPC方案,我最近在一个数据采集服务里又把它翻了出来。这个服务原本是跨进程传数据,管道和Unix域Socket用得挺顺手,可流量一起来,CPU占用就再也压不下去。换成共享内存之后&#xff0c…

2026/10/15 4:26:50 阅读更多 →
如何判断Ubuntu是否真的关机?三路检查方法与实战探测脚本

如何判断Ubuntu是否真的关机?三路检查方法与实战探测脚本

你有没有遇到过这种情况:在终端里输入了sudo shutdown now,屏幕上日志飞快滚动,最后一切归于黑暗,风扇也慢慢停转,你很自然地认为这台 Ubuntu 机器已经关机了。但我在几年的实践中发现,这个结论经常下得太早…

2026/10/15 4:25:50 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战: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/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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →