我有这个LFSR,但我不确定如何找到与之相关的多项式。我正在尝试使用 uint8_t 变量创建一个 _static _flash 查找表以节省计算周期。唯一的问题,我不确定如何在 C++ 中实现 LFSR。
干杯,赫尼
我有这个LFSR,但我不确定如何找到与之相关的多项式。我正在尝试使用 uint8_t 变量创建一个 _static _flash 查找表以节省计算周期。唯一的问题,我不确定如何在 C++ 中实现 LFSR。
干杯,赫尼
锁存器标记为 0 到 6。锁存器被右移 1 个锁存器,移位前锁存器 6 中的值被放入锁存器 0 并与锁存器 4 异或(最终在锁存器 4 中的值是前锁存器 3 和锁存器 6 的异或)。
对于多项式,不清楚左锁存器或右锁存器是否被认为是最高有效锁存器(位)。硬件图显示了右移,但该图可以反转,左移而不是右移,仍然使用 D6 对数据位流进行异或。
该图有点混乱,因为它显示了 D0、D4 和 D7,但只有 7 位,而不是 8 位。
此 LFSR 将在重复之前循环遍历所有 127 个可能的非零 7 位值。这是循环模式表,以十六进制显示:
01,44,22,11,4c,26,13,4d,62,31,5c,2e,17,4f,63,75
7e,3f,5b,69,70,38,1c,0e,07,47,67,77,7f,7b,79,78
3c,1e,0f,43,65,76,3b,59,68,34,1a,0d,42,21,54,2a
15,4e,27,57,6f,73,7d,7a,3d,5a,2d,52,29,50,28,14
0a,05,46,23,55,6e,37,5f,6b,71,7c,3e,1f,4b,61,74
3a,1d,4a,25,56,2b,51,6c,36,1b,49,60,30,18,0c,06
03,45,66,33,5d,6a,35,5e,2f,53,6d,72,39,58,2c,16
0b,41,64,32,19,48,24,12,09,40,20,10,08,04,02
使用 int 变量 i 实现此 lfsr 一个周期的 C 代码:
i = ((i&1)<<6)^((i&1)<<2)^(i>>1);
您没有包括起始值是什么,只是假设它是十六进制 01,如我的示例表中所示。数据通过从 lfsr 与符号数据位、最低有效数据位到最高有效数据位的异或锁存器 D6 进行加密或解密。我认为您只需要创建一个包含 127 n 位模式的表。我确认这适用于 8 位和 16 位数据。8位数据表:
c9,f2,0e,7f,dc,28,7d,15
da,73,6a,06,5b,17,13,81
64,79,87,3f,6e,94,be,0a
ed,39,35,83,ad,8b,89,40
b2,bc,c3,1f,37,4a,5f,85
f6,9c,9a,c1,d6,c5,44,20
59,de,e1,8f,1b,a5,af,42
7b,4e,cd,60,eb,62,22,90
2c,ef,f0,c7,8d,d2,57,a1
3d,a7,66,b0,75,31,11,48
96,77,f8,e3,46,e9,ab,d0
9e,53,33,d8,ba,98,08,24
cb,3b,fc,71,a3,f4,55,68
cf,a9,19,6c,5d,4c,04,92
e5,1d,fe,b8,51,fa,2a,b4
e7,d4,0c,b6,2e,26,02
作为解释多项式的尝试,反转 LFSR,因此 D[6] 在左侧,D[0] 在右侧。从初始值 1000000 开始,执行 Galois 多项式除法(使用 xor 代替减法)除以 10010001 (D^7 + D^4 + 1),根据需要添加零以循环(移位)LFSR
10010001 | 1000000 (01 reversed)
10010001 (D^7 + D^4 + 1)
-------
0010001 (44 reversed)
0100010 (22 reversed)
1000100 (11 reversed)
10010001 (D^7 + D^4 + 1)
-------
0011001 (4c reversed)