我有这个LFSR,我不确定如何找到与之相关的多项式。我试图用uint8_t变量创建一个_static _flash查找表来节省计算周期。唯一的问题是,我不确定如何在C ++中实现LFSR。
干杯, Hearny
答案 0 :(得分:0)
锁存器标记为0到6.锁存器右移1锁存器,移位前锁存器6中的值放入锁存器0并与锁存器4进行异或(最终锁存器中的值)图4是现有锁存器3和锁存器6)的xor。
对于多项式,不清楚左锁存器或右锁存器是否被认为是最重要的锁存器(位)。硬件图显示右移,但该图可以反转,向左移位而不是向右移动,仍然使用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的xor'ing锁存器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开始并执行伽罗瓦多项式除法(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)