Xilinx FPGA:vivado SPI实现FLASH通信

news2024/9/17 9:02:27
一、实验要求

        要求使用SPI协议实现对flash芯片的页编程、读操作、页擦除等功能。

二、模块划分

大概的时序图:

三、程序设计
(1)接收端模块
`timescale 1ns / 1ps
module uart_rx(
   input                    sys_clk   ,
   input                    rst_n     ,
   (* MARK_DEBUG="true" *)input                    rx_data   ,
   (* MARK_DEBUG="true" *)output    reg[7:0]       uart_data ,
   (* MARK_DEBUG="true" *)output    reg            rx_done  
    );
    parameter               SYSCLK = 50_000_000 ;
    parameter               Baud   = 115200     ; 
    parameter               COUNT  = SYSCLK/Baud;
    parameter               MID    = COUNT/2    ;
    
    ///start_flag
    reg             rx_reg1 ;
    reg             rx_reg2 ;
    (* MARK_DEBUG="true" *)wire            start_flag ;
    
    always@(posedge sys_clk )
         if(!rst_n)begin
            rx_reg1 <= 1 ;
            rx_reg2 <= 1 ;
         end
         else
             begin
                  rx_reg1 <= rx_data  ;
                  rx_reg2 <= rx_reg1  ;
             end
    assign  start_flag = ~rx_reg1 & rx_reg2 ;
    
    /rx_flag
    (* MARK_DEBUG="true" *)reg               rx_flag  ;
    (* MARK_DEBUG="true" *)reg[4:0]          cnt_bit  ;
    (* MARK_DEBUG="true" *)reg[9:0]          cnt      ;
    
    always@(posedge sys_clk )
         if(!rst_n)
            rx_flag <= 0 ;
         else if ( start_flag == 1 )
            rx_flag <= 1 ;
         else if ( cnt_bit == 10 && cnt == MID - 1 )
            rx_flag <= 0 ;
         else
            rx_flag <= rx_flag ;
    
    //cnt
    always@(posedge sys_clk )
         if(!rst_n)
            cnt <= 0 ;
         else if ( rx_flag == 1 )begin
              if ( cnt == COUNT - 1 )
                   cnt <= 0 ;
              else
                   cnt <= cnt +1 ;
         end
         else
         cnt <= 0 ;
  
  /cnt_bit
    always@(posedge sys_clk )
         if(!rst_n)
            cnt_bit <= 0 ;
         else if ( rx_flag == 1 )begin
              if ( cnt == COUNT - 1 )begin
                  if( cnt_bit == 10 )
                      cnt_bit <= 0 ;
                  else
                      cnt_bit <= cnt_bit +1 ;
              end
              else
              cnt_bit <= cnt_bit ;
         end
         else
         cnt_bit <= 0 ;
         
         
            
  
  ///data_reg                         
     (* MARK_DEBUG="true" *)reg[8:0]         data_reg  ;  //data_reg:01234567 [8]
     always@(posedge sys_clk )     //cnt_bit:[0]12345678[9][10]
          if(!rst_n)
             data_reg <= 0 ;
          else if ( rx_flag == 1 )begin
               if ( cnt_bit > 0 && cnt_bit < 10 && cnt == MID - 1)
                    data_reg[cnt_bit - 1 ] <= rx_data  ;
               else
                    data_reg <= data_reg  ;
          end
          else
          data_reg <= 0 ;
 
 check
   (* MARK_DEBUG="true" *)reg                  check   ;
   always@(posedge sys_clk )
        if(!rst_n)
           check <= 0 ;
        else if ( rx_flag == 1 )begin
             if ( cnt_bit == 10 )
                 check <= ^data_reg  ;
             else
                 check <= 0 ;
        end
        else
        check <= 0 ;
 
 uart_data
 parameter            MODE_CHECK = 0 ;
 
    always@(posedge sys_clk )
         if(!rst_n)
            uart_data <= 0 ;
         else if ( rx_flag == 1 )begin
              if ( cnt_bit == 10 && cnt == 10 && check == MODE_CHECK)
                   uart_data <= data_reg[7:0] ;
              else
                   uart_data <= uart_data  ;
         end
         else
         uart_data <= uart_data  ;
 
 rx_done
 
     always@(posedge sys_clk )
          if(!rst_n)
             rx_done <= 0 ;
          else if ( rx_flag == 1 )begin
               if ( cnt_bit == 10 && cnt == MID/2 - 1 )
                    rx_done <= 1 ;
               else
                    rx_done <= 0 ;
          end
          else
          rx_done <= 0 ;
        
 
 

    
endmodule
(2)cmd模块
`timescale 1ns / 1ps
长度 指令 地址 数据
/* 这个模块的功能是把接收到的数据放在寄存器里,这个模块的功能也可以由fifo和ram完成

*/
module cmd_data(
    input                      clk      ,
    input                      rst_n    ,
    (* MARK_DEBUG="true" *)input       [7:0]          data_in  ,
    (* MARK_DEBUG="true" *)input                      rx_done  ,
    (* MARK_DEBUG="true" *)output     reg             spi_start,
    (* MARK_DEBUG="true" *)output     reg [7:0]       cmd      ,
    (* MARK_DEBUG="true" *)output     reg [7:0]       length   ,//长度
    (* MARK_DEBUG="true" *)output     reg [23:0]      addr     ,//地址
    (* MARK_DEBUG="true" *)output     reg [7:0]       data_out 
    );
    parameter               idle  =   1  ;
    parameter               s0    =   2  ;//长度
    parameter               s1    =   3  ;//指令
    parameter               s2    =   4  ;//地址
    parameter               s3    =   5  ;//地址
    parameter               s4    =   6  ;//地址
    parameter               s5    =   7  ;//数据
    
    (* MARK_DEBUG="true" *)reg[3:0]                 cur_state    ;
    (* MARK_DEBUG="true" *)reg[3:0]                 next_state   ;
    
    state1
    always@(posedge clk)
         if(!rst_n)
            cur_state <= idle ;
         else
            cur_state <= next_state ;
    
    ///state2
    always@(*)
           case(cur_state)
                idle :
                      begin
                           if ( rx_done )//长度
                                next_state = s0 ;
                           else 
                                next_state = cur_state ;
                      end
                s0   :
                      begin
                           if ( rx_done )//指令
                                next_state = s1 ;
                           else
                                next_state = cur_state ;
                      end
                s1   :
                      begin
                           if ( rx_done )//地址
                                next_state = s2 ;
                           else
                                next_state = cur_state ;
                      end
                s2   :
                      begin
                           if ( rx_done )//地址
                                next_state = s3 ;
                           else
                                next_state = cur_state ;
                      end
                s3   :
                      begin
                           if ( rx_done )//地址
                                next_state = s4 ;
                           else
                                next_state = cur_state ;
                      end
                s4   :
                      begin
                           if ( rx_done )//数据
                                next_state = s5 ;
                           else
                                next_state = cur_state ;
                      end
                s5   :          next_state = idle ;
   
           default:next_state = idle ;
           endcase

    //state3
    always@(posedge clk )
         if(!rst_n)begin
            spi_start <= 0 ;
            cmd       <= 0 ;
            length    <= 0 ;
            addr      <= 0 ;
            data_out  <= 0 ;
         end
         else
             case(cur_state)
                  idle :
                        begin
                             spi_start <= 0 ; 
                             cmd       <= cmd ;
                             addr      <= addr ;
                             data_out  <= data_out ;
                             if ( rx_done )
                                  length <= data_in ;
                             else
                                  length <= length ;
                        end
                  s0   :
                        begin
                             spi_start <= 0        ;
                             length    <= length   ;
                             addr      <= addr     ;///其他保持不变避免自动清零
                             data_out  <= data_out ;
                             if ( rx_done )
                                  cmd <= data_in ;
                             else
                                  cmd <= cmd ;
                        end
                  s1   :
                        begin
                             spi_start <= 0        ;
                             length    <= length   ;
                             data_out  <= data_out ; 
                             cmd       <= cmd      ;
                             if ( rx_done )
                                  addr[23:16] <= data_in ;
                             else
                                  addr <= addr ;
                        end
                  s2   :
                        begin
                             spi_start <= 0        ;
                             length    <= length   ;
                             data_out  <= data_out ; 
                             cmd       <= cmd      ;
                             if ( rx_done )
                                  addr[15:8] <= data_in ;
                             else
                                  addr <= addr ;
                        end
                  s3   :
                        begin
                             spi_start <= 0        ;
                             length    <= length   ;
                             data_out  <= data_out ; 
                             cmd       <= cmd      ;
                             if ( rx_done )
                                  addr[7:0] <= data_in ;
                             else
                                  addr <= addr ;
                        end
                  s4   :
                        begin
                             spi_start <= 0        ; 
                             length    <= length   ; 
                             cmd       <= cmd      ;
                             addr      <= addr     ;
                             if ( rx_done )
                                  data_out <= data_in ;
                             else
                                  data_out <= data_out ;
                         end 
                  s5   :
                        begin
                             spi_start <= 1        ;
                             cmd       <= cmd      ;
                             length    <= length   ;
                             addr      <= addr     ;
                             data_out  <= data_out ;
                        end
             default:   begin
                             spi_start <= 0 ;
                             cmd       <= cmd      ;
                             length    <= length   ;
                             addr      <= addr     ;
                             data_out  <= data_out ;
                        end
             endcase
            
    
    
    
    
endmodule
(3)send_data模块
`timescale 1ns / 1ps
/*
将数据发送给主机
指令 地址 数据是不能直接给主机模块的
长度可以直接给主机
*/
module send_data(
    input                   clk      ,
    input                   rst_n    ,
    (* MARK_DEBUG="true" *)input       [7:0]       cmd      ,
    (* MARK_DEBUG="true" *)input       [23:0]      addr     ,
    (* MARK_DEBUG="true" *)input       [7:0]       data_in  ,
    (* MARK_DEBUG="true" *)input                   done_bit ,///传输完一个字节的结束信号
    (* MARK_DEBUG="true" *)input                   done     ,SPI传输完一次数据的结束信号
    (* MARK_DEBUG="true" *)output      reg[7:0]    data_spi 
    );
    parameter              idle = 1 ;
    parameter              s0   = 2 ;
    parameter              s1   = 3 ;
    parameter              s2   = 4 ;
    parameter              s3   = 5 ;
    parameter              s4   = 6 ;
    
    (* MARK_DEBUG="true" *)reg[3:0]                cur_state  ;
    (* MARK_DEBUG="true" *)reg[3:0]                next_state ;
    
    ///state1
    always@(posedge clk )
         if(!rst_n)
            cur_state <= idle ;
         else
            cur_state <= next_state ;
    
    state2
    always@(*)
          case(cur_state)
               idle :   next_state = s0 ;
               s0   :
                     begin
                          if ( done_bit )
                               next_state = s1 ;
                          else if ( done )
                               next_state = idle ;   ///不加这个信号的话后面发送数据会锁在s1状态
                          else
                               next_state = cur_state ;
                     end
               s1   :
                     begin
                          if ( done_bit )
                               next_state = s2 ;
                          else if ( done )
                               next_state = idle ;
                          else
                               next_state = cur_state ;
                     end
               s2   :
                     begin
                          if ( done_bit )
                               next_state = s3 ;
                          else if ( done )
                               next_state = idle ;
                          else
                               next_state = cur_state ;
                     end
               s3   :
                     begin
                          if ( done_bit )
                               next_state = s4 ;
                          else if ( done )
                               next_state = idle ;
                          else
                               next_state = cur_state ;
                     end
               s4   :
                     begin
                          if ( done_bit )
                               next_state = idle ;
                          else if ( done )
                               next_state = idle ;
                          else
                               next_state = cur_state ;
                     end
          default:next_state = idle ;
          endcase

    //state3
    always@(posedge clk )
         if(!rst_n)
            data_spi <= 0 ;
         else
             case(cur_state)
                  idle :  data_spi <= 0           ;  
                  s0   :  data_spi <= cmd         ;
                  s1   :  data_spi <= addr[23:16] ;
                  s2   :  data_spi <= addr[15:8]  ;
                  s3   :  data_spi <= addr[7:0]   ;
                  s4   :  data_spi <= data_in     ;
             default:data_spi <= 0 ;
             endcase
    
    
    
    

endmodule
(4)SPI_Master模块
`timescale 1ns / 1ps
module 
SPI_Master #(
//    parameter               all_bit  = 16  ,
    parameter               data_LEN = 8   ,
    parameter               data_bit = 8   ,
    parameter               delay    = 8     
)
(
    (* MARK_DEBUG="true" *)input                           clk            ,
    (* MARK_DEBUG="true" *)input                           rst_n          ,
    (* MARK_DEBUG="true" *)input                           spi_start      ,
    (* MARK_DEBUG="true" *)input                           miso           ,
    (* MARK_DEBUG="true" *)input       [7:0]               data_in        ,
    (* MARK_DEBUG="true" *)input       [data_LEN-1:0]      data_len       ,
    (* MARK_DEBUG="true" *)output      reg                 mosi           ,
    (* MARK_DEBUG="true" *)output      reg                 done           ,整体的结束信号
    (* MARK_DEBUG="true" *)output      reg[data_bit -1:0]  data_out_tx    ,
    (* MARK_DEBUG="true" *)output      reg                 sck            ,
    (* MARK_DEBUG="true" *)output      reg                 cs             ,
    (* MARK_DEBUG="true" *)output                          done_bit     字节的结束信号
);
//    localparam               data_in = 16'b0011_1101_0000_0000     ;
//    localparam               data_len = 2 ; 
    
//    localparam               data_in = 16'b0011_1101    ;
//    localparam               data_len = 1 ; 


    ///状态机/
    (* MARK_DEBUG="true" *)reg[31:0]           cnt_sck     ;
    (* MARK_DEBUG="true" *)reg[31:0]           cnt_bit     ;
    (* MARK_DEBUG="true" *)reg[2:0]            cur_state   ;
    (* MARK_DEBUG="true" *)reg[2:0]            next_state  ;
    
    localparam          IDLE  =  0       ;
    localparam          s0    =  1       ;
    localparam          s1    =  2       ;
    localparam          s2    =  3       ;   
    
    /state1
    always@(posedge clk )
         if(!rst_n)
            cur_state <= IDLE ;
         else
            cur_state <= next_state ;
    
    ///state2
    always@(*)
            case(cur_state)
                 IDLE :
                        begin
                             if ( spi_start == 1 )
                                  next_state <= s0 ;
                             else
                                  next_state <= cur_state ;
                        end
                 s0   :
                        begin
                             if ( cnt_sck == 1 )
                                  next_state = s1 ;
                             else
                                  next_state = cur_state ;
                        end
                 s1   :
                        begin
                             if ( (cnt_bit+1)/8 == data_len && cnt_sck == delay -1 )
                                   next_state = s2 ;
                             else
                                   next_state = cur_state ;
                        end
                 s2   :
                        begin
                            if ( cnt_sck == delay -1 )
                                 next_state = IDLE ;
                            else
                                 next_state = cur_state ;
                        end
            default:next_state = IDLE;
            endcase

    state3
    always@(posedge clk )
         if(!rst_n)begin
            cnt_bit <= 0 ;
            cnt_sck <= 0 ;
            mosi    <= 0 ;
            sck     <= 0 ;
            cs      <= 1 ;
            data_out_tx<= 0 ;
            done    <= 0 ;
         end
         else begin
               case (cur_state)
                     IDLE  :
                            begin
                                cnt_bit <= 0 ; 
                                cnt_sck <= 0 ; 
                                mosi    <= 0 ; 
                                sck     <= 0 ; 
                                cs      <= 1 ; 
                                data_out_tx<= data_out_tx ; 
                                done    <= 0 ; 
                            end
                     s0    :
                            begin
                                cnt_bit <= 0 ;  
                                mosi    <= 0 ; 
                                sck     <= 0 ; 
                                cs      <= 0 ; 
                                data_out_tx<= 0 ; 
                                done    <= 0 ; 
                                cnt_sck
                                if ( cnt_sck == delay -1 )  
                                     cnt_sck <= 0 ;         
                                else                        
                                     cnt_sck <= cnt_sck +1 ;
                                
                            end
                     s1    :
                            begin
                                cs      <= 0 ; 
                                done    <= 0 ; 
                                /cnt_sck
                                if ( cnt_sck == delay -1 )
                                     cnt_sck <= 0 ;
                                else
                                     cnt_sck <= cnt_sck +1 ;
                                /sck 
                                if ( cnt_sck == delay/2 -1 || cnt_sck == delay -1 )
                                     sck <= ~sck ;
                                else
                                     sck <= sck ;
                                /cnt_bit  
                                if ( cnt_sck == delay -1 )begin
                                     if ( cnt_bit == data_len*data_bit -1 )
                                          cnt_bit <= 0 ;
                                     else
                                          cnt_bit <= cnt_bit +1 ;
                                end
                                else
                                cnt_bit <= cnt_bit ;
                                //mosi
                                if ( cnt_sck == 2 )
//                                     mosi <= data_in [ (data_len*data_bit - 1) - cnt_bit ] ;
                                     mosi <= data_in [ 7 -(cnt_bit)%8 ] ;根据data_in的不同进行调整
                                else
                                     mosi <= mosi ;    
                                /data_out
                                if ( cnt_sck == delay -2 )/上升沿采集数据  
                                     data_out_tx <= { data_out_tx [data_bit-2:0] , miso }   ;
                                else
                                     data_out_tx <= data_out_tx ;              
                            end
                     s2    :
                            begin
                                cnt_bit <= 0 ; 
                                mosi    <= 0 ;  
                                cs      <= 1 ; 
                                sck     <= 0 ;
                                data_out_tx<= data_out_tx ; 
                                /cnt_sck
                                if ( cnt_sck == delay -1 )
                                     cnt_sck <= 0 ;
                                else
                                     cnt_sck <= cnt_sck +1 ;
                                ///sck
//                                if ( cnt_sck == delay/2 -1 || cnt_sck == delay -1 )
//                                     sck <= ~sck ;
//                                else
//                                     sck <= sck ;
                                done
                                if ( cnt_sck == delay -1 )
                                     done <= 1 ;
                                else
                                     done <= 0 ;
                            end
               default:    begin
                                cnt_bit <= 0 ; 
                                cnt_sck <= 0 ; 
                                mosi    <= 0 ; 
                                sck     <= sck ; 
                                cs      <= 1 ; 
                                data_out_tx<= data_out_tx ; 
                                done    <= 0 ; 
                            end
               endcase
         end
            
   assign   done_bit = ( cnt_bit %8 == 7 && cnt_sck == delay -1 )?1:0 ;
    
    
endmodule
(5)发送端模块
`timescale 1ns / 1ps
module uart_tx(
    input                 sys_clk   ,
    input                 rst_n     ,
    input                 tx_start  ,
    input     [7:0]       rd_data   ,
    output    reg         tx_data   ,
    output    reg         tx_done
    );
    parameter            SYSCLK = 50_000_000 ;
    parameter            Baud   = 115200     ;
    parameter            COUNT  = SYSCLK/Baud;
    parameter            MID    = COUNT/2    ;
    
 
    
    //start_flag
    reg              tx_reg1 ;
    reg              tx_reg2 ;
    wire             start_flag ;
    
    always@(posedge sys_clk )
         if(!rst_n)begin
            tx_reg1 <= 0 ;
            tx_reg2 <= 0 ;
         end
         else
             begin
                  tx_reg1 <= tx_start ;
                  tx_reg2 <= tx_reg1  ;
             end
   assign start_flag = tx_reg1 & ~tx_reg2 ;
   
   //tx_flag
   reg              tx_flag  ;
   reg [9:0]        cnt      ;
   reg [4:0]        cnt_bit  ; //0 12345678 9 10 
   
   always@(posedge sys_clk )
        if(!rst_n)
           tx_flag <= 0 ;
        else if ( start_flag )
           tx_flag <= 1 ;
        else if ( cnt == COUNT -1 && cnt_bit == 10 )
           tx_flag <= 0 ;
        else
           tx_flag <= tx_flag ;
   
   //cnt
   always@(posedge sys_clk )
        if(!rst_n)
           cnt <= 0 ;
        else if ( tx_flag )begin
             if ( cnt == COUNT -1 )
                  cnt <= 0 ;
             else
                  cnt <= cnt +1 ;
        end
        else
        cnt <= 0 ;
   
   //cnt_bit 
     always@(posedge sys_clk )
          if(!rst_n)
             cnt_bit <= 0 ;
          else if ( tx_flag )begin
               if ( cnt == COUNT -1 )begin
                   if ( cnt_bit == 10 )
                        cnt_bit <= 0 ;
                   else
                        cnt_bit <= cnt_bit +1 ;
               end
               else
               cnt_bit <= cnt_bit ;
          end
          else
          cnt_bit <= 0 ;
   
   
       //寄存rd_data     rd_data随着cur_state变为STOP后清零,在uart_tx模块
    //中,cnt_bit == 0 的时候可以捕捉到数据
    reg[7:0]              data_reg  ;
    always@(posedge sys_clk )
         if(!rst_n)
            data_reg <= 0 ;
         else if ( tx_flag )begin
              if ( cnt_bit == 0 && cnt == MID -1 )
                  data_reg <= rd_data ;
              else
                  data_reg <= data_reg ;
         end
         else
         data_reg <= data_reg ;
   
     
   
   //tx_data
   parameter                  MODE_CHECK = 0 ;
   always@(posedge sys_clk )
        if(!rst_n)                  //cnt_bit: 0 12345678 9 10
            tx_data <= 0 ;          //rd_data: 01234567
        else if ( tx_flag )begin
             if ( cnt_bit > 0 && cnt_bit <9 )
                  tx_data <= data_reg [ cnt_bit -1 ] ;
             else if ( cnt_bit == 0 )
                  tx_data <= 0 ;
             else if ( cnt_bit == 10 )
                  tx_data <= 1 ;
             else if ( cnt_bit == 9 )
                  tx_data <= (MODE_CHECK == 0 )? ^rd_data : ~^rd_data ;
             else
                  tx_data <= tx_data ;                
        end
        else
        tx_data <= 1 ;
    
    //tx_done 
    always@(posedge sys_clk )
         if(!rst_n)
            tx_done <= 0 ;
         else if ( tx_flag )begin
              if ( cnt == COUNT -1 && cnt_bit == 10 )
                   tx_done <= 1 ;
              else
                   tx_done <= 0 ;
         end
         else
         tx_done <= 0 ;
            
   
   
   
            
    
    
    
    
endmodule
(6)引脚分配
set_property PACKAGE_PIN K17 [get_ports clk]
set_property PACKAGE_PIN P20 [get_ports cs]
set_property PACKAGE_PIN T20 [get_ports miso]
set_property PACKAGE_PIN V20 [get_ports mosi]
set_property PACKAGE_PIN M20 [get_ports rst_n]
set_property PACKAGE_PIN U15 [get_ports rx_data]
set_property PACKAGE_PIN U20 [get_ports sck]
set_property PACKAGE_PIN W15 [get_ports tx_data]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports cs]
set_property IOSTANDARD LVCMOS33 [get_ports miso]
set_property IOSTANDARD LVCMOS33 [get_ports mosi]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rx_data]
set_property IOSTANDARD LVCMOS33 [get_ports sck]
set_property IOSTANDARD LVCMOS33 [get_ports tx_data]
四、实验结果

FLASH指令集(用到的已经用红框标出来了):

(1)打开写使能

返回FF,捕捉到波形

(2)打开读状态寄存器

返回值02表示打开成功

(3)写入数据

  向01这个地址里面写入22    返回FF

(4)读出

返回刚才写入的数字22

(5)擦除

(6)读出

经过刚才的擦除操作,从000001这个地址里看能否读出来数,读不出来就表示擦除成功

返回FF,擦除成功

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

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

相关文章

Mongodb新增文档、查询文档、更新文档、删除文档

文章目录 1、新增文档1.1、进入容器1.2、向集合插入一个新文档1.3、查询文档1.4、向集合插入一个或者多个文档 2、查询文档2.1、查询年龄等于202.2、查询年龄是20的男性2.3、查询年龄是20或者性别是男2.4、查询年龄小于232.5、查询年龄小于等于232.6、查询大于等于232.7、查询年…

新型蜜罐有哪些?未来方向如何?

前言&#xff1a;技术发展为时代带来变革&#xff0c;同时技术创新性对蜜罐产生推动力。 一、新型蜜罐的诞生 技术发展为时代带来变革&#xff0c;同时技术创新性对蜜罐产生推动力&#xff0c;通过借鉴不同技术思想、方法&#xff0c;与其它技术结合形成优势互补&#xff0c;…

Docker 搭建 Minio 容器

Docker 搭建 Minio 容器 (完整详细版) 简介&#xff1a; Minio 是一个基于Apache License v2.0开源协议的对象存储服务&#xff0c;虽然轻量&#xff0c;却拥有着不错的性能。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据。 例如图片、视频、日…

CentOS通过rsync实现文件同步(daemon方式)

rsync介绍 rsync是Liunx下的远程数据同步工具&#xff0c;可快速同步多台服务器间的文件和目录&#xff0c;并可实现增量同步以减少数据的传输。 rsync有两种常用的认证方式&#xff0c;一种是rsync-daemon方式&#xff0c;另外一种是ssh方式。 daemon 方式与 ssh 方式相比有…

Nginx代理路径被吃

Nginx代理路径被吃的情况 日常工作中经常使用nginx反向代理一些资源&#xff0c;有时正常代理&#xff0c;发现代理不过去。 验证被吃调location情况 通过浏览器访问&#xff1a; https://zhao138969.com/LinuxPackage/Python/SelectDocker location /LinuxPackage { proxy…

深度学习Day-27:生成对抗网络(GAN)入门

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 要求&#xff1a; 了解什么是生成对抗网络生成对抗网络结构是怎么样的学习本文代码&#xff0c;并跑通代码调用训练好…

【MeterSphere】3.X备份与还原

目录 一、手动备份数据库 二、备份 minio 目录 三、自动备份 3.1 设置备份服务器 3.2 创建文件夹 msdb_bak 3.3 设置备份脚本 3.4 创建用于定时任务脚本文件 3.5 为msdb_bak赋权 3.6 执行 install_ms_backup.sh 3.7 查看定时任务是否成功 四、还原数据 4.1 还原 s…

LinkedHashSet底层原理

LinkedHashSet 的特点 去重&#xff1a;不允许重复的元素&#xff0c;类似于 HashSet。有序&#xff1a;能够记住元素的插入顺序&#xff0c;类似于 LinkedList。性能&#xff1a;具有较好的平均时间复杂度&#xff0c;如添加、删除和查找操作通常都是 O(1)。 内部实现 数据…

Java全栈课程之Linux——进程管理

一、什么是进程 1、在Linux中,每一个程序都是有自己的一个进程,每一个进程都有一个id号! 2、每一个进程呢,都会有一个父进程! 3、进程可以有两种存在方式:前台!后台运行! 4、一般的话服务都是后台运行的,基本的程序都是前台运行的! 二、命令 ps 查看当前系统中正在执行的…

航空客运订票系统(数据结构与算法课设)(C语言版)

本文为数据结构与算法课设《航空客运订票系统》的分享与实践,采用了顺序表和链表两种数据结构。贴近生活采用了系统选择来区别用户和管理员。 目录 1.设计内容与要求 2.功能实现和程序调试 功能实现 函数原型清单 程序调试 3.代码实现 (1)结构体定义 (2)管理员菜单…

若依开发平台数据权限设计与实现深度剖析

概述 在之前的博客《数据权限的设计与思考》中&#xff0c;我们对软件系统的数据权限进行了全面的梳理。接下来&#xff0c;本文深度剖析主流开源的若依开发平台数据权限是怎么设计与实现的。 平台展示 在角色管理菜单中&#xff0c;在角色列表中选择一个具体角色&#xff…

【C++】实验十二

题目&#xff1a; 1、事先编好程序&#xff0c;上机调试和运行程序&#xff0c;分析结果。 将教材第11章例11.1的程序片段补充和改写成一个完整、正确的程序&#xff0c;用公用继承方式。在程序中包括输入数据的函数&#xff0c;在程序运行时输入num&#xff0c;name&#xf…

人工智能与机器学习原理精解【11】

文章目录 广义线性模型基础理论泊松分布的基本公式一、基本公式二、泊松分布的特点三、泊松分布的应用场景四、泊松分布与二项分布的关系五、总结 泊松回归例子1例子背景模型设定数据收集模型拟合结果解释预测应用场景 泊松回归例子2背景数据准备模型设定模型拟合结果解释预测 …

红外视觉简介:近红外图像与中远红外图像

在本教程中,您将学习红外成像的基础知识,包括: 什么是红外图像:近红外与中远红外红外摄像机的类型它们有什么用处什么是红外图像?近红外图像 在开始处理这种奇怪的图像之前,我们应该了解它们的来源。 我们都熟悉常见的数字彩色可见图片(图 1,左),因为我们每年都会用…

“华数杯”全国大学生数学建模竞赛含金量如何?

“华数杯”全国大学生数学建模竞赛是由华中师范大学主办的一项全国性的大学生数学建模竞赛。该竞赛旨在提高大学生的数学建模能力和实践能力,增强大学生的创新意识和团队协作精神。 搜集一些评价,有人说该竞赛的含金量较高,但是也有一些人认为其认可度不高,报名费用较贵。…

【漏洞复现】华天动力OA downloadWpsFile.jsp 任意文件读取漏洞

0x01 产品简介 华天动力OA是一款将先进的管理思想、 管理模式和软件技术、网络技术相结合&#xff0c;为用户提供了低成本、 高效能的协同办公和管理平台。 0x02 漏洞概述 华天动力OA downloadWpsFile.jsp 接口处存在任意文件读取漏洞&#xff0c;未经身份认证的攻击者可利用…

springboot民办高校科研项目管理系统-计算机毕业设计源码54009

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

Chat2DB新推Chat2Excel,让数据对话跃然纸上

Excel 智能问答 Chat2Excel 1. 创建新聊天 点击左侧AI对话&#xff0c;进入对话界面。点击加号""按钮以开始一个新的对话。 新建对话选择表格类型, 选择上传excel文档。 双击对话名称可以修改对话名称。现在我们就可以开始针对于Excel进行智能问答了。 2. 智能…

小程序开发_02项目构成

一、项目的基本结构 二、小程序的页面组成部分 三、json配置文件 ① project.config.json文件 作用&#xff1a;项目的配置文件&#xff0c;用来记录对小程序开发工具所作的个性化配置 ② sitemap.json 作用&#xff1a;是否允许被微信引擎搜索,不希望被搜索dis ③ app.jso…

Pycharm打开 .xlsx文件 使用系统自带的软件

问题由来 最初默认是使用自带的软件打开 同事电脑默认打开方式是pycharm&#xff0c;有点不好弄&#xff0c;希望打开方式是默认系统默认&#xff1b; 自己尝试修改了一下自己的.xlsx打开方式&#xff0c;无法解决同事问题&#xff0c;后删除默认&#xff0c;自己电脑就出现乱码…