FPGA project : flash_read

实验目标:

flash的普通读指令,在指定地址开始读。可以更改地址与读的数据个数。

先发送读指令+扇区地址+页地址+字节地址。

然后读数据。再把读到的串行数据转化为8bit的数据,存入fifo。

然后读出FIFO中数据,通过uart_tx模块发送给上位机。

经验总结:

接收数据:比如接收8bit的串行数据,通过miso传递。

1,先接收高位。

reg         [7:0]        data ;

那么通过data保存miso传递的数据,把串行数据,转换为并行数据。

有两种常用写法:

data <= {data[6:0],miso};

或者

data <= data << 1 + miso ;

或者:写一个cnt_bit,记录保存到第几bit。

data[cnt_bit] <= miso ;

2,先接收低位

data <= {miso,data[7:1]};

data[cnt_bit] <= miso ;

小技巧:

画时序图时不一定要先画内部信号,再画输出端口信号。

按照自己的设计思路,该到那个信号就画那个信号,画完也不要改,

写代码时,按照这个思路,这个画时序图的顺序,编写代码。

相当于再次检查一遍,即容易排错,有容易编写代码。

状态机:

模块框图:

时序图: 

代码: 

module spi (input       wire            sys_clk     ,input       wire            sys_rst_n   ,input       wire            key_flag    ,input       wire            miso        ,output      reg             cs_n        ,output      reg             sck         ,output      reg             mosi        ,output      reg             po_flag     ,output      wire    [7:0]   po_data     
);// localparam define 一般状态机的状态定义用局部参数就可以。localparam  IDLE     = 4'b0001 ,INSTRUCT = 4'b0010 ,READ     = 4'b0100 ,SEND     = 4'b1000 ;// parameter define  指令,计数器最大值,用全局参数定义。parameter   COMD_REA = 8'h03 , // comd_readADDR_SEC = 8'h00 , // address_secter 扇区地址ADDR_PAG = 8'h00 , // address_page   页地址(行地址)ADDR_BYT = 8'h00 , // assress_byte   字节地址NUM_COMD = 4'd4  ; // 用来记录在指令状态传递指令和地址byte数量parameter   CNT_MAX_BYTE = 11'd300   , // 4 + 要读出的数据。例如: 4 + 256CNT_MAX_SEND = 20'd53000 ;// reg signal define reg     [3:0]       state_c   ;reg     [3:0]       state_n   ;reg                 cnt_20_ns ;reg     [2:0]       cnt_bit   ;reg     [10:0]      cnt_byte  ;reg                 flag_b    ; // flag_bytereg                 flagBreg  ;reg                 flag_R_S  ; // flag_bytereg                 flag_RSr  ;reg     [7:0]       datInFifo ; // data_in_fiforeg                 flag_data ; // flag_data 采样标志信号reg                 flaInFifo ; // flag_in_fiforeg     [19:0]      cnt_send  ; // uart_tx模块发送1byte数据的等待时间。reg                 flaSenEnd ; // 计数器cnt_send计数到CNT_MAX_SEND - 2 拉高一个时钟周期,reg                 flag_out_fifo_reg ;// wire signal definewire                empty     ;wire                full      ;wire                flaOutFif ; // flag_out_fifo  wire    [9:0]       usedw     ; // fifo中存储的数据量   wire                IDLEtoINSTRUCT  ;wire                INSTRUCTto_READ ;wire                READtoSEND      ;wire                SENDtoIDLE      ; 
/**********************************************************************/// // reg signal describe /*******状态机采用三段式描述*******/// reg     [3:0]       state_c   ;// reg     [3:0]       state_n   ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) state_c <= IDLE ;else state_c <= state_n ;endalways @(*) begincase (state_c)IDLE     :  if(IDLEtoINSTRUCT)state_n <= INSTRUCT ;else state_n <= IDLE ;INSTRUCT :  if(INSTRUCTto_READ)state_n <= READ ;else state_n <= INSTRUCT ;READ     :  if(READtoSEND)state_n <= SEND ;else state_n <= READ ;SEND     :  if(SENDtoIDLE)state_n <= IDLE ;else state_n <= SEND ;default:        state_n <= IDLE ;endcaseendassign   IDLEtoINSTRUCT  = (state_c == IDLE    ) && (key_flag) ;assign   INSTRUCTto_READ = (state_c == INSTRUCT) && (flagBreg) ; // 指令的的最后1byte发送完毕assign   READtoSEND      = (state_c == READ    ) && (flag_RSr) ; // 读完想要的最后1byteassign   SENDtoIDLE      = (state_c == SEND    ) && (flaSenEnd && empty) ;// reg                 cnt_20_ns ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)cnt_20_ns <= 1'b0 ;else if(state_c == INSTRUCT || state_c == READ)cnt_20_ns <= cnt_20_ns + 1'b1 ;else if(state_c != INSTRUCT || state_c != READ)cnt_20_ns <= 1'b0 ;else cnt_20_ns <= 1'b0 ;end// reg     [2:0]       cnt_bit   ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)cnt_bit <=3'd0 ;elsecase (state_c)IDLE    :   cnt_bit <=3'd0 ;INSTRUCT:   if(!cnt_20_ns && sck && cnt_bit == 7)  cnt_bit <= 3'd0 ;else if(!cnt_20_ns && sck)cnt_bit <= cnt_bit + 1'b1 ;READ    :   if(!cnt_20_ns && sck && cnt_bit == 7)  cnt_bit <= 3'd0 ;else if(!cnt_20_ns && sck)cnt_bit <= cnt_bit + 1'b1 ;SEND    :   cnt_bit <=3'd0 ;default :   cnt_bit <=3'd0 ; endcaseend// reg     [10:0]       cnt_byte  ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)cnt_byte <= 4'd0 ;else if(cnt_bit == 7 && cnt_byte == CNT_MAX_BYTE - 1 && !cnt_20_ns && sck)cnt_byte <= 4'd0 ;else if(cnt_bit == 7 && !cnt_20_ns && sck)cnt_byte <= cnt_byte + 1'b1 ;else cnt_byte <= cnt_byte ;end// reg                 flag_R_S  ;// reg                 flag_b    ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginflag_b   <= 1'b0 ;flag_R_S <= 1'b0 ;endelsecase (state_c)IDLE    :   beginflag_b <= 1'b0 ;flag_R_S <= 1'b0 ;end         INSTRUCT:   begin if((cnt_byte == NUM_COMD - 1) && (cnt_bit == 7) && !cnt_20_ns && sck)flag_b <= 1'b1 ;else flag_b <= flag_b ;flag_R_S <= 1'b0 ;endREAD    :   beginif(cnt_byte == NUM_COMD)flag_R_S <= 1'b0 ;else if((cnt_byte == CNT_MAX_BYTE - 1) && (cnt_bit == 7) && !cnt_20_ns && sck)flag_R_S <= 1'b1 ;flag_b <= 1'b0 ;endSEND    :   beginflag_b <= 1'b0 ;flag_R_S <= 1'b0 ;end default :   beginflag_b <= 1'b0 ;flag_R_S <= 1'b0 ;end endcase end// reg                 flagBreg  ;// reg                 flag_RSr  ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)flagBreg <= 1'b0 ;else flagBreg <= flag_b ;endalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)flag_RSr <= 1'b0 ;else flag_RSr <= flag_R_S ;end// reg     [7:0]       datInFifo ; // data_in_fifoalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) datInFifo <= 1'b0 ;else if(flag_data)datInFifo <= {miso,datInFifo[7:1]}; // 读flash中数据,先传的低位。else datInFifo <= datInFifo ;end// reg                 flag_data ; // flag_data 采样标志信号always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)flag_data <= 1'b0 ;else if(state_c == READ) beginif(cnt_20_ns && !sck)flag_data <= 1'b1 ;else flag_data <= 1'b0 ;end else beginflag_data <= 1'b0 ;endend// reg                 flaInFifo ; // flag_in_fifoalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)flaInFifo <= 1'b0 ;else if(state_c == READ && cnt_bit == 7 && flag_data)flaInFifo <= 1'b1 ;else flaInFifo <= 1'b0 ;end// reg     [19:0]      cnt_send  ; // uart_tx模块发送1byte数据的等待时间。always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) cnt_send <= 20'd0 ;else if(state_c == SEND) beginif(cnt_send == CNT_MAX_SEND - 1) cnt_send <= 20'd0 ;else cnt_send <= cnt_send + 1'b1 ;endelse cnt_send <= 20'd0 ;end//     reg                 flag_out_fifo_reg ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)flag_out_fifo_reg <= 1'b0 ;else if(flaSenEnd && !empty)flag_out_fifo_reg <= 1'b1 ;else flag_out_fifo_reg <= 1'b0 ;end//     reg                 flaSenEnd ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) flaSenEnd <= 1'b0 ;else if(cnt_send == CNT_MAX_SEND - 2)flaSenEnd <= 1'b1 ;else flaSenEnd <= 1'b0 ;end// output signal describe// cs_n        ,always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)cs_n <= 1'b1 ;else case (state_c)IDLE    :   if(key_flag)cs_n <= 1'b0 ;else cs_n <= cs_n ;INSTRUCT:   cs_n <= cs_n ;READ    :   cs_n <= cs_n ;SEND    :   cs_n <= 1'b1 ;default :   cs_n <= 1'b1 ;endcaseend// sck         ,always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) sck <= 1'b0 ;else case (state_c)IDLE    :   sck <= 1'b0 ; INSTRUCT:   if(cnt_20_ns)sck <= ~sck ;else sck <= sck  ;READ    :   if(cnt_20_ns)sck <= ~sck ;else sck <=  sck ;SEND    :   sck <= 1'b0 ; default :   sck <= 1'b0 ; endcaseend// mosi        ,always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginmosi <= 1'b0 ;end else begincase (state_c)IDLE    :   mosi <= 1'b0 ;INSTRUCT:   case (cnt_byte)0   :   if(cnt_bit == 0)mosi <= COMD_REA[7] ;else if(cnt_20_ns && sck)mosi <= COMD_REA[7 - cnt_bit] ;else mosi <= mosi ;1   :   if(cnt_bit == 0)mosi <= ADDR_SEC[7] ;else if(cnt_20_ns && sck)mosi <= ADDR_SEC[7 - cnt_bit] ;else mosi <= mosi ;2   :   if(cnt_bit == 0)mosi <= ADDR_PAG[7] ;else if(cnt_20_ns && sck)mosi <= ADDR_PAG[7 - cnt_bit] ;else mosi <= mosi ;3   :   if(cnt_bit == 0)mosi <= ADDR_BYT[7] ;else if(cnt_20_ns && sck)mosi <= ADDR_BYT[7 - cnt_bit] ;else mosi <= mosi ;default :   mosi <= 1'b0 ;endcaseREAD    :   mosi <= 1'b0 ;SEND    :   mosi <= 1'b0 ;default :   mosi <= 1'b0 ;endcaseendend// po_flag     ,always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)po_flag <= 1'b0 ;else po_flag <= flag_out_fifo_reg ;end// wire     [7:0]    po_data ;// 直接连接到fifo的输出端口。     // */
/***********************例化FIFO***************************************/assign flaOutFif = flag_out_fifo_reg ;
fifo_1024x8 fifo_1024x8_inst(.clock              ( sys_clk   ) ,.data               ( datInFifo ) ,.rdreq              ( flaOutFif ) ,.wrreq              ( flaInFifo ) ,.empty              ( empty     ) ,.full               ( full      ) ,.q                  ( po_data   ) ,.usedw              ( usedw     )
);endmodule
module top (input       wire            sys_clk   ,input       wire            sys_rst_n ,input       wire            key_in    ,input       wire            miso      ,output      wire            cs_n      ,output      wire            sck       ,output      wire            mosi      ,output      wire            tx        
);// 例化间连线wire            key_flag ;wire            po_flag  ;wire    [7:0]   po_data  ;key_filter key_filter_isnt(.sys_clk                ( sys_clk    ) ,.sys_rst_n              ( sys_rst_n  ) ,.key_in                 ( key_in     ) ,.key_out                ( key_flag   )  
);spi spi_inst(.sys_clk                ( sys_clk   ) ,.sys_rst_n              ( sys_rst_n ) ,.key_flag               ( key_flag  ) ,.miso                   ( miso      ) , .cs_n                   ( cs_n      ) ,.sck                    ( sck       ) ,.mosi                   ( mosi      ) ,.po_flag                ( po_flag   ) ,.po_data                ( po_data   ) 
);uart_tx uart_tx_isnt(.sys_clk                ( sys_clk   ) ,.sys_rst_n              ( sys_rst_n ) ,.pi_flag                ( po_flag   ) ,.pi_data                ( po_data   ) ,.tx                     ( tx        )
);endmodule

 

module key_filter
#(parameter MAX_CNT_20MS = 20'd100_0000 
)(input           wire    sys_clk     ,input           wire    sys_rst_n   ,input           wire    key_in      ,output          wire    key_out        
);reg     key_r_0 ;reg     key_r_1 ;wire    nege    ;wire    pose    ;reg     [19:00]     cnt_20ms     ;wire                add_cnt_20ms ;wire                end_cnt_20ms ;reg                 add_cnt_flag ;// key_r_0 key_r_1 always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginkey_r_0 <= 1'b1 ;end else beginkey_r_0 <= key_in ;endendalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginkey_r_1 <= 1'b1 ;end else beginkey_r_1 <= key_r_0 ;endend// nege poseassign nege = ~key_r_0 &&  key_r_1 ;assign pose =  key_r_0 && ~key_r_1 ;// add_cnt_flagalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginadd_cnt_flag <= 1'b0 ;end else beginif(nege) beginadd_cnt_flag <= 1'b1 ;end else beginif( pose || end_cnt_20ms ) beginadd_cnt_flag <= 1'b0 ;end else beginadd_cnt_flag <= add_cnt_flag ;endend endend// cnt_20ms add_cnt_20ms end_cnt_20msalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) begincnt_20ms <= 20'd0 ;end else beginif(add_cnt_20ms) beginif(end_cnt_20ms) begincnt_20ms <= 20'd0 ;end else begincnt_20ms <= cnt_20ms + 20'd1 ;endend else begincnt_20ms <= 20'd0 ;endendendassign add_cnt_20ms = add_cnt_flag ;assign end_cnt_20ms = add_cnt_20ms && cnt_20ms == ( MAX_CNT_20MS - 1'b1 ) ;// key_out// always @(posedge sys_clk or negedge sys_rst_n) begin// // always @(*) begin // 这样的话 会综合成 数据选择器//     if(~sys_rst_n) begin//         key_out <= 1'b0 ;//     end else begin//         if(end_cnt_20ms) begin//             key_out <= 1'b1 ;//         end else begin//             key_out <= 1'b0 ;//         end//     end// endassign key_out = end_cnt_20ms ;
endmodule

 

module uart_tx (input       wire            sys_clk     ,input       wire            sys_rst_n   ,input       wire            pi_flag     ,input       wire    [7:0]   pi_data     ,output      reg             tx          
);// parameterparameter   SUB_1K   = 1000           , // 缩减第十位,空闲位的时间。CLK_UART = 50_000_000     ,BPS      = 9600           ;localparam  MAX_BPS  = CLK_UART / BPS ;// reg signal definereg             pi_flag_reg1 ;reg     [ 7:0]  pi_data_reg1 ;reg             work_en      ;reg     [12:0]  cnt_bps      ;reg     [ 3:0]  cnt_bit      ;reg             bit_flag     ;/**********************************************/// reg             pi_flag_reg1 ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)pi_flag_reg1 <= 1'b0 ;else pi_flag_reg1 <= pi_flag ;end// reg             pi_data_reg1 ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)pi_data_reg1 <= 8'd0 ;else pi_data_reg1 <= pi_data ;end// reg             work_en      ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) work_en <= 1'b0 ;else if(((cnt_bit == 4'd0) && pi_flag_reg1) || (cnt_bit == 4'd9) && (bit_flag))work_en <= ~work_en ;else work_en <= work_en ;end// reg     [12:0]  cnt_bps      ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)cnt_bps <= 13'd0 ;else if(work_en && cnt_bps == MAX_BPS - 1) // 波特率计数器计数到最大值。cnt_bps <= 13'd0 ;else if(work_en)cnt_bps <= cnt_bps + 1'b1 ;else cnt_bps <= 13'd0 ;end// reg             bit_flag     ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)bit_flag <= 1'b0 ;else if((work_en && cnt_bps == MAX_BPS - 1) || (work_en && cnt_bps == MAX_BPS - SUB_1K && cnt_bit == 9))bit_flag <= 1'b1 ;else bit_flag <= 1'b0 ;end// reg     [ 3:0]  cnt_bit      ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)cnt_bit <= 4'd0 ;else if(work_en && bit_flag && cnt_bit == 4'd9) // 传递完第十位,位计数器要归零。cnt_bit <= 4'd0 ;else if(work_en && bit_flag)cnt_bit <= cnt_bit + 1'b1 ;else if(work_en)cnt_bit <= cnt_bit ;else cnt_bit <= 4'd0 ;end/****************************************/// output signal// txalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) tx <= 1'b1 ;else if(work_en) begincase (cnt_bit)0  : tx <= 1'b0 ;1  : tx <= pi_data_reg1[0] ; // 先发最低位。2  : tx <= pi_data_reg1[1] ;3  : tx <= pi_data_reg1[2] ;4  : tx <= pi_data_reg1[3] ;5  : tx <= pi_data_reg1[4] ;6  : tx <= pi_data_reg1[5] ;7  : tx <= pi_data_reg1[6] ;8  : tx <= pi_data_reg1[7] ;9  : tx <= 1'b1 ;default: tx <= 1'b1 ;endcase   end else begintx <= 1'b1 ;endend
endmodule

 

`timescale 1ns/1nsmodule  test_spi();reg             sys_clk     ;reg             sys_rst_n   ;reg             key_flag    ;wire            miso        ;wire            cs_n        ;wire            sck         ;wire            mosi        ;wire            po_flag     ;wire    [7:0]   po_data     ;defparam memory.mem_access.initfile = "initmemory.txt"; defparam spi_inst.CNT_MAX_SEND = 100 ;m25p16 memory (.c          ( sck      ) , .data_in    ( mosi     ) , .s          ( cs_n     ) , .w          ( 1'b1     ) , .hold       ( 1'b1     ) , .data_out   ( miso     )
);
spi spi_inst(.sys_clk                ( sys_clk   ) ,.sys_rst_n              ( sys_rst_n ) ,.key_flag               ( key_flag  ) ,.miso                   ( miso      ) ,.cs_n                   ( cs_n      ) ,.sck                    ( sck       ) ,.mosi                   ( mosi      ) ,.po_flag                ( po_flag   ) ,.po_data                ( po_data   ) 
);parameter   CYCLE = 20 ;initial beginsys_clk     = 1'b1  ;sys_rst_n  <= 1'b0  ;key_flag   <= 1'b0  ;#(CYCLE)            ;sys_rst_n  <= 1'b1  ;#(CYCLE*10)         ;#(CYCLE * 100)      ;key_flag   <= 1'b1  ;#(CYCLE)            ;key_flag   <= 1'b0  ;endalways #(CYCLE/2) sys_clk = ~sys_clk ;endmodule

 仿真波形:

上版验证通过。 

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

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

相关文章

Redis分布式锁最牛逼的实现(Java 版,最牛逼的实现方式)

写在前面的话 分布式锁一般有三种实现方式&#xff1a;1. 数据库乐观锁&#xff1b;2. 基于Redis的分布式锁&#xff1b;3. 基于ZooKeeper的分布式锁。 本篇博客将介绍第二种方式&#xff0c;基于Redis实现分布式锁。 为什么需要分布式锁&#xff1f; 在单机环境下编写多线…

【使用 TensorFlow 2】03/3 创建自定义损失函数

一、说明 TensorFlow 2发布已经接近5年时间&#xff0c;不仅继承了Keras快速上手和易于使用的特性&#xff0c;同时还扩展了原有Keras所不支持的分布式训练的特性。3大设计原则&#xff1a;简化概念&#xff0c;海纳百川&#xff0c;构建生态.这是本系列的第三部分&#xff0c;…

Python数据挖掘项目实战——自动售货机销售数据分析

摘要&#xff1a;本案例将主要结合自动售货机的实际情况&#xff0c;对销售的历史数据进行处理&#xff0c;利用pyecharts库、Matplotlib库进行可视化分析&#xff0c;并对未来4周商品的销售额进行预测&#xff0c;从而为企业制定相应的自动售货机市场需求分析及销售建议提供参…

2、vscode c++ 项目配置调试及运行

文章目录 1、项目布局2、多项目管理2.1 先是一个总的CMakeLists.txt2.2 每个项目2.3 多版本OPENCV 3、调试和运行 接上一篇文章&#xff0c;vscode和cmake的c环境配置好以后&#xff0c;我们要写项目&#xff0c;再写对应的CMakeLists.txt 1、项目布局 . ├── bin ├── bu…

jmeter实现webservice接口测试

其实可以用jmeter两种sampler进行webservice的测试&#xff1a; 1、SOAP/XML-RPC Request(但是在jmeter3.2以后版本中已经取消了这个取样器) 2、HTTP请求 下面分别介绍两种方式 一、首先需要使用soupUI工具抓取webservice接口的部分需要的信息。 1、新建项目 2、新建成功的…

怎么修改linux的root@后面的名称

文章目录 场景.登录服务器,root后面的名称是随机的,想自定义名称建议,直接使用命令执行需要重启机子 场景.登录服务器,root后面的名称是随机的,想自定义名称 建议,直接使用命令执行 hostnamectl set-hostname rdd-test重新连接即可生效,实际也是修改了/etc/hostname名称 需要…

十三、前端开发知识快速入门

目录 一、HTML概述和基本结构1.1 概述1.2 基本结构1.3 html文档类型1.4 html注释 二、HTML常用标签2.1 块标签2.2 行内标签2.3 字符实体2.4 图片标签2.5 链接标签2.6 列表标签2.7 表单2.8 表格 三、页面布局四、CSS样式4.1 基本语法和页面引用4.2 文本样式设置4.3 颜色表示法4.…

中国陆地生态系统服务价值空间分布数据集

简介&#xff1a; 中国陆地生态系统服务价值空间分布产品是以全国陆地生态系统类型遥感分类为基础&#xff0c;生态系统类型包括&#xff1a;旱地、农田、针叶林、针阔混交林、阔叶林、灌木林、草原、灌草丛、草甸、湿地、荒漠、裸地、水系、冰川积雪、人工表面&#xff08;包…

B端产品需求分析的思路和方法 4大方面

需求分析对产品成功和客户满意度至关重要&#xff0c;它帮助团队深入了解用户需求&#xff0c;优化用户体验&#xff0c;减少开发中的需求变更&#xff0c;降低开发风险。如果缺乏产品分析&#xff0c;容易造成产品定位不准确&#xff0c;用户体验不佳&#xff0c;不能满足用户…

迷你Ceph集群搭建(超低配设备)

我的博客原文链接&#xff1a;https://blog.gcc.ac.cn/post/2023/%E8%BF%B7%E4%BD%A0ceph%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA/ 环境 机器列表&#xff1a; IP角色说明10.0.0.15osdARMv7&#xff0c;512M内存&#xff0c;32G存储&#xff0c;百兆网口10.0.0.16clientARM64…

【C语言】atoi函数的模拟

atoi对于初学者来说大概率是一个陌生的函数 但不要害怕&#xff0c;我们可以通过各种网站去查询 例如&#xff1a; cplusplus就是一个很好的查询网站 目录 函数介绍模拟实现需要注意的点 函数介绍 我们发现这是一个将字符串转换为整形数字的函数 例如&#xff1a; int main()…

C++类和对象(下)

目录 一、初始化列表 二、单参构造参数和explicit关键字 三、匿名对象 四、static成员 五、友元 六、内部类 一、初始化列表 之前我们在构造函数中写得还不错&#xff0c;也没发现什么问题&#xff0c;为什么C还有搞一个初始化列表呢&#xff1f; 如下这段代码&#x…

FPGA project : sobel

实验目标&#xff1a; sobel算法&#xff0c;处理100X100灰度图像&#xff1a;野火logo 边缘检测&#xff1a; 边缘检测&#xff0c;针对的是灰度图像&#xff0c;顾名思义&#xff0c;检测图像的边缘&#xff0c;是针对图像像素点的一种计算&#xff0c;目的是标识数字图像…

vue3学习(二)--- ref和reactive

文章目录 ref1.1 ref将基础类型和对象类型数据转为响应式1.2 ref()获取id元素1.3 isRef reactive1.1 reactive()将引用类型数据转为响应式数据&#xff0c;基本类型无效1.2 ref和reactive的联系 toRef 和 toRefs1.1 如果原始对象是非响应式的就不会更新视图 数据是会变的 ref …

点燃市场热情,让产品风靡全球——实用推广策略大揭秘!

文章目录 一、实用推广策略的重要性1. 提高产品知名度和认可度2. 拓展产品市场和用户群体3. 增强企业品牌形象和市场竞争力 二、实用推广策略的种类1. 社交媒体推广2. 定向推广3. 口碑营销4. 内容推广 三、实用推广策略的实施步骤1. 研究目标用户和市场需求&#xff0c;明确产品…

大数据NoSQL数据库HBase集群部署

目录 1. 简介 2. 安装 1. HBase依赖Zookeeper、JDK、Hadoop&#xff08;HDFS&#xff09;&#xff0c;请确保已经完成前面 2. 【node1执行】下载HBase安装包 3. 【node1执行】&#xff0c;修改配置文件&#xff0c;修改conf/hbase-env.sh文件 4. 【node1执行】&#xf…

第14章总结:lambda表达式与处理

14.1&#xff1a; lambada表达式 14.1.1&#xff1a;lambada表达式简介 无参数 package fourteen; interface SayhHi{ String say();//抽象方法接口 } public class NoParamDemo { public static void main(String[] args) { //无参数 …

【AI视野·今日Robot 机器人论文速览 第五十二期】Wed, 11 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Wed, 11 Oct 2023 Totally 31 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers RoboHive: A Unified Framework for Robot Learning Authors Vikash Kumar, Rutav Shah, Gaoyue Zhou, Vincent Moens, Vittor…

SAP MM学习笔记35 - 请求书照合中的差额处理(发票扣减,受入)

SAP中&#xff0c;请求书照合之后&#xff0c;发现不一致&#xff0c;就会支付保留。 支付保留&#xff0c;可以参考如下文章。 SAP MM学习笔记34 - 请求书照合中的支付保留&#xff08;发票冻结&#xff09;_东京老树根的博客-CSDN博客 即使支付保留之后暂时不付钱&#xff…

外卖跑腿系统开发的最佳实践和成功案例

外卖跑腿系统的开发既涉及技术实现&#xff0c;也需要考虑用户体验、运营策略和合规性。以下是一些最佳实践和一些成功的案例&#xff0c;以帮助您更好地理解这个领域的要点。 1. 技术框架的选择 选择适合的技术框架是外卖跑腿系统成功的关键。您可以考虑使用以下技术&#…