-
目
录
伪随机序列
...........................
..................................................
..................................................
........
2
1
基本原理
.
..................................................
..................................................
..........................
2
1.1
背景
.
.....................................
..................................................
...................................
2
1.2
实现原理
.
..................................................
..................................................
..............
2
2
实现方式
.
.....................................
..................................................
.......................................
3
3
FPGA
的实现
.
< br>............................................... .................................................. ........................
5
3.1
设计思路
< br>.
...................................
..................................................
.............................
5
3.2
代码实现分析
.
................................................ .................................................. ........
5
3.2.1
斐波那契方式
.
................................
..................................................
.................
5
3.2.2
伽罗瓦方式
.
.................................
..................................................
....................
9
4
总结
.............
..................................................
..................................................
....................
1
2
伪随机序列
1
基本原理
1.1
背景
随着通信技术的发展,
在某些情况下,
为了实现最有效的通信
应采用具有白
噪声统计特性的信号;
为了实现高可靠的保密通信
,
也希望利用随机噪声;
另外
在测试领
域,大量的需要使用随机噪声来作为检测系统性能的测试信号。然而,
利用随机噪声的最
大困难是它难以重复再生和处理。
伪随机序列的出现为人们解
决
了这一难题。
伪随机序列具有类似于随机噪声的一些统计特性,
同时又便于重
复产生和处理,有预先的可确定性和可重复性。由于它的这些优点,在通信
、雷
达、
导航以及密码学等重要的技术领域中伪随机序列获得了
广泛的应用。
而在近
年来的发展中,
它
的应用范围远远超出了上述的领域,
如计算机系统模拟、
数字<
/p>
系统中的误码测试、
声学和光学测量、
数
值式跟踪和测距系统等也都有着广阔的
使用。
p>
伪随机序列通常由反馈移位寄存器产生,
又可分为线性反馈移位寄存
器和非
线性反馈移位寄存器两类。
由线性反馈移位寄存器产生出
的周期最长的二进制数
字序列称为最大长度线性反馈移位寄存器,即为通常说的
m
序列,因其理论成
熟,实现简单,应用较为广
泛。
m
序列的特点:
(
1
)每个周期中,
“1”
码出现
2n-1
次,
“0”
码出现
2n-1
次,即
0
、
1
出现概率几
p>
乎相等。
(
2<
/p>
)序列中连
1
的数目是
< br>n
,连
0
的数目是
n-1
。
(
3
)分布无规律,具有与白噪声相似的伪随机特性。
1.2
实现原理
< br>在二进制多级移位寄存器中,若线性反馈移位寄存器(
LFSR
< br>)有
n
阶(即
有
n
级寄存器)
,则所能产生的最大长度的码序列为<
/p>
2
n
-1
位。如
果数字信号直接
取自
LFSR
(非翻转
信号)的输出,那么最长的连
0
数为
n
-1
。除了字符串的连
0
和连
1
,
伪随机序列在一个长度为
< br>n
的字符串中将包含任何可能的
0
和
1
的组合。
要使移位寄存器产生确
定的值,必须置其初值并允许时钟电路产生移位时钟。
一般的
线性反馈移存器组成如图
1
所示,图中一级移存器的状态用
p>
ai
表示,
ai =
0
或
1, i =
整数。反馈线的连
接状态用
ci
表示,
ci = 1
p>
表示此线接通,
0
表示
断开。反馈线的连接状态不同就能改变输出序列的周期。
+
C0 = 1
+
c
2
+
c
n-1
c
1
a
n-1
a
n-2
a
1
a
0
图
1
一般的线性反馈移存器框图
ci
p>
的取值决定了移存器的反馈连接和序列的结构,也就是决定了序列的周
期。用特征多项式
f(x)
表示为:
f(x) = c
0
+
c
1
x+
c
2
x
2
+
·
·
·
+ c
n
x
n
=
p>
∑
c
i
x
i
当特征多项式符合某些条件时称为本原多项
式。在设计
m
序列产生器时,
移位寄存
器反馈线的结构直接决定于本原多项式的结构。
也就是只要找到本原多
< br>项式,就能由它构成
m
序列产生器。
不同周期的
m
序列所适用的环境
不同,
ITU-T
(国际电信联盟)对此提出了
一系列标准。如
ITU-T
建议用于数据传输设备测量
误码的周期是
511
,其特征多
项式建
议采用
x
9
+
x
5
+ 1
;以及建议用于数字传输系统(
1544/2048
和
6312/8448kb/s
)
测量的
m
序列周期是
2
15
-1 = 32767
,
其特征多项式
建议采用
x
15
+
x
14
+ 1
。在具体应用时,可参考
ITU-T
的标准进行选择。
2
实现方式
对于某种特定的本原多项式
,有两种形式的
LFRS
结构来实现:
Fibonacci
(斐波纳契)
LFSR
和
Galois
(伽罗瓦)
LFS
R
。
Fibonacci
(斐波纳契)
LFSR
专
门在移位寄存器外部使用或
(异或)门,而
Galois
LFSR
在移位寄存器链内部使
用专门的或门。两者的一般结构如图
2
、
3
所示:
n
阶
n
n-1
n-2
................
3
2
1
图
2
Fibonacci
(斐波纳契)<
/p>
LFSR
从图
2
中可以看到,
该移位寄存器是将各寄存器的输出值抽出来,
在
外部进
行异或运算之后再将该值反馈到输入端。
n
阶
n
n-1
.....
3
2
1
图
3
Galois(
伽罗瓦
)
LFSR
从图
3
中明显看到,异或运算是在各寄存器之间进行的。
例如,一个本原多项式为
x
15
< br> + x
14
+ 1
,表示一
个
15
级的移位寄存器的输
出。如果用
斐波纳契
LFSR
实现,这个移位寄存器的第十四和第十五级被
加入到
异或门,结果反馈到第一级的输入端。而如果用伽罗瓦
L
FSR
的方式实现,则当
前移位寄存器的输出被加入到内置的第
十四、十五级的异或门反馈实现。
在当前多项式的项数较少时
,
用斐波那契方法实现比伽罗瓦方式更好,
可以
达到较高的时钟速率。
但是,
虽然斐波那契的速度更快
,
但是它的实现方式在项
数增加的时候性能会下降,而伽罗瓦<
/p>
LFSR
的实现方式在项数增加的时几乎没有
性能上的损失。
所以,在应用时可根据不同的系统需求进行选择。
3 FPGA
的实现
本设计分别用上述两种方式实现
7
阶的伪随机序列。<
/p>
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?
,表示此处需要或门<
/p>
//Poly :
x^7 +
x^6
//
: 000 0011
//
:
0
3
parameter 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) begin
if (reset_in)
begin
exp_in
<= 7'b1111111;
//
给寄存器赋初值
data_out <= 1; end
else
begin
exp_in
<= exp_out;
data_out <= exp_out[06];
//
输出值
end
end
endmodule
在上述程序中,首先值得注意是
Po
ly
这个参数定义,它根据特征多项式转
化而来,
这样定义可以更方便的得到下一状态的输出值。
系统将当前寄存器的状
态值与该参数相与,
并将各位异或,
实现的即
为寄存器外部的异或,
由此得到的
便是下一状态的输入值。将当
前状态值移位便得到下一状态各寄存器的值。
还有一点要注意
的是,
在系统进行复位之后,
必须给寄存器赋初值,
否则输
出序列是不定值。