FPGA番茄时钟:从串口指令到倒计时提醒的硬件实现

发布时间:2026/8/16 2:24:21

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

2026/8/16 2:24:21

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

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

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

2026/8/16 2:24:21

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

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

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

2026/8/16 2:24:21

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

Ansys Maxwell自定义材料库创建与管理全攻略:从B-H曲线到团队协作

Ansys Maxwell自定义材料库创建与管理全攻略:从B-H曲线到团队协作

2026/8/16 3:44:24

1. 项目概述:为什么需要自定义材料库?做电磁仿真,尤其是电机、变压器、无线充电这些领域,材料属性是仿真的基石。Ansys Maxwell作为行业标杆工具,自带的材料库虽然丰富,但总有不够用的时候。比如&#xff0…

51单片机流水灯实验

51单片机流水灯实验

2026/8/16 3:44:24

Keil-c51兼容性问题/vscoddeEIDE代替方案 1.EIDE插件:编写C语言,编译输出.hex单片机程序文件 2.CH340串口驱动:电脑和单片机USB通信必须的驱动程序 3.烧录:把hex文件烧写到单片机芯片 工作流程 1.VScode编写C语言代码 2.EIDE编译器…

Qwen3.8-27B 本地部署踩坑实录:5 个坑,16G 显存用户先别急

Qwen3.8-27B 本地部署踩坑实录:5 个坑,16G 显存用户先别急

2026/8/16 3:44:24

8 月 14 日深夜,阿里开源了 Qwen3.8-27B,宣传语写着「量化后 17GB 显存就能跑,家用显卡即可运行」。我盯着自己那张 16G 显存的卡,觉得终于等到本地部署自由了。结果当晚下载、加载、跑通,一共踩了 5 个坑,…

自律背后的双表结构:ArkTS 为鸿蒙打卡日历设计日期字段

自律背后的双表结构:ArkTS 为鸿蒙打卡日历设计日期字段

2026/8/16 3:44:24

实例:习惯打卡日历(Habit Check-in)|技术:日期范围查询、连续天数统计、双表设计一、业务需求分析:打卡应用的五个核心诉求 打卡类应用(习惯养成、健身记录、学习打卡)在市场上经久不…

完全不会写开题报告,有哪些专业的AI写作辅助软件推荐?

完全不会写开题报告,有哪些专业的AI写作辅助软件推荐?

2026/8/16 3:44:24

毕业季一到,开题报告就成了不少同学的“第一道坎”:选题定不下来、研究背景和意义分不清、文献综述写不出头绪、研究方法和技术路线逻辑混乱,对着空白文档干瞪眼,硬是熬出几周也理不出框架。尤其是零基础、在职读研、跨专业的学生…

Obsidian插件打造个人工作台:从笔记软件到生产力中心的进阶指南

Obsidian插件打造个人工作台:从笔记软件到生产力中心的进阶指南

2026/8/16 3:34:23

这次我们来看一个能让 Obsidian 从笔记软件变身“工作台”的插件。对于深度使用 Obsidian 的用户来说,核心痛点往往不是记笔记,而是如何将笔记与日常工作任务、项目管理、代码片段、临时灵感高效串联,形成一个无需频繁切换窗口的沉浸式工作环…

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

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

2026/8/16 0:04:13

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

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/16 0:04:13

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

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/16 0:04:13

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

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

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

2026/8/16 0:04:13

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

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/16 0:04:13

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

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/16 0:04:13

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

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/15 1:04:46

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/15 10:10:27

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/14 19:35:14

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…