小梅哥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 通过正则表达式匹配文本...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...

若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...