FPGA实现ABS防抱死控制器:从ModelSim仿真到板级验证完整流程
简介面向大二数字电子技术实验课这份资源以FPGA实现ABS绝对值加法器为核心项目支持对有符号输入进行取绝对值运算适合正在完成Vivado仿真与硬件验证作业的学生参考也适用于初次接触Xilinx开发流程的读者。项目工程共79个文件、压缩包仅435KB涵盖xpr工程文件、xdc约束、仿真与综合报告rpt、Tcl脚本及bat批处理等类型其中综合与实现报告可用于分析资源占用和时序表现整套文件能够完整还原从编写Verilog代码、逻辑综合synth_1、时序实现impl_1到下载FPGA芯片验证的完整流程。已有359人学习下载读者可借助其中测试向量与仿真波形校验自己的绝对值计算电路并通过rst源码与dcp网表文件对照理解设计层次对巩固组合逻辑、时序逻辑基础掌握Verilog硬件描述语言及Xilinx FPGA开发流程均有直接的参考价值。1. 先把“大二数电实验仿真加fpga实现abs.zip”这包认清楚仿真过只是第一步看到“大二数电实验仿真加fpga实现abs.zip”这串名字第一反应十有八九是课程设计包仿真工程和FPGA工程打包在一起。里面核心是ABS——防抱死制动系统但到了大二数电实验它被简化成一个有限状态机核心工作是“测周期、判锁止、控压力”。能解决什么问题让你从原理图思维切到硬件描述语言思维把一段能仿真的逻辑真正烧进开发板交一份不只停留在波形上的实验报告。适合谁正在做数电课程设计、准备接触FPGA完整流程、或者想把这个ABS例子改造成自己毕设前奏的人。注意仿真跑通只说明逻辑对了一半管脚约束、按键消抖、跨时钟这些坑全在板级实现那一步等着你。2. ABS防抱死控制器拆解从制动状态机到可综合的边界2.1 简化ABS测周期、判锁止、控压力三件事汽车上的ABS系统涉及车速传感器、液压调节单元、整车动力学模型拿到数电实验里不可能照搬。常见的教学简化是这样的轮速传感器输出一串脉冲脉冲频率越快代表轮子转得越快当制动导致轮子趋于抱死时轮速脉冲会突然变稀也就是脉冲周期突然变长。控制器要做的事情就是测量当前脉冲周期与上一个周期比较如果发现周期变长超过一定比例就判定为“有抱死趋势”随后按照增压、保压、减压三个状态循环调节制动压力。状态机的跳转条件很直白空闲态下制动开关没按下输出全为零制动按下后进入增压态输出增压阀信号如果期间检测到周期突然变长就切到保压态保持压力保压持续一段时间后进入减压态周期结束后再回到增压态。这种设计的好处是只用三个状态就能复现ABS“刹—放—刹”的核心节奏组合逻辑很少状态机清晰适合大二实验的验收尺度。判据怎么定我一般在代码里用“当前周期比上一周期长50%以上”作为抱死趋势阈值。这个值不是从车辆动力学推出来的而是实测经验值阈值太小轮速稍微波动就频繁进入保压阈值太大抱死趋势都过去了还没触发。50%的阈值配合移位近似实现起来不用除法器综合代价低。2.2 原理图输入 vs Verilog为什么十有八九选后者大二数电实验前期很多人用原理图拖门电路但到了“仿真加FPGA实现ABS”这个节点原理图方案会很痛苦。一个带周期计数、阈值比较、四状态跳转的逻辑用原理图画出来连根线都费劲更不用说参数调试。Verilog或者VHDL用文本描述逻辑仿真和综合是同一份代码不需要二次输入这才是“仿真加FPGA实现”这个词真正想表达的工作流。有人会问直接用Quartus的波形编辑器做仿真行不行行但可追溯性差。testbench一旦写好改一个参数重跑只需要一条命令而波形编辑器每次都要手动拖激励规模一大就烦。常见做法是Quartus写工程、ModelSim跑仿真、Quartus再综合烧板工具链成熟遇到问题能按阶段定位。还有一点大二项目包的作者通常会把系统时钟和外部脉冲都设计成同一个时钟域这样仿真和综合都省心。如果从一开始就把轮速脉冲当成独立时钟源处理跨时钟域就是另一个级别的麻烦。2.3 解压后先核对包里这几样东西拿到“abs.zip”这类项目包我通常会先按下面这个清单核对文件完整性缺哪一块直接决定后面能不能复现文件类型作用缺失后果RTL源文件.v/.vhd或原理图文件实现ABS控制器的核心逻辑无法启动仿真仿真激励testbench或.do脚本产生轮速变化观察状态跳转只能手动拉波形效率低FPGA工程文件.qpf/.qsf或.xpr记录芯片型号、管脚约束需自行新建工程易出错管脚约束文件.qsf/XDC/UCF绑定顶层端口到物理引脚上板时报未约束错误说明文档实验目的、操作步骤、管脚表靠猜浪费大量时间核对完这些下一步再看核心代码因为仿真工程和FPGA实现通常共用同一份RTL源码如果包的作者把仿真和实现分了两个不同文件那要先对比差异防止上板跑了份旧逻辑。3. 仿真先行用ModelSim把ABS状态机跑通的最小工程3.1 一个能综合的ABS控制器核心模块附完整代码这一节给一套能直接仿真的核心模块。它做三件事同步轮速脉冲、测量脉冲周期、用状态机控制三路输出。代码结构刻意保持简单方便大二学生看懂也方便改成自己的参数。// abs_ctrl.v module abs_ctrl #( parameter CLK_FREQ 50_000_000, // 系统时钟频率板子上通常是50MHz parameter HOLD_TIME 1_250_000, // 保压持续时间约25ms parameter RELEASE_TIME 1_250_000 // 减压持续时间约25ms )( input wire clk, // 全局时钟 input wire rst_n, // 低电平复位 input wire brake, // 制动开关1表示踩下制动 input wire wheel_in, // 轮速脉冲输入 output reg pressure_incr,// 增压阀控制 output reg pressure_keep,// 保压阀控制 output reg pressure_decr // 减压阀控制 ); localparam IDLE 2b00; localparam PRESS 2b01; localparam HOLD 2b10; localparam RELEASE 2b11; reg [1:0] state; reg [31:0] period_cnt, period_prev; reg [31:0] hold_timer, release_timer; reg wheel_r1, wheel_r2; wire wheel_edge, slip_flag; // 两级同步器把异步轮速脉冲同步到clk域 always (posedge clk or negedge rst_n) begin if (!rst_n) begin wheel_r1 1b0; wheel_r2 1b0; end else begin wheel_r1 wheel_in; wheel_r2 wheel_r1; end end assign wheel_edge wheel_r2 ~wheel_r1; // 上升沿脉冲 // 周期测量统计两个轮速上升沿之间的时钟个数 always (posedge clk or negedge rst_n) begin if (!rst_n) begin period_cnt 32b0; period_prev 32b0; end else begin period_cnt period_cnt 1b1; if (wheel_edge) begin period_prev period_cnt; // 存下当前周期 period_cnt 32b0; // 清空重新计 end end end // 抱死趋势当前周期比上一周期长50%以上 // 用右移代替除以2再相加近似乘1.5避免综合出除法器 assign slip_flag (period_prev ! 0) (period_cnt period_prev (period_prev 1)); // 主状态机 always (posedge clk or negedge rst_n) begin if (!rst_n) begin state IDLE; pressure_incr 1b0; pressure_keep 1b0; pressure_decr 1b0; hold_timer 32b0; release_timer 32b0; end else begin case (state) IDLE: begin pressure_incr 1b0; pressure_keep 1b0; pressure_decr 1b0; if (brake) state PRESS; end PRESS: begin pressure_incr 1b1; if (slip_flag) begin hold_timer 32b0; state HOLD; end end HOLD: begin pressure_incr 1b0; pressure_keep 1b1; hold_timer hold_timer 1b1; if (hold_timer HOLD_TIME) begin release_timer 32b0; state RELEASE; end end RELEASE: begin pressure_keep 1b0; pressure_decr 1b1; release_timer release_timer 1b1; if (release_timer RELEASE_TIME) state PRESS; end endcase end end endmodule代码里的四个参数是仿真的灵魂CLK_FREQ只在需要精确延时时使用HOLD_TIME和RELEASE_TIME决定每个状态停留多久仿真时可以把它改小到几十个时钟周期跑起来状态跳转一眼就能看穿。slip_flag的写法没有用乘法和除法而是period_prev (period_prev 1)这是避开大资源综合的常用技巧因为大二实验板一般不用去优化但养成分而治之的习惯对后面调时序有好处。要说明一点周期计数器用了32位在50MHz时钟下满幅大约85秒。大二实验里轮速脉冲不会那么慢32位够用如果要把这个模块用在实际转台上建议把period_cnt和period_prev扩成48位防止低频脉冲溢出。3.2 testbench怎么打速度变化的激励写testbench的核心目的是让轮速脉冲从“高频”变成“低频”触发抱死趋势判据再观察状态机从PRESS跳到HOLD、RELEASE然后又回到PRESS。// tb_abs_ctrl.v module tb_abs_ctrl(); reg clk 1b0; reg rst_n 1b0; reg brake 1b0; reg wheel_in 1b0; wire pressure_incr, pressure_keep, pressure_decr; // 仿真时把保压和减压时间缩到64个时钟周期约1.28us abs_ctrl #( .HOLD_TIME(64), .RELEASE_TIME(64) ) uut ( .clk(clk), .rst_n(rst_n), .brake(brake), .wheel_in(wheel_in), .pressure_incr(pressure_incr), .pressure_keep(pressure_keep), .pressure_decr(pressure_decr) ); // 50MHz时钟 always #10 clk ~clk; // 产生一个轮速脉冲高电平保持high_time低电平保持low_time task pulse_period(input integer high_time, low_time); begin wheel_in 1b1; #high_time; wheel_in 1b0; #low_time; end endtask initial begin #100; rst_n 1b1; // 复位释放 #100; brake 1b1; // 踩下制动 // 先模拟高速轮速周期20ns跑20个脉冲 repeat (20) pulse_period(10, 10); // 再模拟抱死趋势周期200ns跑20个脉冲 repeat (20) pulse_period(100, 100); #200; $finish; end endmodule这个testbench里最关键的是后半段repeat (20) pulse_period(100,100)直接把周期从20ns拉到200ns相差10倍必然超过1.5倍的判定阈值于是slip_flag会拉高状态机立刻进入保压和减压。如果你改代码把阈值调成70%那就要把激励的周期差拉得更大否则仿真里看不到跳变别急着怀疑状态机写错了先检查阈值和激励周期差是否匹配。用ModelSim跑的时候建议把state、period_cnt、period_prev、slip_flag一起加到波形窗口。只看pressure_*三根信号能知道结果但看不到触发原因。3.3 仿真波形里的三个关键观察点第一个观察点wheel_edge是否只在wheel_r2上升沿后出现一拍的脉冲。如果它持续拉高说明wheel_r2或wheel_r1在仿真里被反复翻转一般是激励里时间太短导致逻辑还没稳定就被再次触发。第二个观察点period_cnt是否在每次wheel_edge时被清零并且period_prev锁存的是清之前的计数值。如果period_prev收到了0说明清零和锁存放在同一个时钟沿上出现了赋值冲突。我习惯把period_prev的锁存放在else分支里确保优先执行清零。第三个观察点slip_flag在低频段是否一直为1。如果一直是1状态应该锁定在HOLD和RELEASE间循环这符合预期。如果它在低频段来回抖动大概率是period_cnt没有清零干净或者周期计数器的位宽不够溢出了。4. FPGA板上实现管脚约束、按键消抖与烧录跑通4.1 顶层工程必须接好的几个信号仿真通过后下一步是把代码变成板子能跑的工程。常见做法是做一个顶层模块abs_top把abs_ctrl的端口接到开发板的物理信号上。顶层的典型接口包括50MHz系统时钟、低有效复位按键、制动开关、模拟轮速脉冲的输入源、三路LED输出。// abs_top.v module abs_top ( input wire clk_50m, input wire rst_n, input wire brake_sw, input wire wheel_sw, output wire led_incr, output wire led_keep, output wire led_decr ); wire brake_db; wire wheel_db; // 两个按键消抖 debounce #(.DELAY_CYCLES(250_000)) u_brake ( .clk(clk_50m), .rst_n(rst_n), .btn_in(brake_sw), .btn_out(brake_db) ); debounce #(.DELAY_CYCLES(250_000)) u_wheel ( .clk(clk_50m), .rst_n(rst_n), .btn_in(wheel_sw), .btn_out(wheel_db) ); // 核心控制器 abs_ctrl #( .HOLD_TIME(1_250_000), .RELEASE_TIME(1_250_000) ) u_ctrl ( .clk(clk_50m), .rst_n(rst_n), .brake(brake_db), .wheel_in(wheel_db), .pressure_incr(led_incr), .pressure_keep(led_keep), .pressure_decr(led_decr) ); endmodule顶层代码里最容易被忽略的地方是复位rst_n直接被abs_ctrl使用同时又被debounce使用。如果板上复位键在按下时会产生抖动两边的复位时序都受影响。我在大二实验里见过有人把复位直接接成固定高电平只靠断电上电复位这种做法能跑通但非常不推荐很容易在一次误触后摸不着头脑。wheel_sw这个输入如果直接用按键来模拟轮速脉冲按下一次只产生一个边沿状态机刚进去PRESS就会因为没有后续脉冲而卡住。更合理的做法是在开发板上找一个可调频率的方波源或者用一个独立按键生成边沿但每次按键松开再按下才算一个新脉冲。如果想要连续波形可以把板载晶振分频后送给wheel_in具体分频比由你想模拟的轮速段决定。4.2 一个实用的按键消抖模块机械按键按下和释放时会有约几毫秒的抖动如果不处理轻则多触发几个沿重则让状态机在多个状态之间反复横跳。仿真里看不到这个问题因为testbench给的激励是理想的但上板后十有八九要遇到。// debounce.v module debounce #( parameter DELAY_CYCLES 250_000 // 5ms 50MHz )( input wire clk, // 系统时钟 input wire rst_n, // 低有效复位 input wire btn_in, // 原始按键输入低有效 output reg btn_out // 消抖后输出低有效 ); reg btn_r1, btn_r2; reg [31:0] cnt; always (posedge clk or negedge rst_n) begin if (!rst_n) begin btn_r1 1b1; btn_r2 1b1; btn_out 1b1; cnt 32b0; end else begin btn_r1 btn_in; btn_r2 btn_r1; if ((btn_r2 ! btn_out) (btn_r1 btn_r2)) begin // 输入状态稳定且与当前输出不同开始计时 cnt cnt 1b1; if (cnt DELAY_CYCLES) begin btn_out btn_r2; cnt 32b0; end end else begin // 输入仍在抖动计数器清零重来 cnt 32b0; end end end endmodule消抖逻辑的思路是先打两拍去掉亚稳态然后只当输入连续稳定DELAY_CYCLES个时钟周期才更新输出。如果中间有一拍抖动计数器立刻清零保证不会误判。DELAY_CYCLES250_000在50MHz下对应5ms可以覆盖大多数机械开关的抖动。如果按键接触老化严重把这个参数调大到50万甚至100万。这里有一个风险点把wheel_sw也做了消抖会限制脉冲频率。消抖模块会滤掉短于5ms的脉冲如果你用连续方波模拟轮速而方波周期小于5ms那么从wheel_db出来的信号将是几乎恒定的值周期测量就会失效。所以对于轮速脉冲输入我一般只做两级同步不做长消抖只有制动开关才用完整消抖。4.3 管脚约束文件怎么写给新工程不同厂商的FPGA工具管脚约束语法不同Quartus里写QSFVivado里写XDC。以Quartus为例一套常用的引脚分配长这样set_location_assignment PIN_E1 -to clk_50m set_location_assignment PIN_M18 -to rst_n set_location_assignment PIN_N20 -to brake_sw set_location_assignment PIN_M21 -to wheel_sw set_location_assignment PIN_L13 -to led_incr set_location_assignment PIN_L14 -to led_keep set_location_assignment PIN_L15 -to led_decr第一行把clk_50m分配到开发板晶振引脚这个必须对着板子原理图抄不能随便挑一个空闲引脚。因为时钟引脚往往有全局时钟网络加持普通IO即使连上也容易在高速逻辑下出时序问题。rst_n通常接到开发板的专用复位按键上那个引脚可能不是普通IO而是带内部上拉的复位脚分配前最好翻一翻原理图。编译时如果出现 “Pin is not constrained” 的error多半是有些顶层端口漏了分配。Quartus在综合后弹出的时序报告里也会列出未约束引脚。总之先看板子的原理图确认每个外设的引脚名再写约束不要凭感觉猜。4.4 烧录与验证的完整步骤按顺序操作基本一遍过先新建工程把abs_ctrl.v、debounce.v、abs_top.v三个文件加到工程然后选择芯片型号编译如果编译报时序问题先看是不是period_prev (period_prev 1)这条加法路径太长解决办法是把系统时钟降到25MHz或者把比较拆成两步接着打开Pin Planner核对引脚最后打开Programmer连接板子下载SOF文件。下载后先按一次复位再按制动开关看LED状态。如果brake开关保持按下并且wheel_sw能产生连续脉冲你会看到三路LED按“增压灯亮、保压灯亮、减压灯亮”的顺序循环循环节奏由HOLD_TIME和RELEASE_TIME决定。这里要留意SOF是易失配置断电后芯片内部逻辑消失下次上电还要重新烧。要固化成长期可用的状态还要额外生成POF或JIC文件写入配置芯片这是另一个话题。5. 避坑手记仿真过了上板仍翻车的五个现场5.1 现象仿真波形完美上板一按制动键状态就跳飞原因复位按键没有消抖按下制动的同时手指碰到复位或者复位按键本身抖动导致模块被反复清零。很多时候状态机上板后跳出完全不符合状态机的组合比如state出现在RELEASE和IDLE之间来回跳。解决复位信号加两级同步器并且把复位按键换成拨码开关或焊接一个固定电阻上拉。课程实验里复位逻辑用专用复位IC更为稳妥如果是纯手按至少加一段长度为20ms左右的复位滤波。5.2 现象周期计数器一上板就不断清零状态机卡在PRESS出不来原因wheel_sw如果用按键模拟机械抖动产生了多个边沿period_prev频繁被更新为很小的值导致slip_flag永远为0或者永远为1。我见过有人把按键信号直接接给wheel_in结果按下一次能触发五六次wheel_edge状态机就乱了。解决按键模拟轮速信号时给wheel_in加消抖和边沿检测但消抖时间要小于脉冲的低电平时间。更推荐直接用开发板上的IO读取外部方波源或者在顶层内部把50MHz分频成一个低频方波再作为wheel_in。5.3 现象输出接继电器后吱吱响LED闪烁还有明显鬼影原因HOLD_TIME和RELEASE_TIME设置得太短输出切换频率接近音频范围继电器线圈和机械触点根本跟不上。实验中常见把HOLD_TIME设成几万个时钟周期也就是1ms级别输出变化频率达几百赫兹继电器会明显发热并发出高频噪声。解决把HOLD_TIME、RELEASE_TIME调整到10ms到25ms之间即1_250_00050MHz这样的量级。如果是直接驱动LED演示把时间缩短到几百微秒就能看到连续呼吸效果但没有继电器的机械负载效果完全不同。继电器驱动还需要注意续流二极管否则关断反向电压很容易打坏FPGA引脚这是另一个容易被忽略的硬件坑。5.4 现象综合报时序违规Max Frequency只有十几MHz原因period_prev (period_prev 1)是一个32位加法组合逻辑链很长在FPGA里又没有做流水线导致关键路径延迟过大。如果板载50MHz系统时钟且这个模块同时还在跑数码管扫描、按键扫描很容易达不到时序要求。解决把阈值判断从纯组合改成寄存更新比如在时钟里先算出slip_compare_value period_prev (period_prev 1)下一拍再用组合判断。或者直接降低系统时钟到25MHz。对大二实验而言25MHz足够而且时序压力小很多。5.5 现象波形里已经进了RELEASE却突然又跳回PRESS保压时间没保持住原因slip_flag在RELEASE期间仍然为1因为period_cnt还在持续增长。状态机的逻辑是只要slip_flag1PRESS里就会跳到HOLD但RELEASE里没有加保护所以当RELEASE结束回到PRESS时它会立刻再次进入HOLD表现上看就是保压时间失效。解决在slip_flag判断里增加“仅更新period_prev的条件下才允许触发跳转”。常见做法是把period_prev的更新限定在PRESS状态HOLD和RELEASE期间保持period_prev不变或者在RELEASE状态里加一个最小驻留计数器确保它在减压完成前不被新事件打断。6. 往深里做的三个方向SignalTap抓波形、UART回传和真实轮速探头6.1 用SignalTap II抓板上的真实时序信号TapSignalTap II是Quartus自带的在线逻辑分析仪没必要买实体逻辑分析仪。添加到工程后设置采样时钟为clk_50m采样深度选1024把state、period_cnt、period_prev、wheel_edge加进观察列表。触发条件设为wheel_edge上升沿触发然后下载程序运行。板上真实跑的时候如果周期值不是干净递增而是乱跳就能一眼看出是同步、消抖或引脚问题而不是逻辑问题。需要注意的是SignalTap本身会占用一些逻辑和存储器资源大二板上弦量小的时候要关掉它再跑最终版本。6.2 加一个UART_TX把轮速周期回传电脑只看LED只能判断“是否在循环”看不出具体周期值。进阶做法是写一个最简单的UART发送模块波特率1152001位起始位、8位数据、1位停止位。把period_cnt的低8位或者把压缩后的状态值0/1/2/3持续从FPGA的一个引脚发送接USB转TTL到电脑。这样可以在串口终端看到轮速周期数值的变化趋势验证ABS触发点是否合理。实现UART_TX的代码量不大只要把50MHz计数到434得到115200波特率然后按位输出即可。6.3 用霍尔探头替代按键直接采真实轮速脉冲如果想让这个ABS实验更有说服力可以把按键输入换成霍尔探头在电机转盘上贴一个小磁铁霍尔开关检测转盘转速并输出脉冲到FPGA。这个方向的实际坑在于信号完整性——霍尔输出沿可能存在抖动转盘振动会让脉冲宽窄不均匀。我建议在霍尔输出和FPGA之间加一个施密特触发器芯片或者在FPGA内部做两级同步再沿检测。代码上不需要改动状态机只要保证wheel_in的波形是干净的。等到这一步能工作整个“数电实验仿真加FPGA实现ABS”才算真正闭环了。我第一次做类似课题时只顾着仿真通过就交差结果上板连LED都不亮折腾一下午才发现是复位没接好。后来养成了习惯仿真只证明逻辑方向对管脚约束、消抖、跨时钟才是真正耗时间的战场。这份笔记把这些路都趟了一遍希望帮到你。本文还有配套的精品资源点击获取

相关新闻

微服务容器化实战:Docker镜像构建与K8s部署关键实践

微服务容器化实战:Docker镜像构建与K8s部署关键实践

1. 为什么微服务架构师必须亲手敲开Docker这扇门我带过不少刚从单体应用转型过来的Java开发者,他们能熟练写Spring Boot、画UML图、调优JVM参数,但一提到“容器化部署”,眼神里常闪过一丝犹豫——不是不会,而是没真正把镜像build出…

2026/10/15 14:38:50 阅读更多 →
SQLite FTS5 context-mode语境高亮原理与实战

SQLite FTS5 context-mode语境高亮原理与实战

1. “context-mode”不是功能开关,而是SQLite FTS5全文检索的底层执行范式你第一次在SQLite文档里看到“context-mode”这个词,大概率是在FTS5的MATCH查询语法说明里——它不像ORDER BY或LIMIT那样直白,也不像CREATE VIRTUAL TABLE那样显眼。…

2026/10/15 14:38:50 阅读更多 →
数字电路实验:4位补码绝对值电路设计与FPGA实现

数字电路实验:4位补码绝对值电路设计与FPGA实现

简介:面向大二数字电子技术实验的完整绝对值加法器工程包,配套Vivado仿真与FPGA实现全流程,围绕ABS加法器设计,涵盖符号位判断、取反加一等核心逻辑。包体共79个文件、约435KB,以rst报告、rpt时序报告、pb配置、xdc约束…

2026/10/15 14:38:50 阅读更多 →

最新新闻

Python数据分析实战:从工具链到工程化实践

Python数据分析实战:从工具链到工程化实践

1. 项目概述:为什么Python是数据分析师的首选工具十年前我刚入行数据分析时,主流工具还是Excel和SPSS。直到2015年第一次用Python处理百万行销售数据,5分钟完成同事需要通宵操作的报表,才真正体会到"工欲善其事必先利其器&qu…

2026/10/15 15:20:03 阅读更多 →
Kotlin语言基础与Android开发实践指南

Kotlin语言基础与Android开发实践指南

1. Kotlin语言概述与开发环境搭建作为一名从Java转向Kotlin的Android开发者,第一次接触Kotlin时就被它的简洁性惊艳到了。Kotlin是JetBrains公司2011年推出的静态类型编程语言,2017年被Google官方宣布为Android开发一级语言。与Java相比,Kotl…

2026/10/15 15:20:03 阅读更多 →
3天18小时无人值守:dzhng/skills 驱动 Codex 自主运行的完整案例复盘

3天18小时无人值守:dzhng/skills 驱动 Codex 自主运行的完整案例复盘

【免费下载链接】skills Reusable AI agent skills for software factories: explore ideas, write specs, implement, review, and run autonomous research. Works with Claude Code, Codex, and other skill-compatible agents. 项目地址: https://gitcode.com/g…

2026/10/15 15:20:03 阅读更多 →
EVEngine v0.5.0 重构:从游戏运行时转向可组合创作平台

EVEngine v0.5.0 重构:从游戏运行时转向可组合创作平台

说实话,在把 v0.5.0 的发布说明发出去之前,我纠结了很久。如果只写"修复了若干个 bug、新增某某模块",那完全体现不了这一版的真实分量;可要是一上来就聊架构、聊生态、聊理念,又怕把实际用户吓跑。几轮讨论…

2026/10/15 15:20:03 阅读更多 →
基于mongoose实现多线程HTTP Server:多核并发与性能调优实战

基于mongoose实现多线程HTTP Server:多核并发与性能调优实战

简介:本资源面向嵌入式开发与C/C后端学习者,提供一份基于mongoose库实现多线程HTTP服务器的完整工程源码,帮助理解轻量级Web服务器在高并发场景下的线程池设计、线程同步与请求分发机制。压缩包共11个文件,约221KB,以c…

2026/10/15 15:20:03 阅读更多 →
OpenTelemetry Instrumentation for VoyageAI:为 Embedding 与 Rerank 调用接入可观测性

OpenTelemetry Instrumentation for VoyageAI:为 Embedding 与 Rerank 调用接入可观测性

LLMOps可观测性 【免费下载链接】openllmetry Open-source observability for your GenAI or LLM application, based on OpenTelemetry 项目地址: https://gitcode.com/gh_mirrors/op/openllmetry 点击查看 免费下载 这篇技术指南以 openllmetry 仓库中的 opentel…

2026/10/15 15:19:02 阅读更多 →

日新闻

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/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 9:49:14 阅读更多 →