实验内容 1.分别写出实现 n-LFSR 与 n-DSR (n 为正整数) 进动一拍的程序(旨在“由寄存器的一个状态算出紧接着的下一个状态”),要求: 寄存器状态的各分量自然地与相应数据存储区的各比特位一一对应,不允许仅 1 个状态分量就占据 1 个存储单元(字节、字或双字等)。2、基于上述程序完成以下工作: 选定一个 8 次联接多项式,这时检验状态存储区自然形成的 1 字节二进制数是否与前出现者相同就可判定状态是否开始成圈(即进入周期性重复),据此编制 i) 分别计算 LFSR 与 DSR 在一个给定初态 (由外部响应给出) 下输出序列 ii)求出 LFSR或 DSR之一状态图的程序 实验要求 1.对较低次数的联接多项式,程序计算结果须与手工推算一致;2.抓图显示“输出序列”与“状态图”(附页),不能出现明显错误。请用C语言代码写出代码并且提供代码解释
时间: 2024-03-25 13:38:06 浏览: 51
下面是一个基于 C 语言的 n-LFSR 和 n-DSR 的进动一拍程序的示例代码:
```c
#include <stdio.h>
#include <stdint.h>
#define N 8 // 寄存器的位数
#define POLY 0x8E // 8 次联接多项式
uint8_t lfsr(uint8_t state) {
uint8_t feedback = ((state >> 0) ^ (state >> 1) ^ (state >> 2) ^ (state >> 4)) & 1;
return (state >> 1) | (feedback << (N - 1));
}
uint8_t dsr(uint8_t state, uint8_t sync) {
if (sync == 0) {
return state;
} else {
uint8_t feedback = ((state >> 0) ^ (state >> 1) ^ (state >> 2) ^ (state >> 4)) & 1;
return (state >> 1) | (feedback << (N - 1));
}
}
int main() {
uint8_t state_lfsr = 0x01; // LFSR 初态
uint8_t state_dsr = 0x01; // DSR 初态
uint8_t sync = 0; // 同步复位信号
uint8_t output_lfsr, output_dsr; // 输出序列
printf("LFSR Output:\n");
for (int i = 0; i < 8; i++) {
output_lfsr = lfsr(state_lfsr);
printf("%d ", output_lfsr);
state_lfsr = output_lfsr;
}
printf("\n");
printf("DSR Output:\n");
for (int i = 0; i < 8; i++) {
output_dsr = dsr(state_dsr, sync);
printf("%d ", output_dsr);
sync = (output_dsr == POLY) ? 1 : 0;
state_dsr = output_dsr;
}
printf("\n");
return 0;
}
```
上述代码中,`lfsr` 函数表示 n-LFSR 的进动一拍操作,通过异或运算计算反馈位,然后将状态向右移动一位,最后将反馈位放到最高位。`dsr` 函数表示 n-DSR 的进动一拍操作,如果同步复位信号为 0,则直接返回当前状态;否则,与 LFSR 类似,计算反馈位,并且将状态向右移动一位,最后将反馈位放到最高位。
在 `main` 函数中,分别设置 LFSR 和 DSR 的初态以及同步复位信号,然后循环 8 次进行进动一拍操作,并且打印输出序列。同时,对于 DSR,如果输出序列等于联接多项式(即 0x8E),则认为进入了周期性重复,将同步复位信号设置为 1。
需要注意的是,由于寄存器状态的各分量自然地与相应数据存储区的各比特位一一对应,因此在程序中使用了 C 语言中的位运算符来操作比特位,如右移运算符 `>>` 和与运算符 `&`。
总之,这个实验要求编写 n-LFSR 和 n-DSR 的进动一拍程序,然后通过选定一个 8 次联接多项式来计算输出序列并绘制状态图。同时,要求保证程序计算结果与手工推算一致,并且抓图显示输出序列和状态图,以便检查和验证程序的正确性。
阅读全文