AD7606芯片驱动-FPGA实现

news2024/11/14 13:39:18

        简介

        AD7606是一款16位ADC芯片,可实现8通道并行采集,每通道最大速度可达1M,可实现多种模式数据采集。

        介绍

        本次FPGA使用的是8通道串行采样模式,设计中所用到的AD7606引脚说明如下:

名称定义
CONVST同步采集转换开始信号
BUSYADC忙碌状态信号
RD/SCLK采样/寄存器工作时钟
CS片选使能
DOUTA~DOUTH

ADC 8通道串行输出

SDI寄存器数据输入

 本次采用的寄存器读写时序如下图所示:

 1、寄存器读写第一位默认为0;

2、第二位代表寄存器读写位,0代表写寄存器,1代表读寄存器;

3、6个地址位,具体寄存器定义查阅芯片手册;

4、如果是写操作,后面8bit为寄存器值,如果是读操作则通过DoutA接口读取返回的寄存器数据。

5、该芯片支持CRC模式,本次设计默认不启动CRC模式,所以后面8bitCRC在普通模式下不存在。

采样时序如下图所示:

                        

本时序图发现如下两个问题:

1、DoutA~DoutH输出的应该是V1~V7数据,上图中标识有错误;

2、上图未标识CONVST和BUSY信号,显然这两个信号是必须存在的;

另外芯片引脚OS0~OS2都接高点平,进入Enters software mode模式。

代码

FPGA驱动代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/08/05 15:39:27
// Design Name: 
// Module Name: ADC_SLAVE_DRI_TOP
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module ADC_SLAVE_DRI_TOP(
    input sys_clk,
    input sys_rst_n,

	output reg ADC_CONVST,
	input ADC_BUSY,
	output ADC_SCLK,
	output ADC_CS,
	input ADC_FRSTDATA,
	input[7:0] ADC_DATA,[7]:a [6]:b [5]:c ......
	output ADC_SDI,
	
	reg set
	input[15:0] adc_frame_length,
	
	input[15:0] adc_tdata_reg,
	input[15:0] adc_sample_rate_h,
	input[15:0] adc_sample_rate_l,	
	ADC REC REG DATA
	output[7:0] adc_rec_reg_data,
	output adc_rec_reg_data_en,
	input[3:0] adc_rw_set,//[1]:sample [0]:reg w/r
	input[15:0] adc_sample_rate_reg,
	input[15:0] adc_sample_channel_en_reg,
	ADC SAMPLE DATA	
	output[15:0] rx_data_length,
	output [7:0] axis_adc_data,
	output  axis_adc_tvalid,
	output  axis_adc_tlast	
	
    );

parameter ADC_CONVST_num = 'd100;	
	
	
reg[7:0] spi_tdata;
reg spi_tvalid;
reg tx_reg_en_r1;
wire[31:0] ADC_SAMPLE_RATE;
reg[31:0]sample_cnt;
reg tx_reg_wr_r1;
reg tx_reg_rd_r1;
wire tx_reg_wr;
wire tx_reg_rd;
wire sample_en;
reg ADC_BUSY_r1;
reg ADC_BUSY_r2;
reg ADC_BUSY_r3;
reg ADC_BUSY_r4;
reg ADC_BUSY_r5;
wire ADC_BUSY_neg;

reg[15:0]rec_adc_a_sample_data;
reg[15:0]rec_adc_b_sample_data;
reg[15:0]rec_adc_c_sample_data;
reg[15:0]rec_adc_d_sample_data;
reg[15:0]rec_adc_e_sample_data;
reg[15:0]rec_adc_f_sample_data;
reg[15:0]rec_adc_g_sample_data;
reg[15:0]rec_adc_h_sample_data;
reg rec_adc_sample_en;
reg ADC_SCLK_i;
reg ADC_CS_i;
reg[3:0] adc_mode;
reg[31:0] sample_en_delay;
reg[31:0] adc_stop_delay;

reg[15:0] rec_data_cnt;

reg[7:0] s_axis_tdata;
reg s_axis_tvalid;
wire s_axis_tlast;
reg[15:0] s_axis_tvalid_cnt;


reg[15:0] spi_clk_cnt;
reg[15:0] clk_cnt;

reg sample_en_r1;
reg sample_en_r2;
wire sample_en_neg;
wire[13:0] axis_data_count;


reg fifo_rst_n;
reg[15:0] fifo_rst_cnt;
reg fifo_rst_en;

wire channel_a_en;
wire channel_b_en;
wire channel_c_en;
wire channel_d_en;
wire channel_e_en;
wire channel_f_en;
wire channel_g_en;
wire channel_h_en;


assign channel_a_en = adc_sample_channel_en_reg[7];
assign channel_b_en = adc_sample_channel_en_reg[6];
assign channel_c_en = adc_sample_channel_en_reg[5];
assign channel_d_en = adc_sample_channel_en_reg[4];
assign channel_e_en = adc_sample_channel_en_reg[3];
assign channel_f_en = adc_sample_channel_en_reg[2];
assign channel_g_en = adc_sample_channel_en_reg[1];
assign channel_h_en = adc_sample_channel_en_reg[0];



assign rx_data_length = adc_frame_length;
assign tx_reg_wr = adc_rw_set[0];
assign tx_reg_rd = adc_rw_set[1];
assign sample_en = adc_rw_set[2];
assign ADC_SAMPLE_RATE = {adc_sample_rate_h,adc_sample_rate_l};
assign ADC_BUSY_neg = (~ADC_BUSY_r4) && ADC_BUSY_r5;

assign ADC_SCLK = (adc_mode == 'd3)?ADC_SCLK_i:ADC_SCLK_ii;
assign ADC_CS = (adc_mode == 'd3)?ADC_CS_i:ADC_CS_ii;
assign sample_en_neg = sample_en_r2 && (~sample_en_r1);

assign s_axis_tlast = (s_axis_tvalid_cnt == adc_frame_length - 'd1)?1'b1:1'b0;


always@(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'D0)begin 
		adc_mode <= 'd0;
	end
	else if(tx_reg_wr == 'd1)begin
		adc_mode <= 'd1;	
	end
	else if(tx_reg_rd == 'd1)begin
		adc_mode <= 'd2;
	end
	else if(sample_en == 'd1)begin
		adc_mode <= 'd3;
	end
end
	

 reg set
always@(posedge sys_clk)begin
	tx_reg_wr_r1 <= tx_reg_wr;
	tx_reg_rd_r1 <= tx_reg_rd;
end	


always@(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'D0)begin  
		spi_tdata <= 'd0;
		spi_tvalid <= 'd0;
	end
	else if(tx_reg_wr == 'd1)begin
		spi_tdata <= {2'b00,adc_tdata_reg[13:8]};
		spi_tvalid <= 'd1;
	end
	else if(tx_reg_rd == 'd1)begin
		spi_tdata <= {2'b01,adc_tdata_reg[13:8]};
		spi_tvalid <= 'd1;
	end
	else if(tx_reg_wr_r1 == 'd1 || tx_reg_rd_r1 == 'd1)begin
		spi_tdata <= adc_tdata_reg[7:0];
		spi_tvalid <= 'd1;		
	end
	else begin
		spi_tdata <= 'd0;
		spi_tvalid <= 'd0;		
	end
end
 	
	

 sample

always@(posedge sys_clk)begin
	ADC_BUSY_r1 <= ADC_BUSY;
	ADC_BUSY_r2 <= ADC_BUSY_r1;
	ADC_BUSY_r3 <= ADC_BUSY_r2;
	ADC_BUSY_r4 <= ADC_BUSY_r3;
	ADC_BUSY_r5 <= ADC_BUSY_r4;
	sample_en_r1 <= sample_en;
	sample_en_r2 <= sample_en_r1;
end


always@(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'D0)begin  
		sample_cnt <= 'd0;
	end
	else if(sample_cnt >= ADC_SAMPLE_RATE - 'd1)begin
		sample_cnt <= 'd0;
	end
	else if(sample_en == 'd1)begin
		sample_cnt <= sample_cnt + 'd1;
	end
	else begin
		sample_cnt <= 'd0;
	end
end
	
	
always@(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'D0)begin  
		ADC_CONVST <= 'd0;
	end
	else if(sample_cnt < ADC_CONVST_num + 'd10 && sample_cnt >= 'd10 && sample_en == 'd1)begin
		ADC_CONVST <= 'd1;
	end
	else begin
		ADC_CONVST <= 'd0;
	end
end




always@(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'D0)begin  
		spi_clk_cnt <= 'd0;
		clk_cnt <= 'd0;
	end	
	else if(ADC_BUSY_neg == 'd1) begin
		spi_clk_cnt <= 'd36;
		clk_cnt <= adc_sample_rate_reg;20M;
	end
	else if(spi_clk_cnt > 'd0 && clk_cnt == 'd1)begin
		spi_clk_cnt <= spi_clk_cnt - 'd1;
		clk_cnt <= adc_sample_rate_reg;
	end
	else if(spi_clk_cnt > 'd0)begin
		clk_cnt <= clk_cnt - 'd1;
	end
end



always@(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'D0)begin  
		ADC_CS_i <= 'd1;
	end	
	else if(spi_clk_cnt > 'd0) begin
		ADC_CS_i <= 'd0;
	end
	else begin
		ADC_CS_i <= 'd1;
	end
end


always@(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'D0)begin  
		ADC_SCLK_i <= 'd1;
	end	
	else if(clk_cnt == 'd1 && spi_clk_cnt >='d3 && spi_clk_cnt <= 'd34) begin
		ADC_SCLK_i <= ~ADC_SCLK_i;
	end
end

always@(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'D0)begin  
		rec_adc_a_sample_data <= 'd0;
		rec_adc_b_sample_data <= 'd0;	
		rec_adc_c_sample_data <= 'd0;	
		rec_adc_d_sample_data <= 'd0;	
		rec_adc_e_sample_data <= 'd0;	
		rec_adc_f_sample_data <= 'd0;	
		rec_adc_g_sample_data <= 'd0;	
		rec_adc_h_sample_data <= 'd0;		
	end	
	else if(clk_cnt == 'd1 && spi_clk_cnt >='d3 && spi_clk_cnt <= 'd34 && ADC_SCLK_i == 'd0) begin
		rec_adc_a_sample_data <= {rec_adc_a_sample_data[14:0],ADC_DATA[7]};
		rec_adc_b_sample_data <= {rec_adc_b_sample_data[14:0],ADC_DATA[6]};
		rec_adc_c_sample_data <= {rec_adc_c_sample_data[14:0],ADC_DATA[5]};
		rec_adc_d_sample_data <= {rec_adc_d_sample_data[14:0],ADC_DATA[4]};	
		rec_adc_e_sample_data <= {rec_adc_e_sample_data[14:0],ADC_DATA[3]};
		rec_adc_f_sample_data <= {rec_adc_f_sample_data[14:0],ADC_DATA[2]};
		rec_adc_g_sample_data <= {rec_adc_g_sample_data[14:0],ADC_DATA[1]};
		rec_adc_h_sample_data <= {rec_adc_h_sample_data[14:0],ADC_DATA[0]};
	end
end

always@(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'D0)begin  
		rec_adc_sample_en <= 'd0;
		
	end	
	else if(clk_cnt == 'd1 && spi_clk_cnt == 'd3 && ADC_SCLK_i == 'd0) begin
		rec_adc_sample_en <= 'd1;
	end
	else begin
		rec_adc_sample_en <= 'd0;
	end
end

always@(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'D0)begin  
		sample_en_delay <= 'd0;
		adc_stop_delay <= 'd0;
	end	
	else begin
		sample_en_delay <= {sample_en_delay[30:0],rec_adc_sample_en};
		adc_stop_delay <= {adc_stop_delay[30:0],sample_en_neg};
	end
end



always@(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'D0)begin  
		s_axis_tdata <= 'd0;
		s_axis_tvalid <= 'd0;
	end	
	else if(sample_en_delay[0] == 'd1 && channel_a_en == 'd1)begin
		s_axis_tdata <= rec_adc_a_sample_data[15:8];
		s_axis_tvalid <= 'd1;
	end
	else if(sample_en_delay[1] == 'd1 && channel_a_en == 'd1)begin
		s_axis_tdata <= rec_adc_a_sample_data[7:0];
		s_axis_tvalid <= 'd1;
	end
	else if(sample_en_delay[2] == 'd1 && channel_b_en == 'd1)begin
		s_axis_tdata <= rec_adc_b_sample_data[15:8];
		s_axis_tvalid <= 'd1;
	end
	else if(sample_en_delay[3] == 'd1 && channel_b_en == 'd1)begin
		s_axis_tdata <= rec_adc_b_sample_data[7:0];
		s_axis_tvalid <= 'd1;
	end
	else if(sample_en_delay[4] == 'd1 && channel_c_en == 'd1)begin
		s_axis_tdata <= rec_adc_c_sample_data[15:8];
		s_axis_tvalid <= 'd1;
	end
	else if(sample_en_delay[5] == 'd1 && channel_c_en == 'd1)begin
		s_axis_tdata <= rec_adc_c_sample_data[7:0];
		s_axis_tvalid <= 'd1;
	end
	else if(sample_en_delay[6] == 'd1 && channel_d_en == 'd1)begin
		s_axis_tdata <= rec_adc_d_sample_data[15:8];
		s_axis_tvalid <= 'd1;
	end
	else if(sample_en_delay[7] == 'd1 && channel_d_en == 'd1)begin
		s_axis_tdata <= rec_adc_d_sample_data[7:0];
		s_axis_tvalid <= 'd1;
	end
	else if(sample_en_delay[8] == 'd1 && channel_e_en == 'd1)begin
		s_axis_tdata <= rec_adc_e_sample_data[15:8];
		s_axis_tvalid <= 'd1;
	end
	else if(sample_en_delay[9] == 'd1 && channel_e_en == 'd1)begin
		s_axis_tdata <= rec_adc_e_sample_data[7:0];
		s_axis_tvalid <= 'd1;
	end
	else if(sample_en_delay[10] == 'd1 && channel_f_en == 'd1)begin
		s_axis_tdata <= rec_adc_f_sample_data[15:8];
		s_axis_tvalid <= 'd1;
	end
	else if(sample_en_delay[11] == 'd1 && channel_f_en == 'd1)begin
		s_axis_tdata <= rec_adc_f_sample_data[7:0];
		s_axis_tvalid <= 'd1;
	end
	else if(sample_en_delay[12] == 'd1 && channel_g_en == 'd1)begin
		s_axis_tdata <= rec_adc_g_sample_data[15:8];
		s_axis_tvalid <= 'd1;
	end
	else if(sample_en_delay[13] == 'd1 && channel_g_en == 'd1)begin
		s_axis_tdata <= rec_adc_g_sample_data[7:0];
		s_axis_tvalid <= 'd1;
	end
	else if(sample_en_delay[14] == 'd1 && channel_h_en == 'd1)begin
		s_axis_tdata <= rec_adc_h_sample_data[15:8];
		s_axis_tvalid <= 'd1;
	end
	else if(sample_en_delay[15] == 'd1 && channel_h_en == 'd1)begin
		s_axis_tdata <= rec_adc_h_sample_data[7:0];
		s_axis_tvalid <= 'd1;
	end
	else begin
		s_axis_tvalid <= 'd0;
	end
end

always@(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'D0)begin  
		s_axis_tvalid_cnt <= 'd0;
	end	
	else if(s_axis_tvalid == 'd1 && s_axis_tvalid_cnt == adc_frame_length - 'd1)begin
		s_axis_tvalid_cnt <= 'd0;
	end
	else if(s_axis_tvalid == 'd1)begin
		s_axis_tvalid_cnt <= s_axis_tvalid_cnt + 'd1;
	end
end




always@(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'D0)begin  
		fifo_rst_en <= 'd0;
	end	
	else if(sample_en == 'd0 && axis_adc_tvalid == 'd0 && axis_data_count > 'd0 && axis_data_count <adc_frame_length)begin
		fifo_rst_en <= 'd1;
	end
	else begin
		fifo_rst_en <= 'd0;
	end
end

always@(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'D0)begin  
		fifo_rst_n <= 'd1;
		fifo_rst_cnt <= 'd0;
	end		
	else if(fifo_rst_en == 'd1)begin
		fifo_rst_n <= 'd0;
		fifo_rst_cnt <= 'd200;
	end
	else if(fifo_rst_cnt > 'd0)begin
		fifo_rst_n <= 'd0;
		fifo_rst_cnt <= fifo_rst_cnt - 'd1;
	end
	else begin
		fifo_rst_n <= 'd1;
		fifo_rst_cnt <= 'd0;
	end
end




SPI_DRV	SPI_DRV_inst(
	.sys_rstn(sys_rst_n),
	.sys_clk_100m(sys_clk),
	.spi_mode(2'b11),
	.spi_tvalid(spi_tvalid),
	.spi_tdata(spi_tdata),
	.spi_rate('d20),
	.spi_rd_num('d1),
	.DUT_SPI_WR_BIT_reg(8'h04),
	
	.spi_tready(),
	.dut_data_out(adc_rec_reg_data),
	.dut_data_out_en(adc_rec_reg_data_en),
	.spi_fifo_recv_en('d1),
	.spi_rd_busy(),
	
	.spi_sck(ADC_SCLK_ii),
	.spi_cs(ADC_CS_ii),
	.spi_mosi(ADC_SDI),
	.spi_miso(ADC_DATA[7])	
);
	
	
fifo_adc_sample_data	fifo_adc_sample_data_inst(
	.s_aclk(sys_clk),
	.s_aresetn(sys_rst_n && fifo_rst_n),
	.s_axis_tvalid(s_axis_tvalid),
	.s_axis_tready(),
	.s_axis_tdata(s_axis_tdata),
	.s_axis_tlast(s_axis_tlast),
	.m_axis_tvalid(axis_adc_tvalid),
	.m_axis_tready('d1),
	.m_axis_tdata(axis_adc_data),
	.m_axis_tlast(axis_adc_tlast),
	
	.axis_data_count(axis_data_count)
  );
	
	
/* test
	
reg[31:0] cnt_tx;
reg[31:0] delay;

assign rx_data_length = adc_frame_length;
	 
	
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(sys_rst_n == 'd0) begin	
		axis_adc_data <= 'd0;
		axis_adc_tvalid <= 'd0;
		axis_adc_tlast <= 'd0;
		cnt_tx <= 'd0;
		delay <= 'd0;
	end

	else if(delay <= 'd2000)begin
		delay <= delay + 'd1;
	end
	
	else if(cnt_tx == adc_frame_length - 'd1)begin
		axis_adc_data <= axis_adc_data + 'd1;
		axis_adc_tvalid <= 'd1;
		axis_adc_tlast <= 'd1;
		cnt_tx <= cnt_tx + 'd1;		
	end
	else if(cnt_tx < adc_frame_length - 'd1)begin
		axis_adc_data <= axis_adc_data + 'd1;
		axis_adc_tvalid <= 'd1;
		axis_adc_tlast <= 'd0;
		cnt_tx <= cnt_tx + 'd1;		
	end

	///
	else if(cnt_tx <= 'd20000)begin
		axis_adc_data <= 'd0;
		axis_adc_tvalid <= 'd0;
		axis_adc_tlast <= 'd0;
		cnt_tx <= cnt_tx + 'd1;		
	end
	else begin
		axis_adc_data <= 'd0;
		axis_adc_tvalid <= 'd0;
		axis_adc_tlast <= 'd0;
		cnt_tx <= 'd0;
	end
end


*/	
	
endmodule






代码接口说明:

信号名说明
adc_frame_length采样数据打包成帧输出,这里设置帧内容长度
adc_tdata_reg寄存器地址+数据信息,如果是读只有读地址有效
adc_sample_rate_hADC循环采样周期高16位
adc_sample_rate_l                ADC循环采样周期低16位
adc_rec_reg_dataADC返回的寄存器值
adc_rec_reg_data_enADC返回的寄存器值使能位
adc_rw_setADC读、写、循环采样控制寄存器
adc_sample_rate_regclk速率控制
adc_sample_channel_en_reg通道使能寄存器控制,8通道可以做任意通道使能。

仿真

代码仿真结果如下:

首先是SPI写操作,放大效果如下:

该操作标识对寄存0x01写0x23值;

ADC采样波形如下:

         CONGVST为高电平期间触发芯片同步采集,此时BUSY会至高表示正在转换中,当BUSY拉低代表转换完成,输出SCLK时钟信号并开始同步采样。

如需要完整的驱动代码或者技术支持可以私聊我,谢谢。

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

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

相关文章

并发服务器开发基础

一、服务器模型 1. 单循环服务器&#xff1a; 单循环服务器在同一时刻只能处理一个客户端的请求。由于其结构简单&#xff0c;适合低负载的场景&#xff0c;但在并发请求增加时可能导致性能问题。 2. 并发服务器模型&#xff1a; 并发服务器可以同时响应多个客户端…

openzgy编译和测试应用

zgy是仅次于segy重要的地震数据格式,最早在petrel软件中使用,目前已基本成为行业标准,具有更快的数据存储效率。openzgy是其开源版本。 ZGY文件格式由Schlumberger公司开发,用于存储地震解释的三维数据。OpenZGY库提供了读写该格式的能力。存在C++和Python两种版本。对于P…

web应用程序之服务器部署

当一个web应用层序开发好后&#xff0c;无论你是用什么语言&#xff0c;最后都要考虑部署到服务器上测试使用&#xff0c;这里就常见的服务器上部署进行如下的摸索总结。WSGI&#xff08;Web Server Gateway Interface&#xff09;&#xff0c;翻译为Python web服务器网关接口&…

【与C++的邂逅】--- 模板初阶

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 与C的邂逅 本篇博客我们将了解C中泛型编程体现的一大利器 --- 模板&#xff0c;有了模板可以帮我们用户省力。 &#x1f3e0; 泛型编程 如何实现一个通…

二叉树的三个简单题

1、二叉树的第k个结点 思路解析 由题可知这是一棵二叉搜索树 它或者是一棵空树&#xff0c;或者是具有下列性质的二叉树&#xff1a; 1. 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b; 2. 若它的右子树不空&#xff0c;则右子树…

LSTM唐诗生成

LSTM唐诗生成 1课程简介1-2递归神经网络RNN1-3RNN网络细节1-4LSTM网络架构2-1处理Minist数据集2-2RNN网络模型及训练3-1任务概述与环境配置3-2参数配置3-3数据预处理模块3-4batch数据制作3-5RNN模型定义3-8测试唐诗生成效果 1课程简介 使用深度网络模型 写首歌 写个剧本等 原…

openshift node NotReady kubelet http: TLS handshake error

文章目录 问题现象解决方法 问题现象 openshift 集群 node 节点 notready $ oc get node NAME STATUS ROLES AGE VERSION master1.ocp4.demo.com Ready control-plane,master 4d14h v1.29.76abe8a1 master2.ocp4…

折腾 Quickwit,Rust 编写的分布式搜索引擎-官方教程

快速上手 在本快速入门指南中&#xff0c;我们将安装 Quickwit&#xff0c;创建一个索引&#xff0c;添加文档&#xff0c;最后执行搜索查询。本指南中使用的所有 Quickwit 命令都在 CLI 参考文档 中进行了记录。 https://quickwit.io/docs/main-branch/reference/cli 使用 Qui…

光庭信息半年报:营收利润「双」下降,汽车软件业务竞争加剧

「软件定义汽车」概念&#xff0c;不可否认强化了软件在整车价值的权重、带动更多供应商争夺软件业务的同时&#xff0c;也同样埋下了不小的风险。 比如&#xff0c;在汽车行业&#xff0c;常见的软件业务有两种&#xff1a;1、软件许可/IP&#xff0c;这类产品服务主要集中于…

MacOS 本地打开android模拟器

MacOS 本地打开android模拟器 查看本地安卓模拟器&#xff1a;emulator -list-avds 注意&#x1f4e2;&#xff1a;这里会提示你找不到 emulator 命令&#xff0c;此时我们需要进入 cd ~/Library/Android/sdk/tools/ 查看模拟器列表&#xff1a;./emulator -list-avds 启动…

PHP概述-特点-应用领域-如何学习

老师建议注册使用百度文心一言&#xff1b;讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞&#xff1b;Kimi.ai - 帮你看更大的世界 等人工智能工具软件的一个到两个&#xff0c;也可下载文心一言、讯飞星火、kimi等APP软件使用&#xff0c;对于我们在读的大二学生来说有什么…

需方软件供应链安全保障要求及开源场景对照自评表(上)

国标《信息安全技术 软件供应链安全要求》确立了软件供应链安全目标&#xff0c;规定了软件供应链安全风险管理要求和供需双方的组织管理和供应活动管理安全要求。 开源软件供应链作为软件供应链的一种特殊形式&#xff0c;该国标亦适用于指导开源软件供应链中的供需双方开展组…

BaseCTF [Week2] 最简单的编码

前言&#xff1a;做题笔记。 下载解压 查壳。 64ida打开。 查找字符串。 跟进。 逆着向前看。 说明是密文。 里面是base64的变异加密。 原base64关键加密&#xff1a; &#xff08;看BaseCTF week1 [第一周]BasePlus 官方WP&#xff09; 变种后&#xff1a; 在此基础上加上了…

安卓系统 XBL阶段详解

在安卓系统的启动流程中&#xff0c;XBL&#xff08;eXtensible Boot Loader 或 Secondary Bootloader&#xff09;是一个关键阶段&#xff0c;特别是在使用QualComm&#xff08;高通&#xff09;等SOC&#xff08;System on Chip&#xff09;的设备上。以下是对XBL阶段的详细解…

Yololov5+Pyqt5+Opencv 实时城市积水报警系统

在现代城市生活中&#xff0c;积水问题不仅影响交通和人们的日常生活&#xff0c;还可能对城市基础设施造成潜在的威胁。为了快速、准确地识别和应对积水问题&#xff0c;使用计算机视觉技术进行智能积水检测成为一个重要的解决方案。在这篇博客中&#xff0c;我将带你一步步实…

数据结构(邓俊辉)学习笔记】串 08——KMP算法:再改进

文章目录 1. 美中不足2. 以卵击石3. 前车之覆4. 后车之鉴5. 可视对比 1. 美中不足 以上&#xff0c;我们不仅给出了 KMP 算法&#xff0c;同时也证明它的时间复杂度已经达到了渐进意义上的最优&#xff0c;也就是最坏情况也不超过 O(n)。而该算法目前这个版本也绝非完美无缺&am…

005、架构_数据节点

​DN组件总览 ​ DN节点包含进程 dbagent进程:主要提供数据节点高可用、数据导入导出、数据备份恢复、事务一致性、运维类功能、集群的扩缩容、卸数等功能;MySQL进程:主要提供数据一致性、分组管理、快同步复制、高低水位等;

机械学习—零基础学习日志(如何理解概率论10)

数理统计 这里X为总体。x1,x2,x3为样本。具体的取值为样本值。 抽样分布 来一道习题&#xff1a; 回答&#xff1a; 上一道题解析&#xff1a; 《概率论与数理统计期末不挂科|考研零基础入门4小时完整版&#xff08;王志超&#xff09;》学习笔记 王志超老师 &#xff08;UP…

一张图认识视频中间件

之前我们有介绍了很多关于视频中间件的技术资料&#xff1a; 超视网络视频中间件平台详解 视频中间件&#xff1a;海康E-home私有协议接入&#xff0c;并输出标准FLV/HLS/RTSP流 视频中间件&#xff1a;大华IPC/NVR 主动注册协议接入并输出标准FLV/RTSP/HLS流 视频中间件&#…

Meta AI动画生成功能的规模化部署与优化策略

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…