UDP接收PC发送数据的丢包处理:同步头

UDP在传输的时候经常出现丢包,为了遏制这种错误带来的连锁反应,加一个同步头是好主意。

Matlab代码:

clc;
clear all;
load('img.mat');
udplink=udp('255.255.255.255','RemotePort',8080,'LocalPort',0808);
udplink.OutputBufferSize=8192000;%传数据buffer大小
udplink.Timeout=10;%传输时间限制
fopen(udplink);
data=0:255;
Sync_head = uint32(hex2dec('F05AA50F'));
%data=zeros(1,256,'uint8');
for i=1:1000
    for f=1:numFrames
        fwrite(udplink,imgdata(1:end,f),'uint8');
        pause(1e-4);
        fwrite(udplink,Sync_head,'uint32');
        pause(1e-4);
    end
end
fclose(udplink);
delete(udplink);
clear udplink;

Verilog代码:

    always @(posedge eth_rx_clk) begin
        if(sys_rst_n == 1'b0) begin
            frame_sync_check <= 1'b0;
        end else if(crc_end == 1'b1) begin
            frame_sync_check <= 1'b0;
        end else if(eth_rx_vaild == 1'b1 && rx_vaild_cnt == 'd50 && eth_rx_data == RX_Sync_Frame[31:24]) begin
            frame_sync_check <= 1'b1;
        end else if(eth_rx_vaild == 1'b1 && rx_vaild_cnt == 'd51 && eth_rx_data != RX_Sync_Frame[23:16]) begin
            frame_sync_check <= 1'b0;
        end else if(eth_rx_vaild == 1'b1 && rx_vaild_cnt == 'd52 && eth_rx_data != RX_Sync_Frame[15:08]) begin
            frame_sync_check <= 1'b0;
        end else if(eth_rx_vaild == 1'b1 && rx_vaild_cnt == 'd53 && eth_rx_data != RX_Sync_Frame[07:0]) begin
            frame_sync_check <= 1'b0;
        end else begin
            frame_sync_check <= frame_sync_check;
        end
    end

 

参考资料:

威三学院FPGA教程

正点原子FPGA教程

无双软件学院FPGA教程

posted @ 2024-04-02 21:21  NoNounknow  阅读(61)  评论(0编辑  收藏  举报