RGMII回环:IDDR+ODDR+差分接口

news2024/11/17 5:31:03

目录

  • 一、实验内容
  • 二、原理解释
  • 三、程序
    • 1、顶层文件:
    • 2、子模块
      • 2.1 oddr模块
      • 2.2、iddr顶层模块
      • 2.3、iddr子模块
    • 3、仿真
    • 4、注意
    • 5、下载工程及仿真

一、实验内容

1、通过IDDR和ODDR的方式完成RGMII协议;
2、外部接口使用OBUFDS、IBUFDS转换成差分接口;
3、数据转换及传输:顶层文件自己产生100次数,每个数都是8bit,传给oddr模块,oddr模块经过转换再传出4bit,这4bit数据再输出到外部(仿真的时候,可以接到输入,实际板测可以用跳线帽短接,也可以传给另一块板子,进行回环实验),4bit数据重新从顶层输入到iddr模块,iddr模块经过转换,输出8bit数据,输出到外部。

二、原理解释

本实验参考了部分文章,一些原理请直接看以下文章:
1、VIVADO IDDR与ODDR原语的使用
2、Xilinx 差分信号 LVDS传输实战

三、程序

1、顶层文件:

      这里面的diff定义=lvds,之所以定义成diff,是老大说这样对于IO的适用范围更大。
      顶层模块例化了一个iddr_top模块,一个PLL模块(输入50mhz系统时钟,输出125mhz高速时钟采集数据),一个oddr模块。

`timescale 1ns / 1ps
module I_ODDR_ETH_DIFF_TOP(
    //System Interfaces
    input                   sclk            ,
    input                   rst_n           ,
    
    input                   rx_clk_p          ,//IDDR IN CLK
    input                   rx_clk_n          ,//IDDR IN CLK
    input    [ 3:0]         rx_data_p         ,//IDDR IN DATA
    input    [ 3:0]         rx_data_n         ,//IDDR IN DATA
    
    output                  tx_clk_p          ,//ODDR CLK
    output                  tx_clk_n          ,//ODDR CLK
    output   [ 3:0]         tx_data_p         ,//ODDR DATA
    output   [ 3:0]         tx_data_n         ,//ODDR DATA
    
    output                  gb_out_clk_p      ,//IDDR OUT CLK 
    output                  gb_out_clk_n      ,//IDDR OUT CLK  
    output   [ 7:0]         gb_out_data_p     ,//IDDR OUT DATA 
    output   [ 7:0]         gb_out_data_n      //IDDR OUT DATA   

);

wire [3:0] rx_data;
wire [3:0] tx_data;

reg  [ 7:0]     gb_tx_data      ;
wire            phy_rst_n       ;       
wire            tx_data_ctrl    ;
reg             gb_tx_data_en   ;

reg  [ 7:0]     gb_tx_cnt       ;
wire            gb_tx_clk       ;

wire            gb_out_clk      ;
wire [7:0]      gb_out_data     ;

clk_wiz_1 clk_wiz_1_inst
 (
  // Clock out ports
  .clk_out1(gb_tx_clk),
 // Clock in ports
  .clk_in1(sclk) //iddr clk_90  default:sclk
 ); 


// diff out, 把iddr转化的数据,通过diff发送出去
// 输出50M相位90度的差分时钟
OBUFDS #(
	.IOSTANDARD		(	"DEFAULT"	), // Specify the output I/O standard
	.SLEW			(	"SLOW"		) 
)     
dclko_OBUFDS
(
	.O  (	tx_clk_p ),
	.OB (	tx_clk_n ),
	.I  (	tx_clk  ) 
);

 
  genvar ao;
    generate
        for (ao = 0; ao < 4; ao = ao+1) begin
 // 输出oddr的数据
OBUFDS #(
	.IOSTANDARD		(	"DEFAULT"	), // Specify the output I/O standard
	.SLEW			(	"SLOW"		) 
)  
dout_OBUFDS
(
	.O  (	tx_data_p[ao] 	),
	.OB (	tx_data_n[ao] 	),
	.I  (	tx_data[ao]	) 
);
       end
   endgenerate


//diff in
// 还原单端时钟
IBUFDS 
#(
	.DIFF_TERM		(	"TRUE"		),       // Differential Termination
	.IBUF_LOW_PWR	(	"TRUE"		),     // Low power="TRUE", Highest performance="FALSE" 
	.IOSTANDARD		(	"DEFAULT"	)     // Specify the input I/O standard
)
rxlki_IBUFDS
(
	.O	(	rx_clk	),   // 1-bit output: Buffer output
	.I	(	rx_clk_p	),   // 1-bit input: Diff_p buffer input (connect directly to top-level port)
	.IB	(	rx_clk_n	)  // 1-bit input: Diff_n buffer input (connect directly to top-level port)
);    
// 还原单端数据
  genvar i;
    generate
        for (i = 0; i < 4; i = i+1) begin
IBUFDS 
#(
	.DIFF_TERM		(	"TRUE"		),       // Differential Termination
	.IBUF_LOW_PWR	(	"TRUE"		),     // Low power="TRUE", Highest performance="FALSE" 
	.IOSTANDARD		(	"DEFAULT"	)     // Specify the input I/O standard
)
rxdatai_IBUFDS
(
	.O	(	rx_data[i]		),   // 1-bit output: Buffer output
	.I	(	rx_data_p[i]	),   // 1-bit input: Diff_p buffer input (connect directly to top-level port)
	.IB	(	rx_data_n[i]	)  // 1-bit input: Diff_n buffer input (connect directly to top-level port)
); 
end
endgenerate
 

//IDDR 8bit
  genvar io;
    generate
        for (io = 0; io < 8; io = io+1) begin
 // 输出oddr的数据
OBUFDS #(
	.IOSTANDARD		(	"DEFAULT"	), // Specify the output I/O standard
	.SLEW			(	"SLOW"		) 
)  
iddrout_OBUFDS
(
	.O  (	gb_out_data_p[io] 	),
	.OB (	gb_out_data_n[io] 	),
	.I  (	gb_out_data[io]	) 
);
       end
   endgenerate

OBUFDS #(
	.IOSTANDARD		(	"DEFAULT"	), // Specify the output I/O standard
	.SLEW			(	"SLOW"		) 
)     
iddrclko_OBUFDS
(
	.O  (	gb_out_clk_p ),
	.OB (	gb_out_clk_n ),
	.I  (	gb_out_clk  ) 
);
   
always@(posedge gb_tx_clk or negedge phy_rst_n)
    if(phy_rst_n == 1'b0)
       gb_tx_cnt   <=8'b0;
    else if(gb_tx_cnt == 8'd99)
       gb_tx_cnt   <=8'd0;
    else 
       gb_tx_cnt   <=gb_tx_cnt+1'b1;
              
always @(posedge gb_tx_clk or negedge rst_n)
    if(rst_n == 1'b0)begin
        gb_tx_data      <=8'd0;
        gb_tx_data_en   <=1'b0;
    end
    else if(phy_rst_n == 1'b1)begin
        gb_tx_data_en       <=1'b1;
        if (gb_tx_cnt < 8'd7)
            gb_tx_data       <=     8'h55;
        else if(gb_tx_cnt  ==  8'd7)
            gb_tx_data      <=      8'hd5;
        else 
            gb_tx_data      <=    gb_tx_cnt;
        end

    else begin
        gb_tx_data      <=8'd0;
        gb_tx_data_en   <=1'b0;
    end

              
oddr_ctrl oddr_ctrl_inst(
    //System Interfaces
    .rst_n                  (rst_n                  ),
    //Gigbit Interfaces
    .tx_data                (tx_data                ),
    .tx_data_ctrl           (tx_data_ctrl           ),
    .tx_clk                 (tx_clk                 ),
    //Communication Interfaces
    .gb_tx_data             (gb_tx_data             ),
    .gb_tx_data_en          (gb_tx_data_en          ),
    .gb_tx_data_err         (1'b0                   ),
    .gb_tx_clk              (gb_tx_clk              ) 
);

IDDR_TOP gbit_top_inat(
    //System Interfaces
    .sclk                   (sclk                   ),
    .rst_n                  (rst_n                  ),
    //Gigbit Interfaces
    .phy_rst_n              (phy_rst_n              ),
    .rx_data                (rx_data                ),
    .rx_ctrl                (tx_data_ctrl           ),
    .gb_rx_data             (gb_out_data            ),
    .rx_clk_90              (gb_out_clk             ),
    .rx_clk                 (rx_clk                 )
);

endmodule

2、子模块

2.1 oddr模块

负责将8bit转换成4bit。

`timescale 1ns / 1ps
module oddr_ctrl(
    //System Interfaces
    input                   rst_n           ,
    //Gigbit Interfaces
    output  wire    [ 3:0]  tx_data         ,
    output  wire            tx_data_ctrl    ,
    output  wire            tx_clk          ,
    //Communication Interfaces
    input           [ 7:0]  gb_tx_data      ,
    input                   gb_tx_data_en   ,
    input                   gb_tx_data_err  ,
    input                   gb_tx_clk        
);
 

ODDR #(
    .DDR_CLK_EDGE               ("SAME_EDGE"                ), // "OPPOSITE_EDGE" or "SAME_EDGE" 
    .INIT                       (1'b0                       ),    // Initial value of Q: 1'b0 or 1'b1
    .SRTYPE                     ("SYNC"                     ) // Set/Reset type: "SYNC" or "ASYNC" 
) ODDR_ctrl (
      .Q                        (tx_data_ctrl               ),   // 1-bit DDR output
      .C                        (gb_tx_clk                  ),   // 1-bit clock input
      .CE                       (1'b1                       ), // 1-bit clock enable input
      .D1                       (gb_tx_data_en              ), // 1-bit data input (positive edge)
      .D2                       (gb_tx_data_err             ), // 1-bit data input (negative edge)
      .R                        (~rst_n                     ),   // 1-bit reset
      .S                        (1'b0                       )    // 1-bit set
);

ODDR #(
    .DDR_CLK_EDGE               ("SAME_EDGE"                ), // "OPPOSITE_EDGE" or "SAME_EDGE" 
    .INIT                       (1'b0                       ),    // Initial value of Q: 1'b0 or 1'b1
    .SRTYPE                     ("SYNC"                     ) // Set/Reset type: "SYNC" or "ASYNC" 
) ODDR_clk (
      .Q                        (tx_clk                     ),   // 1-bit DDR output
      .C                        (gb_tx_clk                  ),   // 1-bit clock input
      .CE                       (1'b1                       ), // 1-bit clock enable input
      .D1                       (1'b1                       ), // 1-bit data input (positive edge)
      .D2                       (1'b0                       ), // 1-bit data input (negative edge)
      .R                        (~rst_n                     ),   // 1-bit reset
      .S                        (1'b0                       )    // 1-bit set
);

genvar i;
    generate
        for (i = 0; i < 4; i = i+1) begin
            ODDR #(
                .DDR_CLK_EDGE               ("SAME_EDGE"                ), // "OPPOSITE_EDGE" or "SAME_EDGE" 
                .INIT                       (1'b0                       ),    // Initial value of Q: 1'b0 or 1'b1
                .SRTYPE                     ("SYNC"                     ) // Set/Reset type: "SYNC" or "ASYNC" 
            ) ODDR_data (
                .Q                          (tx_data[i]                 ),   // 1-bit DDR output
                .C                          (gb_tx_clk                  ),   // 1-bit clock input
                .CE                         (1'b1                       ), // 1-bit clock enable input
                .D1                         (gb_tx_data[i]              ), // 1-bit data input (positive edge)
                .D2                         (gb_tx_data[4+i]            ), // 1-bit data input (negative edge)
                .R                          (~rst_n                     ),   // 1-bit reset
                .S                          (1'b0                       )    // 1-bit set
            );
      end
   endgenerate
endmodule


2.2、iddr顶层模块

例化了一个PLL(输入125Mhz时钟,输出125mhz,90度相位时钟,用于时钟中心位数据采集),和一个iddr子模块;

`timescale 1ns / 1ps
module IDDR_TOP(
    //System Interfaces
    input                   sclk            ,
    input                   rst_n           ,
    //Gigbit Interfaces
    output  reg             phy_rst_n       ,
    input           [ 3:0]  rx_data         ,
    input                   rx_ctrl         ,
    output          [ 7:0]  gb_rx_data      ,
    output                  rx_clk_90       ,
    input                   rx_clk      
);
 
reg                 [20:0]  phy_rst_cnt     ;
//wire                        rx_clk_90       ;
//iddr_ctrl_inst
wire                        gb_rx_data_en   ;
wire                        gb_rx_data_err  ;

clk_wiz_0 clk_wiz_0_inst(
    // Clock out ports
    .clk_out1               (rx_clk_90                  ),     // output clk_out1
    // Clock in ports
    .clk_in1                (rx_clk                     )
);     
                            
iddr_ctrl iddr_ctrl_inst(
    //System Interfaces
    .rst_n                  (rst_n                      ),
    //Gigabit Interfaces
    .rx_data                (rx_data                    ),
    .rx_ctrl                (rx_ctrl                    ),
    .rx_clk                 (rx_clk_90                  ),
    //Communication Interfaces
    .gb_rx_data             (gb_rx_data                 ),
    .gb_rx_data_en          (gb_rx_data_en              ), 
    .gb_rx_data_err         (gb_rx_data_err             )     
);

always @(posedge sclk or negedge rst_n)
    if(rst_n == 1'b0)
        phy_rst_cnt         <=      21'd0;
    else if(phy_rst_cnt[20] == 1'b0)
        phy_rst_cnt         <=      phy_rst_cnt + 1'b1;
    else
        phy_rst_cnt         <=      phy_rst_cnt;
//phy芯片复位
always @(posedge sclk or negedge rst_n)
    if(rst_n == 1'b0)
        phy_rst_n           <=      1'b0;
    else if(phy_rst_cnt[20] == 1'b1)
        phy_rst_n           <=      1'b1;
    else
        phy_rst_n           <=      phy_rst_n;

endmodule


2.3、iddr子模块

将oddr输出的4bit数据转换成8bit数据。

`timescale 1ns / 1ps
module iddr_ctrl(
    //System Interfaces
    input                   rst_n               ,
    //Gigabit Interfaces
    input           [ 3:0]  rx_data             ,
    input                   rx_ctrl             ,
    input                   rx_clk              ,
    //Communication Interfaces
    output  reg     [ 7:0]  gb_rx_data          ,
    output  reg             gb_rx_data_en       , 
    output  reg             gb_rx_data_err           
);
 

wire                [ 7:0]  data                ;
wire                        data_en             ; 
wire                        data_err            ;        
 
IDDR #(
    .DDR_CLK_EDGE           ("OPPOSITE_EDGE"            ), // "OPPOSITE_EDGE", "SAME_EDGE" 
                                                           //    or "SAME_EDGE_PIPELINED" 
    .INIT_Q1                (1'b0                       ), // Initial value of Q1: 1'b0 or 1'b1
    .INIT_Q2                (1'b0                       ), // Initial value of Q2: 1'b0 or 1'b1
    .SRTYPE                 ("SYNC"                     )  // Set/Reset type: "SYNC" or "ASYNC" 
) IDDR_ctrl (
    .Q1                     (data_en                    ), // 1-bit output for positive edge of clock
    .Q2                     (data_err                   ), // 1-bit output for negative edge of clock
    .C                      (rx_clk                     ),   // 1-bit clock input
    .CE                     (1'b1                       ), // 1-bit clock enable input
    .D                      (rx_ctrl                    ),   // 1-bit DDR data input
    .R                      (~rst_n                     ),   // 1-bit reset
    .S                      (1'b0                       )    // 1-bit set
   );


genvar i;
    generate
        for (i = 0; i < 4; i = i+1) begin
            IDDR #(
                .DDR_CLK_EDGE           ("OPPOSITE_EDGE"            ), // "OPPOSITE_EDGE", "SAME_EDGE" 
                                                                       //    or "SAME_EDGE_PIPELINED" 
                .INIT_Q1                (1'b0                       ), // Initial value of Q1: 1'b0 or 1'b1
                .INIT_Q2                (1'b0                       ), // Initial value of Q2: 1'b0 or 1'b1
                .SRTYPE                 ("SYNC"                     )  // Set/Reset type: "SYNC" or "ASYNC" 
            ) IDDR_ctrl (
                .Q1                     (data[i]                    ), // 1-bit output for positive edge of clock
                .Q2                     (data[4+i]                  ), // 1-bit output for negative edge of clock
                .C                      (rx_clk                     ),   // 1-bit clock input
                .CE                     (1'b1                       ), // 1-bit clock enable input
                .D                      (rx_data[i]                 ),   // 1-bit DDR data input
                .R                      (~rst_n                     ),   // 1-bit reset
                .S                      (1'b0                       )    // 1-bit set
            );
      end
   endgenerate
  
always @(posedge rx_clk or negedge rst_n)
    if(rst_n == 1'b0)
        gb_rx_data          <=      8'd0;
    else 
        gb_rx_data          <=      data;

always @(posedge rx_clk or negedge rst_n)
    if(rst_n == 1'b0)
        gb_rx_data_err      <=      1'b0;
    else 
        gb_rx_data_err      <=      data_err;

always @(posedge rx_clk or negedge rst_n)
     if(rst_n == 1'b0)
        gb_rx_data_en       <=      1'b0;
     else
        gb_rx_data_en       <=      data_en;

endmodule


3、仿真

      仿真时钟50mhz。需要仿真21ms才能看到计数器开始计数,数据开始循环(因为这里为了兼容以太网口的phy芯片,需要一小段时间进行初始化);
在这里插入图片描述

`timescale 1ns / 1ps
`define     CLOCK   8
//测试功能:双沿4bit数据变单沿8bit数据——FPGA接收,单沿8bit数据变双沿4bit数据——FPGA发送;增加DIFF接口;
module tb_eth_i_oddr_diff;
reg                     sclk            ;
//reg                     sclk_p          ;
//reg                     sclk_n          ;
reg                     rst_n           ;
//reg                     gb_tx_clk       ;              
wire                    tx_clk          ; 

initial begin
    rst_n           <=      1'b0;
//    gb_tx_clk       =       1'b0;
    sclk            =       1'b0;
//    sclk_p          =       1'b0;
//    sclk_n          =       1'b1;
    #(3000*`CLOCK)
    rst_n           <=      1'b1;
end
//always  #(`CLOCK/2)     gb_tx_clk       =       ~gb_tx_clk;
always  #(10)           sclk            =       ~sclk;

//always  #(10)           sclk_p          =     ~sclk_p;
//always  #(10)           sclk_n          =     ~sclk_n;

wire        dclk_p;
wire        dclk_n;
wire [3:0] gb_data_p;
wire [3:0] gb_data_n;

I_ODDR_ETH_DIFF_TOP u_I_ODDR_ETH_DIFF_TOP(
    //System Interfaces
    .sclk         (sclk) ,
    .rst_n          (rst_n) ,
    
    .rx_clk_p        (dclk_p) ,
    .rx_clk_n        (dclk_n) ,    
    .rx_data_p   (gb_data_p) ,
    .rx_data_n   (gb_data_n) ,
    
    .tx_clk_p        (dclk_p) ,
    .tx_clk_n        (dclk_n) ,
    .tx_data_p      (gb_data_p),
    .tx_data_n      (gb_data_n),
    
    .gb_out_clk_p   () ,
    .gb_out_clk_n   () ,
    .gb_out_data_p  () ,
    .gb_out_data_n  () 
);

endmodule


最好使用Modelsim进行仿真,数据比较详细
设计文件路径:I_ODDR_DIFF_test\I_ODDR_DIFF\I_ODDR_LVDS.srcs\sources_1\new
编译路径:I_ODDR_DIFF_test\I_ODDR_DIFF\I_ODDR_LVDS.sim\sim_1\behav\modelsim\compile.bat
启动路径:I_ODDR_DIFF_test\I_ODDR_DIFF\I_ODDR_LVDS.sim\sim_1\behav\modelsim\simulate.bat

波形归类脚本:

onerror {resume}
quietly WaveActivateNextPane {} 0
add wave -noupdate /tb_eth_i_oddr_diff/sclk
add wave -noupdate /tb_eth_i_oddr_diff/rst_n
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/gb_tx_cnt
add wave -noupdate /glbl/GSR

add wave -noupdate -divider ODDR
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/tx_clk
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/tx_clk_p
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/tx_clk_n
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/gb_tx_data
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/tx_data
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/tx_data_p
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/tx_data_n

add wave -noupdate -divider IDDR
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/gbit_top_inat/phy_rst_n
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/rx_clk
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/gbit_top_inat/rx_clk_90
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/gb_out_clk_p
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/gb_out_clk_n
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/gb_out_data
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/gb_out_data_p
add wave -noupdate /tb_eth_i_oddr_diff/u_I_ODDR_ETH_DIFF_TOP/gb_out_data_n
TreeUpdate [SetDefaultTree]
WaveRestoreCursors {{Cursor 1} {20995528826 ps} 0}
quietly wave cursor active 1
configure wave -namecolwidth 382
configure wave -valuecolwidth 100
configure wave -justifyvalue left
configure wave -signalnamewidth 0
configure wave -snapdistance 10
configure wave -datasetprefix 0
configure wave -rowmargin 4
configure wave -childrowmargin 2
configure wave -gridoffset 0
configure wave -gridperiod 1
configure wave -griddelta 40
configure wave -timeline 0
configure wave -timelineunits ns
update
WaveRestoreZoom {20996884656 ps} {20997587062 ps}

4、注意

      本实验主要是测IDDR+ODDR+差分接口,仿真满足RGMII协议。如果用于实际板测以太网实验,有个bug,但是因为这个工程我做的比较久了,当时那个bug没有做笔记,现在一时想不起来😂😂😂😂😂
      后面我如果想起来,再补充到这里。

5、下载工程及仿真

在这里插入图片描述
在这里插入图片描述
下载链接:RGMII回环:IDDR+ODDR+差分接口
https://download.csdn.net/download/weixin_46423500/88527095

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

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

相关文章

C++语言的广泛应用领域

目录 1. 系统级编程 2. 游戏开发 3. 嵌入式系统 4. 大数据处理 5. 金融和量化分析 6. 人工智能和机器学习 7. 网络和通信 结语 C是一种多范式编程语言&#xff0c;具有高性能、中级抽象能力和面向对象的特性。由Bjarne Stroustrup于1979年首次设计并实现&#xff0c;C在…

如何确定线程栈的基址?

起 很早之前&#xff0c;我遇到过几个与栈相关的问题&#xff0c;当时总结过几篇关于线程栈的文章&#xff0c;分别是 《栈大小可以怎么改&#xff1f;》、《栈局部变量优化探究&#xff0c;意外发现了 vs 的一个 bug &#xff1f;》、《栈又溢出了》、《有趣的异常》。在这几…

【fast2021论文导读】 Learning Cache Replacement with Cacheus

文章:Learning Cache Replacement with Cacheus 导读摘要: 机器学习的最新进展为解决计算系统中的经典问题开辟了新的、有吸引力的方法。对于存储系统,缓存替换是一个这样的问题,因为它对性能有巨大的影响。 本文第一个贡献,确定了与缓存相关的特征,特别是,四种工作负载…

C++基础(2)——类和对象

目录 1. 类的引入&#xff1a; 2. 类的定义&#xff1a; 2.1类的定义以及基本结构&#xff1a; 2.2 类的访问限定符&#xff1a; 3. 类的声明与定义的分离&#xff1a; 4. 类的实例化&#xff1a; 5. 类的大小计算&#xff1a; 1. 类的引入&#xff1a; 在数据结构系列的…

有源RS低通滤波

常用的滤波电路有无源滤波和有源滤波两大类。若滤波电路元件仅由无源元件&#xff08;电阻、电容、电感&#xff09;组成&#xff0c;则称为无源滤波电路。无源滤波的主要形式有电容滤波、电感滤波和复式滤波(包括倒L型、LC滤波、LCπ型滤波和RCπ型滤波等)。若滤波电路不仅有无…

【vue+el-upload+vue-cropper】vue图片上传,vue-cropper图片裁剪后上传

一. 先看效果演示 二. 图片上传 用的el-upload加el-image组件 html部分 <el-dialog> ...//无关代码已省略<div v-for"item in imgArr" :key"item.index"><span>{{ item.name }}</span><el-upload action"#" list-t…

【408】计算机学科专业基础 - 数据结构

数据结构知识 绪论 数据结构在学什么 如何用程序代码把现实世界的问题信息化 如何用计算机高效地处理这些信息从而创造价值 数据结构的基本概念 什么是数据&#xff1a; 数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序…

K8S知识点(十)

&#xff08;1&#xff09;Pod详解-启动命令 创建Pod&#xff0c;里面的两个容器都正常运行 &#xff08;2&#xff09;Pod详解-环境变量 &#xff08;3&#xff09;Pod详解-端口设置 &#xff08;4&#xff09;Pod详解-资源配额 修改&#xff1a;memory 不满足条件是不能正常…

揭秘:车企如何利用5R模式在数位行销领域取得突破

01 车企进入“大逃杀”时间 汽车行业一边是出口“捷报频传”&#xff0c;一边是内销“压力山大”。 内销的难&#xff0c;在之前中部某省的政府“骨折价”补贴掀起的“价格战”中已经可见一斑。这一颇具标志性的事件反映了汽车行业&#xff0c;尤其是燃油车行业正处在巨大的转…

曾被揭露造假的越南,再次宣称研发成功5G芯片,这是真的么?

日前在2023 年越南国际创新展 (VIIE 2023) 上&#xff0c;越南的Viettel宣布成功研发5G芯片&#xff0c;可以应用于5G基站&#xff0c;并表示该公司已成为全球第六大芯片设备供应商。 越南是近10年来制造业发展强劲的国家之一&#xff0c;甚至还在2022年成为全球经济增长最快的…

C#多线程入门概念及技巧

C#多线程入门概念及技巧 一、什么是线程1.1线程的概念1.2为什么要多线程1.3线程池1.4线程安全1.4.1同步机制1.4.2原子操作 1.5线程安全示例1.5.1示例一1.5.2示例二 1.6C#一些自带的方法实现并行1.6.1 Parallel——For、ForEach、Invoke1.6.1 PLINQ——AsParallel、AsSequential…

TSINGSEE视频智能分析人员入侵AI检测算法如何让城市管理更加高效、智慧?

在城市管理场景中&#xff0c;经常面临着禁区垂钓、非法捕捞、行人闯红灯、小区盗窃、车辆乱停乱放等一系列管理难题&#xff0c;这给城市发展带来了不小的阻力&#xff0c;同时也极易增加管理的人力、物力和财力。传统的人员巡逻监管效率低并且存在时间差&#xff0c;很难及时…

2.4.0 Milky Way 强势登场!新功能大爆炸,让你High翻全场!

Yo开发达人们&#xff0c;我们有重磅新功能要给你们放送啦&#xff01; Check it out 数据汇总不再单调&#xff0c;新的聚合函数登场&#xff01; compact_state_agg #1359gauge_agg #1370first #1395last #1413mode #1440increase #1476delta #1395time_delta #1405rate #14…

内存映射:PS和PL DDR3的一些区别

之前写的一些资料&#xff1a; PS与PL互联与SCU以及PG082-CSDN博客 参考别人的资料&#xff1a; PL读写PS端DDR的设计_pl读写ps端ddr数据-CSDN博客 xilinx sdk、vitis查看地址_vitis如何查看microblazed地址_yang_wei_bk的博客-CSDN博客 可见&#xff0c;PS端的DDR3需要从…

从0到1实现一个前端监控系统(附源码)

目录 一、从0开始 二、上报数据方法 三、上报时机 四、性能数据收集上报 收集上报FP 收集上报FCP 收集上报LCP 收集上报DOMContentLoaded 收集上报onload数据 收集上报资源加载时间 收集上报接口请求时间 五、错误数据收集上报 收集上报资源加载错误 收集上报js错…

msvcp120.dll丢失的6种解决方法,教你如何修复dll文件丢失

“找不到msvcp120dll,无法继续执行代码的6个修复方案”。我相信很多朋友在运行某些程序时&#xff0c;可能会遇到这样的错误提示&#xff1a;“找不到msvcp120dll&#xff0c;无法继续执行代码”。那么&#xff0c;msvcp120dll究竟是什么&#xff1f;为什么会丢失呢&#xff1f…

Java基础知识第四讲:Java 基础 - 深入理解泛型机制

Java 基础 - 深入理解泛型机制 背景&#xff1a;Java泛型这个特性是从JDK 1.5才开始加入的&#xff0c;为了兼容之前的版本&#xff0c;Java泛型的实现采取了“伪泛型”的策略&#xff0c;即Java在语法上支持泛型&#xff0c;但是在编译阶段会进行所谓的“类型擦除”&#xff0…

NestJS——基于Node.js 服务器端应用程序的开发框架

文章目录 前言什么是 NestJS&#xff1f; 一、NestJS特性&#xff1f;二、使用步骤Typescript 知识后端开发基本知识新建项目目录结构 前言 Nestjs中文文档 什么是 NestJS&#xff1f; Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用…

【JVM系列】- 寻觅·方法区的内容

寻觅方法区的内容 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff0c;大家一起学习成长&#xff01; 文章目录 寻觅…

杂记 | 使用FRP搭建内网穿透服务(新版toml配置文件,搭配反向代理食用)

文章目录 01 需求与回顾02 下载程序包03 编辑.toml文件3.1 编辑frps.toml3.2 编辑frpc.toml 04 启动服务4.1 启动服务端4.2 启动客户端 05 配置反向代理&#xff08;可选&#xff09;06 windows设置为默认启动&#xff08;可选&#xff09;6.1 创建启动脚本6.2 设置为开机自启 …