实验内容 1.分别写出实现 n-LFSR 与 n-DSR (n 为正整数) 进动一拍的程序(旨在能“由寄存器的一个状态算出紧接着的下一个状态”),要求: 寄存器状态的各分量自然地与相应数据存储区的各比特位一一对应,不允许仅 1 个状态分量就占据 1 个存储单元(字节、字或双字等)。2、基于上述程序完成以下工作: 选定一个 8 次联接多项式,这时检验状态存储区自然形成的 1 字节二进制数是否与前出现者相同就可判定状态是否开始成圈(即进入周期性重复),据此编制 i) 分别计算 LFSR 与 DSR 在一个给定初态 (由外部响应给出) 下输出序列 ii)求出 LFSR或 DSR之一状态图的程序 实验要求 1.对较低次数的联接多项式,程序计算结果须与手工推算一致;2.抓图显示“输出序列”与“状态图”(附页),不能出现明显错误。请用C语言代码写出代码并且对代码进行检查和完善
时间: 2024-03-25 19:37:50 浏览: 161
各种数据结构基础实验
好的,以下是C语言代码实现n-LFSR和n-DSR:
```c
#include <stdio.h>
// n-LFSR
unsigned int lfsr(unsigned int reg, unsigned int taps) {
unsigned int bit = 0;
// 计算最右边的比特位
bit = ((reg & 1) ^ ((reg >> (taps - 1)) & 1));
// 左移寄存器,舍弃最左边的比特位,将计算得到的比特位放到最右边
reg = (reg >> 1) | (bit << (taps - 1));
return reg;
}
// n-DSR
unsigned int dsr(unsigned int reg, unsigned int taps) {
unsigned int bit = 0;
// 计算最左边的比特位
bit = ((reg >> (taps - 1)) & 1);
// 右移寄存器,舍弃最右边的比特位,将计算得到的比特位放到最左边
reg = (reg << 1) | bit;
// 清除第taps位
reg &= ~(1 << taps);
return reg;
}
int main() {
unsigned int reg = 0x7F; // 初始状态
unsigned int taps = 8; // 联接多项式的次数
unsigned int output = 0;
int i;
printf("LFSR output sequence:\n");
for (i = 0; i < (1 << taps) - 1; i++) {
output = lfsr(reg, taps);
printf("%d ", output & 1);
reg = output;
}
printf("\nDSR output sequence:\n");
for (i = 0; i < (1 << taps) - 1; i++) {
output = dsr(reg, taps);
printf("%d ", output & 1);
reg = output;
}
return 0;
}
```
对于实验要求2中的状态图程序,我们可以使用Graphviz来生成状态图。以下是完整的代码:
```c
#include <stdio.h>
// n-LFSR
unsigned int lfsr(unsigned int reg, unsigned int taps) {
unsigned int bit = 0;
// 计算最右边的比特位
bit = ((reg & 1) ^ ((reg >> (taps - 1)) & 1));
// 左移寄存器,舍弃最左边的比特位,将计算得到的比特位放到最右边
reg = (reg >> 1) | (bit << (taps - 1));
return reg;
}
// n-DSR
unsigned int dsr(unsigned int reg, unsigned int taps) {
unsigned int bit = 0;
// 计算最左边的比特位
bit = ((reg >> (taps - 1)) & 1);
// 右移寄存器,舍弃最右边的比特位,将计算得到的比特位放到最左边
reg = (reg << 1) | bit;
// 清除第taps位
reg &= ~(1 << taps);
return reg;
}
// 生成状态图
void generate_state_diagram(unsigned int reg, unsigned int taps, char *filename) {
FILE *fp;
fp = fopen(filename, "w");
fprintf(fp, "digraph StateDiagram {\n");
unsigned int state = reg;
unsigned int next_state = 0;
int i, j;
for (i = 0; i < (1 << taps); i++) {
fprintf(fp, " S%d [label=\"", state);
for (j = taps - 1; j >= 0; j--) {
fprintf(fp, "%d", (state >> j) & 1);
}
fprintf(fp, "\", shape=circle]\n");
next_state = lfsr(state, taps);
fprintf(fp, " S%d -> S%d [label=\"%d\"]\n", state, next_state, next_state & 1);
next_state = dsr(state, taps);
fprintf(fp, " S%d -> S%d [label=\"%d\"]\n", state, next_state, next_state & 1);
state = next_state;
}
fprintf(fp, "}");
fclose(fp);
}
int main() {
unsigned int reg = 0x7F; // 初始状态
unsigned int taps = 8; // 联接多项式的次数
unsigned int output = 0;
int i;
printf("LFSR output sequence:\n");
for (i = 0; i < (1 << taps) - 1; i++) {
output = lfsr(reg, taps);
printf("%d ", output & 1);
reg = output;
}
printf("\nDSR output sequence:\n");
for (i = 0; i < (1 << taps) - 1; i++) {
output = dsr(reg, taps);
printf("%d ", output & 1);
reg = output;
}
printf("\nGenerating state diagram...\n");
generate_state_diagram(0x7F, 8, "state_diagram.dot");
printf("Done.\n");
return 0;
}
```
这个程序会生成一个名为`state_diagram.dot`的文件,我们可以使用Graphviz来将其转换为图像文件。在命令行中运行以下命令:
```
dot -Tpng state_diagram.dot -o state_diagram.png
```
这将会生成一个名为`state_diagram.png`的PNG文件,其中包含了LFSR和DSR的状态图。
阅读全文