m基于FPGA的桶形移位寄存器verilog实现,包含testbench
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 Register,LFSR)是一种在数字电路、通信以及密码学中广泛应用的技术。其基本原理是通过移位寄存器中的位运算来生成一个伪随机序列。桶形移位寄存器具有体积小、速度快、易于实现以及循环性好等优点,因此被广泛应用于通信系统中的编码、加密等领域。
2.1、桶形移位寄存器的基本原理
桶形移位寄存器是一种寄存器,其结构如图1所示。其中,$D$个触发器通过互相反馈的方式组成一个环形结构,称为反馈路径。每个触发器的输出连接一个异或门,其中一个输入为其输入,另一个输入为反馈路径上的某些输出的异或和。桶形移位寄存器通过对输入比特进行移位和反馈比特运算,可以在寄存器中生成一个伪随机序列。
2.2、桶形移位寄存器的数学模型
桶形移位寄存器的输出序列可以表示为一个线性反馈移位寄存器方程:
2.3、桶形移位寄存器的实现步骤
桶形移位寄存器的实现步骤如下:
选择一个合适的多项式S(x),并确定移位寄存器的长度$D$和反馈路径上的比特位置T_1,\cdots,T_d。
初始化移位寄存器的状态,将所有触发器的初始值设为0或1。
对于每个时刻,执行移位和反馈运算,生成输出序列s_n。
重复步骤3,直到生成所需长度的输出序列。
桶形移位寄存器是一种在数字电路、通信以及密码学中广泛应用的技术。其基本原理是通过移位寄存器中的位运算来生成一个伪随机序列。桶形移位寄存器具有体积小、速度快、易于实现以及循环性好等优点,因此被广泛应用于通信系统中的编码、加密等领域。本文从数学原理和实现步骤两个方面,详细介绍了桶形移位寄存器的基本原理、结构、数学模型以及实现步骤。
3.Verilog核心程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | 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 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)