FPGA模块——SPI协议(读写FLASH)
FPGA模块——SPI协议(读写FLASH)
- (1)FLASH芯片 W25Q16BV
- (2)SPI协议
- (3)芯片部分命令
- 1.Write Enable(06h)
- 2.Chip Erase (C7h / 60h)
- 3.写指令(02h)
- 4.读指令(03h)
- (4)代码
- 1. FPGA做主机的SPI协议
- 2. SPI协议的使用
(1)FLASH芯片 W25Q16BV
芯片引脚图:
内部结构图:
存储区域总共分成了32块,每块64KB。每块又分成了16个部分,每个部分4KB。方便进行读取和局部操作。
电路设计
(2)SPI协议
SPI的四种模式
这里使用这个模式:
主机和从机在时钟上升沿放入要输出的数据,在时钟下降沿读取要输入的数据。
8个时钟后交换一个字节8位数据(高位在前)。
(3)芯片部分命令
有个输入时序的要求 开始时CS拉低等待(tSLCH要求最小5ns)再开始, 结束时CS拉高等待(tSHSL用100ns )再进行下一次操作。
这个寄存器的第一位数据可以判断操作是否完成(BUSY位)
1.Write Enable(06h)
写使能:开始时CS拉低等待(tSLCH要求最小5ns)再开始,结束时CS拉高等待(tSHSL取100ns )再进行下一次操作。
2.Chip Erase (C7h / 60h)
整片擦除,要判断操作是否完成
3.写指令(02h)
数据写多了会把之前的数据覆盖掉,要判断操作是否完成。
4.读指令(03h)
要判断操作是否完成
(4)代码
1. FPGA做主机的SPI协议
对信号进行同步和提前准备:
100m时钟和clk_cnt配合进行数据的读取和输出(clk_cnt有等于1和0的时候)
spi_clk基于100m时钟输出一个相当于clk_cnt的延时半个周期的时钟,确保输入输出数据稳定。
module spi_drive(input clk_100m ,input sys_rst_n ,//user interfaceinput spi_start ,//spi开启使能。input [7:0 ] spi_cmd ,//FLAH操作指令input [23:0] spi_addr ,//FLASH地址input [7:0 ] spi_data ,//FLASH写入的数据input [3:0 ] cmd_cnt ,output idel_flag_r ,//空闲状态标志的上升沿 output reg w_data_req ,//FLASH写数据请求 output reg [7:0] r_data ,//FLASH读出的数据output reg erro_flag ,//读出的数据错误标志//spi interfaceoutput reg spi_cs ,//SPI从机的片选信号,低电平有效。output reg spi_clk ,//主从机之间的数据同步时钟。output reg spi_mosi ,//数据引脚,主机输出,从机输入。input spi_miso //数据引脚,主机输入,从机输出。);//状态机
parameter IDLE =4'd0;//空闲状态
parameter WEL =4'd1;//写使能状态
parameter S_ERA =4'd2;//扇区擦除状态
parameter C_ERA =4'd3;//全局擦除
parameter READ =4'd4;//读状态
parameter WRITE =4'd5;//写状态
parameter R_STA_REG =4'd6;//指令集
parameter WEL_CMD =8'h06;
parameter S_ERA_CMD =8'h20;
parameter C_ERA_CMD =8'hc7;
parameter READ_CMD =8'h03;
parameter WRITE_CMD =8'h02;
parameter R_STA_REG_CMD=8'h05;//wire define
wire idel_flag;//reg define
reg[3:0] current_state ;
reg[3:0] next_state ;
reg[7:0 ] data_buffer ;
reg[7:0 ] cmd_buffer ;
reg[7:0 ] sta_reg ;
reg[23:0] addr_buffer ;
reg[31:0] bit_cnt ;
reg clk_cnt ;
reg dely_cnt ;
reg[31:0] dely_state_cnt ;
reg[7:0 ] rd_data_buffer ;
reg spi_clk0 ;
reg stdone ;
reg[7:0 ] data_check ;
reg idel_flag0 ;
reg idel_flag1 ;//*****************************************************
//** main code
//*****************************************************//*抓取上升沿
assign idel_flag=(current_state==IDLE)?1:0;//空闲状态标志
assign idel_flag_r=idel_flag0&&(~idel_flag1);//空闲状态标志的上升沿//*抓取上升沿要用的
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)beginidel_flag0<=1'b1;idel_flag1<=1'b1;endelse beginidel_flag0<=idel_flag;idel_flag1<=idel_flag0;end
end//请求数据 + 把数据放入buffer
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)w_data_req<=1'b0;else if((bit_cnt+2)%8==0&&bit_cnt>=30&&clk_cnt==0&¤t_state==WRITE) //提前2个时钟周期w_data_req<=1'b1;elsew_data_req<=1'b0;
endalways @(posedge clk_100m or negedge sys_rst_n )begin//读出的数据移位寄存if(!sys_rst_n)rd_data_buffer<=8'd0;else if(bit_cnt>=32&&bit_cnt<=2080&&clk_cnt==0&¤t_state==READ) rd_data_buffer<={rd_data_buffer[6:0],spi_miso};elserd_data_buffer<=rd_data_buffer;
endalways @(posedge clk_100m or negedge sys_rst_n )begin//检查读出的数据是否正确if(!sys_rst_n)data_check<=8'd0;else if(bit_cnt%8==0&&bit_cnt>=40&&clk_cnt==1&¤t_state==READ)data_check<=data_check+1'd1;elsedata_check<=data_check;
endalways @(posedge clk_100m or negedge sys_rst_n )begin//读出的数据if(!sys_rst_n)r_data<=8'd0;else if(bit_cnt%8==0&&bit_cnt>38&&clk_cnt==1&¤t_state==READ)r_data<=rd_data_buffer;elser_data<=r_data;
endalways @(posedge clk_100m or negedge sys_rst_n )begin//读出的数据错误标志if(!sys_rst_n)erro_flag<=1'd0;else if(bit_cnt>32&&bit_cnt<=2080&¤t_state==READ&&cmd_cnt==6)beginif(data_check!=r_data)erro_flag<=1'd1;elseerro_flag<=erro_flag;endelseerro_flag<=erro_flag;
end//*把数据放入buffer 提前一个周期
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)data_buffer<=8'd0;else if((bit_cnt+1)%8==0&&bit_cnt>30&&clk_cnt==1)//*把数据放入buffer 提前一个周期data_buffer<=spi_data;else if(clk_cnt==1&¤t_state==WRITE&&bit_cnt>=32)data_buffer<={data_buffer[6:0],data_buffer[7]};elsedata_buffer<=data_buffer;
end//*----位移cmd指令存储器 开始:cs选中且dely未生效,提前了100mhz的周期------------
//使50mhz时数据提前半个周期获得
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)cmd_buffer<=8'd0;else if(spi_cs==0&&dely_cnt==0)cmd_buffer<=spi_cmd;else if(clk_cnt==1&&(current_state==WEL||current_state==S_ERA||current_state==C_ERA||current_state==READ||current_state==WRITE||current_state==R_STA_REG)&&bit_cnt<8)cmd_buffer<={cmd_buffer[6:0],1'b1};elsecmd_buffer<=cmd_buffer;
end//取出地址每一位
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)addr_buffer<=8'd0;else if(spi_cs==0&&dely_cnt==0)addr_buffer<=spi_addr;else if(clk_cnt==1&&(current_state==READ||current_state==WRITE)&&bit_cnt>=8&&bit_cnt<32)addr_buffer<={addr_buffer[22:0],addr_buffer[23]};elseaddr_buffer<=addr_buffer;
end//------------使能后clk_cnt输出50M时钟用于操作信号--------------
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)clk_cnt<=1'd0;else if(dely_cnt==1)clk_cnt<=clk_cnt+1'd1;else clk_cnt<=1'd0;
end//*---------cs选中器件后的信号输出的 dely_cnt 可以认为是使能操作------------
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)dely_cnt<=1'd0;else if(spi_cs==0)beginif(dely_cnt<1)dely_cnt<=dely_cnt+1'd1;elsedely_cnt<=dely_cnt;endelsedely_cnt<=1'd0;
end//*-----------------结束的延时计时器------------------------------------
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)dely_state_cnt<=1'd0;else if(spi_cs)beginif(dely_state_cnt<400000000)dely_state_cnt<=dely_state_cnt+1'd1;elsedely_state_cnt<=dely_state_cnt;endelsedely_state_cnt<=1'd0;
end//*-------------------------bit读写计数---------------------
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)bit_cnt<=11'd0;else if(dely_cnt==1)beginif(clk_cnt==1'b1)bit_cnt<=bit_cnt+1'd1;elsebit_cnt<=bit_cnt;endelsebit_cnt<=11'd0;
end
状态机 :每个状态该干什么,怎么转移
修改里面的命令和转态就可以移植到其他的地方了。
//三段式状态机
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)current_state<=IDLE;elsecurrent_state<=next_state;
endalways @(*)begincase(current_state)IDLE: beginif(spi_start&&spi_cmd==WEL_CMD)next_state=WEL;else if(spi_start&&spi_cmd==C_ERA_CMD)next_state=C_ERA;else if(spi_start&&spi_cmd==S_ERA_CMD)next_state=S_ERA;else if(spi_start&&spi_cmd==READ_CMD)next_state=READ;else if(spi_start&&spi_cmd==WRITE_CMD)next_state=WRITE;else if(spi_start&&spi_cmd==R_STA_REG_CMD)next_state=R_STA_REG;elsenext_state=IDLE;endWEL: beginif(stdone&&bit_cnt>=8)next_state=IDLE;elsenext_state=WEL;endS_ERA: beginif(stdone)next_state=IDLE;elsenext_state=S_ERA;endC_ERA: begin if(stdone)next_state=IDLE;elsenext_state=C_ERA;endREAD: begin if(stdone&&bit_cnt>=8)next_state=IDLE;elsenext_state=READ;endWRITE: begin if(stdone&&bit_cnt>=8)next_state=IDLE;elsenext_state=WRITE;endR_STA_REG: begin if(stdone)next_state=IDLE;elsenext_state=R_STA_REG;enddefault: next_state=IDLE; endcase
endalways @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n) beginspi_cs<=1'b1;spi_clk<=1'b0;spi_clk0<=1'b0;spi_mosi<=1'b0; stdone<=1'b0; endelse begincase(current_state)IDLE: beginspi_cs<=1'b1;spi_clk<=1'b0;spi_mosi<=1'b0; endWEL: beginstdone<=1'b0;spi_cs<=1'b0;if(dely_cnt==1&&bit_cnt<8) begin spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=cmd_buffer[7];endelse if(bit_cnt==8&&clk_cnt==0)beginstdone<=1'b1;spi_clk<=1'b0; spi_mosi<=1'b0; endelse if(bit_cnt==8&&clk_cnt==1)beginspi_cs<=1'b1; endendC_ERA: beginstdone<=1'b0;if(dely_state_cnt==10) spi_cs<=1'b0;else if(dely_cnt==1&&bit_cnt<8) begin spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=cmd_buffer[7];endelse if(bit_cnt==8&&clk_cnt==0)beginstdone<=1'b1; spi_clk<=1'b0;spi_mosi<=1'b0; endelse if(bit_cnt==8&&clk_cnt==1)beginspi_cs<=1'b1; endendS_ERA: beginstdone<=1'b0; if(dely_state_cnt==10) spi_cs<=1'b0;else if(dely_cnt==1&&bit_cnt<8) begin spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=cmd_buffer[7];endelse if(bit_cnt>=8&&bit_cnt<32&&spi_cs==0)beginspi_cs<=1'b0;spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=addr_buffer[23];endelse if(bit_cnt==32&&clk_cnt==0) beginspi_cs<=1'b1;spi_clk<=1'b0;spi_mosi<=1'b0;stdone<=1'b1;endendREAD: beginstdone<=1'b0;if(dely_state_cnt==10) spi_cs<=1'b0;else if(dely_cnt==1&&bit_cnt<8) begin spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=cmd_buffer[7];endelse if(bit_cnt>=8&&bit_cnt<32&&spi_cs==0)begin spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=addr_buffer[23];endelse if(bit_cnt>=32&&bit_cnt<2080)begin spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=1'b0; endelse if(bit_cnt==2080&&clk_cnt==0) begin spi_clk<=1'b0;spi_mosi<=1'b0;stdone<=1'b1; endelse if(bit_cnt==2080&&clk_cnt==1) beginspi_cs<=1'b1;endendWRITE: beginstdone<=1'b0;if(dely_state_cnt==10) spi_cs<=1'b0;else if(dely_cnt==1&&bit_cnt<8) begin spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=cmd_buffer[7];endelse if(bit_cnt>=8&&bit_cnt<32&&spi_cs==0)begin spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=addr_buffer[23];endelse if(bit_cnt>=32&&bit_cnt<2080)begin spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=data_buffer[7];endelse if(bit_cnt==2080&&clk_cnt==0) beginspi_clk<=1'b0;spi_mosi<=1'b0;stdone<=1'b1;endelse if(bit_cnt==2080&&clk_cnt==1) beginspi_cs<=1'b1;endendR_STA_REG:begin stdone<=1'b0;if(dely_state_cnt==10) spi_cs<=1'b0;else if(dely_cnt==1&&bit_cnt<8)begin spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=cmd_buffer[7];endelse if(bit_cnt==8)begin spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=1'b0; end else if(~spi_miso&&bit_cnt%8==0)beginspi_clk<=1'b0;spi_cs<=1'b1;stdone<=1'b1;endelse if(~spi_cs&&dely_cnt==1)beginspi_clk0<=~spi_clk0;spi_clk<=spi_clk0;end end default: beginstdone<=1'b0;spi_cs<=1'b1;spi_clk<=1'b0;spi_clk0<=1'b0;spi_mosi<=1'b0; endendcaseend
endendmodule
2. SPI协议的使用
首先系统开始运行,来几个周期延伸。
spi_start信号只是一个周期脉冲。
idel_flag_r是进入空闲状态的标志位也就是意味着上一步操作完成。
cmd计数指令不断加来切换不同的命令。
spi_cmd 输出命令
module flash_rw(input sys_clk ,input sys_rst_n ,input idel_flag_r ,input w_data_req ,output reg[3:0 ] cmd_cnt ,output reg spi_start ,//spi开启使能。output reg[7:0 ] spi_cmd ,output reg[7:0 ] spi_data );//指令集
parameter WEL_CMD =16'h06;
parameter S_ERA_CMD =16'h20;
parameter C_ERA_CMD =16'hc7;
parameter READ_CMD =16'h03;
parameter WRITE_CMD =16'h02;
parameter R_STA_REG_CMD=8'h05 ;//reg define
reg[3:0] flash_start;//SPI 要写入的数据
always @(posedge sys_clk or negedge sys_rst_n )beginif(!sys_rst_n)flash_start<=0;else if(flash_start<=5)flash_start<=flash_start+1;elseflash_start<=flash_start;
endalways @(posedge sys_clk or negedge sys_rst_n )beginif(!sys_rst_n)cmd_cnt<=0;else if(flash_start==4)spi_start<=1'b1;else if(idel_flag_r&&cmd_cnt<10)begincmd_cnt<=cmd_cnt+1;spi_start<=1'b1;endelse begincmd_cnt<=cmd_cnt;spi_start<=1'b0;end
endalways @(posedge sys_clk or negedge sys_rst_n )beginif(!sys_rst_n)spi_data<=8'd0;else if(w_data_req)spi_data<=spi_data+1'b1;elsespi_data<=spi_data;
endalways @(*)begincase(cmd_cnt)0:spi_cmd=WEL_CMD;1:spi_cmd=C_ERA_CMD;2:spi_cmd=R_STA_REG_CMD;3:spi_cmd=WEL_CMD;4:spi_cmd=WRITE_CMD;5:spi_cmd=R_STA_REG_CMD;6:spi_cmd=READ_CMD;7:spi_cmd=WEL_CMD;8:spi_cmd=S_ERA_CMD;9:spi_cmd=R_STA_REG_CMD;10:spi_cmd=READ_CMD;default:;endcase
endendmodule
相关文章:

FPGA模块——SPI协议(读写FLASH)
FPGA模块——SPI协议(读写FLASH) (1)FLASH芯片 W25Q16BV(2)SPI协议(3)芯片部分命令1.Write Enable(06h)2.Chip Erase (C7h / 60h)3.写指令(02h&am…...

SQL自学通之表达式条件语句与运算
目录 一、目标 二、表达式条件语句 1、表达式: 2、条件 2.1、WHERE 子句 三、运算 1、数值型运算: 1.1、加法() 1.2、减法 (-) 1.3、除法(/) 1.4、乘法 (*) 1.5、取模 (%) 优先级别…...

公网域名如何解析到内网IP服务器——快解析域名映射外网访问
在本地搭建主机应用后,由于没有公网IP或没有公网路由权限,在需要发布互联网时,就需要用到外网访问内网的一些方案。由于内网IP在外网不能直接访问,通常就用通过外网域名来访问内网的方法。那么,公网域名如何解析到内网…...

线程安全与并发区别
在并发编程中,"线程安全 "和 "并发 "是相关的概念,但它们有着不同的含义。 线程安全 如果一个类或方法可以同时被多个线程使用,而不会导致数据损坏或意外行为,那么这个类或方法就被认为是线程安全的。即使多…...

SEO优化是什么,如何进行SEO优化
SEO(Search Engine Optimization)是指通过对网站进行优化,提高其在搜索引擎中的排名,从而增加有机流量和改善用户体验的一系列技术和方法。 进行SEO优化可以帮助网站获得更多的有机搜索流量,并提升网站的曝光度和可见…...

nodejs发起http或https请求
前言:使用node内置模块http、https http请求 const express require(express) const http require(http)const app express()const loginConfig (token) > {return {hostname: api.test.com,port: 80,path: /test?access_token${token},method: GET} }app.…...

举例C#使用特性排除某些类成员不参与XML序列化和反序列化
在C#中,可以使用 [XmlIgnore] 特性来排除某些类成员不参与XML序列化和反序列化。这个特性告诉XML序列化器忽略被标记的成员。 以下是一个使用 [XmlIgnore] 特性的示例: using System; using System.IO; using System.Xml.Serialization;public class P…...

PHP基础 - 输入输出
在 PHP 中,有多种方法可以用来输出内容。下面是其中的几种: 1、echo: 这是最常见的输出语句之一,可以输出一个或多个字符串。它是一个语言结构,可以省略括号。使用示例如下: <?php // 使用 echo 语句输出一个字符串 echo "Hello, world!\n";// 可以使用…...

大创项目推荐 交通目标检测-行人车辆检测流量计数 - 大创项目推荐
文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测?1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计…...

利用R语言heatmap.2函数进行聚类并画热图
数据聚类然后展示聚类热图是生物信息中组学数据分析的常用方法,在R语言中有很多函数可以实现,譬如heatmap,kmeans等,除此外还有一个用得比较多的就是heatmap.2。最近在网上看到一个笔记文章关于《一步一步学heatmap.2函数》,在此与…...

伦茨科技宣布ST17H6x芯片已通过Apple Find My「查找」认证
深圳市伦茨科技有限公司(以下简称“伦茨科技”)发布ST17H6x Soc平台。成为继Nordic之后全球第二家取得Apple Find My「查找」认证的芯片厂家,该平台提供可通过Apple Find My认证的Apple查找(Find My)功能集成解决方案。…...

nodejs微信小程序+python+PHP的游戏测评网站设计与实现-计算机毕业设计推荐
目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…...

在 JavaScript 中导入和导出 Excel XLSX 文件:SpreadJS
在 JavaScript 中导入和导出 Excel XLSX 文件 2023 年 12 月 5 日 使用 MESCIUS 的 SpreadJS 将完整的 JavaScript 电子表格添加到您的企业应用程序中。 SpreadJS 是一个完整的企业 JavaScript 电子表格解决方案,用于创建财务报告和仪表板、预算和预测模型、科学、工…...

【Pytorch】Fizz Buzz
文章目录 1 数据编码2 网络搭建3 网络配置,训练4 结果预测5 翻车现场 学习参考来自: Fizz Buzz in Tensorflowhttps://github.com/wmn7/ML_Practice/tree/master/2019_06_10Fizz Buzz in Pytorch I need you to print the numbers from 1 to 100, excep…...

C++ Primer Plus第十四章笔记
目录 1.包含对象成员的类 valarray类简介 1.2 Student类的设计 1.3 接口和实现 1.4 C和约束 2. 私有继承 2.1 私有继承和组合的异同 2.2 初始化基类组件 2.3 访问基类的方法 2.4 访问基类对象 2.5 访问基类的友元函数 2.5 使用组合还是私有继承 3. 保护继承 4. 使…...

CentOS 7 mini 运行环境搭建与测试——CentOS Mini 安装ifconfig工具【云原生开发部署实践笔记】
云原生开发部署实践笔记 一、开发测试环境搭建与测试 1.1 Linux运行环境的搭建与测试 虽然CentOS已经更新到Stream 9 版本,但基于大多数企业和单位多数使用CentOS 7版本作为运行底座,7版本也一直在更行维护,此实践基于CentOS 7 Mini版本搭…...

案例061:基于微信小程序的互助学习系统
文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…...

【ELK03】ES 索引的Mapping映射详解、数据类型和settings属性设置
一、ES 索引的映射和设置 1.MAPPING 映射(MAPPING)就是es中一个决定了文档如何存储,如何生成索引,字段各种类型定义的过程.类似于我们在关系型数据库中创建一个表格数据之前先定义表格有哪些字段,每个字段是什么类型,然后数据会按照这个配置写入表格,ES中同样是这个过程,它由…...

线性代数入门与学习笔记
该内容为重拾部分线性代数知识的学习笔记,内容上更多的是为了解决问题而学习的内容,并非系统化的学习。 针对的问题为:Music算法推导求解过程中的矩阵计算知识。 学习的内容包括:矩阵原理、矩阵行列式、矩阵的秩、线性变换矩阵变换…...

Linux安全学习路标
1. 操作系统基础知识 首先,你需要建立坚实的操作系统基础知识,包括Linux文件系统和目录结构、Linux进程管理、权限管理等基本概念。 2. 网络和通信安全 学习关于网络和通信安全的基础知识,包括TCP/IP协议栈、网络攻击类型、防火墙配置、网…...

常见的中间件--消息队列中间件测试点
最近刷题,看到了有问中间件的题目,于是整理了一些中间件的知识,大多是在小破站上的笔记,仅供大家参考~ 主要分为七个部分来分享: 一、常见的中间件 二、什么是队列? 三、常见消息队列MQ的比较 四、队列…...

【USRP】5G / 6G OAI 系统 5g / 6G OAI system
面向5G/6G科研应用 USRP专门用于5G/6G产品的原型开发与验证。该系统可以在实验室搭建一个真实的5G 网络,基于开源的代码,专为科研用户设计。 软件无线电架构,构建真实5G移动通信系统 X410 采用了目前流行的异构式系统,融合了FP…...

ubuntu20.04设置开机自启动jar(依赖其他服务)
目的: 有的时候我们的项目是部署在物理机上给其他公司员工使用,对于他们来说操作越简单越好。所以我需要实现将我的jar部署在ubuntu上,实现开机自启。(我的项目依赖emqx服务)。 步骤: 切换到system目录 …...

【GEE笔记】在线分类流程,标注样本点、分类和精度评价
GEE在线分类流程 介绍 GEE(Google Earth Engine)是一个强大的地理信息处理平台,可以实现在线的遥感影像分析和处理。本文将介绍如何使用GEE进行在线的分类流程,包括标注样本点、分类和精度评价。本文以2020年5月至8月的哨兵2影像…...

MATLAB基础运算
矩阵和数字相乘 就是矩阵里面每个元素跟这个数字乘一遍 矩阵和矩阵相乘 能不能相乘,需要前面矩阵的列数等于后面矩阵的行数,出来的矩阵大小是前面矩阵的行数*后面矩阵的列数。 所以大家会发现,矩阵相乘如果前后调转了,结果会完全…...

Linux DAC权限的简单应用
Linux的DAC(Discretionary Access Control)权限模型是一种常见的访问控制机制,它用于管理文件和目录的访问权限。作为一名经验丰富的Linux系统安全工程师,我会尽可能以简单明了的方式向计算机小白介绍Linux DAC权限模型。 在Linu…...

JVS低代码表单引擎:数据校验与处理的先锋
随着信息技术的迅速发展,数据校验与处理已经成为了各类应用中不可或缺的一环。尤其是在涉及敏感信息,如密码处理时,其安全性和准确性显得尤为重要。JVS低代码表单引擎提供了强大的文本组件触发逻辑校验功能,它能够在用户填写数据的…...

clickhouse删除partition分区数据
clickhouse分布式表tencent_table_20231208_DIST,本地表tencent_table_20231208_local; 30台clickhouse存储服务器; 本地表:tencent_table_20231208_local CREATE TABLE tencent_sz.tencent_table_20231208_local (id Int64 DEFA…...

持续集成交付CICD:CentOS 7 安装 Nexus 3.63
目录 一、实验 1.CentOS 7 安装Nexus3.63 二、问题 1.安装Nexus报错 2.Nexus启动停止相关命令 一、实验 1.CentOS 7 安装Nexus3.63 (1)当前操作系统版本&JDK版本 cat /etc/redhat-releasejava -version(2)下载Nexus新…...

Apache Flink(十):Flink集群基础环境搭建-JDK及MySQL搭建
🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录...