FPGA/Verilog四人抢答器设计:按键消抖与仲裁锁定完整实现
简介一套基于Verilog HDL的FPGA四人抢答器完整设计资源面向数字逻辑课程设计、电子竞赛及FPGA入门学习者。工程实现了4路抢答、20秒倒计时、超时报警、超前抢答犯规提示以及抢答优先封锁和蜂鸣提醒系统复位后进入抢答状态按下有效键后将锁定其余输入并持续显示台号采用层次化设计方法模块划分清晰便于理解代码结构和修改功能。压缩包共180个文件大小约23.92MB以Quartus工程文件为主包含源码、工程配置、编译数据库、编译报告和仿真波形等类型覆盖从编写、编译到仿真的完整流程解压后即可用Quartus直接打开编译。已有8933人学习浏览资源来自有经验的开发者除最终工程外还保留了多份备份与过程件可帮助排查报错、对比修改前后版本这些中间文件也有助于理解Quartus工程的组织方式适合课设或竞赛快速落地。1. FPGA/Verilog四人抢答器第一课是先按下的那路信号怎么被记住FPGA/Verilog四人抢答器是很多开发者拿到板子后的第一个完整项目也是大学数字逻辑课程设计里出现频率最高的题目之一。它的需求一句话就能说清四个按键谁先按下数码管就显示谁的编号其他人再按无效主持人按复位后进入下一轮。逻辑上不难但真正把它做到上板稳定运行你会发现难点不在“谁先按”这个判断而在按键抖动、异步信号跨时钟域、锁存优先级、数码管扫描显示这些基本功上。一个反直觉的事实是这个项目里最容易被忽视的部分——按键消抖往往决定了整个系统能不能正常跑起来。这篇文章我会从模块拆分讲到每个模块的Verilog实现再落到仿真验证和上板避坑按我自己做课程项目的习惯走一遍。2. 架构怎么拆把抢答器切成能单独验证的小块拿到这类定时逻辑项目我的第一反应不是打开编辑器写代码而是先把需求翻译成模块边界。这样做最大的好处是每个模块都能单独仿真、单独上板验证出了问题不用在顶层代码里大海捞针。四人抢答器的完整行为大致是这样复位后处在“等待抢答”状态某一路按键按下并被消抖确认后系统进入“已锁定”状态并保存该选手编号后续按键输入都被忽略主持人按下复位回到等待状态。围绕这个状态流转我通常把系统拆成五个部分。2.1 需求拆解一盏LED和一个数码管背后的模块清单先说功能需求。一个四人抢答器必须有四路抢答按键输入、一个复位按键、至少一位数码管显示抢答选手编号。如果要做成完整的竞赛系统还需要主持人的“开始”按键、倒计时显示和超时提示但这些属于扩展功能基础版可以不放。我建议先把基础版跑通再往上加倒计时理由后面会说。按照这样的需求模块划分如下表模块输入输出职责按键消抖模块原始按键信号消抖后的按键电平滤除机械抖动输出稳定的按下/释放状态仲裁锁定模块四路消抖后的按键电平选手编号、锁定标志判断第一路有效按下锁存编号数码管显示模块选手编号段选、位选信号把编号翻译成数码管驱动波形复位管理模块复位按键同步复位信号处理上电复位与按键复位抖动顶层模块时钟、按键、复位数码管接口例化以上模块并完成信号连接如果你只是写一个跑马灯或者按键点灯模块化不是必需品但抢答器涉及状态锁定如果不拆开消抖和锁存逻辑会缠在一起仿真时很难判断是消抖没滤干净还是锁定逻辑写错了。我见过不少同学把消抖和仲裁写在一个always块里最后出现“按下没反应”和“编号被覆盖”两种问题互相干扰排错排到怀疑人生。拆开之后每个模块的输入输出都清楚测试平台也好写。2.2 仲裁与锁定为什么第一拍信号决定胜负抢答器最核心的逻辑是仲裁。仲裁的输入是四路按键但它们来自四个不同的选手按下时刻完全异步——可能A比B早1微秒也可能A和B落在同一个时钟周期里。FPGA是同步时序电路所有信号要在时钟边沿采样所以第一步必须把异步按键信号同步化用两级触发器打两拍消除亚稳态传播。亚稳态是数字电路里一个绕不开的话题如果按键信号正好在时钟建立保持时间窗口内变化触发器输出会处于不确定状态可能变成0也可能变成1甚至振荡一段时间。打两拍不能消除亚稳态但能给亚稳态足够的收敛时间让后面逻辑拿到稳定的值。同步之后是仲裁。仲裁逻辑要回答的问题只有一个四路输入中哪一路是第一个变成有效电平的回答方式很直接按优先级依次判断同时用一个lock信号把结果锁住。lock为0时允许仲裁一旦某一路有效lock置1后续任何输入都不能再改写编号。lock只有在复位时才清零。这就是“先到先得”的硬件实现。这里有一个容易被忽略的设计边界如果两路按键在同一时钟沿同时有效仲裁结果怎么定物理上两只手几乎不可能做到精确同拍但电路上必须有一个确定行为。常用做法是给四路固定优先级比如key[0]最高、key[3]最低。这在课程设计里完全够用。如果项目要求绝对公平需要引入更复杂的循环优先级仲裁但抢答器场景下固定优先级已经是行业里的常规做法。3. Verilog 代码怎么写消抖、锁存、显示三件事分开做这一章直接给能用的代码。我先说一个总的原则所有输入信号进FPGA之前先过同步器所有跨模块的信号在模块内自己处理时序。基于这个原则消抖模块内部自带同步仲裁模块拿到的已经是干净信号。下面三块代码组合起来就是一个能在绝大多数开发板上直接跑的最小系统。时钟参数我以50MHz为例其他频率的换算方法会写在参数说明里。3.1 按键消抖模块计数器方案与参数换算表机械按键按下时触点会因弹性产生毫秒级的高频抖动持续时间通常几毫秒到十几毫秒。如果不做处理一次按下会被判断成多次操作。消抖的思路是检测到按键电平变化后开始计时如果在设定时间内电平保持稳定才认为是一次有效按下。这里给出一个边沿触发的消抖模块。module debounce #( parameter CNT_MAX 1_000_000 // 50MHz下对应20ms ) ( input wire clk, input wire rst_n, input wire key_in, // 按键信号按下为低电平 output reg key_out // 消抖后的电平按下变为低 ); reg [19:0] cnt; reg key_ff1, key_ff2, key_ff3; // 第一级同步把异步按键信号打两拍降低亚稳态概率 always (posedge clk or negedge rst_n) begin if (!rst_n) begin key_ff1 1b1; key_ff2 1b1; key_ff3 1b1; end else begin key_ff1 key_in; key_ff2 key_ff1; key_ff3 key_ff2; end end // 检测按下沿key_ff2为低而key_ff3仍为高说明刚发生按下动作 wire key_posedge key_ff2 ~key_ff3; // 低电平有效稳定低电平持续CNT_MAX个时钟周期后key_out拉低 always (posedge clk or negedge rst_n) begin if (!rst_n) begin cnt 0; key_out 1b1; end else if (key_posedge) begin cnt 0; // 检测到新按下沿重新计时 end else if (cnt CNT_MAX) begin cnt cnt 1; if (cnt CNT_MAX - 1) // 持续稳定满20ms key_out 1b0; end end endmodule这段代码先通过三级寄存器做同步和边沿检测key_ff1采样原始输入key_ff2和key_ff3组成两级同步链key_posedge输出一个脉冲表示“这一拍刚检测到按键被按下”。后面的计数器只在这个边沿脉冲到来时清零然后在接下来20ms内累加到达CNT_MAX就确认按键按下。这样一次短促的抖动虽然会产生边沿脉冲但计数器在抖动间歇期会被反复清零始终到不了CNT_MAX就不会误触发。CNT_MAX的换算方法是延时时间 CNT_MAX / 时钟频率。50MHz下20ms对应1_000_000100MHz下就要改成2_000_000。如果你的板子时钟不是PLL分频出来的整数关系先用计数器分频得到低频使能信号再套用这个模块。下面是几个常见时钟频率的参考参数时钟频率CNT_MAX20msCNT_MAX10ms50MHz1_000_000500_000100MHz2_000_0001_000_00025MHz500_000250_0003.2 仲裁锁定模块锁存信号的优先级怎么排消抖后的四路按键信号送入仲裁模块。这个模块要做两件事判断谁是第一个有效按下者以及保证这个结果不被后续按键覆盖。我常用for循环实现优先级这个写法在综合时会展开成并联的比较逻辑i0对应最高优先级。module lock_arbiter #( parameter WIDTH 4 ) ( input wire clk, input wire rst_n, input wire [WIDTH-1:0] key_in, // 消抖后的按键按下为低 output reg [3:0] winner // 锁存的选手编号1~4 ); reg lock; integer i; always (posedge clk or negedge rst_n) begin if (!rst_n) begin winner 4d0; lock 1b0; end else if (!lock) begin for (i 0; i WIDTH; i i 1) begin if (key_in[i] 1b0) begin winner i 4d1; lock 1b1; end end end end endmodule逻辑说明lock是锁存标志复位时清零。每一拍都检查lock只有为0时才扫描四路输入。一旦发现某一路按下立即写入编号并置位lock。由于lock已经为1后续所有扫描分支都不会再执行后面的选手无论怎样按键都改不了winner。复位后winner回到0系统进入新一轮抢答。这里要特别说明for循环在硬件综合中的语义。很多新手以为for循环是顺序执行的软件逻辑其实综合工具会把循环展开成并行的优先级网。i0分支的信号在硬件上离输出更近所以当两路在同一时钟沿有效时key_in[0]会优先赢得仲裁。这个行为在仿真和上板时都能复现属于“设计意图”而非bug。如果你希望key_in[3]优先级最高把循环倒过来写就行。另外注意赋值方式。这里统一用非阻塞赋值是为了避免同一always块内部出现读改写竞争。如果你把lock写成阻塞赋值综合出的锁存器行为会很奇怪我见过最多的问题之一就是锁存逻辑写错导致“后按的覆盖先按的”这个坑我放在第5章详细排查。3.3 顶层模块例化四位消抖怎么拼、数码管怎么亮有了消抖和仲裁顶层就是把它们连起来。四路按键需要例化四个消抖模块Verilog里可以用generate块生成避免手写四遍重复代码。显示部分用一位数码管段选信号按共阳接法写共阴板子需要把编码取反。module top_quizzer ( input wire clk, input wire rst_n, input wire [3:0] key_in, // 4个选手按键按下为0 output reg [6:0] seg, // 数码管段选共阳低电平有效 output reg [3:0] an // 数码管位选低电平选中 ); wire [3:0] key_debounced; wire [3:0] winner_code; genvar g; generate for (g 0; g 4; g g 1) begin : gen_debounce debounce #( .CNT_MAX(1_000_000) ) u_debounce ( .clk(clk), .rst_n(rst_n), .key_in(key_in[g]), .key_out(key_debounced[g]) ); end endgenerate lock_arbiter #( .WIDTH(4) ) u_arbiter ( .clk(clk), .rst_n(rst_n), .key_in(key_debounced), .winner(winner_code) ); // 七段译码显示1~4无抢答时显示0 always (*) begin case (winner_code) 4d1: seg 7b1001111; 4d2: seg 7b0010010; 4d3: seg 7b0000110; 4d4: seg 7b1001100; default: seg 7b1000000; endcase end assign an 4b1110; // 只点亮最右侧一位数码管 endmodulegenerate块里的gen_debounce是例化名每路消抖模块内部信号独立命名不会互相干扰。key_debounced把四路消除抖动后的电平汇总成一个4位总线送给仲裁模块。七段译码用组合逻辑实现winner_code一变段选立即更新不需要时钟。an固定只点亮一位数码管如果你要显示倒计时或多位数字需要改成动态扫描这个扩展方案在第6章给出。需要注意的是不同开发板的数码管接口极性不一样公共端和段码可能都是低电平有效也可能都是高电平有效。上面代码按“共阳、段选低电平点亮”写如果你的板子是共阴把case里的7位编码全部按位取反。判断方法很简单先下载一个让数码管全亮0的测试工程看实际硬件是高有效还是低有效再决定编码方向。这一步不要靠猜血泪经验告诉我猜错极性会浪费至少半小时。4. 仿真怎么验证公平性testbench 写法与波形判读代码写完直接上板是很多新手踩坑的开端。我的习惯是先写testbench把所有边界情况在仿真里跑通再动开发板。仿真的好处是能看到内部信号比如消抖后的波形、lock信号的跳变沿这些在板子上几乎没法直接观测。下面给出一套能验证“先按先锁、后按无效、复位可重开”的最小测试平台。4.1 搭建测试环境模拟四路异步抢答testbench里要模拟四路按键的真实行为按下时带短暂抖动、按下时长超过消抖窗口、后按的选手无论如何不能改变结果。我按时间顺序构造场景第一轮A先按确认锁定后B再按检查winner保持为1复位后C按检查winner变为3。timescale 1ns/1ps module top_quizzer_tb; reg clk 0; reg rst_n 0; reg [3:0] key_in; wire [6:0] seg; wire [3:0] an; always #10 clk ~clk; // 50MHz时钟 top_quizzer u_top ( .clk(clk), .rst_n(rst_n), .key_in(key_in), .seg(seg), .an(an) ); task press_key(input integer idx); integer k; begin key_in[idx] 0; #100_000; // 模拟100us短抖动 key_in[idx] 1; #50_000; key_in[idx] 0; // 真正按下 #25_000_000; // 保持25ms确保消抖完成 key_in[idx] 1; // 松开 #1_000_000; end endtask initial begin key_in 4b1111; #100 rst_n 0; #100 rst_n 1; // 第一轮选手0先按 press_key(0); // 选手1后按此时应被锁定 press_key(1); #200_000; // 复位进入第二轮 rst_n 0; #100 rst_n 1; #200_000; // 第二轮选手2先按 press_key(2); #200_000; $finish; end endmodule这段testbench里press_key是一个task用于模拟一次完整的按键动作包括短暂抖动、稳定按下和释放。这样写能让测试代码复用后续要测任意选手顺序只需要改变调用顺序即可。#100_000在timescale 1ns/1ps下表示100微秒作为抖动宽度按下过程保持25毫秒确保消抖计数器计满输出才真正变低。4.2 仿真波形该看什么三个关键信号不能漏打开仿真后不要只盯着winner_code。按顺序看三个信号key_debounced、仲裁模块里的lock、以及winner_code。key_debounced在按键按下瞬间会有一段毛毛糙糙的抖动吗不会因为消抖模块要等20ms稳定后才更新输出所以你看到的应该是干净的下跳沿。lock应该在第一个key_debounced变低后的一拍内拉高并且在复位之前一直保持高电平。winner_code从0变成选手编号之后后续所有按键都不能改变它。我习惯在testbench里用$monitor或者波形里加光标来检查这几个时间点也可以用断言比如在第二轮复位后检查winner_code是否回到0。如果lock拉高时序不对说明仲裁模块里lock被意外清零或者在else if (!lock)分支之外还有别的赋值路径覆盖了它。这一步排查的复杂度远低于上板后用示波器抓引脚所以强烈建议至少把仿真跑通一次。5. 常见问题排查上板以后最容易翻车的四个位置仿真通过不代表上板一次成功因为仿真环境是理想化的真实世界里有时钟抖动、有引脚极性、有物理按键磨损。我在带A同学调这块板子时遇到过几种奇怪的现象几乎每一条都能在代码逻辑之外找到一个确定的物理原因。下面四条是我见过最多的高频问题按“现象→原因→解决”的方式列出来遇到类似情况可以直接对照排查。5.1 按键按下完全没反应或者偶尔多跳一个数字现象按选手1的键数码管半天不亮多按几下偶尔能亮但显示的编号不是1。原因消抖参数CNT_MAX和实际时钟频率对不上。很多课程的示例代码按50MHz写但板子上实际时钟可能是100MHz或者48MHz。CNT_MAX小了消抖窗口比真实按键抖动时间还短按键在抖动过程中会被判定为多次有效按下仲裁模块会锁到错误的编号CNT_MAX大了比如设成50ms物理按键如果老化按下时间不够长可能整个按下过程都未能到达CNT_MAX于是表现为“没反应”。解决先确认时钟频率然后按第3章的参数表换算CNT_MAX。改完再测如果还是偶尔跳数可以用逻辑分析仪或者示波器看真实按键的抖动波形用实测抖动宽度加3倍余量。5.2 后按的人把先按的人编号覆盖了现象A先按数码管正常显示1B后按数码管立刻变成2。原因仲裁模块的lock信号没有被正确锁存。常见代码错误有两个一是lock虽然在按下分支里置1但另一个分支里忘了写保持比如用组合逻辑给lock赋值且条件覆盖不全综合时综合出一个不可控的latch二是仲裁逻辑写在了两个always块里一个块置lock另一个块又在某些条件下清lock。解决检查仲裁模块的always块确保复位之外只有一条路径会改变lock就是“检测到有效按键时置1”其余所有分支都保持原值。最有效的排查方法是回到仿真把lock信号拉出来看波形如果lock在A按下后拉高、B按下前出现过一次低电平那问题就在这个信号上。5.3 数码管显示的段码错乱或者所有位都亮现象显示的数字完全不对比如按选手1显示8或者原本只应该亮一位数码管结果几位一起亮亮度还偏暗。原因段码极性搞反或者位选没有正确接。七段数码管有共阳和共阴两种段码编码正好是反的如果板子上位选是高电平有效而代码里按低电平有效写会导致所有位常亮动态扫描时显示内容互相干扰。解决先查开发板原理图确认数码管公共端是接电源还是接地然后对应调整编码。有一个我自己常用的笨办法写一个只显示数字0的测试工程逐个试段码确定哪一位对应哪个字段再组合成正式编码。这个方法慢但可靠。5.4 复位后状态不确定偶尔不能再次抢答现象一轮结束按复位数码管有时归0有时还保留旧编号有时显示一个不在预期范围内的数字。原因复位信号本身来自物理按键按下时同样有抖动而且复位信号相对时钟异步如果复位沿正好落在时钟边沿附近寄存器会进入亚稳态导致复位不彻底。这是很多工程里“上电后表现一切正常跑一会儿出现随机故障”的潜在根源。解决给复位信号加两级同步器像处理普通按键一样先打两拍同时建议把复位信号展宽保证低电平持续时间大于一个时钟周期。我常用的写法是生成一个内部全局复位信号由物理复位触发、由计数器展宽到100微秒以上再释放这样FPGA内部所有时序逻辑都能稳定复位。6. 继续扩展给它装上倒计时和动态扫描显示基础版跑通以后这个系统离真正比赛用的抢答器还差两块主持人的倒计时和跟手的多位显示。倒计时的思路是做一个自由运行的秒计数器主持人按下开始后递减到0或有人抢答时停止。BCD显示部分用动态扫描让两位数码管轮流点亮利用人眼余晖看起来像同时显示。module countdown #( parameter INIT_SEC 30 ) ( input wire clk, input wire rst_n, input wire start, input wire stop, output reg [7:0] bcd_out ); localparam CLK_DIV 50_000_000; // 50MHz下计数到1秒 reg [25:0] clk_cnt; reg [4:0] sec_cnt; reg running; always (posedge clk or negedge rst_n) begin if (!rst_n) begin clk_cnt 0; sec_cnt INIT_SEC; running 0; end else if (start) begin running 1; end else if (stop || sec_cnt 0) begin running 0; end else if (running) begin clk_cnt clk_cnt 1; if (clk_cnt CLK_DIV - 1) begin clk_cnt 0; sec_cnt sec_cnt - 1; end end end assign bcd_out {sec_cnt / 10, sec_cnt % 10}; endmodule代码里直接用了除法和取模方便阅读但FPGA里做除法会消耗大量LUT实际工程建议改成两个BCD位分别递减个位递减到0时置9并向十位借位。显示部分把bcd_out和选手编号一起送到扫描模块每个位选轮流点亮一路数据。我个人的习惯是每加一个功能就先单独仿真那个模块再集成到顶层重新跑一遍完整抢答流程。这个习惯帮我省掉了大量上板调试时间。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

ThinkPHP6框架下载全指南:Composer安装与避坑实战

ThinkPHP6框架下载全指南:Composer安装与避坑实战

简介:ThinkPHP6框架完整项目包,面向需要入门PHP框架或快速搭建Web应用的中级开发者,也适合已有简单PHP基础、希望了解完整工程结构的读者。基于PHP7.1的轻量级MVC架构,覆盖依赖管理、配置加载、路由映射、视图渲染、扩展类库等核心…

2026/10/16 21:24:03 阅读更多 →
Ubuntu 16.04 下源码编译安装 Abseil C++ 库完整指南

Ubuntu 16.04 下源码编译安装 Abseil C++ 库完整指南

1. 项目概述:为什么在 Ubuntu 16.04 上亲手编译 abseil 不是“多此一举”abseil 是 Google 开源的一套 C 基础工具库,它不是那种“写个 Hello World 就够用”的玩具组件,而是现代 C 工程中真正扛大梁的底层基建——从高效的字符串视图&#x…

2026/10/15 15:32:19 阅读更多 →
圆的绘制以及圆弧连接的相切关系

圆的绘制以及圆弧连接的相切关系

目录 一、 图形尺寸分析 二、 具体绘制步骤 第一步:绘制基准中心线 第二步:绘制两个基准圆(φ40) 第三步:绘制两侧倾斜的切线(关键步骤) 第四步:绘制顶部大圆弧(“…

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

最新新闻

xsync集群分发工具原理与实战:基于rsync的生产级配置同步方案

xsync集群分发工具原理与实战:基于rsync的生产级配置同步方案

1. 为什么集群环境下“复制粘贴”根本走不通——xsync不是炫技,而是生存刚需刚接手某高校实验室的分布式计算平台时,我面对的是12台物理节点组成的Hadoop模拟集群。最开始,我习惯性地用scp一条条往每个节点传配置文件:scp core-si…

2026/10/16 21:23:43 阅读更多 →
Cesium 离线地形安装全攻略:从 DEM 切片到 terrainProvider 配置

Cesium 离线地形安装全攻略:从 DEM 切片到 terrainProvider 配置

简介:这份资源面向需要在无网络环境下展示三维地形的Cesium开发者与GIS技术人员,提供将DEM地形tif文件转换为Cesium可加载离线terrain瓦片的完整工具链与操作说明。压缩包共11个文件,约45.9MB,包含msi与exe安装程序、Python脚本、…

2026/10/16 21:23:43 阅读更多 →
双向DC-DC变换器工程落地:PCB布局、控制时序与定点PID实战

双向DC-DC变换器工程落地:PCB布局、控制时序与定点PID实战

简介:本资源为2015年全国大学生电子设计竞赛(电赛)‘双向DC-DC变换器’赛题的完整参赛方案,面向嵌入式电源方向的本科生、竞赛备赛团队及硬件开发初学者,聚焦高精度恒流充电控制与宽输入电压适应性等核心难点。压缩包共…

2026/10/16 21:23:43 阅读更多 →
JVM视角:Java内部类、接口升级与instanceof模式匹配全解析

JVM视角:Java内部类、接口升级与instanceof模式匹配全解析

先说一个我自己的经历。前阵子翻一个老项目里的遗留言代码,看到一个类内部塞了三四个内部类,还有一个匿名类在某个回调里持有外部Activity的引用,结果那页面一直回收不掉,内存抖得厉害。从那次排查之后,我就养成了一个…

2026/10/16 21:23:43 阅读更多 →
从租赁到自建:呼叫中心CTI架构与分阶段实施指南

从租赁到自建:呼叫中心CTI架构与分阶段实施指南

简介:一份面向企业信息化与客服管理岗位的呼叫中心自建整体规划方案,以docx文档呈现,适用于需要从云租赁模式转向自主建设、控制运营成本并保障客户数据安全的项目决策与实施人员。方案围绕自建背景、建设目标、建设原则、分阶段实施步骤及建…

2026/10/16 21:23:43 阅读更多 →
AlphaZero五子棋实战:从零实现自我对弈与MCTS决策系统

AlphaZero五子棋实战:从零实现自我对弈与MCTS决策系统

简介:本资源是基于AlphaZero算法原理实现的五子棋AI教学代码包,面向深度学习初学者与人工智能实践者,聚焦强化学习中自对弈训练、蒙特卡洛树搜索(MCTS)与策略价值网络联合建模等核心环节。压缩包共10个文件&#xff0c…

2026/10/16 21:21:41 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 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/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →