Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验(二)

Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验(前导)

Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验(一)

Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验(三)


 五、实验目的

        本次实验使用电脑上的网络调试助手,将命令帧通过以太网芯片RTL8211(RGMII接口)发送至ACZ7015开发板,提取UDP报文内容转换成控制命令,从而实现对ACM9238模块采样频率、数据采样个数以及采样通道的配置。

         配置完成之后,ACM9238模块开始采集数据,将采集的数据存储至DDR3中,然后通过网口以UDP协议传输到电脑。用户可以在电脑上通过网口调试工具进行指令的下发,并以文件的形式保存接收到的数据,然后使用MATLAB软件进行进一步的数据处理分析。

PL 部分的模块说明如下:

  • pll 模块: 锁相环模块, 输入时钟 50M, 由 PS 输出给 PL; 输出 100M 的时钟给到 DDR3 控制器使用; 输出 50M 的时钟给其它模块使用。
  • eth_receive_cmd 模块: 以太网接收命令模块, 对以太网接收到的数据进行分析, 将接收的数据转换成相应的控制数据并输出到对应的模块。
  • ad9238_ctrl 模块: ACM9238 控制器模块, 该模块内部包含速度控制模块,以及数据位宽转换模块。
  • state_ctrl 模块: ADC 采集数据 DDR3 缓存以太网发送状态控制模块, 协调各个模块的信号控制, 程序状态的总控制模块。
  • fifo_axi4_adapter 模块: fifo 接口到 AXI4 接口的转换模块(含 2 个 FIFO)。

六、ACM9238模块

两路,

采样上限50Msps,如果期望以1Msps 的采样速率采样, 则只需要每间隔 50 个采样数据取一个结果存储或使用, 其他 49 个数据直接舍弃。不建议降低ADC芯片的时钟信号。

七、设计实例

7.1模块设计

7.1.1 eth_receive_cmd模块

将以太网接收到的数据进行解析, 得到控制命令。

 

(1)eth_udp_rx_gmii模块和rgmii_to_gmii模块
(2)mmcm模块

锁相环模块,将 rgmii 接口时钟信号 rgmii_rx_clk_i 偏移90 °得到 rgmii_rx_clk 时钟信号。(为了在时钟信号的上升沿/下降沿取数据时,取得数据刚好是数据信号 rgmii_rxd 的正中间, 使得采样的数据处于最稳定的状态。)

 锁相环IP配置

(3)fifo_rx模块

使用该 IP 核解决采集过程中会出现的跨时钟域数据交互问题(以太网125MHz,ACM9238-50MHz)。

(4)eth_cmd模块

接收转命令模块。

//非空时产生FIFO读请求信号
always@(posedge clk or negedge reset_n)
if(!reset_n)
    fifo_rd_req <= 1'b0;
else if(!rx_empty)
    fifo_rd_req <= 1'b1;
else
    fifo_rd_req <= 1'b0;


//获得帧命令数据
always@(posedge clk)
if(fifo_rd_req)begin
    data_0[7] <= #1 fifodout;
    data_0[6] <= #1 data_0[7];
    data_0[5] <= #1 data_0[6];
    data_0[4] <= #1 data_0[5];
    data_0[3] <= #1 data_0[4];
    data_0[2] <= #1 data_0[3];
    data_0[1] <= #1 data_0[2];
    data_0[0] <= #1 data_0[1];
end


//判断帧命令数据
always@(posedge clk or negedge reset_n)
if(!reset_n)begin
    address <= 0;
    cmd_data <= 32'd0;
    cmdvalid <= 1'b0;
end
else if(fifo_rx_done)begin
    if((data_0[0]==8'h55)&&(data_0[1]==8'hA5)&&(data_0[7]==8'hF0))
    begin
        cmd_data[7:0] <= #1 data_0[6];
        cmd_data[15:8] <= #1 data_0[5];
        cmd_data[23:16] <= #1 data_0[4];
        cmd_data[31:24] <= #1 data_0[3];
        address <= #1 data_0[2];
        cmdvalid <= #1 1;
    end
    else
        cmdvalid <= #1 0;
end
else
cmdvalid <= #1 0;
(5)cmd_rx模块

接收数据转换为控制数据。

寄存器说明:

always@(posedge clk or negedge reset_n)
if(!reset_n)begin
    ChannelSel <= 2'b00;
    DataNum <= 32'd0;
    ADC_Speed_Set <= 32'd0;
    RestartReq <= 1'b0;
end
else if(cmdvalid)begin
    case(cmd_addr)
        0: RestartReq <= 1'b1;
        1: ChannelSel <= cmd_data[1:0];
        2: DataNum <= cmd_data[31:0];
        3: ADC_Speed_Set <= cmd_data[31:0];
    default:;
    endcase
end
else
    RestartReq <= 1'b0;

7.1.2 ad9238_ctrl 模块

控制ADC的采样速率,将12位数据转换为16位数据。

(1)speed_ctrl模块

always@(posedge clk or negedge reset_n)
if(!reset_n)
    div_cnt <= 0;
else if(ad_sample_en)begin
    if(div_cnt >= div_set)
        div_cnt <= 0;
    else
        div_cnt <= div_cnt + 1'd1;
end
else
    div_cnt <= 0;


always@(posedge clk or negedge reset_n)
if(!reset_n)
    adc_data_en <= 0;
else if(div_cnt == div_set)
    adc_data_en <= 1;
else
    adc_data_en <= 0;
(2)ad_12bit_to_16bit模块

always @(posedge clk)
    ad_out_valid <= ad_sample_en;


assign s_ad_in1 = ad_in1 + 12'd2048;
assign s_ad_in2 = ad_in2 + 12'd2048;


always @(posedge clk)
if(ad_sample_en && ch_sel == 2'b01)
    ad_out<={4'd0,s_ad_in1};//这样补 0 为了适应上位机
else if(ad_sample_en && ch_sel == 2'b10)
    ad_out<={4'd0,s_ad_in2};//
else if(ad_sample_en && ch_sel == 2'b00)
    ad_out<={4'd0,adc_test_data};
else
    ad_out <= 16'd0;

7.1.3 state_ctrl 模块

控制信号的产生以及 ADC 何时启动数据传输。

localparam IDLE = 4'd0; //空闲状态
localparam DDR_WR_FIFO_CLEAR = 4'd1; //DDR 写 FIFO 清除状态
localparam ADC_SAMPLE = 4'd2; //ADC 采样数据状态
localparam DDR_RD_FIFO_CLEAR = 4'd3; //DDR 读 FIFO 清除状态
localparam DATA_SEND_START = 4'd4; //数据发送状态
localparam DATA_SEND_WORKING = 4'd5; //数据发送完成状态

(1)IDLE

//ADC 模块开始采样标志信号寄存
always@(posedge clk or posedge reset)begin
if(reset)
    start_sample_rm <= 1'b0;
else if(state==IDLE)
    start_sample_rm <= start_sample;
else
    start_sample_rm <= 1'b0;
end

/*状态切换IDLE->DDR_WR_FIFO_CLEAR
begin
    if(start_sample_rm) begin //DDR 初始化完成并且产生启动采样信号
        state <= DDR_WR_FIFO_CLEAR; //进入写 FIFO 清除状态
    end
    else begin
        state <= state;
    end
end
*/

(2)DDR_WR_FIFO_CLEAR

//延时10个节拍
always@(posedge clk or posedge reset)begin
if(reset)
    wrfifo_clr_cnt<=0;
else if(state==DDR_WR_FIFO_CLEAR)//如果进入了清 fifo 状态
begin
    if(wrfifo_clr_cnt==9)
        wrfifo_clr_cnt<=5'd9;
    else
        wrfifo_clr_cnt<=wrfifo_clr_cnt+1'b1;
end
else
    wrfifo_clr_cnt<=5'd0;
end

//给清FIFO信号足够的拉高时间
always@(posedge clk or posedge reset)begin
if (reset)
    wrfifo_clr<=0;
else if(state==DDR_WR_FIFO_CLEAR)
    begin
        if(wrfifo_clr_cnt==0||wrfifo_clr_cnt==1||wrfifo_clr_cnt==2)
            wrfifo_clr<=1'b1;
        else
            wrfifo_clr<=1'b0;
    end
else
    wrfifo_clr<=1'b0;
end

/*状态切换DDR_WR_FIFO_CLEAR->ADC_SAMPLE
begin
    if(!wrfifo_full && (wrfifo_clr_cnt==9))
        state<=ADC_SAMPLE;
    else
        state<=DDR_WR_FIFO_CLEAR;
end
*/

(3)ADC_SAMPLE

//根据ADC输出使能信号计数
always@(posedge clk or posedge reset)begin
if(reset)
    adc_sample_cnt<=1'b0;
else if(state==ADC_SAMPLE)begin
    if(adc_data_en)
        adc_sample_cnt<=adc_sample_cnt+1'b1;
    else
        adc_sample_cnt<=adc_sample_cnt;
end
else
    adc_sample_cnt<=1'b0;
end

//产生采样使能信号给其他模块
always@(posedge clk or posedge reset)begin
if(reset)
    ad_sample_en<=0;
else if(state==ADC_SAMPLE)
    ad_sample_en<=1;
else
    ad_sample_en<=0;
end

/*状态切换ADC_SAMPLE->DDR_RD_FIFO_CLEAR
begin
    if((adc_sample_cnt>=set_sample_num-1'b1)&& adc_data_en)
        state<=DDR_RD_FIFO_CLEAR;
    else
        state<=state;
end
*/

(4)DDR_RD_FIFO_CLEAR

//延时10个节拍
always@(posedge clk or posedge reset)begin
if(reset)
    rdfifo_clr_cnt<=0;
else if(state==DDR_RD_FIFO_CLEAR)//如果进入了清 fifo 状态
begin
    if(rdfifo_clr_cnt==9)
        rdfifo_clr_cnt<=5'd9;
    else
        rdfifo_clr_cnt<=rdfifo_clr_cnt+1'b1;
end
else
    rdfifo_clr_cnt<=5'd0;
end

//给清FIFO信号足够的拉高时间
always@(posedge clk or posedge reset)begin
if (reset)
    rdfifo_clr<=0;
else if(state==DDR_RD_FIFO_CLEAR)
begin
    if(rdfifo_clr_cnt==0||rdfifo_clr_cnt==1||rdfifo_clr_cnt==2)
        rdfifo_clr<=1'b1;
else
        rdfifo_clr<=1'b0;
end
else
    rdfifo_clr<=1'b0;
end

/*状态切换DDR_RD_FIFO_CLEAR->DATA_SEND_START
begin
    if(!rdfifo_empty && (rdfifo_clr_cnt==9))begin
        state<=DATA_SEND_START;
    end
    else
        state<=state;
end
*/

(5)DATA_SEND_START

/*状态切换DATA_SEND_START->DATA_SEND_WORKING
begin
    state <= DATA_SEND_WORKING;
end
*/

(6)DATA_SEND_WORKING

//发送数据计数
always@(posedge clk or posedge reset)begin
if(reset)
    send_data_cnt<=32'd0;
else if(state==IDLE)
    send_data_cnt<=32'd0;
else if(rdfifo_rden)
    send_data_cnt<=send_data_cnt+1;
else
    send_data_cnt<=send_data_cnt;
end

//DDR数据存到以太网缓存
always@(posedge clk or posedge reset)
if(reset) begin
    eth_fifo_wrreq <= 1'b0;
    eth_fifo_wrdata <= 'd0;
end
else if(rdfifo_rden) begin
    eth_fifo_wrreq <= 1'b1;
    eth_fifo_wrdata <= rdfifo_dout;
end
else begin
    eth_fifo_wrreq <= 1'b0;
    eth_fifo_wrdata <= 'd0;
end

/*状态切换DATA_SEND_WORKING->IDLE、DATA_SEND_WORKING->DATA_SEND_WORKING
begin
    if(send_data_cnt >= set_sample_num-1'b1) begin
        rdfifo_rden <= 1'b0;
        state <= IDLE;
    end
    else begin
        rdfifo_rden <= 1'b1;
        state <= DATA_SEND_WORKING;
    end
end
*/

7.1.4 fifo_axi_adapter模块

看文章开头:Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验(一)。

S_IDLE:
begin
    if(start)
        next_state = S_ARB;
    else
        next_state = S_IDLE;
end
module fifo_axi4_adapter #(
  parameter FIFO_DW                = 16     ,
  parameter WR_AXI_BYTE_ADDR_BEGIN = 0      ,
  parameter WR_AXI_BYTE_ADDR_END   = 1023   ,
  parameter RD_AXI_BYTE_ADDR_BEGIN = 0      ,
  parameter RD_AXI_BYTE_ADDR_END   = 1023   ,

  parameter AXI_DATA_WIDTH         = 128    ,
  parameter AXI_ADDR_WIDTH         = 28     ,
  parameter AXI_ID                 = 4'b0000,
  parameter AXI_BURST_LEN          = 8'd31    //burst length = 32
)
(
  input                          start         ,
  // clock reset
  input                          clk           ,
  input                          reset         ,
  // wr_fifo wr Interface
  input                          wrfifo_clr    ,
  input                          wrfifo_clk    ,
  input                          wrfifo_wren   ,
  input   [FIFO_DW-1:0]          wrfifo_din    ,
  output                         wrfifo_full   ,
  output  [15:0]                 wrfifo_wr_cnt ,
  // rd_fifo rd Interface
  input                          rdfifo_clr    ,
  input                          rdfifo_clk    ,
  input                          rdfifo_rden   ,
  output  [FIFO_DW-1:0]          rdfifo_dout   ,
  output                         rdfifo_empty  ,
  output  [15:0]                 rdfifo_rd_cnt ,
  // Master Interface Write Address Ports
  output  [3:0]                  m_axi_awid    ,
  output  [AXI_ADDR_WIDTH-1:0]   m_axi_awaddr  ,
  output  [7:0]                  m_axi_awlen   ,
  output  [2:0]                  m_axi_awsize  ,
  output  [1:0]                  m_axi_awburst ,
  output  [0:0]                  m_axi_awlock  ,
  output  [3:0]                  m_axi_awcache ,
  output  [2:0]                  m_axi_awprot  ,
  output  [3:0]                  m_axi_awqos   ,
  output  [3:0]                  m_axi_awregion,
  output                         m_axi_awvalid ,
  input                          m_axi_awready ,
  // Master Interface Write Data Ports
  output  [AXI_DATA_WIDTH-1:0]   m_axi_wdata   ,
  output  [AXI_DATA_WIDTH/8-1:0] m_axi_wstrb   ,
  output                         m_axi_wlast   ,
  output                         m_axi_wvalid  ,
  input                          m_axi_wready  ,
  // Master Interface Write Response Ports
  input   [3:0]                  m_axi_bid     ,
  input   [1:0]                  m_axi_bresp   ,
  input                          m_axi_bvalid  ,
  output                         m_axi_bready  ,
  // Master Interface Read Address Ports
  output  [3:0]                  m_axi_arid    ,
  output  [AXI_ADDR_WIDTH-1:0]   m_axi_araddr  ,
  output  [7:0]                  m_axi_arlen   ,
  output  [2:0]                  m_axi_arsize  ,
  output  [1:0]                  m_axi_arburst ,
  output  [0:0]                  m_axi_arlock  ,
  output  [3:0]                  m_axi_arcache ,
  output  [2:0]                  m_axi_arprot  ,
  output  [3:0]                  m_axi_arqos   ,
  output  [3:0]                  m_axi_arregion,
  output                         m_axi_arvalid ,
  input                          m_axi_arready ,
  // Master Interface Read Data Ports
  input   [3:0]                  m_axi_rid     ,
  input   [AXI_DATA_WIDTH-1:0]   m_axi_rdata   ,
  input   [1:0]                  m_axi_rresp   ,
  input                          m_axi_rlast   ,
  input                          m_axi_rvalid  ,
  output                         m_axi_rready  
);

7.1.5 eth_send_data 模块

将DDR读出的ADC数据发送到电脑端。

(1)fifo_tx模块

First Word Fall Through( FWFT)可以不需要读命令, 自动将最新的数据放在 dout 上。

(2)eth_send_ctrl模块

以太网帧最大长度 1518 字节(数据段 1500 字节) , 其中数据段 1500 字节还包括 20 字节 IP 报文头部和 8 字节 UDP 报文头部, 所以数据帧发送的ACM9238 采集的数据最大长度为 1472 字节。

  always@(posedge clk125M or negedge reset_n)
  if(!reset_n) begin
    pkt_tx_en <= 1'd0;
    pkt_length <= 16'd0;
    data_num <= 32'd0;
    state <= 0;
    cnt_dly_time <= 28'd0;
  end
  else begin
    case(state)
        0://得到 pkt_length 信号的初始值
            begin
                if(restart_req)begin
                    data_num <= total_data_num;
                    if((total_data_num << 1) >= 16'd1472)begin
                        pkt_length <= 16'd1472;	//一个数据2个字节
                        state <= 1;
                    end
                    else if((total_data_num << 1) > 0)begin
                        pkt_length <= total_data_num << 1; //一个数据2个字节
                        state <= 1;
                    end
                    else begin
                        state <= 0;
                    end
				end
            end
         1: 
            begin
                if(fifo_rd_cnt >= (pkt_length -2)) begin
                    pkt_tx_en <= 1'd1;
                    state <= 2;
                end
                else begin
                    state <= 1;
                    pkt_tx_en <= 1'd0;
                end
            end
         2:
            begin
                pkt_tx_en <= 1'd0;
                if(eth_tx_done)begin
					data_num <= data_num - pkt_length/2;
					state <= 3;
				end
            end
         
        3:
			if(cnt_dly_time >= cnt_dly_min)begin
               state <= 4;
               cnt_dly_time <= 28'd0;
            end
            else begin
               cnt_dly_time <= cnt_dly_time + 1'b1;
			   state <= 3;
            end
         4:
            begin
                if(data_num * 2 >= 16'd1472)begin
					pkt_length <= 16'd1472;
					state <= 1;
				end
				else if(data_num * 2 > 0)begin
					pkt_length <= data_num * 2;
					state <= 1;
				end
				else begin
					state <= 0;
				end
            end
          
          default:state <= 0;
         
    endcase
  end

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贪吃蛇c++

#include<bits/stdc.h> #include<conio.h> // 用于获取按键输入using namespace std;const int width 20; const int height 20; int x, y, fruitX, fruitY, score; int tailX[100], tailY[100]; // 蛇的身体位置数组 int nTail; // 蛇的长度 enum eDirecton { S…

C# 用Trace.WriteLine输出调试信息无法查看

写程序就会遇见BUG&#xff0c;这时候在代码不同部位输出一些标记的信息对查找错误非常有必要&#xff0c;一般情况下我们都是使用Console.WriteLine()方法来打印信息到控制台窗口&#xff0c;但有时候使用Console.WriteLine()方法会存在不方便的情况&#xff0c;比如鄙人遇到的…

国际光伏展览会

国际光伏展览会是一个专注于太阳能光伏领域的国际性展览会。该展览会汇集了来自全球光伏行业的专业人士和企业&#xff0c;展示和交流最新的太阳能光伏技术、产品和解决方案。 国际光伏展览会通常展示各种类型的光伏产品&#xff0c;包括太阳能电池、太阳能电池板、太阳能光伏发…

C#,最小代价多边形三角剖分MCPT(Minimum Cost Polygon Triangulation)算法与源代码

1 最小代价多边形三角剖分算法 凸多边形的三角剖分是通过在非相邻顶点&#xff08;角点&#xff09;之间绘制对角线来形成的&#xff0c;这样对角线就不会相交。问题是如何以最小的代价找到三角剖分的代价。三角剖分的代价是其组成三角形的权重之和。每个三角形的重量是其周长…

2024年服装私域提升的三大妙招!

在服装行业&#xff0c;私域运营正逐渐成为主流。随着市场的演变&#xff0c;从传统的线下门店与线上电商并行模式&#xff0c;到如今的以小程序商城、企业微信、视频号、公众号等为核心的全渠道私域运营模式&#xff0c;行业的转型已显而易见。 而推动这种转型的关键因素&…

一些关于绩效提升策略的具体例子和数据

员工个人绩效提升策略&#xff1a; 持续学习与发展&#xff1a; 例子&#xff1a;某销售员工报名参加销售技巧提升课程&#xff0c;学习新的销售策略。 数据&#xff1a;经过三个月的学习与实践&#xff0c;该员工的销售额提升了20%。 目标设定与跟踪&#xff1a; 例子&#xf…

如何在Windows上使用Docker,搭建一款实用的个人IT工具箱It- Tools

文章目录 1. 使用Docker本地部署it-tools2. 本地访问it-tools3. 安装cpolar内网穿透4. 固定it-tools公网地址 本篇文章将介绍如何在Windows上使用Docker本地部署IT- Tools&#xff0c;并且同样可以结合cpolar实现公网访问。 在前一篇文章中我们讲解了如何在Linux中使用Docker搭…

OKLink2月安全月报| 2起典型漏洞攻击案例分析

在本月初我们发布的2024年2月安全月报中提到&#xff0c;2月全网累计造成损失约1.03亿美元。其中钓鱼诈骗事件损失占比11.76%。 OKLink提醒大家&#xff0c;在参与Web3项目时&#xff0c;应当仔细调研项目的真实性、可靠性&#xff0c;提升对钓鱼网站和风险项目的甄别能力&…

关于华为昇腾(Ascend)AI芯片,CANN计算架构,MindSpore深度学习框架,MindStudio开发工具

1、华为昇腾生态 深度学习之前的配置都是&#xff1a;NVIDIA GPU / CPU CUDA Tensorflow/PyTorch 后来老美禁止 NVIDIA 卖GPU芯片给我们&#xff0c;于是国内企业开始发力CPU和GPU硬件&#xff0c;成果丰硕&#xff0c;虽然与NVIDIA顶级GPU还有一些差距&#xff0c;但是也不…

基于Java的生活废品回收系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案&#xff0c;旨在鼓…

CCF-C推荐会议 ICANN‘24 3月15日截稿!瑞士阿尔卑斯山脚下探索人工神经网络前沿!

会议之眼 快讯 第33届ICANN(International Conference on Artificial Neural Networks)即国际人工神经网络会议将于 2024 年 9月17日-20日在瑞士卢加诺举行&#xff01;卢加诺坐落于瑞士阿尔卑斯山脚下。会议地点是意大利瑞士大学和瑞士南部应用科学与艺术大学的一部分&#xf…

弱电综合布线:连接现代生活的纽带

在当今信息化快速发展的时代&#xff0c;弱电网络布线作为信息传输的重要基础设施&#xff0c;其作用日益凸显。它不仅保障了数据的高效流通&#xff0c;还确保了通信的稳定性。从商业大厦到教育机构&#xff0c;从政府机关到医院急救中心&#xff0c;再到我们居住的社区&#…

在哪里能找到抖音短视频素材?推荐热门的抖音短视频素材下载资源

哎呦喂&#xff0c;小伙伴们&#xff0c;是不是在短视频的大海里划船&#xff0c;想找到那颗能让你起飞的珍珠&#xff0c;但又觉得素材难寻如针海捞针&#xff1f;别急&#xff0c;今天我就来给你们送上几个超实用的宝藏素材网站&#xff0c;让你的短视频创作不再愁素材 1&am…

支持向量机 SVM | 线性可分:软间隔模型

目录 一. 软间隔模型1. 松弛因子的解释小节 2. SVM软间隔模型总结 线性可分SVM中&#xff0c;若想找到分类的超平面&#xff0c;数据必须是线性可分的&#xff1b;但在实际情况中&#xff0c;线性数据集存在少量的异常点&#xff0c;导致SVM无法对数据集线性划分 也就是说&…

L波段光端机-L波段+CATV射频光端机工作机制及行业应用探究

L波段光端机-L波段CATV射频光端机工作机制及行业应用探究 北京海特伟业任洪卓发布于2023年3月8日 一、何为L波段光端机 L波段光端机是一种用于光通信的设备&#xff0c;其主要工作波长位于L波段&#xff0c;即40~860MHz和950~2600MHz的带宽&#xff0c;可选独立工作于950~260…

一键转发朋友圈!微信快速营销推广必备法宝!

在这个“得私域者得天下”的互联网时代&#xff0c;如何能够在微信上进行快速、高效的营销推广成为了摆在许多人面前的一道难题。 幸运的是&#xff0c;随着微信管理系统的出现&#xff0c;一键转发朋友圈的快速营销推广法宝已经变得触手可及。 首先&#xff0c;微信管理系统…

【网络连接】ping不通的常见原因+解决方案,如何在只能访问网关时诊断,并修复IP不通的问题

【网络连接】ping不通的常见原因解决方案&#xff0c;如何在只能访问网关时诊断&#xff0c;并修复IP不通的问题 写在最前面网络基础可能的问题、表现以及解决方案如何诊断和解决操作步骤 详细问题描述详细解决方案1. 防火墙或安全软件拦截2. IP配置错误3. 网络设备问题4. 物理…

ArcGIS筛选工具:19段SQL示例代码,所有需求一网打尽

一、使用方法 筛选工具(Select_analysis)主要用于从输入要素类或输入要素图层中提取要素&#xff08;通常使用选择或结构化查询语言 (SQL) 表达式&#xff09;&#xff0c;并将其存储于输出要素类中。 以三调图斑为例&#xff0c;图斑中有一个【DLMC】字段&#xff0c;该字段…

做好用户期望管理的4大重点

用户期望管理对项目成功至关重要&#xff0c;充分了解和满足用户期望可以提高项目的成功率&#xff0c;增加项目的商业价值。如果没有完全理解和忽略用户期望&#xff0c;后期往往容易造成需求变更和重复性工作等问题&#xff0c;增加项目成本和风险。 因此我们需重视用户期望管…

易于使用的6个原型软件,让原型设计事半功倍!

产品原型可以帮助团队更有效地测试产品的可行性&#xff0c;了解和评估用户的需求&#xff0c;并不断优化迭代产品的最终解决方案。它决定了最终产品的质量和用户体验&#xff0c;也影响了产品业务运营的成功。高效的原型设计过程必须离不开优秀的设计工具。高质量的原型软件可…