验收滤波器Verilog设计

With the help of the acceptance filter the CAN controller is able to allow passing of received messages to the RXFIFO only when the identifier bits of the received message are equal to the predefined ones within the acceptance filter registers.

类似Ethernet,CAN引入了子网的概念,IP包含Host ID和Network ID两部分,以Mask(子网掩码)区分。ACR和AMR就类似于Ethernet中的Mask,AF通过ACR和AMR起作用。

一个多功能的验收滤波器,该滤波器允许自动检查 标识符 数据字节

使用这些有效的滤波方法,可以防止对于 某个节点无效的报文 报文组存储在接收缓冲器里,因此降低了主控制器的处理负载。

滤波器由 验收码寄存器 屏蔽寄存器根据数据表给定算法来控制。

接收到的数据会和验收代码寄存器中的值进行逐位比较。

接收屏蔽寄存器定义与比较相关的位的位置(0=相关 1=不相关)。

只有 收到报文的相应的位 验收代码寄存器相应的位相同,报文才会被接收。

换句话说,屏蔽位可以看成是“无视”的功能。在某种定义上,这两个寄存器是为 RXFIFO 也就是接受缓冲寄存器所准备的。

当多个报文在总线传输时,能进入到节点的 RXFIFO 只有相对应标示符的报文,那么该节点就要事先将接受的标示符写入接受代码寄存器,过后进行屏蔽动作,这一过程就是验收过滤。

通过时钟分频寄存器(CDR),地址31的BIT 7

BIT.7BIT.6BIT.5BIT.4BIT.3BIT.2BIT.1BIT.0
CAN ModeCBPRXINTEN(0)关闭时钟CD.2CD.1CD.0

BIT 7 = 0,CAN Mode = BasicCAN

BIT 7 = 1,CAN Mode = PeliCAN

BasicCAN

验收代码寄存器(ACR),地址4

BIT.7BIT.6BIT.5BIT.4BIT.3BIT.2BIT.1BIT.0
AC.7AC.6AC.5AC.4AC.3AC.2AC.1AC.0

验收屏蔽寄存器(AMR),地址5

BIT.7BIT.6BIT.5BIT.4BIT.3BIT.2BIT.1BIT.0
AM.7AM.6AM.5AM.4AM.3AM.2AM.1AM.0

如果一条信息通过了验收滤波器的测试而且接收缓冲器有空间,那么ID和Data将被分别顺次写入 RXFIFO

请输入图片描述

当信息被正确的接收完毕就会

  • 接收状态位置高 (满)
  • 接收中断使能位置高 使能 接收中断置高 (产生中断)

    请输入图片描述

当满足以下方程的描述,则被接收:

[(ID.10-ID.3)≡ (AC.7-AC.0)] ∨ (AM.7-AM.0) ≡ 8'b1111_1111

Basic_Null_Match_o = (
            (id[3] == acr0[0] | amr0[0])  &
            (id[4] == acr0[1] | amr0[1])  &
            (id[5] == acr0[2] | amr0[2])  &
            (id[6] == acr0[3] | amr0[3])  &
            (id[7] == acr0[4] | amr0[4])  &
            (id[8] == acr0[5] | amr0[5])  &
            (id[9] == acr0[6] | amr0[6])  &
            (id[10]== acr0[7] | amr0[7])  );

PeliCAN

模式寄存器(MOD),地址0:**

MOD.7MOD.6MOD.5MOD.4MOD.3MOD.2MOD.1MOD.0
---SMAFMSTMLOMRM

复位模式下可写:

验收代码寄存器(ACRn),地址16-19:**

BIT.7BIT.6BIT.5BIT.4BIT.3BIT.2BIT.1BIT.0
ACRn.7ACRn.6ACRn.5ACRn.4ACRn.3ACRn.2ACRn.1ACRn.0

验收屏蔽寄存器(AMRn),地址20-23:**

BIT.7BIT.6BIT.5BIT.4BIT.3BIT.2BIT.1BIT.0
AMRn.7AMRn.6AMRn.5AMRn.4AMRn.3AMRn.2AMRn.1AMRn.0

PeliCAN 模式的验收滤波已被扩展 4 个 8 位的验收码寄存器 ACR0 ACR1 ACR2 和 ACR3验收屏蔽寄存器 AMR0 AMR1 AMR2 和 AMR3 可以用多种方法滤波报文。

单滤波器模式 :MOD.AFM = 1

0x00 接收标准帧

请输入图片描述

其中,AMR1的最后四位没有用到(no used)

部分代码如下:

Peli_SFStd_Match_o = (
                    (id[3] == acr0[0] | amr0[0])  &
                    (id[4] == acr0[1] | amr0[1])  &
                    (id[5] == acr0[2] | amr0[2])  &
                    (id[6] == acr0[3] | amr0[3])  &
                    (id[7] == acr0[4] | amr0[4])  &
                    (id[8] == acr0[5] | amr0[5])  &
                    (id[9] == acr0[6] | amr0[6])  &
                    (id[10]== acr0[7] | amr0[7])  &
      
                    (rtr1  == acr1[4] | amr1[4])  &
                    (id[0] == acr1[5] | amr1[5])  &
                    (id[1] == acr1[6] | amr1[6])  &
                    (id[2] == acr1[7] | amr1[7])  &

                    (Data0[0] == acr2[0] | amr2[0]  |   MaskData0)  &
                    (Data0[1] == acr2[1] | amr2[1]  |   MaskData0)  &
                    (Data0[2] == acr2[2] | amr2[2]  |   MaskData0)  &  
                    (Data0[3] == acr2[3] | amr2[3]  |   MaskData0)  &
                    (Data0[4] == acr2[4] | amr2[4]  |   MaskData0)  &
                    (Data0[5] == acr2[5] | amr2[5]  |   MaskData0)  &
                    (Data0[6] == acr2[6] | amr2[6]  |   MaskData0)  &
                    (Data0[7] == acr2[7] | amr2[7]  |   MaskData0)  &

                    (Data1[0] == acr3[0] | amr3[0]  |   MaskData1)  &
                    (Data1[1] == acr3[1] | amr3[1]  |   MaskData1)  &
                    (Data1[2] == acr3[2] | amr3[2]  |   MaskData1)  &  
                    (Data1[3] == acr3[3] | amr3[3]  |   MaskData1)  &
                    (Data1[4] == acr3[4] | amr3[4]  |   MaskData1)  &
                    (Data1[5] == acr3[5] | amr3[5]  |   MaskData1)  &
                    (Data1[6] == acr3[6] | amr3[6]  |   MaskData1)  &
                    (Data1[7] == acr3[7] | amr3[7]  |   MaskData1)  );

0x01 接收扩展帧

请输入图片描述

**其中,AMR3的最后两位没有用到(no used)

部分代码如下:

Peli_SFExt_Match_o = (
                    (id[21] == acr0[0] | amr0[0])  &
                    (id[22] == acr0[1] | amr0[1])  &
                    (id[23] == acr0[2] | amr0[2])  &
                    (id[24] == acr0[3] | amr0[3])  &
                    (id[25] == acr0[4] | amr0[4])  &
                    (id[26] == acr0[5] | amr0[5])  &
                    (id[27] == acr0[6] | amr0[6])  &
                    (id[28] == acr0[7] | amr0[7])  &
      
                    (id[13] == acr1[0] | amr1[0])  &
                    (id[14] == acr1[1] | amr1[1])  &
                    (id[15] == acr1[2] | amr1[2])  &
                    (id[16] == acr1[3] | amr1[3])  &
                    (id[17] == acr1[4] | amr1[4])  &
                    (id[18] == acr1[5] | amr1[5])  &
                    (id[19] == acr1[6] | amr1[6])  &
                    (id[20] == acr1[7] | amr1[7])  &

                    (id[5]  == acr2[0] | amr2[0])  &
                    (id[6]  == acr2[1] | amr2[1])  &
                    (id[7]  == acr2[2] | amr2[2])  &
                    (id[8]  == acr2[3] | amr2[3])  &
                    (id[9]  == acr2[4] | amr2[4])  &
                    (id[10] == acr2[5] | amr2[5])  &
                    (id[11] == acr2[6] | amr2[6])  &
                    (id[12] == acr2[7] | amr2[7])  &

                    (rtr2   == acr3[2] | amr3[2])  &
                    (id[0]  == acr3[3] | amr3[3])  &
                    (id[1]  == acr3[4] | amr3[4])  &
                    (id[2]  == acr3[5] | amr3[5])  &
                    (id[3]  == acr3[6] | amr3[6])  &
                    (id[4]  == acr3[7] | amr3[7])  );

双滤波器模式 :MOD.AFM = 1

0x00 接收标准帧

请输入图片描述

部分代码如下:

Peli_DFStd_Match_o = ((
                    (id[3] == acr0[0] | amr0[0])  &
                    (id[4] == acr0[1] | amr0[1])  &
                    (id[5] == acr0[2] | amr0[2])  &
                    (id[6] == acr0[3] | amr0[3])  &
                    (id[7] == acr0[4] | amr0[4])  &
                    (id[8] == acr0[5] | amr0[5])  &
                    (id[9] == acr0[6] | amr0[6])  &
                    (id[10]== acr0[7] | amr0[7])  &

                    (rtr1  == acr1[4] | amr1[4])  &
                    (id[0] == acr1[5] | amr1[5])  &
                    (id[1] == acr1[6] | amr1[6])  &
                    (id[2] == acr1[7] | amr1[7])  &

                    (Data0[0] == acr3[0] | amr3[0]  |   MaskData0)  &
                    (Data0[1] == acr3[1] | amr3[1]  |   MaskData0)  &
                    (Data0[2] == acr3[2] | amr3[2]  |   MaskData0)  &  
                    (Data0[3] == acr3[3] | amr3[3]  |   MaskData0)  &
                    (Data0[4] == acr3[4] | amr3[4]  |   MaskData0)  &
                    (Data0[5] == acr3[5] | amr3[5]  |   MaskData0)  &
                    (Data0[6] == acr3[6] | amr3[6]  |   MaskData0)  &
                    (Data0[7] == acr3[7] | amr3[7]  |   MaskData0)  )|(
      
                    (id[3] == acr2[0] | amr2[0])  &
                    (id[4] == acr2[1] | amr2[1])  &
                    (id[5] == acr2[2] | amr2[2])  &
                    (id[6] == acr2[3] | amr2[3])  &
                    (id[7] == acr2[4] | amr2[4])  &
                    (id[8] == acr2[5] | amr2[5])  &
                    (id[9] == acr2[6] | amr2[6])  &
                    (id[10]== acr2[7] | amr2[7])  &

                    (rtr1  == acr3[4] | amr3[4])  &
                    (id[0] == acr3[5] | amr3[5])  &
                    (id[1] == acr3[6] | amr3[6])  &
                    (id[2] == acr3[7] | amr3[7])  ));

0x01 接收扩展帧

请输入图片描述

部分代码如下:

Peli_DFExt_Match_o = ((
                    (id[21] == acr0[0] | amr0[0])  &
                    (id[22] == acr0[1] | amr0[1])  &
                    (id[23] == acr0[2] | amr0[2])  &
                    (id[24] == acr0[3] | amr0[3])  &
                    (id[25] == acr0[4] | amr0[4])  &
                    (id[26] == acr0[5] | amr0[5])  &
                    (id[27] == acr0[6] | amr0[6])  &
                    (id[28] == acr0[7] | amr0[7])  &
      
                    (id[13] == acr1[0] | amr1[0])  &
                    (id[14] == acr1[1] | amr1[1])  &
                    (id[15] == acr1[2] | amr1[2])  &
                    (id[16] == acr1[3] | amr1[3])  &
                    (id[17] == acr1[4] | amr1[4])  &
                    (id[18] == acr1[5] | amr1[5])  &
                    (id[19] == acr1[6] | amr1[6])  &
                    (id[20] == acr1[7] | amr1[7])  )|(  

                    (id[21] == acr2[0] | amr2[0])  &
                    (id[22] == acr2[1] | amr2[1])  &
                    (id[23] == acr2[2] | amr2[2])  &
                    (id[24] == acr2[3] | amr2[3])  &
                    (id[25] == acr2[4] | amr2[4])  &
                    (id[26] == acr2[5] | amr2[5])  &
                    (id[27] == acr2[6] | amr2[6])  &
                    (id[28] == acr2[7] | amr2[7])  &
      
                    (id[13] == acr3[0] | amr3[0])  &
                    (id[14] == acr3[1] | amr3[1])  &
                    (id[15] == acr3[2] | amr3[2])  &
                    (id[16] == acr3[3] | amr3[3])  &
                    (id[17] == acr3[4] | amr3[4])  &
                    (id[18] == acr3[5] | amr3[5])  &
                    (id[19] == acr3[6] | amr3[6])  &
                    (id[20] == acr3[7] | amr3[7])  ));
最后修改:2022 年 03 月 28 日
如果觉得我的文章对你有用,请随意赞赏