FPGA番茄时钟:从串口指令到倒计时提醒的硬件实现
目录一、项目需求及设计思路1. 项目需求2. 设计思路二、项目实现2.1 模块划分2.2 代码实现2.3 仿真波形三、核心理论基础3.1 UART 异步串行通信3.2 BCD 码与计时逻辑3.3 数码管动态扫描显示3.4 蜂鸣器与 PWM 发声原理四、上板演示一、项目需求及设计思路1. 项目需求我想要实现一个类似于番茄时钟的专注时间倒计时系统用户输入想要专注的时间到时间之后系统能提醒用户专注时间结束然后用户可以重新进行其他活动的安排。2. 设计思路现有的知识基础有UART的RX模块基于数码管实现的秒表和蜂鸣器音乐播放器那么用户就可以在上位机输入时间数据通过 RX 给到秒表系统设置为 23.59.59对应时分秒进行倒计时当秒表系统出现为 00.00.00 时发出信号给到蜂鸣器播放事先写好的音乐。利用计数器实现 BCD 的59 就是用的两组四位宽的二进制也就是两位十六进制不用进行数据的转换那我就直接给到 6 位十六进制对应的就已经是具体的时间了直接进行连续的三组数据输入只是先后到来的顺序我进行约束给到秒表系统。经过刚刚的思考我发现其实对这个小项目进行优化我们还可以得到其他功能时间显示由于 FPGA 的掉电失忆特性只有上电才能工作那我将秒表系统调为正常的时间计数逻辑就可以在上位机给出实时的时间不掉电的情况之下就是一个正常的闹钟显示时间。闹铃模式同倒计时模式我设置一个具体的时间节点给出闹铃信号就开始启动蜂鸣器。其他模式大家可以自行进行扩展本文只是对短期学习综合起来的一个小练习就暂时不做过多的功能扩展了。二、项目实现2.1 模块划分rx 模块 - 倒计时模块 - 数码管显示模块 - 蜂鸣器模块以及 top 模块。2.2代码实现rx模块功能代码module rx ( input wire clk , input wire rst_n , input wire uart_rxd_r ,//接收的串行数据 output reg [7:0] data ,//串并转换后的并行数据 output wire rx_doen //握手信号提示我这个字节已经接收完了 ); parameter sysclk 50_000_000 ,//1s bps 9600 ,//比特率 delay sysclk / bps;//单波特周期数 reg [12:0] baud_cnt ;//单波特计数器 reg [1:0] rx_reg ;//接收串行数据的二级寄存 reg [3:0] bit ;//比特数0-9 reg [7:0] data_reg ;//并行数据寄存信号 reg rx_en ;//数据接收使能 wire flag ;//空闲位下降沿检测信号、也是使能拉高的瞬间 //接受信号的二级寄存 always (posedge clk or negedge rst_n) if(rst_n 0) rx_reg 2b11; else rx_reg {rx_reg[0],uart_rxd_r}; //flag信号 assign flag (rx_reg 2b10 rx_en 0) ? 1 : 0;//二级寄存中遇到下降沿的时候出现10信号,且是在使能信号无效的时候被触发 //先写两个计数器 //单波特计数器 always (posedge clk or negedge rst_n) if(rst_n 0) baud_cnt 0; else if(rx_en) begin if(baud_cnt delay - 1) baud_cnt 0; else baud_cnt baud_cnt 1; end else baud_cnt 0; //比特数计数器 always (posedge clk or negedge rst_n) if(rst_n 0) bit 0; else if(rx_en) begin if(baud_cnt delay - 1) bit bit 1; else bit bit; end else bit 0; //使能信号 always (posedge clk or negedge rst_n) if(rst_n 0) rx_en 0; else if(flag) rx_en 1; else if(baud_cnt delay/2 - 1 bit 9) rx_en 0; //进行数据的串并转换 always (posedge clk or negedge rst_n) if(rst_n 0) data_reg 0; else if(rx_en)begin if(bit 0 bit 9 baud_cnt delay/2 - 1)//在1-8的时候找到中间采样点 data_reg[bit - 1] rx_reg[1]; //同步变化从最低位开始向高位赋值 else data_reg data_reg; end else data_reg 0; //握手信号和并行数据 assign rx_doen (baud_cnt delay/2 - 1 bit 9) ? 1 : 0; //信号有效才给data always (posedge clk or negedge rst_n) if(rst_n 0) data 0; else if(rx_doen) data data_reg; else data data; endmodule仿真代码timescale 1ns/1ps module tb (); reg clk ; reg rst_n ; reg rxd_r ; wire [7:0] data ; wire rx_doen; initial begin clk 0 ; rst_n 0 ; rxd_r 1 ; #20 rst_n 1 ; #2000 rxd_r 0 ; //空闲位结束起始位的开始拉低了 #1060 rxd_r 0 ; //开始以波特为单位进行数据接收,第一个数据 #1060 rxd_r 1 ; #1060 rxd_r 0 ; #1060 rxd_r 0 ; #1060 rxd_r 0 ; #1060 rxd_r 0 ; #1060 rxd_r 0 ; #1060 rxd_r 0 ; //8个数据接收完成 #1060 rxd_r 1 ; //停止位一半、空闲位一半 #1060 rxd_r 0 ; //空闲位结束起始位的开始拉低了 #1060 rxd_r 0 ; //开始以波特为单位进行数据接收,第一个数据 #1060 rxd_r 1 ; #1060 rxd_r 0 ; #1060 rxd_r 0 ; #1060 rxd_r 1 ; #1060 rxd_r 0 ; #1060 rxd_r 0 ; #1060 rxd_r 0 ; //8个数据接收完成 #1060 rxd_r 1 ; //停止位一半、空闲位一半 #1060 rxd_r 0 ; //空闲位结束起始位的开始拉低了 #1060 rxd_r 0 ; //开始以波特为单位进行数据接收,第一个数据 #1060 rxd_r 0 ; #1060 rxd_r 0 ; #1060 rxd_r 1 ; #1060 rxd_r 0 ; #1060 rxd_r 0 ; #1060 rxd_r 1 ; #1060 rxd_r 0 ; //8个数据接收完成 #1060 rxd_r 1 ; //停止位一半、空闲位一半 #10600 $stop; end always #10 clk ~clk;//50MHZ时钟 rx #( .BAUD (52) )rx_inst( .clk (clk ), .rst_n (rst_n ), .uart_rxd_r (rxd_r ), .data (data ), .rx_doen (rx_doen) ); endmodule倒计时模块功能代码//现在就是对计数器进行倒计时的改动 module cnt ( input wire clk , input wire rst_n , input wire [23:0] data_rx_in ,//rx送进来的时间 input wire start , output wire [23:0] cnt_data ); parameter TIME 49_999_999 ; reg [25:0] cnt_time ;//计数1s reg [3:0] cnt_data_1 , cnt_data_2 , cnt_data_3 , cnt_data_4 , cnt_data_5 , cnt_data_6 ; reg [1:0] start_reg ;//赋值信号 reg done ;//计数器控制信号 //赋值信号start上升沿,start_reg2b01的时候 always (posedge clk or negedge rst_n) if(rst_n 0) start_reg 2b00; else start_reg {start_reg[0],start}; //倒计时条件 always (posedge clk or negedge rst_n) if(rst_n 0) done 1; else if(start) //开始倒计时 if(cnt_data 24b0)//倒计时锁定 done 1; else done 0; //持续倒计时 //1s计数器 always (posedge clk or negedge rst_n) if(rst_n 0) cnt_time 0; else if(done 0) if(cnt_time TIME ) cnt_time 0; else cnt_time cnt_time 1; //各位数据的计数逻辑 always (posedge clk or negedge rst_n)begin if(rst_n 0 ) cnt_data_1 data_rx_in[3:0]; else if(cnt_time TIME ) if(cnt_data_1 0) cnt_data_1 9; else cnt_data_1 cnt_data_1 - 1;//实现9s-0s的倒计时 else if(start_reg2b01) cnt_data_1 data_rx_in[3:0]; end always (posedge clk or negedge rst_n)begin if(rst_n 0 ) cnt_data_2 data_rx_in[7:4]; else if(cnt_data_1 0 cnt_time TIME ) if(cnt_data_2 0) cnt_data_2 5; else cnt_data_2 cnt_data_2 - 1;//实现的是5到0的倒计时这里单位是10s else if(start_reg2b01) cnt_data_2 data_rx_in[7:4]; end always (posedge clk or negedge rst_n)begin if(rst_n 0 ) cnt_data_3 data_rx_in[11:8]; else if(cnt_data_2 0 cnt_data_1 0 cnt_time TIME ) if(cnt_data_3 0) cnt_data_3 9; else cnt_data_3 cnt_data_3 - 1;//实现9-0的分钟倒计时 else if(start_reg2b01) cnt_data_3 data_rx_in[11:8]; end always (posedge clk or negedge rst_n)begin if(rst_n 0 ) cnt_data_4 data_rx_in[15:12]; else if(cnt_data_3 0 cnt_data_2 0 cnt_data_1 0 cnt_time TIME ) if(cnt_data_4 0) cnt_data_4 5; else cnt_data_4 cnt_data_4 - 1;//实现5-0的十分钟级倒计时 else if(start_reg2b01) cnt_data_4 data_rx_in[15:12]; end always (posedge clk or negedge rst_n)begin if(rst_n 0 ) cnt_data_5 data_rx_in[19:16]; else if(cnt_data_4 0 cnt_data_3 0 cnt_data_2 0 cnt_data_1 0 cnt_time TIME ) if(cnt_data_5 0) cnt_data_5 9; else cnt_data_5 cnt_data_5 - 1;//实现的是9-0的小时级倒计时 else if(start_reg2b01) cnt_data_5 data_rx_in[19:16]; end always (posedge clk or negedge rst_n)begin if(rst_n 0 ) cnt_data_6 data_rx_in[23:20]; else if(cnt_data_5 0 cnt_data_4 0 cnt_data_3 0 cnt_data_2 0 cnt_data_1 0 cnt_time TIME ) if(cnt_data_6 0) cnt_data_6 0; else cnt_data_6 cnt_data_6 - 1;//2-0的十小时计数 else if(start_reg2b01) cnt_data_6 data_rx_in[23:20]; end //数码管数据 assign cnt_data {cnt_data_6,cnt_data_5,cnt_data_4,cnt_data_3,cnt_data_2,cnt_data_1}; endmodule仿真代码timescale 1ns/1ps module tb (); reg clk ; reg rst_n ; reg start ; reg [23:0] data_rx_in ;//02.12.48 wire [23:0] cnt_data ; initial begin clk 0 ; rst_n 0 ; start 0 ; data_rx_in {4h2,4h3,4h5,4h9,4h5,4h9}; #20 rst_n 1 ; #500 data_rx_in {4h0,4h2,4h1,4h2,4h4,4h8}; start 1; #200 #100000 $stop; end always #10 clk ~clk;//50MHZ时钟 cnt #( .TIME (4) )cnt_inst( .clk (clk ), .rst_n (rst_n ), .data_rx_in (data_rx_in), .start (start ), .cnt_data (cnt_data ) ); endmodule数码管显示模块module smg( input clk , input rst_n , input [23:0] num , output reg [5:0] sel , //位选 output reg [7:0] seg //段选 ); parameter TIMEM 49999 ; reg [19:0] cnt_time ; wire [19:0] data_1 , data_2 , data_3 , data_4 , data_5 , data_6 ; reg [3:0] data ; reg point ; //data赋值 assign data_1 num[23:20] ; assign data_2 num[19:16] ; assign data_3 num[15:12] ; assign data_4 num[11:8] ; assign data_5 num[7:4] ; assign data_6 num[3:0] ; //刷新 always (posedge clk or negedge rst_n) if(rst_n 0) cnt_time 0; else if(cnt_time TIMEM) cnt_time 0; else cnt_time cnt_time 1; //位选 always (posedge clk or negedge rst_n) if(rst_n 0) sel 6b011_111; else if(cnt_time TIMEM) sel {sel[0],sel[5:1]}; //段选 always (posedge clk or negedge rst_n) case (sel) 6b111_110:begin data data_1;point 1;end 6b111_101:begin data data_2;point 0;end 6b111_011:begin data data_3;point 1;end 6b110_111:begin data data_4;point 0;end 6b101_111:begin data data_5;point 1;end 6b011_111:begin data data_6;point 1;end default:begin data data_1;point 1;end endcase //段选 always (posedge clk or negedge rst_n) if(rst_n 0) seg 8b1_100_0000; else case (data) 0 : seg {point,7b100_0000}; 1 : seg {point,7b111_1001}; 2 : seg {point,7b010_0100}; 3 : seg {point,7b011_0000}; 4 : seg {point,7b001_1001}; 5 : seg {point,7b001_0010}; 6 : seg {point,7b000_0010}; 7 : seg {point,7b111_1000}; 8 : seg {point,7b000_0000}; 9 : seg {point,7b001_0000}; default:seg {point,7b100_0000}; endcase endmodule蜂鸣器模块module beep ( input wire clk , input wire rst_n , input wire [23:0] cnt_data,//当倒计时结束该数据会被锁在24‘b0,复位之后锁在23.59.59 output wire buzzer ); parameter DO 47801 , RE 42589 , MI 37936 , FA 35816 , SO 31887 , LA 28409 , SI 25303 , DELAY 24_999_999 ; reg [15:0] cnt_freq ;//频率计数 reg [15:0] cnt_max ;//音频频率计数 reg [24:0] cnt ;//每个音符的延时计数器 reg [31:0] cnt_num ;//实现循环播放的音符计数 //频率计数器 always (posedge clk or negedge rst_n) if(rst_n 0) cnt_freq 0; else if(cnt_data 24b0) if (cnt_freq cnt_max - 1 ||cnt DELAY)//这里是针对仿真来说cnt_freq cnt_max1要满足就得设置cnt_freq的清零条件 cnt_freq 0; else cnt_freq cnt_freq 1; //0.5s计数器 always (posedge clk or negedge rst_n) if(rst_n 0) cnt 0; else if(cnt_data 24b0) if (cnt DELAY ) cnt 0; else cnt cnt 1; //循环播放模块 always (posedge clk or negedge rst_n) if(rst_n 0) cnt_num 1; else if (cnt DELAY) cnt_num (cnt_num 32d48) ? 32d1 : cnt_num 32d1; always (posedge clk or negedge rst_n) if(rst_n 0) cnt_max DO; else case (cnt_num) 1 : cnt_max MI ; 2 : cnt_max DO ; 3 : cnt_max MI ; 4 : cnt_max DO ; 5 : cnt_max SO ; 6 : cnt_max MI ; 7 : cnt_max SO ; 8 : cnt_max MI ; 9 : cnt_max LA ; 10 : cnt_max SO ; 11 : cnt_max MI ; 12 : cnt_max DO ; 13 : cnt_max MI ; 14 : cnt_max DO ; 15 : cnt_max MI ; 16 : cnt_max DO ; 17 : cnt_max SO ; 18 : cnt_max MI ; 19 : cnt_max SO ; 20 : cnt_max MI ; 21 : cnt_max LA ; 22 : cnt_max SO ; 23 : cnt_max MI ; 24 : cnt_max DO ; 25 : cnt_max MI ; 26 : cnt_max SO ; 27 : cnt_max LA ; 28 : cnt_max SO ; 29 : cnt_max MI ; 30 : cnt_max DO ; 31 : cnt_max RE ; 32 : cnt_max MI ; 33 : cnt_max SO ; 34 : cnt_max LA ; 35 : cnt_max SO ; 36 : cnt_max MI ; 37 : cnt_max RE ; 38 : cnt_max MI ; 39 : cnt_max SO ; 40 : cnt_max MI ; 41 : cnt_max DO ; 42 : cnt_max RE ; 43 : cnt_max MI ; 44 : cnt_max SO ; 45 : cnt_max LA ; 46 : cnt_max SO ; 47 : cnt_max MI ; 48 : cnt_max DO ; default: cnt_max DO; endcase assign buzzer (cnt_freq cnt_max1) ? 0 : 1 ; endmoduletop模块博主在进行上板验证的时候发现数据字节数上传老是有问题画了时序图之后才发现是握手信号相关时序的问题这应该也是大多数fpga新手容易遇到的问题对于时序相关的问题还是需要多画时序图和看仿真module top( input wire clk , input wire rst_n , input wire uart_rxd_r , output wire [5:0] sel , output wire [7:0] seg , output wire buzzer ); wire [7:0] data ; wire rx_doen ; reg rx_doen_reg ; wire [23:0] cnt_data ; reg [23:0] data_rx_in ;//24位 reg start ;//倒计时启动信号 reg [1:0] cnt_done ; wire over ; //对握手信号进行寄存,这里只是为了满足时序要求一级寄存就够了 always (posedge clk or negedge rst_n) if(rst_n 0) rx_doen_reg 0; else rx_doen_reg rx_doen; //数据传输 always (posedge clk or negedge rst_n) if(rst_n 0)begin data_rx_in {4h2,4h3,4h5,4h9,4h5,4h9} ;//复位给到最大计数值 start 0 ; cnt_done 0 ; end else if(rx_doen_reg) if(cnt_done 2)begin data_rx_in {data_rx_in[15:0],data}; start 1 ; end else begin data_rx_in {data_rx_in[15:0],data};//将rx给到的数据放到低八位最后给进来的就是秒的设置 cnt_done cnt_done 1; end beep beep_inst( .clk (clk ), .rst_n (rst_n ), .cnt_data (cnt_data ), .buzzer (buzzer ) ); cnt cnt_inst( .clk (clk ), .rst_n (rst_n ), .data_rx_in (data_rx_in ), .start (start ), .cnt_data (cnt_data ) ); smg smg_inst( .clk (clk ), .rst_n (rst_n ), .num (cnt_data ), .sel (sel ), .seg (seg ) ); rx rx_inst( .clk (clk ), .rst_n (rst_n ), .uart_rxd_r (uart_rxd_r ), .data (data ), .rx_doen (rx_doen ) ); endmodule2.3 仿真波形rx 模块数据正确输入但是握手信号会提前 data。倒计时模块。三、核心理论基础本项目的实现依赖于以下四项核心硬件与通信技术。理解这些原理是设计和调试类似嵌入式系统的基础。3.1 UART 异步串行通信UARTUniversal Asynchronous Receiver/Transmitter是一种广泛使用的异步串行通信协议。其核心特点如下异步通信通信双方没有统一的时钟信号依靠预先约定好的波特率Baud Rate来同步数据位。本项目中使用的是常见的9600 bps。帧格式一帧数据通常由1 个起始位低电平、5-9 个数据位、可选的奇偶校验位和1-2 个停止位高电平组成。本项目采用1 起始位、8 数据位、无校验、1 停止位8N1的格式。采样策略接收端RX在检测到起始位下降沿后会在每个比特位的中间点进行采样以提高抗干扰能力。代码中的baud_cnt delay/2 - 1即实现了中点采样逻辑。应用在本项目中UART RX 模块负责从上位机如 PC 串口助手接收用户设定的时间数据格式化为字节流并将其转换为 FPGA 内部可处理的并行数据。3.2 BCD 码与计时逻辑BCDBinary-Coded Decimal码是一种用二进制编码表示十进制数字的方法。在数字时钟、计时器中应用广泛。编码规则每位十进制数0-9用 4 位二进制数表示。例如十进制数59的 BCD 码为0101 1001。计时逻辑本项目中的倒计时模块采用了6 组 4 位 BCD 码来分别表示时间的十时、时、十分、分、十秒、秒。进位/借位规则秒位最低两位从00到59循环当秒从00变为59时向分位借 1分位同理向时位借 1。代码中通过判断低位是否归零如cnt_data_1 0 cnt_time TIME来触发高位的递减实现了级联的倒计时逻辑。初始化与加载模块复位或接收到新时间数据时会将 RX 模块传来的并行数据加载到各个 BCD 计数器中作为倒计时的初始值。3.3 数码管动态扫描显示数码管动态扫描是一种利用人眼视觉暂留效应分时点亮多个数码管以显示不同数字的技术能极大节省硬件 I/O 资源。硬件结构一个多位数码管由多个独立的“段”构成数字的笔画a-g 和 dp和“位”选择哪个数码管亮组成。工作原理**位选sel**在极短的时间周期内如本项目中的TIMEM计数器控制依次选中一位数码管使其共阴极为低电平或共阳极为高电平。**段选seg**在选中某一位的期间根据该位需要显示的数字输出对应的段码a-g 的电平组合。快速循环以高于人眼识别频率的速度通常 60Hz循环执行上述步骤由于视觉暂留人眼看到的是所有位数码管同时稳定显示。应用本项目的smg模块通过一个计数器cnt_time循环产生位选信号sel并根据当前选中的位从num即倒计时数据中取出对应的 BCD 码查表转换为段码seg输出从而实现了六位数码管对“时:分:秒”的动态显示。3.4 蜂鸣器与 PWM 发声原理蜂鸣器分为有源内部带振荡源通电即响和无源需要外部驱动频率两种。本项目使用的是无源蜂鸣器通过产生不同频率的方波来驱动其发声。PWMPulse Width Modulation通过调节一个周期信号中高电平所占的比例占空比来等效模拟不同电压或功率。对于发声我们主要利用其频率控制特性。发声原理音高频率声音的音高由方波的频率决定。例如中音 DOC4的频率约为 262Hz对应的计数周期为系统时钟频率 / 目标频率。代码中的DO、RE、MI等参数就是根据 50MHz 系统时钟计算出的分频计数值。音长时长每个音符的持续时间由另一个计数器控制如代码中的cnt和DELAY参数。实现beep模块包含两个核心计数器音符频率计数器 (cnt_freq)以cnt_max当前音符对应的分频值为周期进行循环计数产生特定频率的方波输出给buzzer。音符时长计数器 (cnt)控制每个音符的持续时间时间到则切换cnt_num从而改变cnt_max的值切换到下一个音符的频率实现旋律播放。旋律存储通过一个大的case语句或可扩展为 ROM将预先编好的乐谱音符序列映射为对应的频率计数值 (cnt_max)。总结UART负责数据输入BCD 计时器负责核心逻辑动态扫描负责视觉输出PWM驱动蜂鸣器负责听觉反馈。这四大技术有机结合构成了一个完整的、交互式的倒计时提醒系统。四、上板演示下载程序后先复位一下然后在上位机输入想设置的时间等RX模块将数据通过顶层连接到倒计时模块开始倒计时可以看到数码管开始显示倒计时正常运行当倒计时记到00.00.00时开始播放音乐此时摁下复位即可关闭

相关新闻

国内下载 HuggingFace 模型太慢?自适应并发 + 动态连接管理,让 1000Mbps 带宽跑满 500Mbps

国内下载 HuggingFace 模型太慢?自适应并发 + 动态连接管理,让 1000Mbps 带宽跑满 500Mbps

# 国内下载 HuggingFace 模型太慢?这个工具让 1000Mbps 带宽跑满 500Mbps> CDN 波动时普通工具降速干等,它能自动新建连接把速度拉满。## 问题:为什么你的模型下载总是慢?如果你在国内下载过 HuggingFace 上的 AI 模型&#xf…

2026/8/19 16:22:26 阅读更多 →
医学影像常见术语与应用场景

医学影像常见术语与应用场景

医学影像常见术语与应用场景 全文链接:医学影像常见术语与应用场景 按 RadiAnt DICOM Viewer 中文首页 栏目与用语整理 阅片 / PACS 词汇表,并做归纳延伸。面向工程师与科研入门,把官网功能名翻译成「是什么、典型场景」。非 RadiAnt 官方文档…

2026/8/17 10:25:30 阅读更多 →
Keil MDK 安装配置全攻略:从零搭建 ARM Cortex-M 开发环境

Keil MDK 安装配置全攻略:从零搭建 ARM Cortex-M 开发环境

这次我们来看 Keil MDK 的安装与配置。对于嵌入式开发,尤其是 ARM Cortex-M 系列单片机开发,Keil MDK(Microcontroller Development Kit)是绕不开的工具。它集成了编译器、调试器和项目管理器,但安装过程常因版本选择、…

2026/8/18 10:15:03 阅读更多 →

最新新闻

用 OpenLRC 把音频变成多语言 LRC 字幕:从安装到出活完整走一遍

用 OpenLRC 把音频变成多语言 LRC 字幕:从安装到出活完整走一遍

用 OpenLRC 把音频变成多语言 LRC 字幕:从安装到出活完整走一遍 【免费下载链接】openlrc Transcribe and translate voice into LRC file using Whisper and LLMs (GPT, Claude, et,al). 使用whisper和LLM(GPT,Claude等)来转录、翻译你的音频为字幕文件…

2026/8/22 13:59:40 阅读更多 →
最新26年OSM中国水系数据集(附获取方式)

最新26年OSM中国水系数据集(附获取方式)

随着2025年我国完成水利建设投资1.28万亿元,国家水网建设全面提速,27项重大水利工程开工建设,水系空间数据在智慧水利、防洪减灾、水资源管理等领域的应用价值日益凸显。精准的水系矢量数据已成为支撑流域划分、洪水风险评估、城市蓝线规划等…

2026/8/22 13:59:40 阅读更多 →
最新! 26年路网数据(附获取链接)

最新! 26年路网数据(附获取链接)

大家好呀!今天给大家分享一个好数据,在“十四五”综合交通运输体系发展规划持续推进与国家新型城镇化战略深化背景下,高现势性、多尺度路网数据成为支撑交通碳排放核算、城乡融合评估及应急物流网络构建的关键基础。2026年初更新的OpenStreet…

2026/8/22 13:59:40 阅读更多 →
G-Helper:免费开源的华硕笔记本轻量性能控制工具,它能替你解决什么?

G-Helper:免费开源的华硕笔记本轻量性能控制工具,它能替你解决什么?

G-Helper:免费开源的华硕笔记本轻量性能控制工具,它能替你解决什么? 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, …

2026/8/22 13:59:40 阅读更多 →
从按下 RUN 到 main():CEdev CRT 启动流程与初始化机制源码级剖析

从按下 RUN 到 main():CEdev CRT 启动流程与初始化机制源码级剖析

从按下 RUN 到 main():CEdev CRT 启动流程与初始化机制源码级剖析 【免费下载链接】toolchain Toolchain and libraries for C/C programming on the TI-84 CE calculator series 项目地址: https://gitcode.com/gh_mirrors/too/toolchain 在 TI-84 CE 计算器…

2026/8/22 13:59:39 阅读更多 →
FreeCol独立战争指南:如何击败皇家远征军赢得最终胜利?

FreeCol独立战争指南:如何击败皇家远征军赢得最终胜利?

FreeCol独立战争指南:如何击败皇家远征军赢得最终胜利? 【免费下载链接】freecol FreeCol: FreeCol is a turn-based strategy game based on the old game Colonization, and similar to Civilization. The objective of the game is to create an inde…

2026/8/22 13:58:39 阅读更多 →

日新闻

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

2026/8/22 0:00:11 阅读更多 →
电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

这次我们来看一个针对电气考研电路科目的学习规划项目。它不是软件工具,而是一套聚焦于8月份关键节点的备考策略。对于电气工程考研的同学来说,电路分析是专业课的重中之重,也是拉开分差的关键。进入8月,复习进入强化阶段&#xf…

2026/8/22 0:00:11 阅读更多 →
消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

大家好,我是专注于前端开发与AI工具实践的技术博主。在日常使用 Claude Code 等AI编程助手时,你是否也遇到过这样的困扰:生成的代码功能上没问题,但代码风格、组件设计、交互逻辑总透着一股“AI味”——布局单调、样式简陋、交互生…

2026/8/22 0:00:11 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/22 8:09:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/21 16:42:28 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →