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