m序列的FPGA实现

m序列

m序列由带反馈的移位寄存器实现,反馈的结构由本原多项式给出。
下图给出一个四级反馈移存器。
在这里插入图片描述
本原多项式中的ai表示第i个寄存器是否参与反馈。
注意:a1和an均为0

FPGA实现

下面给出一个7级反馈移存器的实现。
反馈移存器的电路可以看作由两部分组成,一部分是由7个D触发器组成的时序逻辑电路。另一部分是反馈电路,由组合逻辑电路实现。

`timescale 1ns / 1ps

module pn_code(
    input  rc_clk,
    input  rst,
    output pn
);

parameter len=7;                        // 线性反馈移存器深度,影响后面变量的深度
wire [len-1:0] reg_init=7'b100_0000;    // 寄存器初始状态
wire [len:0]   polynomial=8'b100_100_01;// 本原多项式
reg  [len-1:0] pn_reg;                  // 7个寄存器
reg  poly;

  
integer j; 
always@(*)begin
    for(j=len;j>0;j=j-1)
        if(j==len)                  poly=pn_reg[j-1];		//思考:这句代码存在的意义是什么
        else if(polynomial[j])      poly=poly^pn_reg[j-1];
end
  
integer i;
always@(posedge rc_clk)begin
    if(rst)
        pn_reg<=reg_init;
    else begin
        pn_reg[0]<=poly;
        for(i=0;i<len-1;i=i+1)
        pn_reg[i+1]<=pn_reg[i];
    end
end   
       
assign pn=pn_reg[len-1];
       
endmodule

电路图

在这里插入图片描述

错误示例

反馈电路部分用for循环实现,下面给出两个实现反馈电路的代码,并指出其中的错误。

// 存在问题的代码
integer j1; 
  always@(*)begin
    poly1=pn_reg[len-1];
      for(j1=len;j1>0;j1=j1-1)
        if(polynomial[j1])
        poly1=poly1^pn_reg[j1-1];
        else
        poly1=poly1;
 end

// 改正后的代码
integer j1; 
  always@(*)begin
    poly1=pn_reg[len-1];
      for(j1=len;j1>0;j1=j1-1)
        if(polynomial[j1])
        poly1=poly1^pn_reg[j1-1];
        else
        poly1=poly1;
 end

问题:j1=len时执行的poly1=poly1^pn_reg[j1-1];语句对应电路其实在for循环外的poly1=pn_reg[len-1];已经执行过了,重复实现了同一电路。

integer j2;                        
always@(*)begin                   
    for(j2=len;j2>0;j2=j2-1)                 
        if(polynomial[j2])    
        poly2=poly2^pn_reg[j2-1];    
end  

问题:poly2未给出初值

仿真文件

`timescale 1ns / 1ps

module tb_pn_code();

reg  rc_clk ;
reg  rst    ;
wire pn     ;

initial begin
    rst=1;
    rc_clk=0;
    #200
    rst=0;
end

always #10 rc_clk=~rc_clk;

pn_code u_pn_code(
    .rc_clk(rc_clk),
    .rst   (rst   ),
    .pn    (pn    )
);

integer pn_code_file;
initial begin
    pn_code_file=$fopen("G:/graduation_project/verilog/project_bpsk/bpsk_dsss/bpsk_dsss.srcs/txt/pn_code.txt");
end

always@(posedge rc_clk)begin
    if(~rst)
    $fdisplay(pn_code_file,"%d",pn);
end

endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据线

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值