小梅哥Xilinx FPGA学习笔记16——FSM(状态机)的学习
目录
一、 状态机导读
1.1 理论学习
1.2 状态机的表示
1.3 状态机编码
1.4 状态机描述方式
二 、实战演练一(来自野火)
2.1 实验目标
2.2 模块框图
2.3 状态转移图绘制
2.4 设计文件
2.5 仿真测试文件
2.6 仿真结果
三、 实战演练二(来自野火)
3.1 实验目标
3.2 模块框图
3.3 状态转移图绘制
3.4 设计文件
3.5 仿真测试文件
3.6 仿真结果
四、 实战演练三(来自小梅哥)
4.1 实验目标
4.2 模块框图
4.3 端口功能描述
4.4 设计文件
4.5 仿真测试文件
4.6 仿真结果
五、 实战演练四(来自小梅哥)
5.1 实验目标
5.2 设计文件
5.2.1 顶层文件
5.2.2 串口接收文件
5.2.3 字符检测模块
5.3 引脚约束文件
5.4 板上验证
一、 状态机导读
1.1 理论学习
1.2 状态机的表示

1.3 状态机编码

1.4 状态机描述方式
二 、实战演练一(来自野火)
2.1 实验目标
2.2 模块框图
2.3 状态转移图绘制

2.4 设计文件
module simple_fsm(input sys_clk,input sys_rst_n,input pi_money,output reg po_cola);parameter IDLE = 0;//记住独热码,二进制码,格雷码的区别。parameter ONE = 1;parameter TWO = 2;reg [1:0]state;always@(posedge sys_clk or negedge sys_rst_n)if(!sys_rst_n)beginstate <= IDLE; po_cola <= 0;endelse begin case(state) IDLE: beginif(pi_money)beginstate <= ONE;po_cola <= 0; //可以使用两个时序逻辑分别描述状态转换和输出。endelsestate <= IDLE; endONE:if(pi_money)beginstate <= TWO;po_cola <= 0; endelsestate <= ONE; TWO:if(pi_money)beginstate <= IDLE;po_cola <= 1; endelsestate <= TWO; default:begin state <= IDLE;po_cola <= 0;endendcaseend
endmodule
2.5 仿真测试文件
`timescale 1ns / 1ps
module simple_fsm_test();reg sys_clk ;
reg sys_rst_n;
reg pi_money;
wire po_cola;simple_fsm simple_fsm_inst(.sys_clk(sys_clk),.sys_rst_n(sys_rst_n),.pi_money(pi_money),.po_cola(po_cola));initial sys_clk = 1;always #10 sys_clk = ~sys_clk;initial beginsys_rst_n = 0;pi_money = 0;#201;sys_rst_n = 1;#20000;pi_money = 1;#20;pi_money = 0;#20000;pi_money = 1;#20;pi_money = 0;#20000;pi_money = 1;#20;pi_money = 0;#20000;$stop;end
endmodule
2.6 仿真结果

三、 实战演练二(来自野火)
3.1 实验目标
3.2 模块框图

端口列表与功能总结如下面表格所示。

3.3 状态转移图绘制

3.4 设计文件
module hard_fsm(input sys_clk,input sys_rst_n,input pi_money_half,input pi_money_one,output reg po_cola,output reg po_money);parameter IDLE = 0,//使用二进制码HALF = 1,ONE = 2,ONE_HALF = 3,TWO = 4,TWO_HALF = 5;reg [2:0]state;always@(posedge sys_clk or negedge sys_rst_n)if(!sys_rst_n)beginstate <= IDLE; endelse begin case(state)IDLE:if(pi_money_half)beginstate <= HALF;endelse if(pi_money_one)beginstate <= ONE;endelse beginstate <= IDLE;endHALF:if(pi_money_half)beginstate <= ONE;endelse if(pi_money_one)beginstate <= ONE_HALF;endelse beginstate <= HALF;endONE:if(pi_money_half)beginstate <= ONE_HALF;endelse if(pi_money_one)beginstate <= TWO;endelse beginstate <= ONE;endONE_HALF:if(pi_money_half)beginstate <= TWO;endelse if(pi_money_one)beginstate <= IDLE;endelse beginstate <= ONE_HALF;end TWO:if(pi_money_half || pi_money_one)beginstate <= IDLE;endelse beginstate <= TWO;end default:state <= IDLE;endcaseendalways@(posedge sys_clk or negedge sys_rst_n)//使用两段式状态机写法if(!sys_rst_n)po_cola <= 0; else if(((state == TWO) && (pi_money_half == 1))||((state ==ONE_HALF) &&(pi_money_one == 1))||((state ==TWO) &&(pi_money_one == 1)))po_cola <= 1;elsepo_cola <= 0;always@(posedge sys_clk or negedge sys_rst_n)if(!sys_rst_n)po_money <= 0; else if((state == TWO) && (pi_money_one == 1))po_money <= 1; elsepo_money <= 0;
endmodule
3.5 仿真测试文件
`timescale 1ns/1ns
module hard_fsm_tb();//********************************************************************//
//****************** Parameter and Internal Signal *******************//
//********************************************************************////reg definereg sys_clk;reg sys_rst_n;reg pi_money_one;reg pi_money_half;reg random_data_gen;//wire definewire po_cola;wire po_money;//********************************************************************////***************************** Main Code ****************************////********************************************************************////初始化系统时钟、全局复位initial beginsys_clk = 1'b1;sys_rst_n <= 1'b0;#20sys_rst_n <= 1'b1;end//sys_clk:模拟系统时钟,每 10ns 电平翻转一次,周期为 20ns,频率为 50MHzalways #10 sys_clk = ~sys_clk;//random_data_gen:产生非负随机数 0、1always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)random_data_gen <= 1'b0;elserandom_data_gen <= {$random} % 2;//pi_money_one:模拟投入 1 元的情况always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)pi_money_one <= 1'b0;elsepi_money_one <= random_data_gen;//pi_money_half:模拟投入 0.5 元的情况always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)pi_money_half <= 1'b0;else
//取反是因为一次只能投一个币,即 pi_money_one 和 pi_money_half 不能同时为 1pi_money_half <= ~random_data_gen;//********************************************************************//
//*************************** Instantiation **************************//
//********************************************************************////------------------------complex_fsm_inst------------------------hard_fsm hard_fsm_inst(.sys_clk (sys_clk ), //input sys_clk.sys_rst_n (sys_rst_n ), //input sys_rst_n.pi_money_one (pi_money_one ), //input pi_money_one.pi_money_half (pi_money_half ), //input pi_money_half.po_cola (po_cola ), //output po_money.po_money (po_money ) //output po_cola
); endmodule
3.6 仿真结果

四、 实战演练三(来自小梅哥)
4.1 实验目标

4.2 模块框图

4.3 端口功能描述

4.4 设计文件
module hello(input sys_clk,input sys_rst_n,input [7:0]data_in,//输入数据input data_in_valid,//有效数据输入output reg check_ok//检测出来一个hello就出现一个高脉冲
);//定义5个状态localparam CHECK_h = 0,CHECK_e = 1,CHECK_l1 = 2,CHECK_l2 = 3, CHECK_o = 4;reg [2:0]state;//我使用的是新二段式状态机,小梅哥用的是一段式状态机。always@(posedge sys_clk or posedge sys_rst_n) if(!sys_rst_n) state <= CHECK_h; else begincase(state)CHECK_h:beginif(data_in_valid && data_in == "h")state <= CHECK_e;else state <= CHECK_h; end CHECK_e:beginif(data_in_valid && data_in == "e")//千万注意if还有else if的顺序问题,不然可能会造成检测不成功的现象出现。比如出现hhello就无法检测出来。state <= CHECK_l1;else if(data_in_valid && data_in == "h")state <= CHECK_e; else if(data_in_valid)state <= CHECK_h; elsestate <= CHECK_e; endCHECK_l1:if(data_in_valid && data_in == "l")state <= CHECK_l2;else if(data_in_valid && data_in == "h")state <= CHECK_e; else if(data_in_valid)state <= CHECK_h; elsestate <= CHECK_l1; CHECK_l2:if(data_in_valid && data_in == "l")state <= CHECK_o;else if(data_in_valid && data_in == "h")state <= CHECK_e; else if(data_in_valid)state <= CHECK_h; elsestate <= CHECK_l2; CHECK_o:if(data_in_valid && data_in == "o")state <= CHECK_h;//检测完毕回到起始状态else if(data_in_valid && data_in == "h")state <= CHECK_e; else if(data_in_valid)state <= CHECK_h; elsestate <= CHECK_o; endcaseend //输出单独控制逻辑
always@(posedge sys_clk or posedge sys_rst_n) if(!sys_rst_n) check_ok <= 0; else if((state == CHECK_o) && data_in_valid && (data_in == "o"))check_ok <= 1; else if(state == CHECK_h)check_ok <= 0; elsecheck_ok <= check_ok;
endmodule
4.5 仿真测试文件
`timescale 1ns / 1ps
`define CLK_PERIOD 20
module hello_tb();reg sys_clk;
reg sys_rst_n;
reg data_valid;
reg [7:0]data_in;
wire check_ok;hello hello(.sys_clk(sys_clk),.sys_rst_n(sys_rst_n),.data_in(data_in),.data_in_valid(data_valid),.check_ok(check_ok));initial sys_clk = 1;
always#(`CLK_PERIOD/2) sys_clk = ~sys_clk;initial beginsys_rst_n = 0;data_valid = 0;data_in = 0;#(`CLK_PERIOD*20);sys_rst_n = 1;#(`CLK_PERIOD*20 + 1);repeat(2)begingen_char("I");#(`CLK_PERIOD);gen_char("A");#(`CLK_PERIOD);gen_char("h");#(`CLK_PERIOD);gen_char("e");#(`CLK_PERIOD);gen_char("l");#(`CLK_PERIOD);gen_char("l");#(`CLK_PERIOD); gen_char("h");#(`CLK_PERIOD);gen_char("h");#(`CLK_PERIOD);gen_char("e");#(`CLK_PERIOD);gen_char("l");#(`CLK_PERIOD);gen_char("l");#(`CLK_PERIOD);gen_char("o");#(`CLK_PERIOD);gen_char("e");#(`CLK_PERIOD);gen_char("h");#(`CLK_PERIOD);gen_char("h");#(`CLK_PERIOD);gen_char("o");#(`CLK_PERIOD); end#200;$stop;endtask gen_char;input [7:0]char; begindata_in = char;data_valid = 1'b1;#(`CLK_PERIOD);data_valid = 1'b0;endendtask
endmodule
4.6 仿真结果

五、 实战演练四(来自小梅哥)
5.1 实验目标

5.2 设计文件
5.2.1 顶层文件
module fsm_hello_test(input sys_clk,input sys_rst_n,input uart_rxd,output reg Led
);wire [7:0]data_in;wire data_in_valid;wire check_ok;zdyz_rs232_rx #(.CLK_FREQ (5000_0000),//波特率设置.UART_BPS (115200))zdyz_rs232_rx(.sys_clk(sys_clk) , //系统时钟.sys_rst_n(sys_rst_n) , //系统复位,低有效.uart_rxd(uart_rxd) , //UART 接收端口.uart_rx_done(data_in_valid), //UART 接收完成信号,接收完成后就代表数据有效.uart_rx_data(data_in) //UART 接收到的数据送给字符检测模块作为输入
);hello hello(.sys_clk(sys_clk),.sys_rst_n(sys_rst_n),.data_in(data_in),.data_in_valid(data_in_valid),.check_ok(check_ok)
);//每检测一次,LED就要翻转一次
always@(posedge sys_clk or posedge sys_rst_n)if(!sys_rst_n)Led <= 0;else if(check_ok)Led <= ~Led;else Led <= Led;endmodule
5.2.2 串口接收文件
(个人觉得正点原子的串口接收模块比小梅哥的简单易懂,实用)
module zdyz_rs232_rx(input sys_clk , //系统时钟input sys_rst_n , //系统复位,低有效input uart_rxd , //UART 接收端口output reg uart_rx_done, //UART 接收完成信号output reg [7:0] uart_rx_data //UART 接收到的数据
);parameter CLK_FREQ = 5000_0000; //系统时钟频率
parameter UART_BPS = 115200 ; //串口波特率
localparam BAUD_CNT_MAX = CLK_FREQ/UART_BPS; //为得到指定波特率,对系统时钟计数 BPS_CNT 次reg uart_rxd_d0;
reg uart_rxd_d1;
reg rx_flag ; //接收过程标志信号
reg [3:0] rx_cnt ; //接收数据位计数器
reg [15:0] baud_cnt ; //波特率计数器(位宽为16,防止溢出)
reg [7:0 ] rx_data_t ; //接收数据寄存器wire start_flag;//开始接收的标志,下降沿到来。//打两拍:波特率时钟和系统时钟不同步,为异步信号,所以要进行打拍处理,防止产生亚稳态
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n) beginuart_rxd_d0 <= 1'b0;uart_rxd_d1 <= 1'b0;endelse beginuart_rxd_d0 <= uart_rxd;uart_rxd_d1 <= uart_rxd_d0;end
end assign start_flag = (uart_rxd_d0 == 0)&&(uart_rxd_d1 == 1);//下降沿到来的表示方法
// rx_flag接收信号的拉高与拉低
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)rx_flag <= 1'b0;else if(start_flag) //检测到起始位rx_flag <= 1'b1; //接收过程中,标志信号 rx_flag 拉高//在停止位一半的时候,即接收过程结束,标志信号 rx_flag 拉低else if((rx_cnt == 4'd9) && (baud_cnt == BAUD_CNT_MAX/2 - 1))//rx_flag 要提前拉低,防止其影响下一帧数据的接收rx_flag <= 1'b0;elserx_flag <= rx_flag;end
//波特率的计数器计数逻辑
always @(posedge sys_clk or negedge sys_rst_n)begin if(!sys_rst_n) baud_cnt <= 0; else if(rx_flag)beginif(baud_cnt == BAUD_CNT_MAX - 1)baud_cnt <= 0;elsebaud_cnt <= baud_cnt + 1; endelsebaud_cnt <= 0;
end
//位计数实现逻辑
always @(posedge sys_clk or negedge sys_rst_n)begin if(!sys_rst_n)rx_cnt <= 0; else if(rx_flag)beginif(baud_cnt == BAUD_CNT_MAX - 1)rx_cnt <= rx_cnt + 1; elserx_cnt <= rx_cnt;endelserx_cnt <= 0;//其他情况下都为0,所以不用担心计数超过9,且其计数也不会超过9,当rx_flag为0时就不计数了
end
//根据 rx_cnt 来寄存 rxd 端口的数据
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)rx_data_t <= 0; else if(rx_flag)begin //系统处于接收过程时if(baud_cnt == BAUD_CNT_MAX/2 - 1)begin//判断 baud_cnt 是否计数到数据位的中间 case(rx_cnt)1:rx_data_t[0] <= uart_rxd_d1; //寄存数据的最低位2:rx_data_t[1] <= uart_rxd_d1;3:rx_data_t[2] <= uart_rxd_d1;4:rx_data_t[3] <= uart_rxd_d1;5:rx_data_t[4] <= uart_rxd_d1;6:rx_data_t[5] <= uart_rxd_d1;7:rx_data_t[6] <= uart_rxd_d1;8:rx_data_t[7] <= uart_rxd_d1;//寄存数据的高低位default:rx_data_t <= rx_data_t; endcaseendelse rx_data_t <= rx_data_t;endelserx_data_t <= 0;
end
//给接收完成信号和接收到的数据赋值
always @(posedge sys_clk or negedge sys_rst_n)begin if(!sys_rst_n)begin uart_rx_done <= 0; uart_rx_data <= 0;end//当接收数据计数器计数到停止位,且 baud_cnt 计数到停止位的中间时else if((rx_cnt == 4'd9) && (baud_cnt == BAUD_CNT_MAX/2 - 1))beginuart_rx_done <= 1; //拉高接收完成信号uart_rx_data <= rx_data_t;//并对 UART 接收到的数据进行赋值end else beginuart_rx_done <= 0; uart_rx_data <= uart_rx_data; end
end
endmodule
5.2.3 字符检测模块
module hello(input sys_clk,input sys_rst_n,input [7:0]data_in,//输入数据input data_in_valid,//有效数据输入output reg check_ok//检测出来一个hello就出现一个高脉冲
);//定义5个状态localparam CHECK_h = 0,CHECK_e = 1,CHECK_l1 = 2,CHECK_l2 = 3, CHECK_o = 4;reg [2:0]state;//我使用的是新二段式状态机,小梅哥用的是一段式状态机。always@(posedge sys_clk or posedge sys_rst_n) if(!sys_rst_n) state <= CHECK_h; else begincase(state)CHECK_h:beginif(data_in_valid && data_in == "h")state <= CHECK_e;else state <= CHECK_h; end CHECK_e:beginif(data_in_valid && data_in == "e")//千万注意if还有else if的顺序问题,不然可能会造成检测不成功的现象出现。比如出现hhello就无法检测出来。state <= CHECK_l1;else if(data_in_valid && data_in == "h")state <= CHECK_e; else if(data_in_valid)state <= CHECK_h; elsestate <= CHECK_e; endCHECK_l1:if(data_in_valid && data_in == "l")state <= CHECK_l2;else if(data_in_valid && data_in == "h")state <= CHECK_e; else if(data_in_valid)state <= CHECK_h; elsestate <= CHECK_l1; CHECK_l2:if(data_in_valid && data_in == "l")state <= CHECK_o;else if(data_in_valid && data_in == "h")state <= CHECK_e; else if(data_in_valid)state <= CHECK_h; elsestate <= CHECK_l2; CHECK_o:if(data_in_valid && data_in == "o")state <= CHECK_h;//检测完毕回到起始状态else if(data_in_valid && data_in == "h")state <= CHECK_e; else if(data_in_valid)state <= CHECK_h; elsestate <= CHECK_o; endcaseend //输出单独控制逻辑
always@(posedge sys_clk or posedge sys_rst_n) if(!sys_rst_n) check_ok <= 0; else if((state == CHECK_o) && data_in_valid && (data_in == "o"))check_ok <= 1; else if(state == CHECK_h)check_ok <= 0; elsecheck_ok <= check_ok;
endmodule
5.3 引脚约束文件
set_property PACKAGE_PIN U18 [get_ports sys_clk]
set_property IOSTANDARD LVCMOS33 [get_ports sys_clk]
set_property IOSTANDARD LVCMOS33 [get_ports Led]
set_property IOSTANDARD LVCMOS33 [get_ports sys_rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports uart_rxd]
set_property PACKAGE_PIN F20 [get_ports sys_rst_n]
set_property PACKAGE_PIN K16 [get_ports uart_rxd]
set_property PACKAGE_PIN G17 [get_ports Led]
5.4 板上验证
本文所有程序均经过板上验证过,均正常,放心使用参考。
相关文章:
小梅哥Xilinx FPGA学习笔记16——FSM(状态机)的学习
目录 一、 状态机导读 1.1 理论学习 1.2 状态机的表示 1.3 状态机编码 1.4 状态机描述方式 二 、实战演练一(来自野火) 2.1 实验目标 2.2 模块框图 2.3 状态转移图绘制 2.4 设计文件 2.5 仿真测试文件 2.6 仿真结果 三、 实战演练二&…...
vol----学习随记!!!
目录 一、代码生成1.先新建一个功能的对应的代码配置各项解释: 2.后设置配置菜单3.再点保存,生成vue页面,生成model,生成业务类4.再通过菜单设置编写系统菜单 一、代码生成 1.先新建一个功能的对应的代码配置 各项解释ÿ…...
HarmonyOS4.0系统性深入开发10卡片事件能力说明
卡片事件能力说明 ArkTS卡片中提供了postCardAction()接口用于卡片内部和提供方应用间的交互,当前支持router、message和call三种类型的事件,仅在卡片中可以调用。 接口定义:postCardAction(component: Object, action: Object): void 接口…...
openGauss学习笔记-181 openGauss 数据库运维-升级-升级流程
文章目录 openGauss学习笔记-181 openGauss 数据库运维-升级-升级流程 openGauss学习笔记-181 openGauss 数据库运维-升级-升级流程 本章介绍升级到该版本的主要升级过程。 图 1 升级流程图 说明: 本文档中描述的时间仅供参考,实际操作时间以现场情况…...
提前应对威胁
通过新的《2023-2028 年荷兰国际网络安全战略》,荷兰政府在面对国家和犯罪分子持续构成的网络威胁时展现了责任和机构。它渴望将民主、人权和规范放在首位,并寻求维护全球开放、自由和安全的互联网。该战略明确了政府在国内实施打击的意愿和能力…...
C语言与人生:数组交换和二分查找
少年们,大家好。我是博主那一脸阳光,今天和分享数组交换和二分查找。 前言:探索C语言中的数组交换操作与二分查找算法 在计算机编程领域,特别是以C语言为代表的低级编程语言中,对数据结构的理解和熟练运用是至关重要的…...
Python实现【亚马逊商品】数据采集
前言 亚马逊公司,是美国最大的一家网络电子商务公司,位于华盛顿州的西雅图 是网络上最早开始经营电子商务的公司之一,亚马逊成立于1994年 今天教大家用Python批量采集亚马逊平台商品数据(完整代码放在文末) 地址&#…...
Git使用教程 gittutorial
该教程对该文章的翻译:https://git-scm.com/docs/gittutorial 本文介绍怎用使用 Git 导入新的工程、修改文件及如何其他人同步开发。 首先, 可以使用以下指令获取文档帮助 git help log笔者注:不建议看这个文档,标准的语法介绍…...
有了向量数据库,我们还需 SQL 数据库吗?
“除了向量数据库外,我是否还需要一个普通的 SQL 数据库?” 这是我们经常被问到的一个问题。如果除了向量数据以外,用户还有其他标量数据信息,那么其业务可能需要在进行语义相似性搜索前先根据某种条件过滤数据,例如&a…...
信息网络协议基础-IPv6协议
文章目录 概述为什么引入IP服务模型IPv4的可扩展性问题解决方法***CIDR(Classless Inter-Domain Routing, 无类别域间寻路)前缀汇聚***前缀最长匹配***NAT(网络地址转换)存在的问题解决方案路由表配置***局限性IPv6协议头标IPv6地址表示前缀类型单播地址链路局部地址(Link-Loca…...
VC++ ado 实现单表CURD
继续修改前文的资产管理源码; 新建一个数据库sds;把代码中的数据库连接改为连接此库; 新建下图一个表; 把之前的资产类别管理对话框改为下图所示;对话框ID也改为下图; 资产类别管理菜单和ID改为下图; 直接修改资产类别管理对话框类不太方便,新建一个对话框类,没有关联…...
C#使用switch多路选择语句判断何为季节
目录 一、 switch语句 二、示例 三、生成 一、 switch语句 switch语句是多路选择语句,它通过一个表达式的值来使程序从多个分支中选取一个用于执行的分支。 switch表达式的值只可以是整型、字符串、枚举和布尔类型。 switch语句中多个case可以使用一个break。 在…...
可爱的魔法曲线 Lovely Magical Curves(12年开始只有5个人AC)
一起来交流编程吧!【CSDN app】:http://qm.qq.com/cgi-bin/qm/qr?_wv1027&k3svdDJTlkD76TRRShbxYCYK1zK1c8cyF&authKeyv1pxp6rS8AA4SRy7bflJl9LIwp8d5v0HOudw%2BDxHiWDRqZ1LzjeoBJH1Z1EXnl35&noverify0&group_code546881376 可爱的魔法…...
通过C++程序实现光驱的自动化刻录和读取
文章目录 ISO文件格式光盘的基本概念光盘种类特点DVDR光盘使用windows调用Linux调用Linux平台下用到的C库:读取设备驱动列表向光驱中写文件 数字存储媒体快速发展的今天,光驱的使用已经不像以前那样普及了。但是在数据备份、安装软件和操作系统、旧设备兼容等领域还…...
【电商项目实战】商品详情显示与Redis存储购物车信息
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《电商项目实战》。🎯🎯 &am…...
概率论基础
1.概率论 1.1 随机事件与概率 1.1.1 基本概念 样本点(sample point): 称为试验 S S S的可能结果为样本点,用 ω \omega ω表示。 样本空间(sample space):称试验 S S S的样本点构成的集合为样本空间,用 Ω \Omega Ω表示…...
Mac电脑CMake安装和配置
1.从CMake官网下载dmg文件并且安装 ...
FormData传送复杂数据
FormData 是一个用于创建表单数据对象的 JavaScript 类。它通常用于通过 JavaScript 发送表单数据,尤其是用于发送 AJAX 请求时非常有用。 使用 FormData 可以方便地构建一个以 multipart/form-data 格式提交的表单数据,这允许你在发送 XMLHttpRequest …...
力扣回溯算法-电话号码的字母组合
力扣第17题,电话号码的字母组合 题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 .电话号码的字母组合 示例: 输入:“2…...
运维面试笔试题
目录 shell脚本 nginx 数据库mysql k8s(kubernetes) 安全与防护 网络TCP/IP shell脚本 1 通过正则表达式匹配文本...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
