目录伪随机序列 (2)1 基本原理 (2)1.1 背景 (2)1.2 实现原理 (2)2 实现方式 (3)3 FPGA的实现 (5)3.1 设计思路 (5)3.2 代码实现分析 (5)3.2.1斐波那契方式 (5)3.2.2伽罗瓦方式 (9)4 总结 (12)伪随机序列1 基本原理1.1 背景随着通信技术的发展,在某些情况下,为了实现最有效的通信应采用具有白噪声统计特性的信号;为了实现高可靠的保密通信,也希望利用随机噪声;另外在测试领域,大量的需要使用随机噪声来作为检测系统性能的测试信号。
然而,利用随机噪声的最大困难是它难以重复再生和处理。
伪随机序列的出现为人们解决了这一难题。
伪随机序列具有类似于随机噪声的一些统计特性,同时又便于重复产生和处理,有预先的可确定性和可重复性。
由于它的这些优点,在通信、雷达、导航以及密码学等重要的技术领域中伪随机序列获得了广泛的应用。
而在近年来的发展中,它的应用范围远远超出了上述的领域,如计算机系统模拟、数字系统中的误码测试、声学和光学测量、数值式跟踪和测距系统等也都有着广阔的使用。
伪随机序列通常由反馈移位寄存器产生,又可分为线性反馈移位寄存器和非线性反馈移位寄存器两类。
由线性反馈移位寄存器产生出的周期最长的二进制数字序列称为最大长度线性反馈移位寄存器,即为通常说的m序列,因其理论成熟,实现简单,应用较为广泛。
m序列的特点:(1)每个周期中,“1”码出现2n-1次,“0”码出现2n-1次,即0、1出现概率几乎相等。
(2)序列中连1的数目是n,连0的数目是n-1。
(3)分布无规律,具有与白噪声相似的伪随机特性。
1.2 实现原理在二进制多级移位寄存器中,若线性反馈移位寄存器(LFSR)有n 阶(即有n级寄存器),则所能产生的最大长度的码序列为2n-1位。
如果数字信号直接取自LFSR(非翻转信号)的输出,那么最长的连0数为n-1。
除了字符串的连0和连1,伪随机序列在一个长度为n的字符串中将包含任何可能的0和1的组合。
要使移位寄存器产生确定的值,必须置其初值并允许时钟电路产生移位时钟。
一般的线性反馈移存器组成如图1所示,图中一级移存器的状态用ai表示,ai = 0或1, i = 整数。
反馈线的连接状态用ci表示,ci = 1表示此线接通,0表示断开。
反馈线的连接状态不同就能改变输出序列的周期。
图1 一般的线性反馈移存器框图ci的取值决定了移存器的反馈连接和序列的结构,也就是决定了序列的周期。
用特征多项式f(x)表示为:f(x) = c0 + c1x+ c2x2+ ···+ c n x n=∑c i x i当特征多项式符合某些条件时称为本原多项式。
在设计m序列产生器时,移位寄存器反馈线的结构直接决定于本原多项式的结构。
也就是只要找到本原多项式,就能由它构成m序列产生器。
不同周期的m序列所适用的环境不同,ITU-T(国际电信联盟)对此提出了一系列标准。
如ITU-T建议用于数据传输设备测量误码的周期是511,其特征多项式建议采用x9 + x5 + 1;以及建议用于数字传输系统(1544/2048和6312/8448kb/s)测量的m序列周期是215-1 = 32767,其特征多项式建议采用x15+ x14 + 1。
在具体应用时,可参考ITU-T的标准进行选择。
2 实现方式对于某种特定的本原多项式,有两种形式的LFRS结构来实现:Fibonacci (斐波纳契)LFSR和Galois(伽罗瓦)LFSR。
Fibonacci(斐波纳契)LFSR专门在移位寄存器外部使用或(异或)门,而Galois LFSR在移位寄存器链内部使用专门的或门。
两者的一般结构如图2、3所示:n阶图2 Fibonacci(斐波纳契)LFSR从图2中可以看到,该移位寄存器是将各寄存器的输出值抽出来,在外部进行异或运算之后再将该值反馈到输入端。
n阶图3 Galois(伽罗瓦)LFSR从图3 中明显看到,异或运算是在各寄存器之间进行的。
例如,一个本原多项式为x15 + x14 + 1,表示一个15级的移位寄存器的输出。
如果用斐波纳契LFSR实现,这个移位寄存器的第十四和第十五级被加入到异或门,结果反馈到第一级的输入端。
而如果用伽罗瓦LFSR的方式实现,则当前移位寄存器的输出被加入到内置的第十四、十五级的异或门反馈实现。
在当前多项式的项数较少时,用斐波那契方法实现比伽罗瓦方式更好,可以达到较高的时钟速率。
但是,虽然斐波那契的速度更快,但是它的实现方式在项数增加的时候性能会下降,而伽罗瓦LFSR的实现方式在项数增加的时几乎没有性能上的损失。
所以,在应用时可根据不同的系统需求进行选择。
3 FPGA的实现本设计分别用上述两种方式实现7阶的伪随机序列。
3.1 设计思路由m序列的产生原理可知,该发生器主要由移位寄存器和异或门的反馈输入实现。
因此,将设计分为以下几个步骤:1)给移位寄存器赋初值,使其产生一个确定的序列;2)分别根据斐波那契方式和伽罗瓦方式的特点,得到下一状态寄存器的输入值;3)更新当前各寄存器的状态值,并且输出最高位的值。
3.2 代码实现分析3.2.1斐波那契方式斐波那契V代码如下:module wsj_1( data_out, clock_in, reset_in );output data_out; //输入输出声明input clock_in, reset_in;//==============变量声明============================= wire [06:00] exp_out; //下一状态各寄存器存储的值,其最高位为//下一次触发时的输出值reg [06:00] exp_in;reg data_out;parameter poly_in = 07'h03; //poly为特征多项式转化而来的7位值,//若为…1‟,表示此处需要或门//Poly : x^7 + x^6// : 000 0011// : 0 3parameter length_in = 1'b0;//==================得到下一状态的输入值===================== assign exp_out[00] = (exp_in[00] & poly_in[06]) ^(exp_in[01] & poly_in[05]) ^(exp_in[02] & poly_in[04]) ^(exp_in[03] & poly_in[03]) ^(exp_in[04] & poly_in[02]) ^(exp_in[05] & poly_in[01]) ^(exp_in[06] & poly_in[00]) ^ length_in;//由特征多项式得到下一状态的输入值assign exp_out[06:01] = exp_in[05:00];//当前状态值移位得到下一状态值//=================更新状态并将数据输出======================= always @ (posedge clock_in) beginif (reset_in) beginexp_in <= 7'b1111111; //给寄存器赋初值data_out <= 1; endelse beginexp_in <= exp_out;data_out <= exp_out[06]; //输出值endendendmodule在上述程序中,首先值得注意是Poly这个参数定义,它根据特征多项式转化而来,这样定义可以更方便的得到下一状态的输出值。
系统将当前寄存器的状态值与该参数相与,并将各位异或,实现的即为寄存器外部的异或,由此得到的便是下一状态的输入值。
将当前状态值移位便得到下一状态各寄存器的值。
还有一点要注意的是,在系统进行复位之后,必须给寄存器赋初值,否则输出序列是不定值。
移位寄存器输出的是串行数据,在实际应用中常常需要并行的伪随机序列,用户只需根据自己的需要,循环调用此模块,并用N x M位(其中N表示并行数据的宽度,M表示伪随机序列的阶数)的寄存器进行存储,在同一时刻便可输出并行的伪随机码。
3.2.1.1 仿真分析代码在ISE软件中综合之后,进行功能仿真。
其仿真波形如图4所示:图4 伪随机序列仿真图在复位信号reset_in之后,系统自动启动,正常工作,第一行的data_out 即为串行输出的伪随机序列。
在ISE上综合并且功能仿真通过之后,还需在开发板是进行调试,以验证程序实际运行的效果。
调试时采用开发板上100MHZ的固定时钟作为设计时钟输入,故在工程中要注意对时钟进行约束,否则程序无法在开发板上运行。
本设计采用chipscope逻辑分析仪进行调试,调试需要使用到三个核:ICON、ILA和VIO核。
ICON为控制内核,其控制端口为2,分别控制ILA核和VIO 核。
ILA核用于观察伪随机序列输出的波形,触发端口为1位。
VIO核输入输出信号进行设置,异步输出控制复位信号,1位宽;异步输入观察输出的数据,1位宽。
图5为生成VIO核时的设置:图5 VIO核的设置图5中选中的是异步输入输出,位宽都是1位长。
其它核的生成方法类似,按照前面所述进行设置即可。
最后添加的chipscope调试代码如下:wire [35:0] control_ila,control_vio;wire async_in;wire async_out;wire reset_in;wire trig0;assign reset_in = async_out;assign async_in = data_out;assign trig0 = data_out;icon i_icon(.CONTROL0(control_ila),.CONTROL1(control_vio));vio i_vio(.CONTROL(control_vio),.ASYNC_OUT(async_out),.ASYNC_IN(async_in));ila i_ila(.CLK(clock_in),.CONTROL(control_ila),.TRIG0(trig0));其中,reset_in是系统的复位信号,由async_out控制;data_out是输出的数据,由trig0可观察到该信号的波形。
图6为VIO核的调试界面:图6 VIO核界面图中reset_in为复位信号,data_out为输出的数据。
图7为最后ILA核呈现的波形界面:图7 ILA核调试波形从图7中可以看到,伪随机码的波形与功能仿真的波形一致。