FPGA实现丢掉错误包的代码示例
前几天看到了一个比较好的代码(自己认为图片),在假期最后贴出来,假装自己过了一个充实的假期(其实这三天大门都没有迈出一步图片)。
// Increment write address for every beat that has not been dropped and rewind //to the previous checkpoint when a partial packet is dropped
always @(posedge s_aclk) begin if (~s_aresetn) begin
ram_addra <=0; end
else if (drop_busy) begin
ram_addra <=ram_addra_checkpoint; end
else if (s_axis_tvalid && s_axis_tready) begin ram_addra <- ram_addra+1;
end end
// Record a checkpoint for write address when a complete packet is written // into the buffer
always @(posedge s_aclk) begin if (~s_aresetn) begin
ram_addra_checkpoint<-0; end
else if (s_axis_tvalid && s_axis_tready && s_axis_tlast &&~drop_busy) begin ram_addra_checkpoint <- ram_addra+1;
end
这段代码的功能是将“错误的数据包丢弃”。有时候我们只有将一整包数据全部接收完毕之后才知道这包数据是不是正确(因为包尾标志或者CRC等原因),这段代码给了我们一个很好的例程来解决这个问题。
下面简单分析一下这段代码:在数据开始接收之后,通过写地址不断加一(ram_addra+1’b1)将该数据包存放在RAM中。当数据接收完成之后,使用drop_busy信号来判断这个数据包是不是正确,当数据包正确,即drop_busy为0时,当前的RAM地址不变,并将ram_addra_checkpoint更新为下一次要写入的地址;当数据包错误,即drop_busy信号为1时,当前的RAM更新为上一次处保存的ram_addra_checkpoint值,即该错误数据包第一次写入时的地址,这样当下一包数据来临时就会将之前接收到的数据给覆盖掉,从而实现了丢弃掉这包数据的功能。