使用UDP进行回环,网络调试助手,发送数据通过UDP接收模块接收,解析出数据,给到UDP发送模块,传回上位机。
UDP接收模块中,接收到的CRC校验值与自己计算CRC校验值进行判断,相符后将数据解析给发送端,否则回到空闲状态。当加上CRC校验判断后,回环会有无法接收现象。去掉CRC判断,数据回环无误。
(1)现确定crc计算模块无误,crc_result为接收上位机的值,crc_sum为计算值。
(2)接收模块中均对目的mac,目的IP,udp端口,IP校验,进行验证均无误。
此代码用于判断接收CRC值与计算CRC值
always @ (posedge clk125m_o or negedge reset_n)
if(!reset_n)
rx_done_check_ok <= 1'b0;
else if(crc_result == crc_sum )
rx_done_check_ok <= 1'b1;
else
rx_done_check_ok <= 1'b0; //改为1则认为crc值相等,即不判断
此代码用于判断CRC是否通过,通过产生结束信号,解析出数据,不通过则回到空闲状态。
RX_DONE: begin
if((cnt_rx_done >= 2'd2) && (rx_done_check_ok == 1'b0) )
begin
curr_state <= IDLE;
cnt_rx_done <= 0;
end
else if(cnt_rx_done >= 2'd3)
begin
GMII_RX_DONE <= 1;
curr_state = IDLE;
cnt_rx_done <= 0;
end
else
begin
cnt_rx_done <= cnt_rx_done + 1'b1;
curr_state <= curr_state;
end
end
仿真时没有问题:
不加CRC判断上板测试时数据传输无误:
加CRC校验时有时无法通过:
wireshark抓取也是:
【注:】
always @ (posedge clk125m_o or negedge reset_n)
if(!reset_n)
rx_done_check_ok <= 1'b0;
else if(crc_result == crc_sum )
rx_done_check_ok <= 1'b1;
else
rx_done_check_ok <= 1'b0; //改为1测为不判断crc校验
还请各位大佬不吝赐教,不胜感激!!!
还请各位大佬不吝赐教,不胜感激!!!
还请各位大佬不吝赐教,不胜感激!!!
还请各位大佬不吝赐教,不胜感激!!!
还请各位大佬不吝赐教,不胜感激!!!
还请各位大佬不吝赐教,不胜感激!!!
【工程附件:】链接:https://pan.baidu.com/s/1Rw9Q0jhR82vSSx_FGYmquQ?pwd=2vvu
提取码:2vvu
解决方法:
经过上板实测,通过ILA抓取发现
crc_en未在有效数据地方拉低(只在crc_data有效数据到来时拉高),图中红色部分可见。
修改代码为:
IDLE: begin
GMII_RX_DONE <= 0;
crc_en <= 0;
if(GMII_DV_reg1 && !GMII_DV_reg2)
begin
curr_state <= PREAMBLE_CODE;
crc_init <= 1;
end
else
curr_state <= curr_state;
end
在IDLE状态加上crc_en <= 0;即可解决。