每个时钟输出15个bit,m序列,本源多项式为x15+x14+1
原理图:
代码为:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2024/10/16 17:00:57
// Design Name:
// Module Name: LFSR_PN15
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module LFSR_PN15 (
input clk,
input reset,
output reg [14:0] LFSR = 15'b00000_000000_11111,
output reg [14:0] PN_out,
output reg [31:0] PN_OUT_COUNTER
);
always @(posedge clk) begin
if (reset)begin
LFSR <= 15'b00000_000000_11111; // 同步复位
PN_OUT_COUNTER<=0;
end else begin
LFSR[14] <= LFSR[13] ^ LFSR[14]; // 反馈位移入最低位
LFSR[13] <= LFSR[12] ^ LFSR[13];
LFSR[12] <= LFSR[11] ^ LFSR[12];
LFSR[11] <= LFSR[10] ^ LFSR[11];
LFSR[10] <= LFSR[9] ^ LFSR[10];
LFSR[9] <= LFSR[8] ^ LFSR[9];
LFSR[8] <= LFSR[7] ^ LFSR[8];
LFSR[7] <= LFSR[6] ^ LFSR[7];
LFSR[6] <= LFSR[5] ^ LFSR[6];
LFSR[5] <= LFSR[4] ^ LFSR[5];
LFSR[4] <= LFSR[3] ^ LFSR[4];
LFSR[3] <= LFSR[2] ^ LFSR[3];
LFSR[2] <= LFSR[1] ^ LFSR[2];
LFSR[1] <= LFSR[0] ^ LFSR[1];
LFSR[0] <= LFSR[13] ^ LFSR[14] ^ LFSR[0]; // 最高位反馈移位
PN_OUT_COUNTER<=PN_OUT_COUNTER+1;
end
PN_out <= LFSR;
end
endmodule
testbench代码:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2024/10/17 11:04:15
// Design Name:
// Module Name: tb_LFSR_PN15
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
`timescale 1ns / 1ps
module tb_LFSR_PN15;
// 信号定义
reg clk;
reg reset;
wire [14:0] LFSR;
wire [14:0] PN_out;
wire [31:0] PN_OUT_COUNTER;
// 实例化待测模块 LFSR_PN15
LFSR_PN15 uut (
.clk(clk),
.reset(reset),
.LFSR(LFSR),
.PN_out(PN_out),
.PN_OUT_COUNTER(PN_OUT_COUNTER)
);
// 时钟生成,每10ns周期
initial begin
clk = 0;
forever #5 clk = ~clk; // 10ns周期,时钟每半周期翻转一次
end
// 测试过程
initial begin
// 初始状态,复位信号高电平有效
reset = 1;
#20; // 保持复位20ns
// 取消复位
reset = 0;
// 仿真运行1000ns,观察输出
#1000;
// 结束仿真
$finish;
end
// 显示信号的变化
initial begin
$display("Starting testbench...");
$monitor("Time: %0t | LFSR: %b | PN_out: %b", $time, LFSR, PN_out);
end
endmodule
单bit连续15位输出和每个时钟输出15bit,验证结果保持一致!