m基于FPGA的桶形移位寄存器verilog实现,包含testbench

发布时间 2023-07-14 23:19:25作者: 我爱C编程

1.算法仿真效果

 

本系统进行了两个平台的开发,分别是:

 

Vivado2019.2

 

Quartusii18.0+ModelSim-Altera 6.6d  Starter Edition

 

其中Vivado2019.2仿真结果如下:

 

 

 

 Quartusii18.0+ModelSim-Altera 6.6d  Starter Edition的测试结果如下:

 

 

 

2.算法涉及理论知识概要

        桶形移位寄存器(Linear Feedback Shift RegisterLFSR)是一种在数字电路、通信以及密码学中广泛应用的技术。其基本原理是通过移位寄存器中的位运算来生成一个伪随机序列。桶形移位寄存器具有体积小、速度快、易于实现以及循环性好等优点,因此被广泛应用于通信系统中的编码、加密等领域。

 

2.1、桶形移位寄存器的基本原理

       桶形移位寄存器是一种寄存器,其结构如图1所示。其中,$D$个触发器通过互相反馈的方式组成一个环形结构,称为反馈路径。每个触发器的输出连接一个异或门,其中一个输入为其输入,另一个输入为反馈路径上的某些输出的异或和。桶形移位寄存器通过对输入比特进行移位和反馈比特运算,可以在寄存器中生成一个伪随机序列。

 

 

 

2.2、桶形移位寄存器的数学模型

       桶形移位寄存器的输出序列可以表示为一个线性反馈移位寄存器方程:

 

 

2.3、桶形移位寄存器的实现步骤

桶形移位寄存器的实现步骤如下:

 

选择一个合适的多项式S(x),并确定移位寄存器的长度$D$和反馈路径上的比特位置T_1,\cdots,T_d

 

初始化移位寄存器的状态,将所有触发器的初始值设为01

 

对于每个时刻,执行移位和反馈运算,生成输出序列s_n

 

重复步骤3,直到生成所需长度的输出序列。

 

 

 

         桶形移位寄存器是一种在数字电路、通信以及密码学中广泛应用的技术。其基本原理是通过移位寄存器中的位运算来生成一个伪随机序列。桶形移位寄存器具有体积小、速度快、易于实现以及循环性好等优点,因此被广泛应用于通信系统中的编码、加密等领域。本文从数学原理和实现步骤两个方面,详细介绍了桶形移位寄存器的基本原理、结构、数学模型以及实现步骤。

 

3.Verilog核心程序

 

always@(*)
begin
    case(sn_temp)
    0:dout_temp = dat_temp[63:31];
    1:dout_temp = dat_temp[62:30];
    2:dout_temp = dat_temp[61:29];
    3:dout_temp = dat_temp[60:28];
    4:dout_temp = dat_temp[59:27];
    
    5:dout_temp = dat_temp[58:26];
    6:dout_temp = dat_temp[57:25];
    7:dout_temp = dat_temp[56:24];
    8:dout_temp = dat_temp[55:23];
    9:dout_temp = dat_temp[54:22]; 
    
    10:dout_temp = dat_temp[53:21];
    11:dout_temp = dat_temp[52:20];
    12:dout_temp = dat_temp[51:19];
    13:dout_temp = dat_temp[50:18];
    14:dout_temp = dat_temp[49:17];
    
    15:dout_temp = dat_temp[48:16];
    16:dout_temp = dat_temp[47:15];
    17:dout_temp = dat_temp[46:14];
    18:dout_temp = dat_temp[45:13];
    19:dout_temp = dat_temp[44:12];  
    
    20:dout_temp = dat_temp[43:11];
    21:dout_temp = dat_temp[42:10];
    22:dout_temp = dat_temp[41:9];
    23:dout_temp = dat_temp[40:8];
    24:dout_temp = dat_temp[39:7];
    
    25:dout_temp = dat_temp[38:6];
    26:dout_temp = dat_temp[37:5];
    27:dout_temp = dat_temp[36:4];
    28:dout_temp = dat_temp[35:3];
    29:dout_temp = dat_temp[34:2];
    
    30:dout_temp = dat_temp[33:1];
    31:dout_temp = dat_temp[32:0];
    default:	
    dout_temp = 33'd0;
    endcase
end