FPGA project : fifo_sum

news2024/11/18 19:41:20

实验目标:

col(列) = 4 ;line(行) = 5。相邻三行,按列求和。输出新的数据流。

实现方法:

通过rs232通信协议,输入数据流。第一行存进fifo1,第二行存进fifo2.当输入第三行第一个数据的时候,从fifo1和ffo2中读数据,并于当前输入数据相加,并输出结果与标志信号。

设计中注意的事情:

1,这个fifo,读写信号同时拉高,我进行功能仿真时,它是写满后,同时拉高,写不进数据。我放一张仿真图:

 所以我设计的时序图,fifo1和fifo2都是先读出数据,然后再写数据。

2,数据与标志信号在设计的时候,要注意时序上的对齐。这种小工程,仿真时,时序没问题没问题,上板子后出错,我觉得应该不是时序上的问题(亚稳态)。应该是代码的问题。

因为我在调用之前的uart_rs232模块,修改了参数,结果上板子出错了。就是这个uart模块的问题。苦恼了很久,一开始以为是fifo_sum的问题。我的写法和野火教程里是不完全一样的。

3,大于2的数字,尽量用参数parameter定义。在这方面,吃了大亏(uart模块又花了一个晚上重新写的)。

模块框图:

时序图:

 

代码: 

module uart_rx(
    input       wire            sys_clk   ,
    input       wire            sys_rst_n ,
    input       wire            rx        ,

    output      reg             po_flag   ,
    output      reg     [7:0]   po_data    
);

    // parameter
    parameter   CLK_UART = 50_000_000     ,
                BPS      = 9600           ;
    localparam  MAX_BPS  = CLK_UART / BPS ;

    // reg signal define
    reg             rx_reg1 ;
    reg             rx_reg2 ;
    reg             rx_reg3 ;
    wire            start   ;
    reg             work_en ;
    reg     [12:0]  cnt_bps ;
    reg     [ 3:0]  cnt_bit ;
    reg             bit_flag;
    reg     [ 7:0]  rx_data ; // 对rx_reg3采样,把串行数据转化为8bit并行数据。
    reg             rx_flag ; // 转化完拉高一个时钟周期。


/********************************************************/
    // reg             rx_reg1 ;
    // reg             rx_reg2 ;
    // reg             rx_reg3 ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            rx_reg1 <= 1'b1 ; // 由于空闲状态,rx是高电平。
            rx_reg2 <= 1'b1 ;
            rx_reg3 <= 1'b1 ;
        end else begin
            rx_reg1 <= rx      ;
            rx_reg2 <= rx_reg1 ;
            rx_reg3 <= rx_reg2 ;
        end
    end
    // reg             start   ; // 检测到下降沿,拉高一个sys_clk.
    assign start = ~rx_reg2 && rx_reg3 ;
    // reg             work_en ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            work_en <= 1'b0 ;
        else if((cnt_bit == 4'd0 && start) || (cnt_bit == 4'd8 && 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) begin
        if(~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) begin
        if(~sys_rst_n)
            bit_flag <= 1'b0 ;
        else if(cnt_bps == MAX_BPS - 1) // 波特率计数器的最大值
            bit_flag <= 1'b1 ;
        else 
            bit_flag <= 1'b0 ;
    end
    // reg     [ 3:0]  cnt_bit ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n)
            cnt_bit <= 4'd0 ;
        else if(bit_flag && cnt_bit == 4'd8)
            cnt_bit <= 4'd0 ;
        else if(bit_flag)
            cnt_bit <= cnt_bit + 1'b1 ;
        else 
            cnt_bit <= cnt_bit ;
    end
    // reg     [ 7:0]  rx_data ; // 对rx_reg3采样,把串行数据转化为8bit并行数据。
    // always @(posedge sys_clk or negedge sys_rst_n) begin
    //     if(~sys_rst_n)
    //         rx_data <= 8'd0 ;
    //     else if(work_en == 1'b1 && (cnt_bit >= 1) && (cnt_bps == MAX_BPS/2))
    //             rx_data <= {rx_reg3,rx_data[7:1]} ; // 由于rx是先发低位,所以rx_reg3放在前面.右移。
    //     else if(work_en == 1'b1 && (cnt_bit >= 1))
    //             rx_data <= rx_data ;
    //     else 
    //         rx_data <= rx_data ;
    // end
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n)
            rx_data <= 8'd0 ;
        else if(work_en == 1'b1 && (cnt_bit >= 1)) begin
            if(cnt_bps == MAX_BPS/2)
                rx_data <= {rx_reg3,rx_data[7:1]} ;
            else 
                rx_data <= rx_data ;
        end else begin
            rx_data <= rx_data ;
        end 
    end
    // reg             rx_flag ; // 转化完拉高一个时钟周期。
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            rx_flag <= 1'b0 ;
        else if(cnt_bit == 4'd8 && bit_flag)
            rx_flag <= 1'b1 ;
        else 
            rx_flag <= 1'b0 ; 
    end

/***********************************************************/
    // output signal
    // po_falg   ,
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            po_flag <= 1'b0 ;
        else if(rx_flag) // 可以理解为打一拍子或者使用时序逻辑采样
            po_flag <= 1'b1 ;
        else
            po_flag <= 1'b0 ;
    end
    // po_data    
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            po_data <= 8'd0 ;
        else if(rx_flag) // 可以理解为打一拍子或者使用时序逻辑采样
            po_data <= rx_data ;
        else
            po_data <= po_data ; // 可以归零,也可以保持。
    end
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          
);
    // parameter
    parameter   SUB_1K   = 1000           , // 缩减第十位,空闲位的时间。
                CLK_UART = 50_000_000     ,
                BPS      = 9600           ;
    localparam  MAX_BPS  = CLK_UART / BPS ;

    // reg signal define
    reg             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) begin
        if(~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) begin
        if(~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) begin
        if(~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) begin
        if(~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) begin
        if(~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) begin
        if(~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
    // tx
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            tx <= 1'b1 ;
        else if(work_en) begin
            case (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 begin
            tx <= 1'b1 ;
        end
    end
endmodule
module fifo_sum(
    input       wire            sys_clk     ,
    input       wire            sys_rst_n   ,
    input       wire    [7:0]   data_in     ,
    input       wire            data_flag   ,

    output      reg     [7:0]   po_data     ,
    output      reg             po_data_falg
);

    // parameter 
    parameter 	XLINE_SUM = 3 ,
                MAX_LINE  = 5 ,
                MAX_COL   = 4 ;

    // reg signal define
    reg		[7:0]	cnt_line 	;
    reg  	[7:0]	cnt_col  	;
    reg   			rdreq_r    	; // fifo1 fifo2 公用一个读使能。
    reg    			wrreq1_r 	;
    reg     [7:0]	dataF1_in_r ;
    reg    			wrreq2_r    ;
    reg     [7:0]	dataF2_in_r ;
    reg     [7:0]	data_in_reg1;
    reg     [7:0]	data_in_reg2;
    reg   			flag_sum_r  ;

    // 例化连线
    wire   			rdreq       ;
    wire    [7:0]	dataF1_in   ;
    wire  			wrreq1 		;
    wire			empty1 		;
    wire  			full1  		;
    wire    [7:0]   dataF1_out  ;
    wire  	[2:0]	usedw1 		;
    wire    [7:0]	dataF2_in   ;
    wire  			wrreq2 		;
    wire			empty2 		;
    wire  			full2  		;
    wire    [7:0]   dataF2_out  ;
    wire  	[2:0]	usedw2 		;
/*************************************************************/
    // reg [7:0] cnt_line
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n)
            cnt_line <= 8'd0 ;
        else if(data_flag && cnt_col == MAX_COL - 1 && cnt_line == MAX_LINE - 1)
            cnt_line <= 8'd0 ;
        else if(data_flag && cnt_col == MAX_COL - 1)
            cnt_line <= cnt_line + 1'b1 ;
        else 
            cnt_line <= cnt_line ;
    end
    // reg [7:0] cnt_col
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n)
            cnt_col <= 8'd0 ;
        else if(data_flag && cnt_col == MAX_COL - 1)
            cnt_col <= 8'd0 ;
        else if(data_flag)
            cnt_col <= cnt_col + 1'b1 ;
        else 
            cnt_col <= cnt_col ;
    end
    // reg   			rdreq_r    	; // fifo1 fifo2 公用一个读使能。
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n)
            rdreq_r <= 1'b0 ;
        else if(cnt_line >= XLINE_SUM - 1)
            rdreq_r <= data_flag ;
        else 
            rdreq_r <= 1'b0 ;
    end
    // reg    			wrreq1_r 	;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n)
            wrreq1_r <= 1'b0 ;
        else if(cnt_line == 0)
            wrreq1_r <= data_flag ;
        else if((cnt_line == (XLINE_SUM - 1) && cnt_col != 0) || (cnt_line > (XLINE_SUM - 1) && cnt_line <= (MAX_LINE - 2)) || (cnt_line == (MAX_LINE - 1) && cnt_col == 0))
            wrreq1_r <= wrreq2_r ;
        else 
            wrreq1_r <= 1'b0 ;
    end
    // reg     [7:0]	dataF1_in_r ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n)
            dataF1_in_r <= 8'd0 ;
        else if(cnt_line == 0)
            dataF1_in_r <= data_in ;
        else if((cnt_line >= (XLINE_SUM - 1) && cnt_line <= (MAX_LINE - 2)) || (cnt_line == (MAX_LINE - 1) && cnt_col == 0))
            dataF1_in_r <= dataF2_out ;
        else 
            dataF1_in_r <= dataF1_in_r ;
    end
    // reg    			wrreq2_r    ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n)
            wrreq2_r <= 1'b0 ;
        else if(cnt_line == 1)
            wrreq2_r <= data_flag ;
        else if((cnt_line >= (XLINE_SUM - 1) && cnt_line <= (MAX_LINE - 2)) || (cnt_line == (MAX_LINE - 1) && cnt_col == 0))
            wrreq2_r <= rdreq_r ;
    end
    // reg     [7:0]	dataF2_in_r ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n)
            dataF2_in_r <= 8'd0 ;
        else if(cnt_line == 1)
            dataF2_in_r <= data_in ;
        else if((cnt_line >= (XLINE_SUM - 1) && cnt_line <= (MAX_LINE - 2)) || (cnt_line == (MAX_LINE - 1) && cnt_col == 0))
            dataF2_in_r <= data_in_reg1 ;
        else 
            dataF2_in_r <= dataF2_in_r ;
    end
    // reg flag_sum_r ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            flag_sum_r <= 1'b0 ;
        else
            flag_sum_r <= rdreq_r ;
    end
/**********************************************************/
    // reg     [7:0]   po_data      ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n)
            po_data <= 8'd0 ;
        else if(flag_sum_r) 
            po_data <= dataF1_out + dataF2_out + data_in_reg2 ;
        else 
            po_data <= po_data ;
    end
    // reg             po_data_falg ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n)
            po_data_falg <= 1'b0 ;
        else if(flag_sum_r) 
            po_data_falg <=1'b1 ;
        else 
            po_data_falg <= 1'b0 ;
    end
    // reg     [7:0]	data_in_reg1;
    // reg     [7:0]	data_in_reg2;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            data_in_reg1 <= 8'd0 ;
            data_in_reg2 <= 8'd0 ;
        end else begin
            data_in_reg1 <= data_in      ;
            data_in_reg2 <= data_in_reg1 ;
        end
    end
/*************************************************************/
    assign	dataF1_in	= dataF1_in_r ;
    assign	wrreq1		= wrreq1_r	  ;
    assign	rdreq		= rdreq_r     ;
    assign	dataF2_in	= dataF2_in_r ;
    assign	wrreq2		= wrreq2_r	  ;

fifo_8x8 fifo_8x8_inst1( // 我测试了一下这个fifo 写满了之后读写信号同时拉高,要写的数据不会被写进去。除非有余量才能同时拉高,并且写入数据。
    .clock				( sys_clk    ) ,
    .data				( dataF1_in  ) ,
    .rdreq				( rdreq      ) ,
    .wrreq				( wrreq1     ) ,
    .empty				( empty1     ) ,
    .full				( full1      ) ,
    .q					( dataF1_out ) ,
    .usedw				( usedw1 	 )
);
fifo_8x8 fifo_8x8_inst2(  
    .clock				( sys_clk    ) ,
    .data				( dataF2_in  ) ,
    .rdreq				( rdreq      ) ,
    .wrreq				( wrreq2     ) ,
    .empty				( empty2     ) ,
    .full				( full2      ) ,
    .q					( dataF2_out ) ,
    .usedw				( usedw2 	 )
);

endmodule
module top(
    input       wire            sys_clk   ,
    input       wire            sys_rst_n ,
    input       wire            rx        ,

    output      wire            tx        
);

    // 例化间连线
    wire            po_flag   ;
    wire    [7:0]   po_data   ; 
    wire            sum_flag  ;
    wire    [7:0]   sum_data  ; 
    
uart_rx uart_rx_inst(
    .sys_clk                    ( sys_clk   ) ,
    .sys_rst_n                  ( sys_rst_n ) ,
    .rx                         ( rx        ) ,

    .po_flag                    ( po_flag   ) ,
    .po_data                    ( po_data   )    
);

fifo_sum fifo_sum_inst(
    .sys_clk                    ( sys_clk   ) ,
    .sys_rst_n                  ( sys_rst_n ) ,
    .data_in                    ( po_data   ) ,
    .data_flag                  ( po_flag   ) ,

    .po_data                    ( sum_data  ) ,
    .po_data_falg               ( sum_flag  )
);

uart_tx uart_tx_inst(
    .sys_clk                    ( sys_clk   ) ,
    .sys_rst_n                  ( sys_rst_n ) ,
    .pi_flag                    ( sum_flag  ) ,
    .pi_data                    ( sum_data  ) ,

    .tx                         ( tx        )          
);


endmodule

`timescale 1ns/1ns
module test_top();
    reg             sys_clk   ;
    reg             sys_rst_n ;
    reg             rx        ;

    wire            tx        ;
// Instantiation
top top_inst(
    .sys_clk            ( sys_clk   ) ,
    .sys_rst_n          ( sys_rst_n ) ,
    .rx                 ( rx        ) ,

    .tx                 ( tx        )          
);
    parameter CYCLE = 20 ;
    defparam  top_inst.uart_rx_inst.CLK_UART = 50_000_0 ;
    defparam  top_inst.uart_tx_inst.CLK_UART = 50_000_0 ;
    defparam  top_inst.uart_tx_inst.SUB_1K   = 10       ;
    
    task rx_bit ;
    input   [7:0]   data ;
    integer i ;
    for (i = 0;i <= 9 ;i = i  + 1 ) begin
        case (i)
            0: rx <= 1'b0 ;
            1: rx <= data[i - 1];
            2: rx <= data[i - 1];
            3: rx <= data[i - 1];
            4: rx <= data[i - 1];
            5: rx <= data[i - 1];
            6: rx <= data[i - 1];
            7: rx <= data[i - 1];
            8: rx <= data[i - 1];
            9: rx <= 1'b1 ;
            default: rx <= 1'b1 ;
        endcase
        #(CYCLE * 52) ;
    end
    endtask

    initial begin
        sys_clk    = 1'b1 ;
        sys_rst_n <= 1'b0 ;
        rx        <= 1'b1 ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ;
        #( 210 )          ;
        sys_rst_n <= 1'b0 ;
        #( 10 )           ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ;
        #( CYCLE * 100  ) ;
        rx_bit(8'd1) ;
        rx_bit(8'd1) ;
        rx_bit(8'd2) ;
        rx_bit(8'd2) ;
        rx_bit(8'd3) ;
        rx_bit(8'd3) ;
        rx_bit(8'd4) ;
        rx_bit(8'd4) ;
        rx_bit(8'd5) ;
        rx_bit(8'd5) ;
        rx_bit(8'd6) ;
        rx_bit(8'd6) ;
        rx_bit(8'd7) ;
        rx_bit(8'd7) ;
        rx_bit(8'd8) ;
        rx_bit(8'd8) ;
        rx_bit(8'd9) ;
        rx_bit(8'd9) ;
        rx_bit(8'd1) ;
        rx_bit(8'd1) ;

        
        rx_bit(8'd1) ;
        rx_bit(8'd1) ;
        rx_bit(8'd1) ;
        rx_bit(8'd1) ;

        rx_bit(8'd2) ;
        rx_bit(8'd2) ;
        rx_bit(8'd2) ;
        rx_bit(8'd2) ;

        rx_bit(8'd1) ;
        rx_bit(8'd1) ;
        rx_bit(8'd1) ;
        rx_bit(8'd1) ;

        rx_bit(8'd3) ;
        rx_bit(8'd3) ;
        rx_bit(8'd3) ;
        rx_bit(8'd3) ;

        rx_bit(8'd3) ;
        rx_bit(8'd3) ;
        rx_bit(8'd3) ;
        rx_bit(8'd3) ;

        $stop        ;
    end

    always #( CYCLE / 2 ) sys_clk = ~sys_clk ;

endmodule

 仿真波形:

忘记截图了。

上板验证:

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

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

相关文章

RHCE---作业2

文章目录 目录 文章目录 一.远程连接服务器 二.基于域名和虚目录建立网站 一.远程连接服务器 配置 ssh 免密登陆&#xff1a;客户端主机通过 redhat 用户基于秘钥验证方式进行远程连接服务器的 root 用户 #服务端关闭防火墙 [roottimeserver ~]# systemctl disable --now fir…

一文掌握Linux系统信息查看命令(CPU、内存、进程、网口、磁盘、硬件)

引言 大家好&#xff0c;欢迎来到我的技术博客&#xff01;如果你是一名Linux系统管理员、开发者或者热衷于学习Linux系统的用户&#xff0c;那么你一定需要掌握查看系统信息的命令。在这篇博客中&#xff0c;我将为你介绍一些常用的Linux命令&#xff0c;帮助你快速了解和监控…

2023年CSP-J真题详解+分析数据(选择题篇)

目录 前言 2023CSP-J江苏卷详解 小结 前言 下面由我来给大家讲解一下CSP-J的选择题部分。 2023CSP-J江苏卷详解 1.答案 A 解析&#xff1a;const在C中是常量的意思&#xff0c;其作用是声明一个变量&#xff0c;值从头至尾不能被修改 2.答案 D 解析&#xff1a;八进制…

前端TypeScript学习day01-TS介绍与TS部分常用类型

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 TypeScript 介绍 TypeScript 是什么 TypeScript 为什么要为 JS 添加类型支持&#xff1f; TypeScript 相…

vertx的学习总结4之异步数据和事件流

一、异步数据和事件流 1.为什么流是事件之上的一个有用的抽象&#xff1f; 2.什么是背压&#xff0c;为什么它是异步生产者和消费者的基础&#xff1f; 3.如何从流解析协议数据&#xff1f; 1. 答&#xff1a;因为它能够将连续的事件序列化并按照顺序进行处理。通过将事件…

Elasticsearch架构原理快速了解

目录 一、ES的简单了解 &#xff08;一&#xff09;直面Elasticsearch &#xff08;二&#xff09;Elasticsearch和关系型数据库的对比 二、基本概念回顾 &#xff08;一&#xff09;索引、文档、字段的概念 &#xff08;二&#xff09;映射 &#xff08;三&#xff09;…

读取图片颜色占比绘制{精美}折线图失败

问题之初 读取图片颜色占比绘制{精美}折线图失败❌ 花了4个小时 你问我问题吧 选择题<small> 读取一张图片各种颜色占比 默认 /storage/emulated/0/Pictures/Screenshots/Screenshot_20230725_195440.jpg自动设置检测代码需要的库 函数 变量 定义 样式等from PIL impor…

C++库函数——set与map的模拟实现

目录 1.红黑树的迭代器与改造 ①红黑树的迭代器 ②红黑树的改造 2.map的模拟实现 3.set的模拟实现 4.测试 1.红黑树的迭代器与改造 ①红黑树的迭代器 对于上面这棵红黑树&#xff0c;我们可以很容易得知道begin()是红黑树的最左节点&#xff0c;end()应该是一个空节点。…

ubuntu增加内存

文章目录 1、硬盘操作步骤第二步:点击【扩展】(必须关闭ubuntu电源才能修改)第三步:修改【最大磁盘容量大小】1、硬盘操作步骤 最近发现Ubuntu空间不足,怎么去扩容呢? 第一步:点击【硬盘】 第二步:点击【扩展】(必须关闭ubuntu电源才能修改) 第三步:修改【最大磁…

Java反序列化:CC1链 详解

CC1 Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库&#xff0c;它提供了很多强大的数据结构类型和实现了各种集合工具类。作为Apache开放项目的重要组件&#xff0c;Commons Collections被广泛的各种Java应用的开发&#xff0c;⽽正 是因…

腾讯云轻量和CVM有啥区别?怎么选择服务器配置?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

MIPI接口协议及规范理解

什么是MIPI接口 MIPI&#xff0c;英文全称为Mobile Industry Processor Interface&#xff0c;即移动行业处理器接口。它是MIPI联盟发起的为移动应用处理器制定的开放标准。MIPI接口是一种专为移动设备和嵌入式系统设计的串行通信接口&#xff0c;定义了一系列的接口标准&…

【pwn入门】用gdb调试32位程序

声明 本文是B站你想有多PWN学习的笔记&#xff0c;包含一些视频外的扩展知识。 问题源码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> char sh[]"/bin/sh"; int func(char *cmd){system(cmd);return 0; }int main(){char a[8]…

学习搜狗的workflow,MacBook上如何编译

官网说可以在MacBook上也可以运行&#xff0c;但是编译的时候却有找不到openssl的错误&#xff1a; 看其他博客也有类似的错误&#xff0c;按照类似的思路去解决 问题原因和解决办法 cmake编译的时候&#xff0c;没有找到openssl的头文件&#xff0c;需要设置cmake编译环境下…

基于Java的连锁超市会员管理系统设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

孢子捕捉仪——植物疾病探测的得力工具

孢子捕捉仪是一款专为收集随空气流动、传染的病害病原菌孢子及花粉尘粒而制的精密仪器&#xff0c;它主要用于监测病害孢子的存量及其扩散动态&#xff0c;犹如植物健康状况的“超级侦察兵”&#xff0c;是农业植保部门应当配备的农作物病害监测专用设备&#xff0c;是植物疾病…

学之思第二天-调通登录功能

目录 一、前端问题 二、后端问题 三、总结 之前一直是一个前端网页即使输对了正确的账号密码&#xff0c;也进不去。 一、前端问题 前端控制台就是一大堆爆红&#xff1a; 报错信息大概下面这样&#xff1a; Uncaught (in promise) NavigationDuplicated {_name: "…

Uniapp 婚庆服务全套模板前端

包含 首页、社区、关于、我的、预约、订购、选购、话题、主题、收货地址、购物车、系统通知、会员卡、优惠券、积分、储值金、订单信息、积分、充值、礼品、首饰等 请观看 图片参观 开源&#xff0c;下载即可 链接&#xff1a;婚庆服务全套模板前端 - DCloud 插件市场 问题反…

QT:SQLITE数据库编程

pro文件&#xff1a;QT core gui sql widget.ui main.cpp #include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w("./student.db"); //传入文件名w.show();return a.exec…

binary_cross_entropy和binary_cross_entropy_with_logits的区别

binary_cross_entropy和binary_cross_entropy_with_logits的区别 引言 二分类问题是常见的机器学习任务之一&#xff0c;其目标是将样本分为两个类别。为了训练一个二分类模型&#xff0c;通常使用交叉熵作为损失函数。 二分类交叉熵损失函数有两种不同的形式&#xff0c;分…