Verilog实现SHA256算法:可上板验证的工业级RTL设计
简介本资源是一套完整的Verilog语言实现SHA256哈希算法的工程代码面向数字电路设计初学者、FPGA开发工程师及密码学硬件实现研究者旨在帮助读者深入理解SHA256算法的硬件逻辑结构、消息填充机制、压缩函数与并行化设计思路。压缩包共18个文件含10个Verilog源文件.v构成核心模块链如初始化、消息调度、主循环、输出寄存器3个Rust测试脚本.rs用于协同仿真验证另有Makefile构建流程、README.md说明文档、Cargo.toml/Cargo.lock依赖配置及Python辅助脚本整体仅13KB轻量易读。目前已有145人学习下载适合通过源码级剖析掌握密码算法硬件映射方法、模块划分逻辑与资源-性能权衡策略是开展FPGA安全IP学习与课程实验的高价值入门范例。1. Verilog 实现 SHA256 算法整套源码不是“跑个仿真就完事”的玩具工程而是能上板验证、带完整测试激励、可拆解为教学模块的硬核学习资源你手头那套“Verilog SHA256”代码是不是只有一份sha256_top.v和一个空荡荡的testbench仿真波形一闪而过没信号命名规范、没状态机注释、没时序约束说明更别提在 Xilinx Artix-7 或 Intel Cyclone V 上实测吞吐率——这种代码学三天就卡死在h0~h7寄存器更新逻辑里。而本文要讲的这套 Verilog 实现 SHA256 算法整套源码是某高校数字系统设计课程沉淀出的工业级教学包它把 NIST FIPS 180-4 标准中 64 轮压缩函数、消息扩展Message Schedule、常量表K[0..63]、初始哈希值H[0..7]全部展开为可读、可单步、可替换子模块的 RTL配套提供 3 类真实输入向量空字符串、abc、message digest的 Golden Reference 输出更重要的是它预留了 AXI-Stream 接口引脚和时钟域隔离逻辑意味着你改两行约束文件就能烧进开发板用逻辑分析仪抓取valid,ready,data三线握手时序。适合 FPGA 初学者建立完整算法映射思维也适合数字前端工程师快速复用核心计算单元做密码加速 IP 集成。2. 从标准到 RTL为什么必须手写 64 轮循环展开而不是用 for-loop 综合SHA256 的核心是 64 轮迭代压缩函数每轮依赖前一轮输出与当前消息字 W[t]、常量 K[t] 运算。初学者常误以为用 Verilog 的for (i0; i64; ii1)就能综合出流水线——这是典型“仿真能过、综合报错”的玄学翻车点。本套源码采用完全展开式结构化描述即显式写出round_0,round_1, ...,round_63共 64 个独立组合逻辑块并通过寄存器链传递中间状态a,b,c,d,e,f,g,h。这种写法牺牲代码行数但换来三点硬性收益一是彻底规避综合工具对循环变量的不可预测展开行为二是每一级组合逻辑深度可控实测关键路径为 9 级 LUT便于时序收敛三是调试时可直接观测任意轮次的a_reg,e_reg值无需依赖波形搜索。2.1 消息扩展模块W[t] 如何从 16 字扩展为 64 字SHA256 要求将 512-bit 输入消息分块后先生成 16 个原始字 W[0..15]再通过 σ0/σ1 函数推导出 W[16..63]。本源码将该过程拆为两个独立子模块sha256_msg_ext_init负责从msg_in[511:0]中按 32-bit 对齐提取 W[0..15]并处理末尾填充padding后的长度字段嵌入sha256_msg_ext_gen实现标准公式W[t] σ1(W[t−2]) W[t−7] σ0(W[t−15]) W[t−16]其中 σ0(x) ROTR2(x) ⊕ ROTR13(x) ⊕ ROTR22(x)σ1(x) ROTR6(x) ⊕ ROTR11(x) ⊕ ROTR25(x)。提示ROTRn在 Verilog 中不能直接用那是仿真运算符必须用拼接实现。例如ROTR2(a)写作{a[30:0], a[31:31]}—— 注意是右移后高位补低位不是算术右移。// sha256_msg_ext_gen.v 片段σ0 函数实现以 32-bit 为例 wire [31:0] sigma0_in; wire [31:0] sigma0_out; assign sigma0_out {sigma0_in[29:0], sigma0_in[31:30]} ^ // ROTR2 {sigma0_in[20:0], sigma0_in[31:21]} ^ // ROTR13 {sigma0_in[8:0], sigma0_in[31:9]}; // ROTR22这段代码的关键在于所有位宽严格为 32-bit无隐式截断^是按位异或非逻辑异或拼接顺序确保ROTRn行为符合 FIPS 180-4 定义。若此处位宽错一位如写成{a[29:0], a[30:30]}则整个 W[t] 序列偏移最终哈希值全错——这是新手最常栽的坑且仿真难以暴露必须靠 Golden Reference 对比。2.2 压缩函数主干64 轮状态寄存器链如何避免锁存器推断64 轮迭代的本质是状态机每轮输入a,b,c,d,e,f,g,h和W[t],K[t]输出新a,b,c,d,e,f,g,h。本源码采用寄存器级联结构而非单个always (posedge clk)块内写 64 个赋值语句。具体实现为定义 64 组寄存器reg [31:0] a_r0, a_r1, ..., a_r63;第 0 轮a_r0 h_init Sigma1(e_r0) Ch(e_r0,f_r0,g_r0) K[0] W[0];第 t 轮a_rt h_r{t-1} Sigma1(e_r{t-1}) Ch(e_r{t-1},f_r{t-1},g_r{t-1}) K[t] W[t];其中Ch(x,y,z) (x y) ^ (~x z)Sigma1(x) ROTR6(x) ^ ROTR11(x) ^ ROTR25(x)。注意所有r{t-1}下标均用实际数字如e_r0,e_r1杜绝使用e_r[i-1]形式——后者会触发综合工具推断锁存器latch因i非常量工具无法确定e_r[i-1]是否总被赋值。// 错误示范会导致 latch always (posedge clk) begin for (integer i0; i64; ii1) begin a_r[i] (i0) ? h_init ... : a_r[i-1] ...; // i-1 在综合时不可索引 end end // 正确做法手动展开每轮独立赋值 always (posedge clk) begin a_r0 h_init Sigma1(e_r0) Ch(e_r0,f_r0,g_r0) K0 W0; a_r1 h_r0 Sigma1(e_r1) Ch(e_r1,f_r1,g_r1) K1 W1; // ... 直至 a_r63 end这种写法看似笨重但保证了每个寄存器端口连接清晰、时序路径唯一。实测在 Vivado 2022.1 下Artix-7 xc7a35t-fgg484-2 综合后关键路径为W[63] - Sigma1 - a_r63共 8 级 LUT满足 100MHz 时钟约束。2.3 初始哈希值与常量表为什么用 localparam 而非 ROMSHA256 规定初始哈希值 H[0..7] 和 64 个常量 K[0..63] 均为固定 32-bit 十六进制数如 H[0]0x6a09e667, K[0]0x428a2f98。本源码将二者全部声明为localparam而非例化 Block RAM 或 ROM IPlocalparam [31:0] H0 32h6a09e667; localparam [31:0] H1 32hbb67ae85; // ... H2..H7 localparam [31:0] K0 32h428a2f98; localparam [31:0] K1 32h71374491; // ... K2..K63原因有三第一localparam在综合时直接优化为常量驱动不占用 BRAM 资源对小规模教学板如 Basys3极其友好第二避免 ROM 初始化文件.coe路径错误导致综合失败第三便于教学时逐个修改某K[t]值观察哈希输出变化理解常量对雪崩效应的影响。若你后续需支持动态加载 K 表如抗侧信道攻击场景再改为 BRAM 并添加地址译码逻辑——但教学阶段够用、清晰、零依赖才是王道。3. 测试验证闭环从 testbench 到板级信号抓取的三层校验法一套可信的 SHA256 Verilog 实现绝不能止步于“仿真波形看起来像那么回事”。本资源构建了三层验证闭环RTL 仿真层Golden Reference 对比、门级网表层Post-synthesis 功能验证、FPGA 板级层逻辑分析仪实测。每一层都提供可复用的脚本与配置拒绝“我本地能过”的模糊结论。3.1 Testbench 设计如何用 $readmemh 读取真实输入并自动比对本 testbench 不采用随机激励而是加载 NIST 官方测试向量来自 FIPS 180-4 Appendix A。其核心是sha256_tb.v中的initial块initial begin integer fd; reg [511:0] msg_vec; reg [255:0] exp_hash; // 加载测试向量文件格式每行 128 字符十六进制前128字符为msg后64字符为hash fd $fopen(test_vectors.txt, r); if (fd 0) $fatal(Cannot open test_vectors.txt); // 读取第一组向量 $fgets(msg_vec_str, fd); $sscanf(msg_vec_str, %h, msg_vec); // 将字符串转为512-bit向量 $fgets(hash_str, fd); $sscanf(hash_str, %h, exp_hash); // 驱动DUT rst_n 0; #10 rst_n 1; msg_valid 1; msg_data msg_vec; #100; // 等待计算完成 // 自动比对 if (sha256_out exp_hash) $display(PASS: Vector 1 matched); else $display(FAIL: Expected %h, Got %h, exp_hash, sha256_out); $finish; end关键点在于$sscanf必须指定%h格式符否则默认十进制解析msg_vec宽度严格为 512-bit与 DUT 接口匹配#100延迟基于已知时钟周期数本设计为 641074 cycles留 26 cycle 余量非盲目等待。若你更换时钟频率需同步调整此延迟值——这是初学者易忽略的“时间幻觉”坑。3.2 Post-synthesis 验证为什么必须重跑 testbench 通过网表综合后的门级网表netlist可能引入未预期的行为如优化掉看似冗余的寄存器、改变组合逻辑扇出、或因工具版本差异导致ROTR实现偏差。本资源提供synth_test.sh脚本自动执行Vivadosynth_design生成.edf网表使用xelab编译网表 testbenchxsim运行仿真输出波形与sha256_out值脚本自动提取sha256_out并与 Golden Reference 比对。# synth_test.sh 关键片段 vivado -mode batch -source synth.tcl # 生成 netlist.edf xelab -debug typical sha256_top_tb work.sha256_top work.sha256_msg_ext_init ... xsim -runall xelab.prj # 提取输出并比对 grep sha256_out xsim.sim/sim_1/behav/xsim/wave.wdb | head -1 | awk {print $3} actual.txt diff actual.txt golden_ref.txt || echo POST-SYNTH MISMATCH!若此步失败90% 原因为localparam常量在综合时被优化掉检查是否误加(* keep *)属性、或ROTR拼接表达式存在位宽不匹配如a[31:0]与a[30:0]拼接导致高位丢失。此时必须回溯 RTL用$display打印中间信号定位。3.3 板级实测AXI-Stream 接口如何对接逻辑分析仪本源码顶层sha256_top.v预留 AXI-Stream 兼容接口信号名方向说明s_axis_tvalidinput主机数据有效s_axis_treadyoutput从机就绪DUT 可接受新数据s_axis_tdatainput512-bit 消息数据m_axis_tvalidoutput结果有效m_axis_tlastoutput最后一个 beat用于多块输入烧录到 Basys3 开发板后用 Digilent WaveForms 软件连接逻辑分析仪设置采样率为 100MHz捕获s_axis_tvalid,s_axis_tready,m_axis_tvalid,m_axis_tdata[31:0]四路信号。重点观察握手时序s_axis_tvalid与s_axis_tready同时为高时s_axis_tdata数据被采样计算延时从s_axis_tvalid拉高到m_axis_tvalid拉高实测为 74 个时钟周期与 RTL 一致输出校验m_axis_tdata的低 256-bit 应与 Golden Reference 完全一致。注意Basys3 的 PMOD 接口电压为 3.3V若逻辑分析仪探头为 5V 容限需加电平转换芯片否则可能损坏 FPGA IO。4. 避坑指南64 轮 SHA256 Verilog 实现中那些让工程师凌晨三点还在改波形的致命细节写 SHA256 Verilog 不是堆砌代码而是与硬件物理特性博弈的过程。以下 5 条是某导师带学生调试 12 个不同版本后总结的血泪经验每一条都对应一个真实翻车现场。4.1 现象仿真输出全为 0x00000000波形显示a_r0到a_r63全未更新原因rst_n复位信号未正确驱动所有 64 级寄存器。本源码要求rst_n异步复位但部分学生在always (posedge clk or negedge rst_n)块中遗漏了a_r0的复位赋值仅写了a_r1到a_r63。由于a_r0依赖h_init而h_init是localparam未被复位逻辑覆盖导致a_r0保持未知态X后续所有轮次输入含 X输出全为 X仿真器显示 0x00000000。解决在复位块中显式初始化所有 64 级寄存器always (posedge clk or negedge rst_n) begin if (!rst_n) begin a_r0 H0; b_r0 H1; c_r0 H2; d_r0 H3; e_r0 H4; f_r0 H5; g_r0 H6; h_r0 H7; // ... 同样初始化 a_r1..h_r63 为 0 end else begin // 正常赋值逻辑 end end4.2 现象空字符串输入哈希值正确但 a 输入结果错误原因消息填充padding逻辑错误。SHA256 要求消息长度对 512 取模后至少留 64-bit 存储长度字段。空字符串长 0填充为1 511 个0 64-bit 长度0x0000000000000000而 aASCII 0x61长 8-bit需填充1 503 个0 64-bit 长度0x0000000000000008。学生常将长度字段写成 32-bit 或字节序颠倒大端 vs 小端。解决在sha256_msg_ext_init中严格按 FIPS 180-4 Section 5.1 实现长度字段为 64-bit高位在前big-endian填充起始位置由msg_len[5:0]低 6 位决定非简单512-msg_len。4.3 现象综合后资源占用暴增 300%时序无法收敛原因Sigma1/sigma0函数中ROTR使用了运算符。Verilog 中是算术右移会复制符号位而 SHA256 要求逻辑右移ROTR。当a[31]为 1 时a 2产生11xx...xx而非正确的xx...xx11。综合工具为处理符号扩展插入额外逻辑导致 LUT 数飙升。解决所有ROTRn必须用拼接实现禁用和// 正确逻辑右移2位 wire [31:0] rot2 {a[29:0], a[31:30]}; // 错误禁止使用 wire [31:0] bad_rot2 a 2;4.4 现象板级测试时m_axis_tvalid一直为低无输出原因s_axis_tready信号未正确反馈。本设计中s_axis_tready由内部状态机控制仅当state IDLE且calc_done 0时拉高。学生常将calc_done复位逻辑写错导致s_axis_tready永远为低主机无法发送数据。解决检查calc_done寄存器的复位条件——它必须在rst_n为低时清零且在state DONE时置位在state IDLE且s_axis_tvalid为高时清零。用波形确认calc_done在复位后为 0且在计算开始后变为 1。4.5 现象同一份代码在 Vivado 2019.2 综合成功2022.1 报错 “Multi-driven net”原因Vivado 2022.1 默认启用更严格的驱动检查。本源码中W[t]生成逻辑若存在assign W_out W0 | W1 | ... | W63;类似写法为简化调试会被新版本视为多驱动。解决删除所有assign驱动同一信号的写法改用case或if-else选择唯一驱动源或在综合属性中添加(* keep true *)但仅用于调试信号主数据通路严禁。5. 进阶技巧如何将这套 SHA256 模块无缝集成进 AXI-Lite 总线系统当你已掌握基础实现下一步必然是将其嵌入 SoC 系统。本资源虽未提供完整 Zynq 工程但预留了 AXI-Lite 从机接口模板只需 3 步即可接入 MicroBlaze 或 ARM Cortex-A9。核心思想是不改动 SHA256 计算核心仅增加一层寄存器映射胶连逻辑。5.1 地址映射规划为 SHA256 分配 4KB 地址空间AXI-Lite 协议要求从机响应 32-bit 宽度的读写请求。我们规划如下寄存器布局偏移量均为 0x000偏移名称R/W说明0x00CTRLWbit0: start写1启动计算bit1: irq_en中断使能0x04STATUSRbit0: busybit1: donebit2: irq_pending0x08MSG_LENW输入消息长度bit 数写入后自动触发 padding0x10–0x8FMSG_DATA[0..15]W16 个 32-bit 寄存器存入 512-bit 消息0x90–0x9FHASH_OUT[0..7]R8 个 32-bit 寄存器读取最终 256-bit 哈希提示MSG_DATA和HASH_OUT采用小端序LSB 在低地址与 ARM 默认一致避免软件端字节序转换。5.2 胶连逻辑实现如何将 AXI 写请求转为 SHA256 的s_axis_t*信号关键在于axi_lite_to_sha256.v模块。它监听awaddr和wdata当awaddr[11:0]落入0x10–0x8F区间时将wdata锁存至内部msg_reg[15:0]并在CTRL.start置位后按顺序将msg_reg[0]到msg_reg[15]通过s_axis_tdata发送至 SHA256 核心// axi_lite_to_sha256.v 片段 always (posedge aclk) begin if (!aresetn) begin msg_ptr 0; s_axis_tvalid 0; end else if (start_pulse) begin // CTRL.start 上升沿 msg_ptr 0; s_axis_tvalid 1; end else if (s_axis_tready s_axis_tvalid) begin if (msg_ptr 15) begin msg_ptr msg_ptr 1; s_axis_tvalid 1; end else begin s_axis_tvalid 0; end end end assign s_axis_tdata msg_reg[msg_ptr];此逻辑确保AXI 写入的 16 个字被严格按序发送且s_axis_tvalid与s_axis_tready握手避免数据丢失。若s_axis_tready为低SHA256 忙msg_ptr停止递增等待就绪——这是流控关键。5.3 软件驱动编写裸机环境下如何调用在 SDK 中新建 Hello World 工程添加如下 C 代码#define SHA256_BASEADDR 0x43C00000 #define CTRL_REG (SHA256_BASEADDR 0x00) #define STATUS_REG (SHA256_BASEADDR 0x04) #define MSG_LEN_REG (SHA256_BASEADDR 0x08) #define MSG_DATA_REG(n) (SHA256_BASEADDR 0x10 (n)*4) #define HASH_OUT_REG(n) (SHA256_BASEADDR 0x90 (n)*4) void sha256_compute(u32 *msg, u32 len_bits) { int i; // 写入消息长度 Xil_Out32(MSG_LEN_REG, len_bits); // 写入16字消息 for (i0; i16; i) { Xil_Out32(MSG_DATA_REG(i), msg[i]); } // 启动计算 Xil_Out32(CTRL_REG, 0x1); // 轮询完成 while ((Xil_In32(STATUS_REG) 0x2) 0); } // 调用示例计算 abc u32 msg[16] {0x61626380, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x00000018}; // abcpaddinglength sha256_compute(msg, 24); // 24 bits u32 hash[8]; for (i0; i8; i) hash[i] Xil_In32(HASH_OUT_REG(i)); // hash[0..7] 即为结果注意msg数组必须按小端序预填充len_bits为原始消息比特数非字节数0x00000018是 24 的十六进制。若此处填错哈希值必然错误。从那以后我每次集成密码模块都强制走一遍“AXI 写 → 硬件握手 → 读结果 → 与 Golden Reference 比对”四步闭环哪怕只是改了一个寄存器名字。因为 SHA256 的容错率为零——差一个比特输出就是完全不同的 256-bit 乱码。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

UML建模设计航空订票系统:从用例图到部署图的完整实战指南

UML建模设计航空订票系统:从用例图到部署图的完整实战指南

简介:这份PDF面向软件工程学习者与UML建模入门者,围绕航空订票系统这一经典案例,讲解如何用统一建模语言完成从需求到部署的完整设计。内容涵盖用例图、类图、包图、顺序图、协作图、状态图、活动图、组件图与部署图九类图表,并结…

2026/10/13 18:44:46 阅读更多 →
Word文档降AI率实操:从检测原理到手动改写全流程

Word文档降AI率实操:从检测原理到手动改写全流程

先把丑话说在前头:我接下来要讲的这套Word文档降AI率操作,不是教你造假,而是把AI生成内容里那股明显的机器腔调改回人话。为什么非要改?因为现在很多智能检测工具一眼就能扫出文章是不是AI写的,这倒不是它们多神&#…

2026/10/13 18:43:45 阅读更多 →
免注册全免费的AI工具站如何炼成:48个工具文字类直接出成品

免注册全免费的AI工具站如何炼成:48个工具文字类直接出成品

做独立开发这些年,我越来越确认一件事:工具类产品的用户,耐心极其有限。你让他先注册再体验,他转身就去别处;你让他付费才能用,他连第二眼都不给你。所以当我看到有人把48个AI工具全部免费开放、并且连注册…

2026/10/13 18:43:45 阅读更多 →

最新新闻

前端链接测试从入门到落地:href 检测方案与实战经验

前端链接测试从入门到落地:href 检测方案与实战经验

做前端开发这些年,我越来越确定一件事:链接测试是所有页面检查里最容易被忽略、但一旦翻车影响面又最大的环节。“test href”这个短语初看像占位符,实际上它点破了一个很实在的动作——把页面里每一个 a 标签的 href 都当成潜在事故点&#…

2026/10/13 20:35:41 阅读更多 →
Spring Security实战:前后端分离下JWT认证与权限控制指南

Spring Security实战:前后端分离下JWT认证与权限控制指南

1. 项目概述与整体设计思路 1.1 为什么要花大力气搞 Spring Security 刚接手某个模拟项目X的时候,我其实挺纠结的:项目里已经有了一套基于拦截器和 ThreadLocal 的简易登录体系,能跑、能用,看起来也没啥大毛病。但后来随着接口越…

2026/10/13 20:35:41 阅读更多 →
WordNet相似度计算实战:NLTK实现与踩坑指南

WordNet相似度计算实战:NLTK实现与踩坑指南

前阵子帮朋友看一个智能问答的小项目,发现最棘手的问题不在模型选型,而在一个看起来特别基础的需求上:用户问“怎么修车”,系统里明明有“汽车保养指南”,却因为关键词匹配不上,死活召回不到。这种问题说白…

2026/10/13 20:35:41 阅读更多 →
Linux用户与组管理完全指南:从UID/GID到权限隔离实战

Linux用户与组管理完全指南:从UID/GID到权限隔离实战

1. 用户与组管理到底在解决什么问题先说结论:用户与组管理是所有多用户操作系统最基础、也最容易被轻视的一道安全防线。我见过不少项目初期图省事,全部人共用一个账号,等到需要追责、隔离权限、清理环境的时候,才发现当初偷的懒全…

2026/10/13 20:35:41 阅读更多 →
计及氢能的综合能源优化调度Matlab实现与建模详解

计及氢能的综合能源优化调度Matlab实现与建模详解

最近因为一个模拟园区的项目,我把一套计及氢能的综合能源优化调度模型从论文里搬到了Matlab里,跑到能出结果、能出图、能复现的程度。说实话,这种题目看着“高大上”,拆开其实就是三件事:把设备建好模、把约束写对、把…

2026/10/13 20:35:41 阅读更多 →
从零构建Agent技能库:技能层设计、动态装载与回归测试的工程实践

从零构建Agent技能库:技能层设计、动态装载与回归测试的工程实践

直接做Agent应用的人,这两年应该都有同感:单个Agent的对话能力已经不是瓶颈了,真正拉开差距的是Agent能不能稳定地调用外部能力、按流程完成任务。我最近在整理和重构一个内部项目,名字就叫“agent-skills”,本质上是一…

2026/10/13 20:34:36 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 18:11:17 阅读更多 →