验收滤波器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.7 | BIT.6 | BIT.5 | BIT.4 | BIT.3 | BIT.2 | BIT.1 | BIT.0 |
---|---|---|---|---|---|---|---|
CAN Mode | CBP | RXINTEN | (0) | 关闭时钟 | CD.2 | CD.1 | CD.0 |
BIT 7 = 0,CAN Mode = BasicCAN
BIT 7 = 1,CAN Mode = PeliCAN
BasicCAN
验收代码寄存器(ACR),地址4
BIT.7 | BIT.6 | BIT.5 | BIT.4 | BIT.3 | BIT.2 | BIT.1 | BIT.0 |
---|---|---|---|---|---|---|---|
AC.7 | AC.6 | AC.5 | AC.4 | AC.3 | AC.2 | AC.1 | AC.0 |
验收屏蔽寄存器(AMR),地址5
BIT.7 | BIT.6 | BIT.5 | BIT.4 | BIT.3 | BIT.2 | BIT.1 | BIT.0 |
---|---|---|---|---|---|---|---|
AM.7 | AM.6 | AM.5 | AM.4 | AM.3 | AM.2 | AM.1 | AM.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.7 | MOD.6 | MOD.5 | MOD.4 | MOD.3 | MOD.2 | MOD.1 | MOD.0 |
---|---|---|---|---|---|---|---|
- | - | - | SM | AFM | STM | LOM | RM |
复位模式下可写:
验收代码寄存器(ACRn),地址16-19:**
BIT.7 | BIT.6 | BIT.5 | BIT.4 | BIT.3 | BIT.2 | BIT.1 | BIT.0 |
---|---|---|---|---|---|---|---|
ACRn.7 | ACRn.6 | ACRn.5 | ACRn.4 | ACRn.3 | ACRn.2 | ACRn.1 | ACRn.0 |
验收屏蔽寄存器(AMRn),地址20-23:**
BIT.7 | BIT.6 | BIT.5 | BIT.4 | BIT.3 | BIT.2 | BIT.1 | BIT.0 |
---|---|---|---|---|---|---|---|
AMRn.7 | AMRn.6 | AMRn.5 | AMRn.4 | AMRn.3 | AMRn.2 | AMRn.1 | AMRn.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]) ));
8 条评论
作者的观点新颖且实用,让人在阅读中获得了新的思考和灵感。
建议引入反面案例,增强辩证性。
建议引入反面案例,增强辩证性。
作者对主题的挖掘深入骨髓,展现了非凡的洞察力和理解力。
真棒!
不错不错,我喜欢看 https://www.ea55.com/
不错不错,我喜欢看 https://www.237fa.com/
陈蛇胲:文章真不错http://m.suunpower.com/