在上一篇中,通过iddr_ctrl模块将DDR信号转换为SDR信号,并输出rx_data[7:0]信号和对应的rx_en数据有效信号。本篇将在此基础上对信息进行CRC校验和有效包检测,以达到包过滤的目的。
目录
一、为什么要包过滤?
在一个系统的发送端(这里指上位机)可能有不同的应用程序,接收端也可能有不同的接收设备。那么在数据接收中就需要考虑两个问题:1.当一包数据到来时(rx_en==1),这一包数据是不是发给我的?2.传来的数据有没有错误?
例如,我只想接收上位机中的A应用发来的数据,而A应用也只想让我自己收到数据。那么我在接收到数据的时候就要进行判断,如果是发给我的,并且数据在传输过程中没有发生错误,就留下这包数据;如果不是发给我的,或者发生了错误,就将这包数据过滤掉。
二、有效包检测
从以太网的包结构中可以看到,前50字节是以太网包头,其中具体包括了MAC首部、IP首部和UDP首部。最后还有四个字节的数据校验位,传输的信息存放在data中。我们进行有效包检测就是利用以太网包头中的信息进行判断。已知UDP协议字段为8'h11,我们设置PC端应用端口号为1234,目的端口号为123,我们可以通过判断这三个信息来证明此包为来自于我们需要的应用。

具体实现上,定义两个计数器rx_cnt和vld_cnt,rx_cnt根据rx_en进行计数,当rx_cnt==31时判断UDP协议字段,当rx_cnt==42-43时判断源端口,当rx_cnt==44-45时判断目的端口,共要进行5次判断。每满足一个判断条件就给vld_cnt+1,当vld_cnt==5时,将vld_pkg信号拉高,代表包有效。
reg [13:0] rx_cnt;
reg [3:0] filter_cnt;
reg vld_pkg;
always @(posedge sclk) begin
if