当前位置: 首页 > news >正文

【FPGA实验1】FPGA点灯工程师养成记

对于FPGA几个与LED相关的实验(包括按键点灯、流水灯、呼吸灯等)的记录,方便日后查看。这世界上就又多了一个FPGA点灯工程师了😏

成为一个FPGA点灯工程师分三步:

        • 一、按键点灯
          • 1、按键点灯程序
          • 2、硬件实现
        • 二、流水灯
          • 1、流水灯程序
          • 2、仿真
          • 3、硬件实现
        • 三、呼吸灯
          • 1、先“吸”
          • 2、再“呼吸”
          • 3、最后大口地呼吸

一、按键点灯

按键点灯程序比较简单,就不搞仿真了,直接上机

1、按键点灯程序
module led(input wire key_1,output reg led_1);always@*led_1=!key_1;endmodule

由程序得到的RTL图:

请添加图片描述

2、硬件实现

(1)引脚分配与接线
引脚分配如下,记得引脚分配后再编译一次,不然可能没有现象。

请添加图片描述

上述引脚分配对应的接线:JX22连接到JP5,JX5连接到JP1。
为什么要这样接线可以参考《【FPGA实验2】二进制转为格雷码》中的【三、实验箱实验】➡️【3、引脚分配】。

在这里插入图片描述

(2)实验现象

具体的实验现象可观看下方的视频😏

二、流水灯

学了点状态机的内容,决定用状态机来写一下这个流水灯的代码。
感谢正点原子的视频,用了一个很好理解的例子讲了状态机是怎么样的一个东西,并总结了写状态机主要有四个步骤(也称四段论):
(1)状态空间定义(定义各个状态)
(2)状态跳转(告诉FPGA:你要跳转。让FPGA知道在什么条件下,你要从现在状态跳转到下一个状态)
(3)下个状态的判断(告诉FPGA:你要怎么跳。给FPGA一个地图,判断现在的情况是什么,然后根据地图确定下一个要跳转的状态)
(4)各个状态下的动作(我理解为状态对应信息的输出)

1、流水灯程序
module WaterLED(input wire clk,input wire rst_n,output wire [7:0]led_data);//空间状态定义parameter S1=8'b10000000;parameter S2=8'b01000000;parameter S3=8'b00100000;parameter S4=8'b00010000;parameter S5=8'b00001000;parameter S6=8'b00000100;parameter S7=8'b00000010;parameter S8=8'b00000001;reg [7:0]current_state;reg[7:0]next_state;//状态跳转always @(posedge clk or negedge rst_n) beginif(! rst_n)   current_state<=S1;  //复位,从状态S1开始else current_state<=next_state; //不是复位的情况下,到达时钟的上升沿就转到下一个状态end//状态判断always @(current_state) begincase(current_state) S1:next_state=S2;S2:next_state=S3;S3:next_state=S4;S4:next_state=S5;S5:next_state=S6;S6:next_state=S7;S7:next_state=S8;default:next_state=S1;endcaseend//各个状态下的动作assign led_data=current_state;endmodule

得到的RTL图如下:
在这里插入图片描述

2、仿真

流水灯的仿真程序如下:

`timescale 1ns/100ps
module tb_WaterLED;reg clk_1;reg rst_n_1;wire [7:0] led_data_1;parameter PERIOD=10;always #(PERIOD/2) clk_1=~clk_1;initial beginclk_1=0;#200  $stop;endtask task_rst;begin rst_n_1=0;repeat(2) @(negedge clk_1);//两个时钟负跳变之后rst_n_1=1;endendtaskWaterLED WD_1(.clk(clk_1),.rst_n(rst_n_1),.led_data(led_data_1));initial begintask_rst;$display("task_rst ok!!!");endendmodule

【如何将仿真程序加入到工程中以及如何仿真可以看上一篇《【FPGA实验0】Quartus建立工程文件以及仿真》)】

仿真结果如下:
在两个时钟下降沿之后,复位线RST置高;之后随着每一个时钟上升沿的到来,开始状态的转换。

在这里插入图片描述

3、硬件实现

在实际的硬件实现中,需要注意两个点:

(1)时钟信号
在仿真中,两个状态之间的切换是在时钟信号的上升沿,因而,每个状态保持的时间是一个时钟信号周期(在上的仿真中,一个时钟信号的周期是10ns)。而如果在实际中要实现流水灯的效果,这样的间隔太小了,由于眼睛的暂存作用,我们看懂的现象是8个LED灯一直在同时亮着,没有流水灯的效果,因而我们必须将时钟周期改得大一点。
请添加图片描述

选择实验箱最大时钟12MHz(接线的话将左侧12M对应的时钟和右侧的任意一个引脚接起来即可),定义一个计数器,计数2400000个时钟周期,一个时钟频率为12MHz,一个时钟周期为83.33ns,2400000个时钟周期就是0.2秒。

	reg [23:0] counter;	//计数器对系统时钟计数,计时0.2秒always @(posedge clk or negedge rst_n) beginif (!rst_n)counter <= 24'd0;else if (counter < 24'd2400_000)  //仿真的时候可以改为 24'd0000_0010,下同counter <= counter + 1'b1;elsecounter <= 24'd0;end

同时,状态跳变部分增加一个条件,修改为:

//状态跳转
always @(posedge clk or negedge rst_n) beginif(! rst_n)   current_state<=S1;  //复位,从状态S1开始else if (counter==24'd2400_000) current_state<=next_state; //不是复位的情况下,到达时钟的上升沿就转到下一个状态else   ;
end

(2)复位键如何使用

复位键一开始需要置1(打到开的位置);
之后置0(下降沿产生出发条件;同时!rst=0,状态为初始状态S1);
完成复位后置1(使此刻的状态在触发之后能跳转到下一个状态)。

整个硬件实现的程序:

module WaterLED(input wire clk,input wire rst_n,output wire [7:0]led_data);//空间状态定义parameter S1=8'b10000000;parameter S2=8'b01000000;parameter S3=8'b00100000;parameter S4=8'b00010000;parameter S5=8'b00001000;parameter S6=8'b00000100;parameter S7=8'b00000010;parameter S8=8'b00000001;reg [7:0]current_state;reg[7:0]next_state;reg [23:0] counter;//计数器对系统时钟计数,计时0.2秒always @(posedge clk or negedge rst_n) beginif (!rst_n)counter <= 24'd0;else if (counter < 24'd2400_000)  //仿真的时候可以改为 24'd0000_0010,下同counter <= counter + 1'b1;elsecounter <= 24'd0;end//状态跳转always @(posedge clk or negedge rst_n) beginif(! rst_n)   current_state<=S1;  //复位,从状态S1开始else if (counter==24'd2400_000) current_state<=next_state; //不是复位的情况下,到达时钟的上升沿就转到下一个状态else   ;end//状态判断always @(current_state) begincase(current_state) S1:next_state=S2;S2:next_state=S3;S3:next_state=S4;S4:next_state=S5;S5:next_state=S6;S6:next_state=S7;S7:next_state=S8;default:next_state=S1;endcaseend//各个状态下的动作assign led_data=~current_state;//灯为0时亮起,为1时变暗endmodule

对应的RTL图:
请添加图片描述

引脚分配与接线:
请添加图片描述

按之前的接线即可,key8为复位键。

上述引脚分配对应的接线:JX22连接到JP5,JX5连接到JP1。
为什么要这样接线可以参考《【FPGA实验2】二进制转为格雷码》中的【三、实验箱实验】➡️【3、引脚分配】。

时钟引脚:左侧的12M时钟引脚接到右侧任意一个引脚即可。总的接线图如下:

在这里插入图片描述

具体现象可以看文末的视频😏

三、呼吸灯

呼吸灯,就是灯的亮度由暗变亮再由亮变暗,像人的呼吸一样。

1、先“吸”

(1)代码

module PWM(           input wire clk,output wire[9:0] pwma,output wire pwmb);reg [3:0]counter1=0,counter2=0;reg [9:0]pwm_1=10'b0000_0000_00;reg[0:0] pwm_2;always@(posedge clk) beginif(counter2==4'd9)  beginif(counter1==4'd9)  begincounter1=0;pwm_1=10'b0000_0000_00;					endelse  counter1=counter1+1;							pwm_1[counter1]=1;counter2=0;endelse counter2=counter2+1;pwm_2=pwm_1[counter2];endassign pwma=pwm_1;assign pwmb=pwm_2;endmodule

(2)仿真文件:

`timescale 1ns/100ps
module tb_PWM;reg clk;wire [9:0]pwma;wire [0:0]pwmb;parameter PERIOD=10;always #(PERIOD/2) clk=~clk;initial beginclk=0;# 3000 $stop;endPWM PWM_1(.clk(clk),.pwma(pwma), .pwmb(pwmb));endmodule

(3)仿真结果:
在这里插入图片描述

2、再“呼吸”

(1)代码

module PWM(input wire clk,output wire[9:0] pwma,output wire pwmb);reg [4:0]counter1=0;reg [3:0]counter2=0;reg [9:0]pwm_1=10'b0000_0000_00;reg[0:0] pwm_2;always@(posedge clk) beginif(counter2==4'd9)  beginif(counter1==5'd17)   counter1=0;else  counter1=counter1+1;	$display("counter1:   ",counter1);case(counter1)5'd0  : pwm_1=10'b0000_0000_01;5'd1  : pwm_1=10'b0000_0000_11;5'd2  : pwm_1=10'b0000_0001_11;5'd3  : pwm_1=10'b0000_0011_11;5'd4  : pwm_1=10'b0000_0111_11;5'd5  : pwm_1=10'b0000_1111_11;5'd6  : pwm_1=10'b0001_1111_11;5'd7  : pwm_1=10'b0011_1111_11;5'd8  : pwm_1=10'b0111_1111_11;5'd9  : pwm_1=10'b1111_1111_11;5'd10  : pwm_1=10'b0111_1111_11;5'd11  : pwm_1=10'b0011_1111_11;5'd12  : pwm_1=10'b0001_1111_11;5'd13  : pwm_1=10'b0000_1111_11;5'd14  : pwm_1=10'b0000_0111_11;5'd15  : pwm_1=10'b0000_0011_11;5'd16  : pwm_1=10'b0000_0001_11;5'd17  : pwm_1=10'b0000_0000_11;endcase$display("pwm_1:  ",pwm_1);counter2=0;endelse counter2=counter2+1;pwm_2=pwm_1[counter2];endassign pwma=pwm_1;assign pwmb=pwm_2;endmodule

(2)tb文件:

`timescale 1ns/100ps
module tb_PWM;reg clk;wire [9:0]pwma;wire [0:0]pwmb;parameter PERIOD=10;always #(PERIOD/2) clk=~clk;initial beginclk=0;# 3000 $stop;endPWM PWM_1(.clk(clk),.pwma(pwma), .pwmb(pwmb));endmodule

(3)仿真结果:

在这里插入图片描述

3、最后大口地呼吸

呼吸灯的硬件实现,和流水灯的硬件实现一样原理,如果每个亮度的时间跟仿真的时候一样的话,那我们是看不出亮度变化,所以在硬件实现的时候需要在每一个亮度延长一定的时间。具体的实现如下:

(1)代码:

module PWM(input wire clk,output wire led0,output wire led1,output wire led2,output wire led3,output wire led4,output wire led5,output wire led6,output wire led7);reg [4:0]counter1=0;reg [3:0]counter2=0;reg [9:0]pwm_1=10'b0000_0000_00;reg[0:0] pwm_2;reg [20:0] cnt_base;parameter T_6ms = 21'd2000_000;always @(posedge clk ) beginif(cnt_base < T_6ms - 1'b1)begincnt_base <= cnt_base + 1'b1;pwm_2<=pwm_1[cnt_base%10];endelse begincnt_base <= 21'd0;if(counter1==5'd17)   counter1=0;else  counter1=counter1+1;	case(counter1)5'd0  : pwm_1=10'b0000_0000_01;5'd1  : pwm_1=10'b0000_0000_11;5'd2  : pwm_1=10'b0000_0001_11;5'd3  : pwm_1=10'b0000_0011_11;5'd4  : pwm_1=10'b0000_0111_11;5'd5  : pwm_1=10'b0000_1111_11;5'd6  : pwm_1=10'b0001_1111_11;5'd7  : pwm_1=10'b0011_1111_11;5'd8  : pwm_1=10'b0111_1111_11;5'd9  : pwm_1=10'b1111_1111_11;5'd10  : pwm_1=10'b0111_1111_11;5'd11  : pwm_1=10'b0011_1111_11;5'd12  : pwm_1=10'b0001_1111_11;5'd13  : pwm_1=10'b0000_1111_11;5'd14  : pwm_1=10'b0000_0111_11;5'd15  : pwm_1=10'b0000_0011_11;5'd16  : pwm_1=10'b0000_0001_11;5'd17  : pwm_1=10'b0000_0000_11;endcaseendendassign led0=pwm_2;assign led1=pwm_2;assign led2=pwm_2;assign led3=pwm_2;assign led4=pwm_2;assign led5=pwm_2;assign led6=pwm_2;assign led7=pwm_2;endmodule

(2)对应的RTL图:
请添加图片描述
(3)引脚分配与接线
请添加图片描述
接线同上流水灯的接线。

(4)实验现象:
具体实验现象可以看文末😏

FPGA点灯工程师养成记

Forever young,always tearful. 😏

相关文章:

【FPGA实验1】FPGA点灯工程师养成记

对于FPGA几个与LED相关的实验&#xff08;包括按键点灯、流水灯、呼吸灯等&#xff09;的记录&#xff0c;方便日后查看。这世界上就又多了一个FPGA点灯工程师了&#x1f60f; 成为一个FPGA点灯工程师分三步&#xff1a;一、按键点灯1、按键点灯程序2、硬件实现二、流水灯1、流…...

操作系统论文导读(三):Stack-based scheduling of realtime processes基于堆栈的实时进程调度

目录 一、论文核心思想&#xff1a; 二、基本的相关条件 作业运行的条件&#xff1a; 作业抢占其他作业的条件&#xff1a; 三、基本的相关定义 四、基本的相关调度 五、基本的相关调度 六、堆栈资源共享 七、与PCP的比较 一、论文核心思想&#xff1a; -引入了一个抢占优…...

音频延时测试方法与实现

音频延时测试方法有以下几种 1、使用专业的测试设备&#xff0c;通过专业的音频测试仪器可以准确测量音频延时&#xff0c;如常见声学分析仪、信号发生器、声卡Smaart&#xff08;介绍测试延时方法链接&#xff1a;https://blog.csdn.net/weixin_48408892/article/details/1273…...

在 Python 中管理机密的四种方法

我们生活在一个应用程序用于做任何事情的世界&#xff0c;无论是股票交易还是预订沙龙&#xff0c;但在幕后&#xff0c;连接是使用秘密完成的。必须适当管理机密&#xff0c;例如数据库密码、API 密钥、令牌等&#xff0c;以避免任何泄露。 管理机密的需求对任何组织都至关重…...

全国青少年信息素养大赛Python编程挑战赛初赛试题说明

Python 编程挑战赛初赛采用线上考试比赛形式,分为小学组和初中组。不同组别的考核重难点略有不同,考核内容主要是 Python 基础知识,共 30 题,均为单选题,具体考核如下: 小学组考核内容主要是 Python 基础知识,包括输入输出,变量,条件结构,计次循环和无限循环,海龟库…...

无需魔法打开即用的 AI 工具集锦

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;蚂蚁集团高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐…...

如何进行SEO站内优化,让你的网站更易被搜索引擎收录

我们了解了 SEO 的流程&#xff0c;知道了哪些元素对 SEO 的效果会产生关键影响&#xff0c;接下来&#xff0c;我们就该正式开始动手&#xff0c;打造一个让搜索引擎“爱不释手”的网站。 为了方便理解与记忆&#xff0c;我们将网站划分为几个模块&#xff0c;告诉你优化网站…...

组件内部watch后切换数据报错Error in callback for watcher “xxxx“

报错信息&#xff1a; 报错代码&#xff1a; 百度了一下是因为这里写了箭头函数&#xff0c;导致this指向为父级作用域上下文&#xff0c;不是vue实例导致 修改为&#xff1a; progressData: {handler: function(newValue, oldValue) {this.setChartData(newValue)},deep: …...

VMware ESXi 7.0 U3l macOS Unlocker OEM BIOS (标准版和厂商定制版)

VMware ESXi 7.0 U3l macOS Unlocker & OEM BIOS (标准版和厂商定制版) 提供标准版和 Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科) 定制版镜像 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3-oem/&#xff0c;查看最新版…...

华为阿里版ChatGPT横空出世,谁的成效更好呢?

“你训练的大模型涌现了吗&#xff1f;”“还没有。好难受。”一时间成为了最近AI赛道玩家的一个爆热梗。 不管承不承认&#xff0c;相信每个玩家都不愿意输掉这场激烈的竞争。自百度成为国内“第一个吃螃蟹的人”后&#xff0c;又有两大中国科技巨头做好了准备——华为和阿里…...

【云原生之Docker实战】使用docker部署kooteam在线团队协作工具

【云原生之Docker实战】使用docker部署kooteam在线团队协作工具 一、kooteam介绍1.kooteam介绍2.kooteam的技术选型二、检查本地docker环境1.检查Docker版本2.检查Docker状态三、下载kooteam镜像四、部署kooteam文档管理系统1.创建安装目录2.创建mysql数据库3.新建kooteam数据库…...

ITSS认证是什么认证,itss资质认证

一、ITSS是什么 ITSS根据英文翻译信息技术服务标准&#xff08;InformationTechnologyServiceStandards&#xff0c;简称ITSS&#xff09;&#xff0c;它既是一套成体系和综合配套的标准库&#xff0c;又是一套选择和提供IT服务的方法学&#xff0c;对企业IT服务而言&#xff0…...

FTP-----局域网内部远程桌面

此文包含详细的图文教程。有疑问评论区留言。博主第一时间解决。 目录 一、被远程桌面的电脑 1.开启远程权限 2.添加账户&#xff0c;有本地账户跳过这步 3.帐号隶属于 远程桌面 4.帐号隶属于 本地用户组 二、本地电脑连接远程桌面 前提条件&#xff1a; 1.两台电脑在…...

Learning C++ No.18【STL No.8】

引言&#xff1a; 北京时间&#xff1a;2023/3/18/21:47&#xff0c;周末&#xff0c;不摆烂&#xff0c;但是欠钱终于还是遭报应了&#xff0c;导致坐牢7小时&#xff08;上午3.5&#xff0c;下午3.5&#xff09;&#xff0c;难受&#xff0c;充分意识到行哥是那么的和蔼可亲…...

pytorch搭建ResNet50实现鸟类识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 &#x1f366; 参考文章地址&#xff1a; 365天深度学习训练营-第J1周&#xff1a;ResNet-50算法实战与解析 &#x1f356; 作者&#xff1a;K同学啊 理论知识储备 深度残差网络ResNet&#xff08;dee…...

Node.js -- npm与包

1.包 Node.js中的第三方模块又叫做包 就像电脑和计算机指的是相同的东西&#xff0c;第三方模块和包指的是同一概念&#xff0c;只不过叫法不同。 包的来源&#xff1a; 包是由第三方或者个人团队开发出来的&#xff0c;免费供个人使用。 国外有一家IT 公司&#xff0c;叫做n…...

二 、Locust自定义用户(场景)

二 、自定义用户&#xff08;场景&#xff09; 一个用户类代表了你系统中的一种用户/场景。当你做一个测试运行时&#xff0c;你指定你想模拟的并发用户的数量&#xff0c;Locust将为每个用户创建一个实例。你可以给这些类/实例添加任何你喜欢的属性&#xff0c;但有一些属性对…...

1~3年的测试工程师薪资陷入了瓶颈期,如何突破自己实现涨薪?

对于技术人员而言&#xff0c;职业规划一般分为两个方向&#xff1a;做技术、做管理。进入软件测试行业的新人都会从最基础的执行开始&#xff0c;然后是基本的功能测试。 随后大家会根据个人职业发展来进一步细化&#xff0c;有的走管理路线&#xff0c;成为主管、经理、项目…...

springboot项目前端ajax 07进阶优化,使用jQuery的ajax

使用官网https://jquery.com/ 在下载那里&#xff0c;选择Download the compressed, production jQuery 3.6.4&#xff08;版本不一样&#xff09;&#xff0c;而后在打开的网页中&#xff0c;选择另存为&#xff0c;就下载好了js文件。 > function doAjax(){ …...

东数西存场景的探索与实践

“东数西算”是通过构建数据中心、云计算、大数据一体化的新型算力网络体系&#xff0c;将东部算力需求有序引导到西部&#xff0c;对优化数据中心建设布局&#xff0c;提升国家整体算力水平&#xff0c;促进绿色发展&#xff0c;扩大有效投资&#xff0c;具有重要意义。 在实…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...