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教程