如何用Verilog产生pn序列?

PN序列(Pseudo-noise Sequence)又称之为“伪噪声序列”

 

这类序列具有类似随机噪声的一些统计特性,但和真正的随机信号不同,它可以重复产生和处理,故称作伪随机噪声序列。PN序列有多种,其中最基本常用的一种是最长线形反馈移位寄存器序列,也称作m序列,通常由反馈移位寄存器产生。

PN序列一般用于扩展信号频谱。下面就用verilog代码实现PN序列:

module pn_generator(a,clk,pn,en,clr);
    input [3:0] a;
    //initial state of LFSR
    input clk; //1.023M
    input clr;
  
    input en;
    output pn;
    reg [3:0] register;

// reg [0:8] count_60 = 0;

    assign pn=register[0];
   
    always @(posedge clk)
   
    begin
    if(clr)
    begin
    register <=a;
    end
   
    else if(en==1)
    begin     
       
        register[3:0]<={register[0]+register[3],register[3:1]};

// else if(count_60 == 'd60)
       // begin
       // count_60 = 0;
       // $display("\n");
       // end
   
    end
   
end


endmodule

 

用于测试的testbench代码:

 

`timescale 1ns/1ns
module pn_generator_test;
    //
    reg [3:0] a;
    reg clk;
    reg en;
    reg clr;
    //reg [0:3]pn_register;

    //outputs
    wire pn;
   
// reg [3:0] pn_display;
   reg [3:0] count = 0;
   
    //instantiate the UUT
   
    pn_generator uut(
             .a(a),
             .clk(clk),
             .pn(pn),
             .en(en),
             .clr(clr)
             );
            
   //Initial Inputs
  
   initial begin
  
   a = 4'b1000;
   clk = 0;
   en = 0;
   clr = 0;
  
   #100 clr =1;

   #160 clr = 0;
  
   en = 1;
   end
  
always #25 clk=~clk;

always @(posedge clk)  
begin
              $display("%b",pn);     

end

endmodule

 

下面介绍一下其他牛人的见解:

 

1、PN码序列同步是扩频系统特有的,也是扩频技术中的难点。CDMA系统要求接收机的本地伪随机码与接收到的PN码在结构、频率和相位上完全一致,否则就不能正常接收所发送的信息,接收到的只是一片噪声。若实现了收发同步但不能保持同步,也无法准确可靠地获取所发送的信息数据。因此,PN码序列的同步是CDMA扩频通信的关键技术。

CDMA系统中的PN码同步过程分为PN码捕获(精同步)和PN码跟踪(细同步)两部分。PN码捕获是精调本地PN码的频率和相位,使本地产生的PN码与接收到的PN码间定时误差小于1个码片间隔Tc,可采用基于滑动相关的串行捕获方案或基于时延估计问题的并行捕获方案。PN码跟踪则自动调整本地码相位,进一步缩小定时误差,使之小于码片间隔的几分之一,达到本地码与接收PN码频率和相位精确同步。典型的PN码跟踪环路分基于迟早门定时误差检测器的延迟锁定环及τ抖动环两种。
接收信号经宽带滤波器后,在乘地器中与本地PN码进行相关运算。捕获器件调整压控时钟源,用以调整PN码发生器产生的本地PN码序列的频率和相位,捕获有用信号。一旦捕获到有用信号,启动跟踪器件,用以调整压控钟源,使本地PN码发生器与外来信号保持精确同步。如果由于某种原因引起失步,则重新开始新一轮捕获和跟踪。
 
2、伪随机码(Pseudo Random Code)又称为伪噪声码(Pseudo Noise Code),简称PN码。简单地说,伪随机码是一种具有类似白噪声性质的码。白噪声是一种随机过程,它的瞬时值服从正态分布,功率谱在很宽的频带内都是均匀的。白噪声具有优良的相关特性,但至今无法实现对其进行放大、调制、检测、同步及控制等操作。在工程上与实践中,只能用类似于带限白噪声统计特性的伪随机码信号来逼近,并作为扩频通信系统的扩频码。
大部分伪随机码都是周期码,可以人为地加以产生与复制,通常由二进制移位寄存器来产生。由于这种码具有类似白噪声的性质,相关函数具有尖锐的特性,功率谱占据很宽的频带,因此易于从其它信号或干扰中分离出来,具有优良的抗干扰特性。
在工程上常用二元域{0,1}内的0元素与1元素的序列来表示伪随机码,它具有如下特点:

(1)  在每一个周期内,0元素与1元素出现的次数近似相等,最多只差一次。
(2)  在每一个周期内,长度为k比特的元素游程出现的次数比长度为k+1比特的元素游程出现的次数多一倍(连续出现的r个比特的同种元素叫做长度为r比特的元素游程)。
(3)  序列的自相关函数是一周期函数,且具有双值特性,当码元延时为N的整数倍时,自相关函数R=1,当不是N的整数倍时,R=-k/N。
作为扩频码的伪随机信号,应具有下列特点:

(1)  伪随机信号必须具有尖锐的自相关函数,而互相关函数值应接近0值;
(2)  有足够长的码周期,以确保抗侦破与抗干扰的要求;
(3)  码的数量足够多,用来作为独立的地址,以实现码分多址的要求;
(4)  工程上易于产生、加工、复制与控制。
我们比较 常用的是m码 Gold码 和M码等一些PN码

至于原信息和PN码相乘后 带宽变宽的问题:
在扩频通信系统中,PN码的码速率Rc往往比信息码速率Rb大得多,从而PN码的带宽也比原信号的带宽大得多,时域相乘等效于频域卷积,由卷积的原理可以知道,两者相乘后的带宽为两者带宽相加,即Rc+Rb,因而带宽被展宽了。
频谱卷积的图解示意图。

另外 扩频系统的抗干扰性是很强的,可以有效的抵抗多径、多址、转发等干扰。具体怎么实现可以看看一些扩频的参考书,讲起来太麻烦了。
 
3、PN序列,你已经知道基本内容了。它的主要作用用于模拟自然界中的噪声影响,噪声一般都是随机的没有规律。所以是无法仿真的,那怎么办呢?那就需要人为造一个。怎么造呢?经过科学实验人员的理论和实验分析得出了燥声具有的一些性质,比如自相关性等等。根据这些性质我们用类似的方法,主要是用寄存器、加法器等电路实现该序列。至于扩频,是以具有正交特性的PN序列与原始的二进制序列相乘,在频率上起到扩展信号频谱的作用。为什么要扩展呢? 因为扩展了以后其频率特性与噪声特性,不容易形成干扰与被窃取信息。至于加密,此时的PN序列其实是一个密钥,什么是密钥?就相当于你家的钥匙,你有这个家不错,不过没有钥匙是不能进的。当然密钥的随机性和其长度大小,专业上称为健壮性强与弱,往往能够决定加密的性能。比如DES算法的密钥有64位(其实是56位)。目前已经不安全了。当然现在的AES已经达到128位。这个和IPv4与IPv6地址的关系有点类似。具体可以参考相关扩频通信与数据安全相关书籍。

 

4、PN生成器实际上就是由移位寄存器和反馈逻辑电路组成。反馈逻辑电路通常是XOR,即模2加法器。寄存器的个数决定了PN学列的长度,同时也决定了PN码的个数(number of combinations)。如该图中,寄存器的数量为m,那就可以生成2^m-1个PN码。为什么不是2的m次方个而是2的m次方减一个呢,这里要说一下初始化数据,initialize input。这个数据是用来触发整个电路的。也就是发个m位随机的010...0101。但是有一个数据不能发,那就是m个全0,因为用m个全0触发生成的尾随机序列永远是m个全0。而且在尾随机序列中也是永远不回出现m个全0的。

PN序列有:0和1的个数相等;低相关性;自相关等性质,dragonkiss也有提到。

PN序列的最典型应用就是在CDMA中,至少我最先是在CDMA中了解PN的。理解PN序列的扩频原理就需要简单了解一下CDMA的机制原理, code division multiplex access码分复用。传统的FDMA,是将一小段频宽分给每个移动用户,每个用户独占一段频宽,这样系统容量很有限,带宽利用率及其低下。CDMA是将不同的码分给不同用户,每个用户得到唯一的可识别的码,使得每个用户都可以共用一段频宽。这个码就是PN码,根据上面介绍的,寄存器的个数有m个,一个频宽上就可以存在2^m-1个用户(当然实际中CDMA系统远比我描述的复杂,还有上、下行,Walsh code等等问题),这样频带利用率非常高(very bandwidth efficient)。当然这凭空多处来的一段PN码是要靠更多一段频宽来传,这便是所谓的扩频。(虽然需要更多的频宽来传PN码,但是仍然很bandwidth efficient)。

转载于:https://www.cnblogs.com/Jerome_Lee/archive/2009/11/19/1606115.html

你可能感兴趣的:(如何用Verilog产生pn序列?)