电子森林STEP-MXO2_1 入门部分全部实验

news2024/12/25 9:27:47

前言

本部分实验基于电子森林小脚丫开发板的数电入门教程实验。实验链接:step-mxo2入门教程 电子森林] (eetree.cn)

其中代码是博主学习后根据自己思路自己敲的,并非直接复制,且仅供学习交流使用,侵删。

lattice 环境配置在此不再赘述~

按键LED

module LED (key,sw,led);
	input [3:0] key;
	input [3:0] sw;
	output [7:0] led;
	
	assign led={key, sw};
	
endmodule

1688844371133

三色LED

开发板上的一个三色LED灯,通过赋3位值来决定亮哪个颜色。用三个按键控制 easy

module LED (key,led);
	input [2:0] key;
	output [2:0] led;
	
	assign led={key};
	
endmodule

image-20230709033048500

3-8译码器

三个按键输出8个状态。主要是练习 always case 的使用。

module LED (key,led);
	input [2:0] key;
	output [7:0] led;
	reg [7:0] led;
	always @(key)
	begin
		case(key)
			3'b000:led=8'b11111110;
			3'b001:led=8'b11111101;
			3'b010:led=8'b11111011;
			3'b011:led=8'b11110111;
			3'b100:led=8'b11101111;
			3'b101:led=8'b11011111;
			3'b110:led=8'b10111111;
			3'b111:led=8'b01111111;
			default:;		
		endcase
	end
			
	
endmodule

数码管显示

两个数码管,每个需要9位输入,其中4位是数据输入,可以输入10种状态对应0-9.

我们通过按键和拨码开关传入数据。led 设置我想就记住就行先。

module SEG_LED (key,sw,seg_led_1,seg_led_2);
	input [3:0] key;
	input  [3:0] sw;
	output [8:0] seg_led_1;
	output [8:0] seg_led_2;
	
	reg [8:0] seg [9:0];
	
	initial
	begin
		seg[0]=9'h3f;
		seg[1]=9'h06;
		seg[2]=9'h5b;
		seg[3]=9'h4f;
		seg[4]=9'h66;
		seg[5]=9'h6d;
		seg[6]=9'h7d;
		seg[7]=9'h07;
		seg[8]=9'h7f;
		seg[9]=9'h6f;
	end
	
	assign seg_led_1=seg[key];
	assign seg_led_2=seg[sw];
			
	
endmodule

image-20230709111832655

时钟分频

算法

偶数倍频:光看上升或者下降沿个数就行,0N/2-1时翻转,N/2N-1时再翻转。

奇数倍频:形如下图。

image-20230709151349660

如图为5分频,输入5个周期输出1个周期。所以每2.5个周期一翻转,比如从上升沿开始,再经过两个上升沿,后一个下降沿后翻转。

这样就没法只通过上升或者下降沿去判断了,因为结尾是半个上升/下降沿。不过通过纯上升,下降沿的波形(上升沿比下降沿多一个周期)我们可以发现,两者and操作得到的就是我们想要的结果。

实现

module div(clk_in, rst_n ,clk_out);
	input clk_in,rst_n;
	output clk_out;
	
	parameter WIDTH=3;
	parameter N=5;
	
	reg [WIDTH-1:0] cnt_p, cnt_n;
	reg clk_p, clk_n;
	
	always @ (posedge clk_in or negedge rst_n)
		begin
			if(!rst_n)cnt_p<=0;
			else if(cnt_p==(N-1))
				cnt_p<=0;
			else 
				cnt_p<=cnt_p+1;
		end

	always @ (negedge clk_in or negedge rst_n)
		begin
			if(!rst_n)cnt_n<=0;
			else if(cnt_n==(N-1))
				cnt_n<=0;
			else 
				cnt_n<=cnt_n+1;
		end
		
	always @ (posedge clk_in or negedge rst_n)
		begin
			if(!rst_n)clk_p<=0;
			else if(cnt_p<(N>>1))
				clk_p<=0;
			else 
				clk_p<=1;
		end
		
	always @ (negedge clk_in or negedge rst_n)
		begin
			if(!rst_n)clk_n<=0;
			else if(cnt_n<(N>>1))
				clk_n<=0;
			else 
				clk_n<=1;
		end
		
	assign clk_out=(N==1)?clk_in:(N[0])?clk_p&clk_n:clk_p;
endmodule

打不开仿真显示 license 错误可能是仿真和 license 版本不对。

1688887214194

1688887262813

流水灯

采用模块的思想。我们把前面的3-8译码器(led)部分和时钟分频部分代码结合起来,然后用一个模块去用他俩,传递输入输出。

module flashled (clk,rst,led);
	input clk,rst;
	output [7:0]led;
	
	reg [2:0] cnt;
	
	wire clk1h;
	
	LED u1 (
		.key(cnt),
		.led(led)
	);
	
	div #(.WIDTH(32),.N(12000000)) u2 (         
        .clk_in(clk),
        .rst_n(rst),
        .clk_out(clk1h)
    );               
	
	always @(posedge clk1h or negedge rst)
		if(!rst)
			cnt<=0;
		else
			cnt<=cnt+1;
endmodule

还有一种简单的 led 赋值法,我们知道 led 形如 1111 1101 也就是8位不断循环来形成流水灯的效果。所以我们只需要让 led 不断循环左移或者右移就行。

led={led[0],led[7:1]};

1688891724885

按键消抖

如果只是一个简单的按下按键翻转LED灯状态,那确实很好写:

module debounce (key,rst,key_pulse);
	input key,rst;
	output key_pulse;
	
	reg key_pulse;
	
	always @(negedge rst or negedge key)
		begin
			if(!rst)
				key_pulse=1;
			else
				key_pulse=~key_pulse;
		end
	
endmodule

选用一个按键作为 rst,一个按键为 led 的输入。

但是经典问题,按下按键和松开的一瞬间按键的电平是不断抖动的并不稳定:

image-20230709165306536

这里以(下降沿触发)为例。解决方案为:检测到第一次下降沿后,先延时>10ms,再检测按键是否仍然处于低电平,如果是说明确实是被按下了,如果不是可能只是一个小抖动。

module debounce (clk,key,rst,key_pulse);
	input key;
	input rst;
	input clk;
	output key_pulse;
	
	reg key_rst_pre;
	reg key_rst;
	
	
	reg [17:0] cnt;
	
	wire key_edge;
	
	always @(posedge clk or negedge rst)
		begin
			if(!rst) begin
				key_rst_pre<=1'b1;
				key_rst<=1'b1;
			end
			else begin
				key_rst<=key;
				key_rst_pre<=key_rst;
			end
		end
		
	assign key_edge=key_rst_pre&~(key_rst);
	reg key_sec_pre,key_sec;
	
	always @(posedge clk or negedge rst)
		begin
			if(!rst)
				cnt<=18'h0;
			else if(key_edge)
				cnt<=18'b0;
			else
				cnt<=cnt+1'h1;
		end
		
	always @(posedge clk or negedge rst)
		begin
			if(!rst)
				key_sec<=1'b1;
			else if(cnt==18'h3ffff)
				key_sec<=key;
		end
		
	always @(posedge clk or negedge rst)
		begin
			if(!rst)
				key_sec_pre<=1'b1;
			else
				key_sec_pre<=key_sec;
		end
		
	assign key_pulse=key_sec_pre&~(key_sec);
	
endmodule

下降沿的时候 key_edge 置1,只有当起始状态上升沿, key_edge 下降后一定时间内没有新的下降沿(无抖动)且此时仍然为下降沿时脉冲信息才为1.

处理脉冲部分很简单,读到 pulse 如果是1就翻转 led,否则保持。

module top (clk,key,led,rst);

	input clk;
	input key;
	input rst;
	output reg led;
	
	wire key_pulse;

	debounce u1 (
		.clk(clk),
		.key(key),
		.rst(rst),
		.key_pulse(key_pulse)
	);
	
	always @ (posedge clk or negedge rst)
		begin
			if(!rst)
				led<=1'b1;
			else if(key_pulse)
				led<=~led;
			else
				led<=led;
		end

endmodule

这里写的时候有一个很有趣的bug,我把cnt计数++部分漏掉了,然后生成引脚图定义的时候 clk key rst 都是 unconnected 的引脚,查了一下说是“编译器认为你这几个输入对输出无影响 就自动忽略了”。

计时控制

需求:写一个篮球24s计时软件。要求:

  1. 上电后从24开始倒计时到0为止停止。
  2. 按下 rst 归位到24.
  3. 按下按钮后暂停当前计时,再次按下后继续计时。

主要就是写一个模块用到了时钟分频模块(传入参数设定间隔1s),按键模块(用刚刚用的消抖的)。数码管显示 LED显示都可以在本模块内补全。

写的时候发现一个 always 赋值语法规范:一个变量赋值不要在多个 always 里分别有过赋值,会报错,尽量集中到一个 always 里。

module BasketballBoard (key, clk, rst, seg_led_1,seg_led_2,led);
	input key, clk, rst;
	output [8:0] seg_led_1;
	output [8:0] seg_led_2;
	output reg [7:0] led;

	reg [8:0] seg [9:0];
	
	reg [4:0] SED_LED_H;
	reg [4:0] SED_LED_L;
	wire key_pulse;
	wire clk1h;
	
	reg stop_flag=0;
	reg rst_flag=0;
	
	initial
	begin
		seg[0]=9'h3f;
		seg[1]=9'h06;
		seg[2]=9'h5b;
		seg[3]=9'h4f;
		seg[4]=9'h66;
		seg[5]=9'h6d;
		seg[6]=9'h7d;
		seg[7]=9'h07;
		seg[8]=9'h7f;
		seg[9]=9'h6f;
	end
	
	always @ (posedge key_pulse)
		if(rst) 
			rst_flag<=~rst_flag;
			
		
	debounce u1 (
			.clk(clk),
			.rst(rst),
			.key(key),
			.key_pulse(key_pulse)
		);
		
		
	div #(.WIDTH(32),.N(12000000)) u2 ( 
		.clk_in(clk),
		.rst_n(rst),      
		.clk_out(clk1h)
		);
		
	always @ (posedge clk1h or negedge rst)
		begin
			if(!rst)
				begin
					SED_LED_H<=4'd2;
					SED_LED_L<=4'd4;
					stop_flag<=0;
				end
			else if((!rst_flag)&(!stop_flag))
				begin
					led<=8'b11111111;
					if(SED_LED_L)
						SED_LED_L<=SED_LED_L-4'd1;
					else if(SED_LED_H) begin
							SED_LED_L<=4'd9;
							SED_LED_H<=SED_LED_H-4'd1;
						end
					if((!SED_LED_H)&(!SED_LED_L))
						stop_flag<=1;
				end
			else
				led<=8'b00000000;
		end
		
	assign seg_led_1=seg[SED_LED_H];
	assign seg_led_2=seg[SED_LED_L];

endmodule

led seg key rst clk 这些都是和前面采取类似的引脚设置。再加上前面的 div 模块和 key 模块即可。

呈现效果:计时结束和按下暂停键时 LED 灯会全亮来代表暂停时钟。

LED 流水灯

PWM 原理。随着时间推移改变占空比来呈现出不同亮度的 LED。

1688927302381

比如每个周期长度 100,第一个周期设定高电平0 低电平100,第二个周期设定高电平10 低电平90,第三个周期设定高电平20 低电平80……

也就是说我们需要两个计时器,第一个就是老老实实的记录一个又一个周期,0~Period-1.

第二个计时器一方面,在第一个计时器结束一个周期的时候改变一下自己的占空比,比如上例每个周期结束高电平部分+10.

另一方面,第二个计时器和第一个计时器作比较。比如当前第二个计时器是20也就是20高电平 80低电平,那么计时器1<计时器2的时候设置为高电平,计时器1>计时器2的时候设置为低电平。

module WaterLED(clk,rst,led);
	input clk, rst;
	output led;
	reg [13:0] cnt1;
	reg [13:0] cnt2;
	
	parameter CNT_NUM=2400;
	reg flag=0;
	
	always @ (posedge clk or negedge rst)
		begin
			if(!rst)
				cnt1<=13'b0;
			else if(cnt1==CNT_NUM-1) begin
					cnt1<=13'b0;
					if(flag==0)
						if(cnt2>=CNT_NUM) begin
								flag<=1'b1;
							end
						else cnt2<=cnt2+13'b1;
					else if(flag==1)
						if(cnt2<=0) begin
								flag<=1'b0;
							end
						else cnt2<=cnt2-13'b1;
				end
			else cnt1<=cnt1+13'b1;
		end
		
	
	assign led=cnt1<cnt2?1:0;
endmodule

代码没啥难的。

交通信号灯

两个三色模块各亮各的,表示主路和支路的红绿灯信号。

主路:15绿,3黄,10红(单位:秒)。

支路:7绿,3黄,18红。

概念:状态机,一种抽象模型。对象有状态(state,比如此例中两个红绿灯的三种状态),事件(event,外界施加的,比如我让计数–,或者切换状态颜色),行为(action,交通灯按 event 自己执行的动作,比如切颜色),切换状态(transition,比如红灯绿灯黄灯之间三种状态)。

一开始觉得很容易写。就是两个数组存储主路支路状态表嘛。

module TrafficLED (clk,rst,LED_1,LED_2);
	input clk,rst;
	output reg [2:0] LED_1;
	output reg [2:0] LED_2;
	
	reg [4:0] state_1 [2:0];
	reg [4:0] state_2 [2:0];
	reg [2:0] color_state [2:0];
	
	reg [2:0] cur_state_1;
	reg [2:0] cur_state_2;
	reg [4:0] cur_time_1;
	reg	[4:0] cur_time_2;
	
	wire clk1h;
	
	initial begin
		state_1[0]=5'd14;
		state_1[1]=5'd2;
		state_1[2]=5'd9;
		state_2[0]=5'd6;
		state_2[1]=5'd2;
		state_2[2]=5'd17;
		color_state[0]=3'b101;
		color_state[1]=3'b100;
		color_state[2]=3'b110;
		cur_time_1=5'd14;
		cur_time_2=5'd6;
	end
	
	div #(.WIDTH(32),.N(12000000)) u2 (         
        .clk_in(clk),
        .rst_n(rst),
        .clk_out(clk1h)
    );
	
	always @ (posedge clk1h or negedge rst) begin
			if(!rst) begin
					cur_state_1<=0;
					cur_state_2<=0;
					cur_time_1<=5'd14;
					cur_time_2<=5'd6;
					LED_1<=color_state[cur_state_1];
					LED_2<=color_state[cur_state_2];
				end
			else begin
					if(cur_time_1)cur_time_1<=cur_time_1-5'b1;
					else begin
							if(cur_state_1<2)cur_state_1<=(cur_state_1+1);
							else cur_state_1<=0;
							cur_time_1<=state_1[cur_state_1+1];
						end
					if(cur_time_2)cur_time_2<=cur_time_2-5'b1;
					else begin
							if(cur_state_2<2)cur_state_2<=(cur_state_2+1);
							else cur_state_2<=0;
							cur_time_2<=state_2[cur_state_2+1];
							
						end
					LED_1<=color_state[cur_state_1];
					LED_2<=color_state[cur_state_2];
				end
		end
	
endmodule

有两个注意的地方,都是和 fpga 非阻塞赋值相关的。

之前知道 always 里如果用 <= 赋值,所有变量是结束 always 的时候同时赋值的。第一个错误写法是这么写的:

if(cur_time_1)cur_time_1<=cur_time_1-5'b1;
else begin
        if(cur_state_1<2)cur_state_1<=(cur_state_1+1);
        else cur_state_1<=0;
    	cur_time_1<=state_1[cur_state_1];//这里有区别
    end
if(cur_time_2)cur_time_2<=cur_time_2-5'b1;
else begin
        if(cur_state_2<2)cur_state_2<=(cur_state_2+1);
        else cur_state_2<=0;
    	cur_time_2<=state_2[cur_state_2];//这里有区别
    end
LED_1<=color_state[cur_state_1];
LED_2<=color_state[cur_state_2];

因为我想的是,cur_state+1后切换状态为当前cur_state的状态,也就是已经+1过后的状态。

实际不是这么回事,实际上他俩指令是同时执行的,也就是说state[cur_state]还是刚才没+1的状态。

所以我改成 state[cur_state+1] 了。

第二个错误如下:

if(cur_time_1)cur_time_1<=cur_time_1-5'b1;
else begin
        cur_state_1<=(cur_state_1+1);//这里有区别
    	if(cur_state_1==3)cur_state_1<=0;//这里有区别
    	cur_time_1<=state_1[cur_state_1+1];
    end
if(cur_time_2)cur_time_2<=cur_time_2-5'b1;
else begin
    	cur_state_2<=(cur_state_2+1);//这里有区别
    	if(cur_state_2==3)cur_state_2<=0;//这里有区别
    	cur_time_2<=state_2[cur_state_2+1];
    end
LED_1<=color_state[cur_state_1];
LED_2<=color_state[cur_state_2];

想的也是顺序执行,先+1判断是否超出了(0,1,2)的数组范围,如果超出了就归0.

但是 LED 赋值和 cur_state+1 是同时执行的,也就是有1s我的cur_state是3,LED也尝试获取数组3下标的状态。

所以干脆赋值的时候就:如果为2,直接归0,否则++。这样就不用再一步判断了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/737103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【解压缩技巧】2种方法合并ZIP分卷压缩文件

文件太大的时候&#xff0c;很多人都会选择“分卷压缩”来压缩ZIP文件&#xff0c;那分卷后的ZIP文件要怎么合并回去呢&#xff1f;今天小编就来分享2个合并方法&#xff0c;下面一起看看吧。 方法一&#xff1a; 使用7-Zip压缩软件的自带“合并文件”功能。 首先打开7-Zip&a…

Mac下pom.xml文件中找不到env.JAVA_HOME

Mac 11.7.6 这个是解决后的样子&#xff0c;解决前是env.JAVA_HOME找不到 上图中的${env.JAVA_HOME}中的env是用来获取系统环境变量&#xff0c;但是在mac10以上的版本,即使我们在bash_profile文件中配置了JAVA_HOME&#xff0c;这里也不能直接使用env将JAVA_HOME点出来&#…

解决报错:“export ‘default‘ (imported as ‘VueRouter‘) was not found in ‘vue-router‘

目录 ❓ 问题描述 ❌ 报错信息 ⁉️ 问题原因&#xff1a; &#x1f388; 解决办法&#xff08;仅windows&#xff09;: 如何查看所装依赖的版本号 如何下载或卸载已有依赖版本 说说一些兼容性问题 &#x1f4da; 参考资料&#xff1a; ❓ 问题描述 用npm run serve运…

metersphere主从节点部署

metersphere主从节点关系 环境搭建 docker 环境准备 检查内存是否大于8G free -m 安装docker服务 安装docker&#xff0c;使用yum -y install docker&#xff1b; 启动docker&#xff0c;使用systemctl start docker&#xff1b; 设置开机启动&#xff0c;使用systemctl en…

Web3与物联网行业:实现安全、可信与智能的连接

随着物联网技术的快速发展&#xff0c;我们正迎来一个高度互联、智能化的未来。而Web3作为互联网的下一次演进&#xff0c;将为物联网行业带来重要的变革。 本文将探讨Web3在物联网行业中的应用前景和优势&#xff0c;以及如何实现安全、可信和智能的连接。 第一部分&#xff…

亚马逊哪些因素影响下单成功率

在亚马逊上下单时&#xff0c;下列因素可能影响下单的成功率&#xff1a; 1、账户信息准确性&#xff1a;确保您的亚马逊账户信息是准确的&#xff0c;包括配送地址、付款方式和联系方式等。错误或过期的信息可能导致下单失败。 2、库存和供应情况&#xff1a;某些商品可能由…

业财一体化与数据集成平台:实现数字化转型的关键利器

业财一体化一直是企业信息化领域的热门话题&#xff0c;而随着ERP技术的升级和发展&#xff0c;数据集成平台如轻易云正逐渐崭露头角。本文探讨了不同的业财一体化架构模式&#xff0c;并重点介绍了轻易云数据集成平台的强大集成优势。该平台通过一站式的服务&#xff0c;包括数…

linux 下如何安装 tar.gz包

linux 下如何安装 tar.gz包 解压缩进入解压后的文件目录下 解压缩 tar -zxvf pycharm-community-2023.1.3.tar.gz进入解压后的文件目录下 ./pycharm.sh可执行Pycharm 建议将目录转移到其他位置 我习惯使用2020版本的 下载地址

交通 | 针对Close-Enough旅行商问题的一种分支定界算法

论文解读​&#xff1a;王飞龙&#xff0c;曲晨辉 1、问题背景 \qquad 旅行商问题(TSP)是一种众所周知的路径问题。TSP的目标是在图 G ( V , E ) G(V,E) G(V,E)中找一条以场站为起终点的最短路&#xff0c;访问所有客户点 V V V&#xff0c;同时没有子环路。令 E E E表示网络中…

【复习30-35题】【每天40分钟,我们一起用50天刷完 (剑指Offer)】第二十一天 21/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

几款ai绘画二次元关键词软件分享给你

伴随着二次元文化的兴起&#xff0c;越来越多的人开始关注和喜爱这种独特的漫画风格。二次元绘画风格确实赏心悦目&#xff1a; 当然&#xff0c;绘画创作是二次元文化中不可或缺的部分&#xff0c;很多人也因此对绘画更加热爱。然而&#xff0c;想要制作二次元比较好看的绘画并…

RocketMQ5.0的Broker主从同步机制

RocketMQ5.0的Broker主从同步机制 一、主从同步工作原理 为了提高消息消费的高可用性&#xff0c;避免Broker发生单点故障引起存储在Broker上的消息无法及时消费&#xff0c; RocketMQ引入Broker主备机制&#xff0c;即&#xff1a;消息消费到达主服务器后需要将消息同步到消…

15分钟真正搞懂什么是“交叉熵损失函数”

大家好啊&#xff0c;我是董董灿。 在你刚学习神经网络的时候&#xff0c;有没有被一个名字叫做“交叉熵”的概念绕的云里雾里&#xff0c;以至于现在看到这个概念&#xff0c;依然很懵。 今天就来看一下&#xff0c;这个所谓的“交叉熵”到底是什么&#xff0c;以及它在神经…

【项目级面试题】关于前端鉴权这块,能详细的说说吗?

如果有人问你&#xff1a;”你做了这么多年的开发&#xff0c;关于前端鉴权这块&#xff0c;能详细的说说吗&#xff1f;“。你该如何作答&#xff0c;脑海中有没有一个完整的思路。 像 Token、Cookie、Session、JWT、单点登录 这些概念&#xff0c;它们的作用、应用场景、如何…

【C#】并行编程实战:使用 PLINQ(3)

PLINQ 是语言集成查询&#xff08;Language Integrate Query , LINQ&#xff09;的并行实现&#xff08;P 表示并行&#xff09;。本章将继续介绍其编程的各个方面以及与之相关的一些优缺点。 本文的主要内容为 PLINQ 中的组合并行和顺序 LINQ 查询、取消 PLINQ 查询、使用 PLI…

Azure AD混合部署,实现在本地AD同步到AAD上面

一、前期准备 1、进入 Azure云 注册一个账号 云计算服务 | Microsoft Azure 2、进入 AAD 管理后台 Microsoft Azure 3、创建一个新的租户 4、添加自定义域名&#xff0c;这里要做下验证&#xff0c;所以你要有个线上的域名 5、创建一个全局管理员 6、登陆本地AD&#xff0c;创…

第133页的gtk+编程例子——计算器应用改写网上的例子

第133页的gtk编程例子——计算器应用改写网上的例子 来源&#xff1a;《GTK的计算器》 https://blog.csdn.net/zhouzhouzf/article/details/17097999 重点在于它的设计思路是比较巧妙的&#xff0c;能够处理多种情况&#xff0c;比较容易理解&#xff0c;也感到人类的思想是非…

Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令

目录 ProcessBuilder类的介绍及使用 【前言】 【正文】 --构造方法-- --常用方法-- --使用技巧-- --调用本地Shell命令&#xff0c;实例-- 【总结】 【注意】 ProcessBuilder类的介绍及使用 【前言】 在做一个项目的时候需要用到运行时动态执行JAVA命令&#xff0c;一…

常用数据聚类算法总结记录与代码实现[K-means/层次聚类/DBSACN/高斯混合模型(GMM)/密度峰值聚类/均值漂移聚类/谱聚类等]

本文的主要目的是总结记录日常学习工作中常用到的一些数据聚类算法&#xff0c;对其原理简单总结记录&#xff0c;同时分析对应的优缺点&#xff0c;以后需要的时候可以直接翻看&#xff0c;避免每次都要查询浪费时间&#xff0c;欢迎补充。 聚类算法是一种无监督学习的方法&am…

chrales过期重装或使用途中的踩坑记录及使用方法

1、背景 我的是证书过期了&#xff0c;提示无网络。 1. 重新下载 安装(或者 不需要重新下载安装&#xff0c;用已有的就可以) 2. 重新进行配置 3. (关键)检查电脑上的 证书过期时间 4. (关键)检查手机上的证书过期时间 5. (手机配置好后&#xff0c;点开链接显示无网络&#…