首页 > 编程语言 >[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-04 IP层程序设计

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-04 IP层程序设计

时间:2024-08-09 18:55:56浏览次数:10  
标签:begin end 04 ip UDP 安路 tdata IP

软件版本:Anlogic -TD5.9.1-DR1_ES1.1

操作系统:WIN10 64bit

硬件平台:适用安路(Anlogic)FPGA

实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板

板卡获取平台:https://milianke.tmall.com/

登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

 

3.3 IP层

ICMP层数据和UDP层数据都要经过IP层打包或者解包,IP层主要功能为判断数据报文类型,进行IP首部校验,添加包头或者过滤包头,处理ICMP请求。

3.3.1 IP接收模块

该模块的主要功能是接收uiip_arp_rx传入的数据包,通过首部校验判断包头的正确性,对包头进行过滤,并且提取出UDP报文和ICMP报文。

该模块的状态机转换图如图所示。

 

WAIT_IP_PACKET:等待接收IP包,若I_ip_rvalid拉高,代表数据传入,进入RECORD_IP_HEADER状态。

RECORD_IP_HEADER:接收包头信息,20字节的包头数据全部接收完时,判断收到的IP地址和本地IP地址是否匹配,若不匹配,丢弃该帧,进入WAIT_PACKET_END状态;若匹配,则判断数据包类型。如果收到的数据报文为UDP数据报文,进入OUTPUT_UDP_PACKET状态。如果收到的数据报文为ICMP报文,则将数据传入ICMP子层模块,等待一包数据传输完成后,进入WAIT_PACKET_END状态。

OUTPUT_UDP_PACKET:将有效数据打拍后传输至UDP层,一包数据传输完成后,回到WAIT_IP_PACKET状态。

WAIT_PACKET_END:等待数据有效信号拉低,一帧数据传输完成,回到WAIT_IP_PACKET状态。

 

always@(posedge I_ip_clk or posedge I_reset) begin

    if(I_reset) begin

        cnt                     <= 5'd0;

        ip_version              <= 4'd0;    //IP首部-版本:4位数据表示IP版本号,为4时表示IPv4,为6时表示IPv6,IPv4使用较多。

        ip_header_len           <= 4'd0;    //IP首部-首部长度:4位数据表示IP首部一共有多少个32位(4个字节)数据。没有可选字段的IP首部长度为20个字节,故首部长度为5

        ip_tos                  <= 8'd0;    //IP首部-服务类型:8位服务类型被划分成两个子字段:3位优先级字段和4位TOS字段,最后一位固定为0。服务类型为0时表示一般服务。

        ip_pkg_len              <= 16'd0;   //IP首部-总长度:16位IP数据报总长度包括IP首部和IP数据部分,以字节为单位。利用IP首部长度和IP数据报总长度可以计算出IP数据报中数据内容的起始位置和长度

        ip_packet_id            <= 16'd0;   //IP首部-ID:16位标识字段,用来标识主机发送的每一份数据报。每发送一份报文它的值就会加1

        ip_packet_flag          <= 3'd0;    //IP首部-标志字段:3位标志字段的第1位是保留位,第2位表示禁止分片(1表示不分片,0允许分片),第3位标识更多分片,通常为010不分片

        ip_fragment_offset      <= 13'd0;   //IP首部-片偏移:13位片偏移,在接收方进行数据报重组时用来标识分片的顺序。

        ip_packet_ttl           <= 8'd0;    //IP首部-生存时间:    8位生存时间防止丢失的数据包在无休止的传播,一般被设置为64或者128

        ip_packet_protocol      <= 8'd0;    //IP首部-协议:8位协议类型表示此数据报所携带上层数据使用的协议类型,ICMP为1,TCP为6,UDP为17

        ip_header_checksum      <= 16'd0;   //IP首部-首部校验和:16位首部校验和,该字段只校验数据报的首部,不包含数据部分

        ip_src_address          <= 32'd0;   //IP首部-源IP地址:32位发送端的IP地址

        ip_dst_address          <= 32'd0;   //IP首部-目的IP地址:32位接收端的IP地址

        icmp_pkg_valid          <= 1'b0;    //icmp数据报文有效信号

        O_udp_ip_rvalid         <= 1'b0;    //UDP数据包有效

        O_udp_ip_rdata          <= 8'd0;    //UDP数据包有效输出

        STATE                   <= WAIT_IP_PACKET;

    end

    else begin

        case(STATE)

            WAIT_IP_PACKET:begin

                if(I_ip_rvalid) begin

                    ip_version          <=  I_ip_rdata[7:4];    //IP首部-版本:4位数据表示IP版本号

                    ip_header_len       <=  I_ip_rdata[3:0];    //IP首部-首部长度:4位数据表示IP首部一共有多少个32位(4个字节)数据

                    STATE               <=  RECORD_IP_HEADER;   //下一状态,继续接收IP头部信息

                end

                else

                    STATE               <=  WAIT_IP_PACKET;

            end

            RECORD_IP_HEADER:begin

                case(cnt)

                    0:  begin   ip_tos                      <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-服务类型:8位服务类型被划分成两个子字段:3位优先级字段和4位TOS字段,最后一位固定为0。服务类型为0时表示一般服务。

                    1:  begin   ip_pkg_len[15:8]            <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-总长度:16位IP数据报总长度包括IP首部和IP数据部分,以字节为单位。

                    2:  begin   ip_pkg_len[7:0]             <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-总长度:16位IP数据报总长度包括IP首部和IP数据部分,以字节为单位。

                    3:  begin   ip_packet_id[15:8]          <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-ID:16位标识字段,用来标识主机发送的每一份数据报。

                    4:  begin   ip_packet_id[7:0]           <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-ID:16位标识字段,用来标识主机发送的每一份数据报。

                    5:  begin  

                        ip_packet_flag                      <=  I_ip_rdata[7:5];    //IP首部-标志字段:3位标志字段的第1位是保留位,第2位表示禁止分片(1表示不分片,0允许分片),第3位标识更多分片,通常为010不分片

                        ip_fragment_offset[12:8]            <=  I_ip_rdata[4:0];    //IP首部-片偏移:13位片偏移,在接收方进行数据报重组时用来标识分片的顺序。

                        cnt <=  cnt + 1'b1;

                    end

                    6:  begin   ip_fragment_offset[7:0]     <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-片偏移:13位片偏移,在接收方进行数据报重组时用来标识分片的顺序。

                    7:  begin   ip_packet_ttl[7:0]          <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-生存时间:8位生存时间防止丢失的数据包在无休止的传播,一般被设置为64或者128

                    8:  begin   ip_packet_protocol[7:0]     <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-协议:8位协议类型表示此数据报所携带上层数据使用的协议类型,ICMP为1,TCP为6,UDP为17    

                    9:  begin   ip_header_checksum[15:8]    <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-首部校验和:16位首部校验和,该字段只校验数据报的首部,不包含数据部分

                    10: begin   ip_header_checksum[7:0]     <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-首部校验和:16位首部校验和,该字段只校验数据报的首部,不包含数据部分

                    11: begin   ip_src_address[31:24]       <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-源IP地址:32位发送端的IP地址

                    12: begin   ip_src_address[23:16]       <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-源IP地址:32位发送端的IP地址

                    13: begin   ip_src_address[15:8]        <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-源IP地址:32位发送端的IP地址

                    14: begin   ip_src_address[7:0]         <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-源IP地址:32位发送端的IP地址

                    15: begin   ip_dst_address[31:24]       <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-目的IP地址:32位接收端的IP地址

                    16: begin   ip_dst_address[23:16]       <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-目的IP地址:32位接收端的IP地址

                    17: begin   ip_dst_address[15:8]        <=  I_ip_rdata; cnt <=  cnt + 1'b1;end  //IP首部-目的IP地址:32位接收端的IP地址

                    18: begin  

                        ip_dst_address[7:0]         <=  I_ip_rdata;                         //IP首部-目的IP地址:32位接收端的IP地址

                        cnt                         <=  5'd0;

                        if({ip_dst_address[31:8], I_ip_rdata} == I_ip_local_addr) begin     //如果收到的IP地址和本地IP地址匹配

                            if(ip_packet_protocol == ICMP_TYPE) begin                       //如果是ICMP类型

                                icmp_pkg_valid      <=  1'b1;                               //ICMP包有效          

                                STATE               <=  WAIT_PACKET_END;                    //等待传输结束状态

                            end

                            else if(ip_packet_protocol == UDP_TYPE) begin                   //如果是UDP包有效

                                icmp_pkg_valid      <=  1'b0;

                                STATE               <=  OUTPUT_UDP_PACKET;                  //输出UDP包到UDP协议层

                            end

                            else begin

                                icmp_pkg_valid      <=  1'b0;

                                STATE               <=  WAIT_PACKET_END;                    //等待传输结束状态

                            end

                        end

                        else begin

                            icmp_pkg_valid          <=  1'b0;

                            STATE                   <=  WAIT_PACKET_END;                    //等待传输结束状态

                        end

                    end

                endcase

            end

            OUTPUT_UDP_PACKET:begin

                if(I_ip_rvalid) begin       //打拍后支持输出给UDP协议层

                    O_udp_ip_rvalid         <=  1'b1;

                    O_udp_ip_rdata          <=  I_ip_rdata;

                    STATE                   <=  OUTPUT_UDP_PACKET;

                end

                else begin

                    O_udp_ip_rvalid         <=  1'b0;

                    O_udp_ip_rdata          <=  8'd0;

                    STATE                   <=  WAIT_IP_PACKET;                

                end    

            end

            WAIT_PACKET_END:begin           //等待包传输结束

                if(I_ip_rvalid)

                    STATE                   <=  WAIT_PACKET_END;

                else begin

                    icmp_pkg_valid          <=  1'b0;

                    STATE                   <=  WAIT_IP_PACKET;

                end    

            end

        endcase

    end    

end

 

3.3.2 IP发送模块

该模块的主要功能有:接收uiudp_tx发送的UDP报文和uiip_rx发送的ICMP报文信息,将其封装成IP包并发送至下层uiip_arp_tx模块。

该模块的状态机转换图如图所示。

IDLE:uiip_tx模块处于发送空闲时,接收ICMP和UDP报文发送请求,优先响应ICMP请求。当收到请求时,向uiip_arp_tx模块发送请求信号,通过udp_pkg_en信号标记报文类型,进入WAIT_ACK状态,等待握手响应信号。

WAIT_ACK:接收到I_ip_tbusy信号,代表和IP_ARP层模块握手成功,可以发送数据,进入SEND_IP_HEADER状态。若要发送的是UDP报文,则会发送O_ip_udp_tbusy信号和UDP层进行握手。

SEND_IP_HEADER:在有效数据报文前添加对应的IP包头,发送包头完毕后,若报文类型为UDP报文,进入SEND_UDP_PACKET状态;若为ICMP报文,则进入SEND_ICMP_PACKET状态。

SEND_UDP_PACKET和SEND_ICMP_PACKET:发送完报文中的有效数据后,将标识加1,回到IDLE状态。

        case(STATE)

            IDLE:begin

                if(icmp_pkg_req & (~I_ip_tbusy)) begin          //如果有ICMP包需要发送,并且ip_arp_tx模块处于空闲(I_ip_tbusy==0代表tbuf空闲,不在发送数据)

                    O_ip_treq           <=  1'b1;               //通知ip_arp_tx模块,有IP包需要发送(ICMP包也是IP包)

                    O_ip_udp_tbusy      <=  1'b0;               //通知udp_layer模块,目前不能发送UDP数据包

                    O_ip_taddr          <=  icmp_pkg_ip_addr;   //保存ip_rx模块接收到的icmp请求的IP地址(因为发送icmp包需要通过IP地址获取远程主机的MAC地址)

                    udp_pkg_en          <=  1'b0;               //标记是否是udp包,但udp_pkg_en=1 代表ip层发送的数据为UDP包

                    STATE               <=  WAIT_ACK;

                end

                else if(I_ip_udp_treq & (~I_ip_tbusy)) begin    //如果有UDP包需要发送

                    O_ip_treq           <=  1'b1;               //输出ip包发送请求,给ip_arp_tx模块

                    O_ip_udp_tbusy      <=  1'b0;               //通知udp_layer模块,目前不能发送UDP数据包

                    O_ip_taddr          <=  I_ip_dest_addr;     //udp层提供需要发送的目的主机的IP地址

                    udp_pkg_en          <=  1'b1;               //标记是否是udp包,但udp_pkg_en=1 代表ip层发送的数据为UDP包

                    STATE               <=  WAIT_ACK;

                end

                else begin

                    O_ip_udp_tbusy      <=  1'b0;

                    O_ip_treq           <=  1'b0;

                    udp_pkg_en          <=  1'b0;

                    STATE               <=  IDLE;

                end

            end

            WAIT_ACK:begin

                if(I_ip_tbusy) begin//当发送O_ip_treq后,如果ip_arp_tx模块返回I_ip_tbusy=1 代表ip_layer可以发送IP包(UDP包和ICMP包)到ip_arp_tx模块

                    O_ip_treq           <=  1'b0;

                    O_ip_udp_tbusy      <=  udp_pkg_en ? 1 : 0; //如果udp_pkg_en有效代表发的是UDP包

                    STATE               <=  SEND_IP_HEADER;     //发送IP帧头

                end

                else begin

                    O_ip_treq           <=  1'b1;

                    O_ip_udp_tbusy      <=  1'b0;

                    STATE               <=  WAIT_ACK;                  

                end

            end

            SEND_IP_HEADER:begin//发送IP包帧头

                case(cnt)

                    0   :begin

                        if(I_ip_udp_tvalid | (~udp_pkg_en)) begin       //如果是UDP报文包需要发送或者udp_pkg_en==0 是ICMP报文包

                            O_ip_tdata      <=  {VERSION, IHL};         //版本|首部长度(IP首部一共有多少个32bit数据)

                            O_ip_tvalid     <=  1'b1;                   //通知tbuf IP数据有效

                            packet_id       <=  ID_BASE + datagram_cnt; //标识,每发送1包该值加1

                            TTL             <=  8'h80;                  //生存时间  

                            if(!udp_pkg_en) begin                       //如果是ICMP包

                                ip_tdata_length     <=  icmp_pkg_data_len + (IHL << 2); //IP包总长度(IP数据长度+IP首部长度)

                                PROTOCOL            <=  8'h01;                          //IP包类型为 ICMP包

                            end

                            else begin

                                ip_tdata_length     <=  I_ip_udp_tdata_len + (IHL << 2);

                                PROTOCOL            <=  8'h11;                          //IP包类型为 UDP包

                            end

                            cnt             <=  cnt + 1'b1;

                        end

                        else

                            cnt             <=  5'd0;

                    end

                    1   :begin  O_ip_tdata  <=  TOS;                            cnt <=  cnt + 1'b1;end//服务类型

                    2   :begin  O_ip_tdata  <=  ip_tdata_length[15:8];          cnt <=  cnt + 1'b1;end//IP包总长度

                    3   :begin  O_ip_tdata  <=  ip_tdata_length[7:0];           cnt <=  cnt + 1'b1;end//IP包总长度

                    4   :begin  O_ip_tdata  <=  packet_id[15:8];                cnt <=  cnt + 1'b1;end//IP包标识符,每发送一份报文,其值加1

                    5   :begin  O_ip_tdata  <=  packet_id[7:0];                 cnt <=  cnt + 1'b1;end//IP包标识符,每发送一份报文,其值加1

                    6   :begin  O_ip_tdata  <=  {FLAG, FRAGMENT_OFFSET[12:8]};  cnt <=  cnt + 1'b1;end//标志字段3bit|片偏移共13bit

                    7   :begin  O_ip_tdata  <=  FRAGMENT_OFFSET[7:0];           cnt <=  cnt + 1'b1;end//片偏移共13bit

                    8   :begin  O_ip_tdata  <=  TTL;                            cnt <=  cnt + 1'b1;end//生存时间

                    9   :begin  O_ip_tdata  <=  PROTOCOL;                       cnt <=  cnt + 1'b1;end//协议

                    10  :begin  O_ip_tdata  <=  checksum[15:8];                 cnt <=  cnt + 1'b1;end//校验和

                    11  :begin  O_ip_tdata  <=  checksum[7:0];                  cnt <=  cnt + 1'b1;end//校验和

                    12  :begin  O_ip_tdata  <=  I_ip_local_addr[31:24];         cnt <=  cnt + 1'b1;end//源IP地址32bit

                    13  :begin  O_ip_tdata  <=  I_ip_local_addr[23:16];         cnt <=  cnt + 1'b1;end//源IP地址32bit

                    14  :begin  O_ip_tdata  <=  I_ip_local_addr[15:8];          cnt <=  cnt + 1'b1;end//源IP地址32bit

                    15  :begin  O_ip_tdata  <=  I_ip_local_addr[7:0];           cnt <=  cnt + 1'b1;end//源IP地址32bit

                    16  :begin                          //目的IP地址(远端主机IP地址)

                        if(!udp_pkg_en)                 //ICMP报文包

                            O_ip_tdata      <=  icmp_pkg_ip_addr[31:24];

                        else                            //UDP报文包

                            O_ip_tdata      <=  O_ip_taddr[31:24];

                        cnt     <=  cnt + 1'b1;

                    end                

                    17  :begin                          //目的IP地址(远端主机IP地址)

                        if(!udp_pkg_en)                 //ICMP报文包

                            O_ip_tdata      <=  icmp_pkg_ip_addr[23:16];

                        else                            //UDP报文包

                            O_ip_tdata      <=  O_ip_taddr[23:16];

                        cnt     <=  cnt + 1'b1;

                    end

                    18  :begin                          //目的IP地址(远端主机IP地址)

                        if(!udp_pkg_en) begin

                            O_ip_tdata      <=  icmp_pkg_ip_addr[15:8];

                            icmp_pkg_busy   <=  1'b1;//icmp_pkg_tx代码上必须时序上,在SEND_ICMP_PACKET状态输出ICMP报文包

                        end

                        else begin

                            O_ip_tdata      <=  O_ip_taddr[15:8];

                            icmp_pkg_busy   <=  1'b0;

                        end

                        cnt         <=  cnt + 1'b1;

                    end

                    19  :begin                          //目的IP地址(远端主机IP地址)

                        cnt <=  5'd0;

                        if(!udp_pkg_en) begin

                            O_ip_tdata      <=  icmp_pkg_ip_addr[7:0];

                            STATE           <=  SEND_ICMP_PACKET;

                        end

                        else begin

                            O_ip_tdata      <=  O_ip_taddr[7:0];

                            STATE           <=  SEND_UDP_PACKET;

                        end

                    end

                    default:    cnt <=  5'd0;

                endcase

            end

            SEND_UDP_PACKET:begin                   //发送UDP报文包

                if(trans_data_cnt == (ip_tdata_length - 16'd20)) begin  //20个字节为IP首部,这里相等代表数据发送结束  

                    O_ip_udp_tbusy      <=  1'b0;

                    O_ip_tvalid         <=  1'b0;

                    O_ip_tdata          <=  8'd0;

                    datagram_cnt        <=  datagram_cnt + 16'h0001;    //没发送完1帧报文,该值加1

                    trans_data_cnt      <=  16'd0;

                    STATE               <=  IDLE;

                end

                else begin                          //发送有效的UDP报文数据部分

                    O_ip_tvalid         <=  1'b1;

                    O_ip_tdata          <=  shift_data_out;         //从shift移位寄存器移出数据

                    trans_data_cnt      <=  trans_data_cnt + 1'b1;  //UDP报文包有效数据部分计数器

                    STATE               <=  SEND_UDP_PACKET;

                end

            end

            SEND_ICMP_PACKET:begin                  //发送ICMP报文包

                if(icmp_pkg_valid) begin

                    O_ip_tvalid         <=  1'b1;

                    O_ip_tdata          <=  icmp_pkg_data;

                    STATE               <=  SEND_ICMP_PACKET;

                end

                else begin

                    O_ip_tvalid         <=  1'b0;

                    O_ip_tdata          <=  8'd0;

                    icmp_pkg_busy       <=  1'b0;

                    datagram_cnt        <=  datagram_cnt + 16'h0001;//每发送完1帧报文,该值加1

                    STATE               <=  IDLE;                  

                end

            end

        endcase

3.3.3 IP首部校验模块

正常计算IP首部校验和时,将校验位置0。由于每两字节数据相加得到的不再产生进位结果,为最终校验和的取反,所以当计算过程中加入校验位时,相加得到的结果应当为全1。若结果不为全1,则数据校验错误,将O_check_rerror信号置为高。

`timescale 1ns / 1ps

 

module ip_header_checksum(

input  wire         I_clk,

input  wire         I_reset,

input  wire         I_ip_rdata_valid,

input  wire [7:0]   I_ip_rdata,

output wire         O_checksum_rerror

);

reg checksum_correct;

assign O_checksum_rerror = ~checksum_correct;

 

reg [1:0]  state;

reg [3:0]  cnt;

wire [16:0] tmp_accum1;

reg [15:0] accum1, accum2;

 

assign tmp_accum1 = accum1 + accum2;

 

always @(posedge I_clk or posedge I_reset) begin

    if(I_reset) begin

        state               <= 2'd0;

        cnt                 <= 4'd0;

        accum1              <= 16'd0;

        accum2              <= 16'd0;      

        checksum_correct    <= 1'b1;            

    end

    else begin

        case(state)

            0: begin

                if(I_ip_rdata_valid) begin

                    accum1[15:8]            <= I_ip_rdata;

                    state                   <= 2'd1;

                end

                else begin

                    accum1[15:8]            <= 8'd0;

                    state                   <= 2'd0;

                end

            end

            1: begin accum1[7:0]    <= I_ip_rdata; state <= 2'd2; end

            2: begin        

                if(cnt == 4'd9) begin

                    if((tmp_accum1[15:0] + tmp_accum1[16]) != 16'hffff)

                        checksum_correct    <= 1'b0;

                    cnt                 <= 4'd0;

                    state               <= 2'd3;

                end

                else begin  

                    accum2 <= tmp_accum1[15:0] + tmp_accum1[16];

                    accum1[15:8]        <= I_ip_rdata;

                    cnt                 <= cnt + 1'b1;                        

                    state               <= 2'd1;

                end

            end

            3: begin

                accum1                  <= 16'd0;

                accum2                  <= 16'd0;

                if(I_ip_rdata_valid)

                    state       <= state;

                else

                    state       <= 2'd0;

                end            

        endcase

    end

end

endmodule

标签:begin,end,04,ip,UDP,安路,tdata,IP
From: https://www.cnblogs.com/milianke/p/18351342

相关文章

  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-05 ARP层程序设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑 3.4ARP层该层具有接收ARP请求......
  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-06 UDP层程序设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 3.5UDP层该层实现用户数据和U......
  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-07 ICMP层程序设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 3.6ICMP层该层在程序中为IP层......
  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-01 以太网协议介绍
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! ​1概述本文介绍了基于XILIN......
  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-02 MAC层程序设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 3程序设计前面我们介绍了以太......
  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-03 IP_ARP层程序设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 3.2IP_ARP层由于IP和ARP数据......
  • luogu题解:P10456 The Pilots Brothers' refrigerator【缺少 SPJ】
    思路此题题意酷似P10449.费解的开关。https://www.luogu.com.cn/problem/P10449不同之处便是状态连锁改变不同,但做法截然不同,此题是一个\(4\times4\)的矩阵。暴力枚举的复杂度是\(O(10^7)\),即\(2^{16}\times16\times16=16777216\),\(10^7\)的复杂度可以通......
  • SB3045LFCT-ASEMI无人机专用SB3045LFCT
    编辑:llSB3045LFCT-ASEMI无人机专用SB3045LFCT型号:SB3045LFCT品牌:ASEMI封装:TO-220F批号:最新最大平均正向电流(IF):30A最大循环峰值反向电压(VRRM):45V最大正向电压(VF):0.60V~0..95V工作温度:-65°C~150°C反向恢复时间:35ns芯片个数:2芯片尺寸:74mil引脚数量:3正向浪涌电流(IFMS):250......
  • 派胜OA ExpressOA 3.0 现已支持 Ubuntu 24.04 LTS
    ExpressOA3.0跨平台,高性能,现代化的协同办公平台系统。ExpressOA3.0现已支持Ubuntu24.04LTS-世界上最流行的Linux操作系统。访问派胜OA官网:www.paioffice.com随着.NET8的推出,Ubuntu在支持.NET社区方面迈出了重大的一步。.NET8将在Ubuntu24.04LTS及22.04......
  • PHP+历史文化学习与交流网站-计算机毕设定制-附项目源码(可白嫖)50444
    目   录摘  要Abstract第1章  前  言1.1 研究背景1.2 研究现状1.3 系统开发目标第2章  系统开发环境2.1开发技术2.2 MVVM模式介绍2.3 MYSQL数据库2.4 B/S结构52.5 Thinkphp框架介绍5第3章  需求分析3.1 需求分析3.2......