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

目录

  • 一、实验内容
  • 二、原理解释
  • 三、程序
    • 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 Interfacesinput                   sclk            ,input                   rst_n           ,input                   rx_clk_p          ,//IDDR IN CLKinput                   rx_clk_n          ,//IDDR IN CLKinput    [ 3:0]         rx_data_p         ,//IDDR IN DATAinput    [ 3:0]         rx_data_n         ,//IDDR IN DATAoutput                  tx_clk_p          ,//ODDR CLKoutput                  tx_clk_n          ,//ODDR CLKoutput   [ 3:0]         tx_data_p         ,//ODDR DATAoutput   [ 3:0]         tx_data_n         ,//ODDR DATAoutput                  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;generatefor (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]	) 
);endendgenerate//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;generatefor (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 8bitgenvar io;generatefor (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]	) 
);endendgenerateOBUFDS #(.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)begingb_tx_data      <=8'd0;gb_tx_data_en   <=1'b0;endelse if(phy_rst_n == 1'b1)begingb_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;endelse begingb_tx_data      <=8'd0;gb_tx_data_en   <=1'b0;endoddr_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 Interfacesinput                   rst_n           ,//Gigbit Interfacesoutput  wire    [ 3:0]  tx_data         ,output  wire            tx_data_ctrl    ,output  wire            tx_clk          ,//Communication Interfacesinput           [ 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;generatefor (i = 0; i < 4; i = i+1) beginODDR #(.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);endendgenerate
endmodule

2.2、iddr顶层模块

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

`timescale 1ns / 1ps
module IDDR_TOP(//System Interfacesinput                   sclk            ,input                   rst_n           ,//Gigbit Interfacesoutput  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;elsephy_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;elsephy_rst_n           <=      phy_rst_n;endmodule

2.3、iddr子模块

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

`timescale 1ns / 1ps
module iddr_ctrl(//System Interfacesinput                   rst_n               ,//Gigabit Interfacesinput           [ 3:0]  rx_data             ,input                   rx_ctrl             ,input                   rx_clk              ,//Communication Interfacesoutput  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;generatefor (i = 0; i < 4; i = i+1) beginIDDR #(.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);endendgeneratealways @(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;elsegb_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 beginrst_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/GSRadd 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_nadd 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.rhkb.cn/news/191482.html

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

相关文章

CodeWhisperer 使用经验分享

今天给大家分享一下 Amazon CodeWhisperer 编程工具&#xff08;免费哦&#xff09;&#xff0c;使用这个软件后我的编码质量提升不少&#xff0c;给大家分享一下我的经验。希望大家支持哦。 Amazon CodeWhisperer 是亚⻢逊出品的一款基于机器学习的 AI 编程助手&#xff0c;可…

大数据毕业设计选题推荐-污水处理大数据平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

自适应AI chatGPT智能聊天创作官网html源码/最新AI创作系统/ChatGPT商业版网站源码

源码简介&#xff1a; 自适应AI chatGPT智能聊天创作官网html源码&#xff0c;这是最新AI创作系统&#xff0c;作为ChatGPT商业版网站源码&#xff0c;它是支持创作、编写、翻译、写代码等。是一个智能聊天系统项目源码。 注意&#xff1a;这个只是网站html源码&#xff0c;要…

一文看懂aPaaS平台是什么意思?有哪些优势?

aPaaS开发平台是什么&#xff1f; aPaaS&#xff0c;Application Platform as a Service&#xff0c;应用程序平台即服务。国际知名咨询机构Gartner对aPaaS所下的定义是&#xff1a;“这是基于PaaS&#xff08;平台即服务&#xff09;的一种解决方案&#xff0c;支持应用程序在…

Python爬虫程序网络请求及内容解析

以下是一个简单的Python爬虫程序&#xff0c;用于爬取商户的内容。这个程序使用了requests和BeautifulSoup库来进行网络请求和内容解析。 import requests from bs4 import BeautifulSoup# 爬虫爬虫IP信息 proxy_host duoip proxy_port 8000# 请求URL url 目标网站# 创建一个…

【机器学习】 朴素贝叶斯算法:原理、实例应用(文档分类预测)

1. 算法原理 1.1 朴素贝叶斯方法 朴素贝叶斯方法涉及一些概率论知识&#xff0c;我们先来复习一下。 联合概率&#xff1a;包含多个条件&#xff0c;并且所有的条件同时成立的概率&#xff0c;公式为&#xff1a; 条件概率&#xff1a;事件A在另一个事件B已经发生的前提下发…

第3关:集合操作100

任务描述相关知识编程要求测试说明 任务描述 本关任务&#xff1a;使用 集合操作解决实际问题 相关知识 1.集合并操作符 可转换为SQL 若R,S的属性名不同&#xff0c;可使用重命名使相应列名一致后进行并操作 例如&#xff1a;R(A,B,C) S(D,E,F) select A,B from R union sel…

你真的会使用 MySQL中EXPLAIN吗

EXPLAIN是MySQL数据库中一个强大的工具&#xff0c;用于查询性能分析和优化。通过EXPLAIN&#xff0c;你可以查看MySQL查询的执行计划&#xff0c;了解MySQL是如何执行你的查询语句的。这篇文章将详细介绍EXPLAIN的使用&#xff0c;帮助你更好地理解和优化MySQL查询。 为什么使…

phpstudy 开启目录浏览功能

&#xff08;1&#xff09;在该目录下&#xff1a; &#xff08;2&#xff09;选择对应网站的配置文件&#xff1b; &#xff08;3&#xff09;修改&#xff1a; # Options FollowSymLinks ExecCGI Options Indexes FollowSymLinks ExecCGI

机器视觉行业,日子不过了吗?都进入打折潮,双11只是一个借口,打广告出新招,日子不好过是真的

我就不上图了&#xff0c;大家注意各个机器视觉公司公众号&#xff0c;为什么打折&#xff1f;打广告也只是宣传手段&#xff0c;进入打折潮&#xff0c;内卷严重&#xff0c;价格战变成白刃战&#xff0c;肯定日子不好过了。

【广州华锐互动】楼宇智能化VR虚拟教学系统

在如今的技术时代&#xff0c;教育行业正在逐步引入各种创新方法以提升教学质量。VR公司广州华锐互动开发的楼宇智能化VR虚拟教学系统就是其中的一种&#xff0c;它利用虚拟现实(VR)技术&#xff0c;为学生提供一种全新的、沉浸式的学习体验。 楼宇智能化VR虚拟教学系统涵盖综合…

青少年编程学习 等级考试 信奥赛NOI/蓝桥杯/NOC/GESP等比赛资料合集

一、博主愚见 在当今信息技术高速发展的时代&#xff0c;编程已经成为了一种必备的技能。随着社会对于科技人才的需求不断增加&#xff0c;青少年编程学习正逐渐成为一种趋势。为了更好地帮助青少年学习编程&#xff0c;提升他们的技能和素质&#xff0c;博主结合自身多年从事青…

火山引擎DataTester上线「集成工作台」功能,助力企业打造专属AB平台

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 AB测试不仅是做增长的“利器”&#xff0c;也是企业优化效率、增加决策精确度的有效工具。随着国内企业服务市场需求的多元&#xff0c;企业对AB测试平台的“个性化…

Shiro快速入门之一

一、前言 Java有两个出名的安全框架&#xff0c;一个是Apache Shiro&#xff0c;另一个是Spring Security &#xff0c;相对而言Shiro更简单、控制权限的粒度可粗可细&#xff0c;我们项目中使用的是Shiro。 二、概念 Shiro最主要的功能是验证用户身份和用户访问权限控制&am…

基于ssm的学生档案管理系统(有报告)。Javaee项目,ssm项目。

演示视频&#xff1a; 基于ssm的学生档案管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 项目介绍&#xff…

「 电商API接口系列之淘宝API接口调用 」

API从技术角度来说就是应用程序编程接口。通过API我们可以直接获取一些我们需要的数据结果&#xff0c;而不需要自己编写相应的程序&#xff0c;有点类似模块化调用函数&#xff0c;大大加快了我们编程的速度。当然这个数据传输是需要网络的&#xff0c;所以一般API的形式看起来…

C语言--数组的长度计算【详细解释】

一.数组的长度计算公式 我们都知道字符串有特定的函数strlen,而数组没有&#xff0c;&#xff08;虽然字符串也是一种特殊的数组&#xff09; 但是&#xff0c;类似于这样的数组&#xff1a; int arr[]{12,89,1,5,31,78,45,12,12,0,45,142,21,12}&#xff1b; 我们很难一眼…

OpenCV踩坑笔记使用笔记入门笔记整合SpringBoot笔记大全

springboot开启摄像头抓拍照片并上传实现&问题记录 NotAllowedErrot: 请求的媒体源不能使用&#xff0c;以下情况会返回该错误: 当前页面内容不安全&#xff0c;没有使用HTTPS没有通过用户授权NotFoundError: 没有找到指定的媒体通道NoReadableError: 访问硬件设备出错Ov…

【Unity实战】实现强大通用易扩展的对话系统(附项目源码)

文章目录 先看看实现的最终效果前言素材前期准备工作1. 简单绘制地形2. 绘制对话框3. 配置人物动画4. 实现简单的控制人物移动 控制对话框的显示隐藏定义对话内容实现简单的对话功能逐字打印效果按下按键快速显示文本实现多个NPC配置不同对话扩展TextAsset 读取文档文件实际应用…

java 旋转方阵

public static void main(String[] args) {Scanner scanner new Scanner(System.in);// N阶方阵int n scanner.nextInt();// 构建方阵List<List<Integer>> matrix new ArrayList<>();for (int i 0; i < n; i) {List<Integer> row new ArrayLis…