实验内容 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:07 浏览: 26
下面是一个基于 C 语言的 n-LFSR 和 n-DSR 的进动一拍程序,并且包括选定 8 次联接多项式以及绘制状态图的代码:
```c
#include <stdio.h>
#include <stdint.h>
#include <stdbool.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");
printf("State Diagram:\n");
uint8_t states[N];
for (int i = 0; i < N; i++) {
states[i] = 0;
}
uint8_t current_state = 0x01;
bool found = false;
int period = 0;
while (!found) {
for (int i = 0; i < N; i++) {
printf("%d ", (current_state >> i) & 1);
states[i] = (states[i] << 1) | ((current_state >> i) & 1);
}
printf("\n");
current_state = dsr(current_state, 1);
period++;
for (int i = 0; i < N; i++) {
if (states[i] == ((1 << period) - 1)) {
found = true;
} else {
found = false;
break;
}
}
}
return 0;
}
```
上述代码中,`lfsr` 和 `dsr` 函数与之前相同,用于计算 n-LFSR 和 n-DSR 的进动一拍操作。在 `main` 函数中,首先设置 LFSR 和 DSR 的初态以及同步复位信号,然后循环 8 次进行进动一拍操作,并且打印输出序列。
另外,新增了一段代码用于绘制状态图。首先初始化状态数组为全 0,然后用一个循环来生成状态图,直到发现状态开始成圈为止。具体实现方式是,循环中每次计算出当前状态并且打印输出比特位,然后将状态写入状态数组中,并且检查是否出现了周期性重复。如果周期性重复,则停止循环并且记录周期长度。
需要注意的是,状态图中每一列表示一个比特位的状态,而每一行则表示一个时刻的状态。周期性重复意味着出现了重复的列,因此可以通过统计每个比特位的状态数组是否为“全 1”来判断是否出现了周期性重复,进而计算出周期长度。
总之,这个实验要求编写 n-LFSR 和 n-DSR 的进动一拍程序,并且选定一个 8 次联接多项式来计算输出序列并绘制状态图。同时,要求保证程序计算结果与手工推算一致,并且抓图显示输出序列和状态图,以便检查和验证程序的正确性。