我有一个8位的PRBS 7生成器,我只需要在检查器端使用来自生成的PRBS 7数据的LSB中的2位,即可验证模式是否遵循prbs序列。
有两个组成部分; 1个PRBS生成器和1个PRBS检查器
PRBS生成器将生成8位PRBS 7序列data_gen [7:0];
PRBS CHECKER将使用data_gen [1:0]并检查序列是否遵循prbs 7。
生成器代码:
`timescale 1ns / 1ps
module Patgen (
input clk,
input arstn,
output [7:0] patgen_data
);
reg [7:0] lfsr_shift;
wire [7:0] prbs7_data;
assign prbs7_data[0] = lfsr_shift[2] ^ lfsr_shift[1];
assign prbs7_data[1] = lfsr_shift[3] ^ lfsr_shift[2];
assign prbs7_data[2] = lfsr_shift[4] ^ lfsr_shift[3];
assign prbs7_data[3] = lfsr_shift[5] ^ lfsr_shift[4];
assign prbs7_data[4] = lfsr_shift[6] ^ lfsr_shift[5];
assign prbs7_data[5] = lfsr_shift[7] ^ lfsr_shift[6];
assign prbs7_data[6] = lfsr_shift[1] ^ lfsr_shift[2] ^ lfsr_shift[7];
assign prbs7_data[7] = lfsr_shift[3] ^ lfsr_shift[1];
always @ (posedge clk or negedge arstn)
if(~arstn_patgen) lfsr_shift <= 8'hff;
else lfsr_shift <= prbs7_data;
assign patgen_data = lfsr_shift;
endmodule
检查码
`timescale 1ns / 1ns
module Prbs_chk (
input [1:0] prbs_prbs_datain,
input clk,
input clear,
output error_sig
);
reg [11:0] prbs_data_reg_r;
wire [11:0] prbs_data_reg;
wire [5:0] next_Dta;
reg [5:0] next_Dta_ff;
wire error;
always @( posedge clk )
prbs_data_reg_r <= {prbs_prbs_datain[1:0], prbs_data_reg_r[11:2]};
assign prbs_data_reg = prbs_data_reg_r;
assign next_Dta[0] = prbs_data_reg[1]^prbs_data_reg[0];
assign next_Dta[1] = prbs_data_reg[2]^prbs_data_reg[1];
assign next_Dta[2] = prbs_data_reg[3]^prbs_data_reg[2];
assign next_Dta[3] = prbs_data_reg[4]^prbs_data_reg[3];
assign next_Dta[4] = prbs_data_reg[5]^prbs_data_reg[4];
assign next_Dta[5] = prbs_data_reg[6]^prbs_data_reg[5];
always @( posedge clk )
next_Dta_ff[5:0] <= next_Dta[5:0];
assign error = (next_Dta[1:0] != prbs_data_reg[8:7]) |
({next_Dta[5:0], next_Dta_ff[5:0]} == 12'd0);
reg patchk_reg;
always @ (posedge clk)
if (clear) patchk_reg <= 1'b0;
else if ( error) patchk_reg <= 1'b1;
assign error_sig = patchk_reg;
endmodule
我的Checker模块总是给我一个错误。