以太网实验1.mdio接口读写实验

news2024/12/28 13:23:00

以太网常见硬件组成:

fpga首先发送数据到经过udp层、ip层以及mac层的封装
主要有MAC控制器、PHY芯片、网络变压器和RJ45接头组成,有的系统会有DMA控制。一般的系统中CPU和MAC以及DMA控制器都是集成在一块芯片上的,为了节省空间简化设计,很多时候网口的变压器和RJ45的接头集成在一起。
MAC 及 PHY 工作在 OSI 七层模型的数据链路层和物理层。
mii接口(Media Independent Interface):
MII 接口提供了 MAC 与 PHY 之间、PHY 与 STA(Station Management)之间的互联技术。
MII 接口主要包括四个部分。一是从 MAC 层到 PHY 层的发送数据接口,二是从 PHY 层到 MAC 层的接收数据接口,三是从PHY 层到 MAC 层的状态指示信号,四是 MAC 层和 PHY 层之间传送控制和状态信息的 MDIO 接口。

mdio接口

MDIO为双向信号,用来在MAC和PHY芯片之间的传递控制和状态信息。写寄存器MAC驱动,读寄存器时PHY驱动。
数据传输时先传高位(MSB),后传低位(LSB)。输出采用三态电路设计,MDIO需要接1.5K~10K的上拉电阻。通过MDIO线上是否有上拉电阻,来检测MDIO接口是否连接到PHY芯片上。
MDIO前后有两种协议, 包括Clause22 以及之后的Clause45, Clause 45 兼容Clause 22。
在这里插入图片描述
MDIO: 是 PHY 和 STA 之间的双向信号。 它用于在 PHY 和 STA 之间传输控制信息和状态。 控制信息由 STA 同步地针对 MDC 驱动并且由 PHY 同步地采样。 状态信息由 PHY 针对 MDC 同步驱动并由 STA 同步采样。
MDC: 由站管理实体向 PHY 提供,作为在 MDIO 信号上传送信息的定时参考。 MDC 是一种非周期性的信号,没有最高或最低时间。 无论 TX_CLK 和 RX_CLK 的标称周期如何,MDC 的最小高低时间应为 160 ns,MDC 的最小周期为 400 ns。

MDIO-Clause22帧格式:
依次为空闲标志、前导标志、开始标志、操作码、PHY地址、寄存器地址,翻转标志位和数据。
空闲标志(idle):无MDIO帧发送时,MDIO接口输出高阻(外部有上拉电阻,总线上看到的是高电平)。

前导标志(PRE):每帧发送前,MAC通过MDIO连续发送32个MDC周期的高电平1,同时通过MDC输出32个时钟周期。前导的作用是为PHY建立同步提供时间。如果STA能够确定PHY可以接收管理帧,可以压缩前导的发送。

开启标志(st):长度2Bits,必须为01,标志该数据帧开始。

操作码(op):长度2Bits,10标志为读操作,01标志为写操作。

PHY地址(phyad):长度5Bits,表示所访问的PHY地址,一个MDIO总线最大支持32个PHY。

寄存器地址(regad):长度5Bits,表示所访问的寄存器的地址,共计32个寄存器。IEEE802.3协议中对前16个寄存器进行了定义,其中比较常用的如下表。其余为PHY芯片自定寄存器。

翻转标志位(ta):长度2Bits,固定为10。该标志位为PHY芯片地址传输和数据传输处理预留处理时间,设置2bit TA的目的就是为了防止MDIO总线上产生竞争。

数据(data):长度16Bits,操作符为读操作时,该数据为对于地址PHY的特定寄存器的数值;操作符为写时,该数据为对该寄存器写入的数值。

帧格式Clause45:

MDIO Clause45为了访问更多的寄存器在Clause22基础上做了一些扩展,修改如下:

1)ST由01修改为00

2)OP进行了重新定义。00:地址帧 01:写 11:读 10:增量读(Post-read-increment-address)

3)PHYAD域修改名称为PRTAD,端口地址但仍代表PHY地址

4)REGAD修改为DEVAD,Clause45将PHY内部子模块的地址进行细分,这些子模块用DEVAD寻址。子模块内部的寄存器则使用地址帧进行寻址。

mdio时序:
在这里插入图片描述

当MDIO通信出现问题,可依次检查以下方面:

确保MDC工作在合适的频率,MDC以及MDIO有上拉.
PHYAD(PRTAD)没有搞错。
MMD 没有处于复位状态。
适当调整MDC的相位。
有些MMD要求帧与帧之间一定要用高阻态分隔

以太网芯片YT8511支持两种复位方式,一种是硬件复位,另外一种是软件复位。硬件复位时通过ETH_RST_N引脚实现对PHY芯片的复位,当ETH_RST_N引脚持续10ms的低电平时,即可实现对PHY芯片的复位。软件复位通过向寄存器地址0x00的Bit[15]写入1进行复位,并且在完成复位后,该位会自动清零。YT8511共有22位寄存器,有些寄存器是仅可读的,有些寄存器是仅可写的,还有些寄存器是可读可写的,当然在程序设计中我们不需要把这些寄存器全部都用上,一般来说寄存器0x00、0x01、0x1F是3个最常用的寄存器,即基本控制寄存器、基本状态寄存器、PHY控制寄存器。

对基本控制寄存器有个软复位操作,即MAC控制器可以通过MDIO协议向PHY发送软复位请求,在大多数情况下软复位一次后,即可读取到正确的自协商结果。

对基本状态寄存器,用户通过MDIO协议从PHY中读取该寄存器的值,即可从16位的寄存器值中判断目前自协商状态,注意到寄存器的第5位为1时,代表自协商完成,为0时代表自协商未完成;寄存器的第5位为1时,代表网线的物理层连接成功,为0时代表连接失败。

对PHY控制寄存器,通过MDIO协议从PHY中读取该寄存器的值,即可从16位的寄存器值中判断自协商后连接速度,注意到寄存器的第6位为1时,代表千兆速度;寄存器的第5位为1时,代表百兆速度;而寄存器的第4位为1时,代表十兆速

首先每隔一段时间通过MDIO接口从PHY内部寄存器中读取基本状态寄存器(BMSR)和特定状态寄存器(PHYSR)的值,从而获取到自协商完成状态、连接状态和连接速度,将网口的连接速度通过LED灯进行指示;当FPGA检测到TPAD触摸按键按下时,开始通过MDIO接口对PHY进行软复位,在软复位完成后,PHY会重新开始自协商,此时LED灯会定时获取当前网口的连接状态以及连接速度。
mdio驱动模块代码:

module mdio_driver
  (input clk,input rstn,
   input en,input wl_rh,input[4:0]addr,
   input [15:0]wr_data,
   output reg rd_ack,op_done,dri_clk,eth_mdc,
   output reg[15:0]rd_data,inout eth_mdio);
  parameter  PHY_ADDR = 5'b00001,//PHY地址
             CLK_DIV  = 6'd10 ;   //分频系数
  localparam st_idle    = 6'b00_0001,  //空闲状态
             st_pre     = 6'b00_0010,  //发送PRE(前导码)
             st_start   = 6'b00_0100,  //开始状态,发送ST(开始)+OP(操作码)
             st_addr    = 6'b00_1000,  //写地址,发送PHY地址+寄存器地址
             st_wr_data = 6'b01_0000,  //TA+写数据
             st_rd_data = 6'b10_0000;  //TA+读数据
  reg[5:0]cstate,nstate,clk_cnt;
  reg[6:0]cnt;
  reg[15:0]wr_data_d0,rd_data_d0;
  reg[1:0]op_code;
  reg mdio_dir,mdio_out;
  reg[4:0]addr_d0;
  wire[5:0]clk_divide;
  reg done_flag;
  wire mdio_in;
  assign mdio_in=eth_mdio,
         eth_mdio=mdio_dir?mdio_out:1'bz,
         clk_divide = CLK_DIV >> 2;

  always @(posedge clk or negedge rstn)
  begin
    if(!rstn)
    begin
      dri_clk='d0;
      clk_cnt<='d0;
    end
    else if(clk_cnt==clk_divide-'d1)
    begin
      clk_cnt<='d0;
      dri_clk<=~dri_clk;
    end
    else
      clk_cnt<=clk_cnt+'d1;
  end
  always @(posedge dri_clk or negedge rstn)
  begin
    if(!rstn)
      eth_mdc<='d1;
    else if(cnt[0]=='d0)
      eth_mdc<='d1;
    else
      eth_mdc<='d0;
  end
  always @(posedge dri_clk or negedge rstn)
  begin
    if(!rstn)
      cstate<=st_idle;
    else
      cstate<=nstate;
  end
  always @(*)
  begin
   
    case(cstate)
      st_idle:
        if(en)
          nstate=st_pre;
        else
          nstate=st_idle;
      st_pre:
        if(done_flag=='d1)
          nstate=st_start;
        else
         nstate=st_pre ;
      st_start:
        if(done_flag=='d1)
          nstate=st_addr;
        else
          nstate=st_start;
      st_addr:
        if(done_flag=='d1)
        begin
          if(op_code==2'b01)
            nstate=st_wr_data;
          else
            nstate=st_rd_data;
        end
        else
         nstate=st_addr ;
      st_wr_data:
        if(done_flag=='d1)
          nstate=st_idle;
        else
          nstate=st_wr_data;
      st_rd_data:
        if(done_flag=='d1)
          nstate=st_idle;
        else
         nstate=st_rd_data ;
      default :
      nstate=st_idle;
    endcase
  end
  always @(posedge dri_clk or negedge rstn)
  begin
    if(!rstn)
    begin
      cnt<='d0;
      op_code<='d0;
      mdio_dir<='d0;
      mdio_out<='d1;
      addr_d0<='d0;
      rd_data<='d0;
      wr_data_d0<='d0;
      rd_data_d0<='d0;
      rd_ack<='d1;
      op_done<='d0;
      done_flag<='d0;
    end
    else
    begin
      done_flag<='d0;
      cnt<=cnt+'d1;
      case(cstate)
        st_idle:
        begin
          mdio_out<='d1;
          mdio_dir<='d0;
          op_done<='d0;
          cnt<='d0;
          if(en)
          begin
            op_code<={wl_rh,~wl_rh};
            addr_d0<=addr;
            wr_data_d0<=wr_data;
            rd_ack<='d1;
          end
        end
        st_pre:
        begin
          mdio_dir<='d1;
          mdio_out<='d1;
          if(cnt=='d62)
            done_flag<='d1;
          else if(cnt=='d63)
            cnt<='d0;
        end
        st_start:
        begin
          case(cnt)
            7'd1:
              mdio_out<='d0;
            7'd3:
              mdio_out<='d1;
            7'd5:
              mdio_out<=op_code[1];
            7'd6:
              done_flag<='d1;
            7'd7:
            begin
              mdio_out<=op_code[0];
              cnt<='d0;
            end
            default:
              ;
          endcase
        end
        st_addr:
        begin
          case(cnt)
            7'd1:
              mdio_out<=PHY_ADDR[4];
            7'd3:
              mdio_out<=PHY_ADDR[3];
            7'd5:
              mdio_out<=PHY_ADDR[2];
            7'd7:
              mdio_out<=PHY_ADDR[1];
            7'd9:
              mdio_out<=PHY_ADDR[0];
            7'd11:
              mdio_out<=addr_d0[4];
            7'd13:
              mdio_out<=addr_d0[3];
            7'd15:
              mdio_out<=addr_d0[2];
            7'd17:
              mdio_out<=addr_d0[1];
            7'd18:
              done_flag<='d1;
            7'd19:
            begin
              mdio_out<=addr_d0[0];
              cnt<='d0;
            end
            default:
              ;
          endcase
        end
        st_wr_data:
        begin
          case(cnt)
            7'd1:
              mdio_out<='d1;
            7'd3:
              mdio_out<='d0;//op_code 10
            7'd5:
              mdio_out<=wr_data_d0[15];
            7'd7:
              mdio_out<=wr_data_d0[14];
            7'd9:
              mdio_out<=wr_data_d0[13];
            7'd11:
              mdio_out<=wr_data_d0[12];
            7'd13:
              mdio_out<=wr_data_d0[11];
            7'd15:
              mdio_out<=wr_data_d0[10];
            7'd17:
              mdio_out<=wr_data_d0[9];
            7'd19:
              mdio_out<=wr_data_d0[8];
            7'd21:
              mdio_out<=wr_data_d0[7];
            7'd23:
              mdio_out<=wr_data_d0[6];
            7'd25:
              mdio_out<=wr_data_d0[5];
            7'd27:
              mdio_out<=wr_data_d0[4];
            7'd29:
              mdio_out<=wr_data_d0[3];
            7'd31:
              mdio_out<=wr_data_d0[2];
            7'd33:
              mdio_out<=wr_data_d0[1];
            7'd35:
              mdio_out<=wr_data_d0[0];
            7'd37:
            begin
              mdio_dir<='d0;
              mdio_out<='d1;
            end
            7'd39:
              done_flag<='d1;
            7'd40:
            begin
              cnt<='d0;
              op_done<='d1;
            end
            default:
              ;
          endcase
        end
        st_rd_data:
        begin
          case(cnt)
            7'd1:
            begin
              mdio_dir<='d0;
              mdio_out<='d1;//op_code 01
            end
            7'd4:
              rd_ack<=mdio_in;
            7'd6:
              rd_data_d0[15]<=mdio_in;
            7'd8:
              rd_data_d0[14]<=mdio_in;
            7'd10:
              rd_data_d0[13]<=mdio_in;
            7'd12:
              rd_data_d0[12]<=mdio_in;
            7'd14:
              rd_data_d0[11]<=mdio_in;
            7'd16:
              rd_data_d0[10]<=mdio_in;
            7'd18:
              rd_data_d0[9]<=mdio_in;
            7'd20:
              rd_data_d0[8]<=mdio_in;
            7'd22:
              rd_data_d0[7]<=mdio_in;
            7'd24:
              rd_data_d0[6]<=mdio_in;
            7'd26:
              rd_data_d0[5]<=mdio_in;
            7'd28:
              rd_data_d0[4]<=mdio_in;
            7'd30:
              rd_data_d0[3]<=mdio_in;
            7'd32:
              rd_data_d0[2]<=mdio_in;
            7'd34:
              rd_data_d0[1]<=mdio_in;
            7'd36:
              rd_data_d0[0]<=mdio_in;
            7'd39:
              done_flag<='d1;
            7'd40:
            begin
              op_done<='d1;
              rd_data<=rd_data_d0;
              rd_data_d0<='d0;
              cnt<='d0;
            end
            default:
              ;
          endcase
        end
        default:
          ;
      endcase
    end
  end
endmodule

在st_idle状态中,如果en信号为高(或者说en = 1),则状态会转换到st_pre。否则,状态保持为st_idle。
在st_pre状态中,如果done_flag信号为’d1’(可能表示某个特定操作完成),则状态会转换到st_start。否则,状态保持为st_pre。
类似地,在接下来的每个状态中,都有特定的条件用于转换到下一个状态或保持当前状态。
在所有分支之后,有一个默认分支,如果cstate的值没有匹配任何已知的状态,那么状态将转换到st_idle。
于eth_mdc需要在输入时钟的基础上进行分频,为了方便操作,这里先对输入的时钟进行分频,得到一个dri_clk时钟,作为MDIO驱动模块和MDIO控制模块的操作时钟。eth_mdc在dri_clk的基础上进行2分频,由于输入的参数CLK_DIV为eth_mdc相对于输入时钟的分频系数,因此为了得到dri_clk的分频系数,需要将CLK_DIV除以2,如代码中第72行所示。
根据分频系数clk_divide,得到dri_clk的时钟。当cnt一直累加时,eth_mdc的时钟相当于对dri_clk进行2分频。当开始对MDIO接口进行读写操作时,cnt累加,此时才会产生eth_mdc时钟;当读写操作结束后eth_mdc将一直处于高电平。

在st_wr_data状态下,数据是在eth_mdc的下降沿写入,而在st_rd_data状态,数据在erth_mdc的上升沿读出。值得一提是,在st_rd_data状态下,程序中根据TA的第二位,判断PHY芯片有没有应答,如果没有应答,则说明读取数据失败。
mdio控制模块代码:

module ctrl_mdio(
    input clk,input rstn,
    input soft_trig,op_done,
    input[15:0]rd_data,input rd_ack,
    output reg[4:0]addr,
    output reg en,wl_rh,wr_data,output [1:0]led);
  reg rst_trig_d0,rst_trig_d1,rst_trig_flag;
  reg time_done,st_next,rd_next,error;
  reg[1:0]speed_status;
  reg[2:0]flow_cnt;
  reg[23:0]time_cnt;
  wire rst_trig_p;
  assign rst_trig_p=~rst_trig_d1&rst_trig_d0,
         led=error?2'd0:speed_status;
  always @(posedge clk or negedge rstn)
  begin
    if(!rstn)
    begin
      rst_trig_d0<='d0;
      rst_trig_d1<='d0;
    end
    else
    begin
      rst_trig_d0<=soft_trig;
      rst_trig_d1<=rst_trig_d0;
    end
  end
  always @(posedge clk or negedge rstn)
  begin
    if(!rstn)
    begin
      time_cnt<='d0;
      time_done<='d0;
    end
    else
    begin
      if(time_cnt=='d1_000_000-'d1)
      begin
        time_done<='d1;
        time_cnt<='d0;
      end
      else
      begin
        time_cnt<=time_cnt+'d1;
        time_done<='d0;
      end
    end
  end
  always @(posedge clk or negedge rstn)
  begin
    if(!rstn)
    begin
      flow_cnt<='d0;
      rst_trig_flag<='d0;
      speed_status<='d0;
      en<='d0;
      wl_rh<='d0;
      addr<='d0;
      wr_data<='d0;
      st_next<='d0;
      rd_next<='d0;
      error<='d0;
    end
    else
    begin
      en<='d0;
      if(rst_trig_p=='d1)
        rst_trig_flag<='d1;
      case(flow_cnt)
        3'd0:
        begin
          if(rst_trig_flag=='d1)
          begin
            en<='d1;
            wl_rh<='d0;
            addr<=5'h0;
            wr_data<=16'h9140;
            flow_cnt<=3'd1;
          end
          else if(time_done)
          begin
            en<='d1;
            wl_rh<='d1;
            addr<=5'd1;
            flow_cnt<=3'd2;
          end
          else if(st_next)
          begin
            en<='d1;
            wl_rh<='d1;
            addr<=5'h11;
            flow_cnt<=3'd2;
            st_next<='d0;
            rd_next<='d1;
          end
          else
            ;
        end
        3'd1:
          if(op_done)
          begin
            flow_cnt<=3'd0;
            rst_trig_flag<='d0;
          end
          else
            ;
        3'd2:
          if(op_done)
          begin
            if(rd_ack=='d0&&rd_next=='d0)
              flow_cnt<=3'd3;
            else if(rd_ack=='d0&&rd_next=='d1)
            begin
              rd_next<='d0;
              flow_cnt<=3'd4;
            end
            else
              flow_cnt<=3'd0;
          end
        3'd3:
        begin
          flow_cnt<=3'd0;
          if(rd_data[5]==1&&rd_data[2]==1)
          begin
            st_next<='d1;
            error<='d0;
          end
          else
            error<='d1;
        end
        3'd4:
        begin
          flow_cnt<=3'd0;
          case(rd_data[15:14])
            2'd2:
              speed_status<=2'b11;
            2'd1:
              speed_status<=2'b10;
            2'd0:
              speed_status<=2'b01;
            default :
              speed_status<='d0;
          endcase
        end
        default:
          ;
      endcase
    end
  end
endmodule

根据软复位信号对MDIO接口进行软复位,并定时读取以太网的连接状态。根据状态寄存器的值,为连接速率状态位speed_status赋值。
顶层模块:


module mdio_rw_top(
    input          clk  ,
    input          rstn,
    //MDIO接口
    output         eth_mdc  , //PHY管理接口的时钟信号
    inout          eth_mdio , //PHY管理接口的双向数据信号
    output         eth_rstn, //以太网复位信号
    
    input          touch_key, //触摸按键
    output  [1:0]  led        //LED连接速率指示
    );
    
//wire define
wire          en    ; //触发开始信号
wire          wl_rh   ;  //低电平写,高电平读
wire  [4:0]   addr    ;  //寄存器地址
wire  [15:0]  wr_data ;  //写入寄存器的数据
wire          op_done    ;  //读写完成
wire  [15:0]  rd_data ;  //读出的数据
wire          rd_ack  ;  //读应答信号 0:应答 1:未应答
wire          dri_clk    ;  //驱动时钟

//硬件复位
assign eth_rstn = rstn;

//MDIO接口驱动
mdio_driver #(
    .PHY_ADDR    (5'h04),    //PHY地址 3'b100
    .CLK_DIV     (6'd10)     //分频系数
    )
    u_mdio_dri(
    .clk        (clk),
    .rstn      (rstn),
    .en    (en),
    .wl_rh   (wl_rh  ),   
    .addr    (addr   ),   
    .wr_data (wr_data),   
    .op_done    (op_done   ),   
    .rd_data (rd_data),   
    .rd_ack  (rd_ack ),   
    .dri_clk    (dri_clk   ),  
                 
    .eth_mdc    (eth_mdc   ),   
    .eth_mdio   (eth_mdio  )   
);       

//MDIO接口读写控制    
ctrl_mdio  u_mdio_ctrl(
    .clk           (dri_clk),  
    .rstn         (rstn ),  
    .soft_trig (touch_key ),
    .op_done       (op_done   ),  
    .rd_data    (rd_data),  
    .rd_ack     (rd_ack ),  
    .en       (en   ),  
    .wl_rh      (wl_rh  ),  
    .addr       (addr   ),  
    .wr_data    (wr_data),  
    .led           (led       )
);      
     
endmodule

上板运行:

QQ视频20231104163807

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

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

相关文章

物联网AI MicroPython传感器学习 之 SSD1306 OLED显示屏幕

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 OLED&#xff0c;即有机发光二极管&#xff08;Organic Light-Emitting Diode&#xff09;&#xff0c;又称为有机电激光显示&#xff08;Organic Electroluminesence Display&#xff0c; OEL…

管理文件:文件批量重命名,轻松删除文件名中的空格

在文件管理中&#xff0c;我们经常会遇到文件名中带有空格的情况。这些空格可能会使文件在某些情况下难以被正确识别或使用&#xff0c;因此我们需要掌握一些技巧来轻松删除文件名中的空格。现在使用云炫文件管理器批量重命名进行批量处理。以下是如何操作的步骤详解&#xff1…

Unity中Shader的GI的直接光实现

文章目录 前言一、在上一篇文章中&#xff0c;得到GI相关数据后&#xff0c;需要对其进行Lambert光照模型计算二、在准备好上面步骤后&#xff0c;我们需要准备缺少的数据1、准备上图中的 s.Normal2、准备上图中的 s.Albedo 前言 Unity中Shader的GI的直接光实现&#xff0c;基…

Python基础入门例程30-NP30 用列表实现队列(列表)

最近的博文&#xff1a; Python基础入门例程29-NP29 用列表实现栈&#xff08;列表&#xff09;-CSDN博客 Python基础入门例程28-NP28 密码游戏&#xff08;列表&#xff09;-CSDN博客 Python基础入门例程27-NP27 朋友们的喜好&#xff08;列表&#xff09;-CSDN博客 目录 …

缺陷之灵魂操作bug

一、前言 正常来说&#xff0c;我们在测试缺陷的时候都是按照case来测试的&#xff0c;但是有些场景&#xff0c;例如说发散思维这种场景&#xff0c;就会找到一些比较不太正常、不好复现的缺陷&#xff0c;然后如果要辅助研发修复&#xff0c;就会极为痛苦。 二、场景描述 大…

免费获得临时域名/内网穿透

文章目录 Coplar 介绍Coplar 使用场景Coplar 使用 Coplar 介绍 》官网地址《 官网介绍&#xff1a; cpolar极点云: 公开一个本地Web站点至公网 只需一行命令&#xff0c;就可以将内网站点发布至公网&#xff0c;方便给客户演示。高效调试微信公众号、小程序、对接支付宝网关…

163M水经微图从入门到精通文档教程

我们在《47GB从入门到精通微图视频教程》一文中&#xff0c;为大家分享了视频教程。 由于有一些比较偏理论的内容不便于录制视频&#xff0c;因此文档教程才会更加完整全面。 CHM文档教程 我们将水经微图的文档教程制作成了CHM文件&#xff0c;共有163M大小。 教程内容主要…

佳易王羽毛球馆计时计费管理系统软件下载,支持连接灯控

软件特色&#xff1a; 1、功能实用&#xff0c;操作简单&#xff0c;不会电脑也会操作&#xff0c;软件免安装&#xff0c;已内置数据库。佳易王羽毛球馆计时计费系统软件免安装版V17.6&#xff0c;是集计时计费、商品销售、会员管理、备注记事本、定时提醒功能于一体的管理软…

Keras人工智能神经网络 Regressor 回归 神经网络搭建

前期分享了使用tensorflow来进行神经网络的回归&#xff0c;tensorflow构建神经网络 本期我们来使用Keras来搭建一个简单的神经网络 Keras神经网络可以用来模拟回归问题 (regression)&#xff0c;例如给下面一组数据&#xff0c;用一条线来对数据进行拟合&#xff0c;并可以预…

GPT学习笔记

百度的文心一言 阿里的通义千问 通过GPT能力&#xff0c;提升用户体验和产品力 GPT的出现是AI的iPhone时刻。2007年1月9日&#xff0c;第一代iPhone发布&#xff0c;开启移动互联网时代。新一轮的产业革命。 GPT模型发展时间线&#xff1a; Copilot - 副驾驶 应用&#xf…

Angular-07:组件生命周期

三个阶段&#xff1a; ① 挂载阶段1.1 constructor1.2 ngOnInit ② 更新阶段2.1 ngOnChanges2.2 ngAfterViewInit2.3 ngAfterContentInit2.4 ngDoCheck ③ 卸载阶段3.1 onOnDestroy ④ 在组件中添加所有方法并打印 该表按照执行顺序编写 编号函数名实现名说明1constructorcons…

基于单片机的智能感应监控系统的设计

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、系统分析2.1 整个控制系统的设计要求2.2 总体设计方案 二、系统硬件电路设计3.1 硬件电路介绍3.2 控制电路分析3.2.1 复位电路 三 软件设计原理图 四、 结论五、 文章目录 概要 因为人们在生活中对安全防范的…

【JAVA学习笔记】61 - 线程入门、常用方法、同步机制,以及本章作业(难点)

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter17/src/com/yinhai 线程 一、线程相关概念 1.程序 是为完成特定任务、用某种语言编写的一组指令的集合。简单的说:就是我们写的代码 2.进程 1&#xff09;进程是指运行中的程序&#x…

劳易测扫码条码分段读取实现方法

添加如下3个功能块&#xff1a;M10&#xff0c;M13和M27 设置BCL参数&#xff1a;Code type 1 为Code128 参数&#xff1a;Mode为Range 参数&#xff1a;Number Of digits 1 为条码最小长度 Number Of digits 2 为条码最大长度。 设置M10&#xff1a;Mode&#xff08;With …

嵌入式系统的元素

注意&#xff1a;关于嵌入式系统的元素这一块儿内容&#xff0c;定义太多了。例如&#xff1a;吉姆莱丁 著&#xff0c;陈会翔 译&#xff0c;由清华大学出版社出版的《构建高性能嵌入式系统》中提到&#xff1a;嵌入式系统通常由电源、时基、数字处理、内存、软件和固件、专用…

JavaScript执行上下文和调用栈

上节课我们已经说过了&#xff0c;JavaScript的代码执行是发生在js引擎中的调用堆栈的&#xff0c;但是具体是如何运行的&#xff0c;我们来详细剖析一下 如何执行上下文 执行上下文&#xff1a; 执行上下文是指在JavaScript中代码被执行时所创建的环境。它包含了变量、函数、…

京东大数据平台-第三方京东平台数据查询分析软件系统

对于电商商家来说&#xff0c;做好电商数据分析是电商运营中的重要一环&#xff0c;且能为电商商家带来诸多好处&#xff0c;例如&#xff1a; 1、提高销售额&#xff1a;通过数据分析可以更好地把握消费者的购买行为&#xff0c;从而更好地推出营销活动&#xff0c;提高销售额…

7.SpringBoot集成Mybats-plus且安装代码生成插件

一、背景 项目需要集成Mybatis-plus用作服务的ORM。 二、实现 2.1 pom.xml引入 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version>&l…

QT 实现解密m3u8文件

文章目录 概要如何解密M3U8文件呢实现思路和代码序列图网络请求解密 结论 概要 视频文件很多已M3U8文件格式来提供&#xff0c;先复习下什么是M3U8文件&#xff01;用QT的 mutimedia框架来播放视频时&#xff0c;有的视频加载慢&#xff0c;有的视频加载快&#xff0c;为啥&am…

python 深度学习 解决遇到的报错问题9

本篇继python 深度学习 解决遇到的报错问题8-CSDN博客 目录 一、can only concatenate str (not "int") to str 二、cant convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, complex64, complex128, int64, in…