不要在 Verilog 上调整线性反馈移位寄存器模块

Don't right module of linear-feedback shift register on Verilog

有我的模块:

module linear_feedback_shift_reg( clk, reset, data_out );

// PARAMETERS //

parameter REGISTER_WIDTH = 2;   // width of initial and current states 
parameter INIT_STATE = 0;       // initialization state when reset process
parameter POLYNOMIAL = 3;       // 0x11 -- x^2 + x + 1
parameter RESET_ACTIVE = 1;     // reset process when reset port is RESET_ACTIVE
parameter CLK_ACTIVE = 1;       // clk process when clk port is CLK_ACTIVE

// PORTS //

input wire clk;
input wire reset;

output reg data_out;

// VARIABLES //

reg [REGISTER_WIDTH - 1 : 0] polynomial;
reg [REGISTER_WIDTH - 1 : 0] current_state;
reg next_bit;

integer i;

// BEHAVIORAL

always @* begin
    if(reset == RESET_ACTIVE) begin // reset process
        current_state = INIT_STATE;
        next_bit = 1'b0;
        data_out = 1'b0;
        polynomial = POLYNOMIAL;
    end 
    else begin  // clk process
        if(clk == CLK_ACTIVE) begin
            data_out = current_state[0];
            next_bit = current_state[REGISTER_WIDTH - 1];
            for( i = 0; i < REGISTER_WIDTH - 1; i = i + 1) begin
                if(polynomial[i] == 1'b1) begin
                    next_bit = next_bit ^ current_state[i];
                end
            end
            current_state = current_state >> 1;
            current_state[REGISTER_WIDTH - 1] = next_bit;
        end
    end
end 
endmodule

我使用的是 Vivado 2017.1。当我 运行 合成时,结果是 0 个 LUT,0 个 FF。

警告列表:

[Synth 8-3936] 找到未连接的内部寄存器 'polynomial_reg' 并将其从“2”位修剪为“1”位。

[Synth 8-327] 推断变量 'data_out_reg'

的闩锁

[Synth 8-327] 变量 'current_state_reg'

的推断锁存器

[Synth 8-327] 推断变量 'polynomial_reg'

的闩锁

[Synth 8-3332] 顺序元素 (data_out_reg) 未使用,将从模块 linear_feedback_shift_reg.

中删除

[Synth 8-3332] 顺序元素 (current_state_reg[1]) 未使用,将从模块 linear_feedback_shift_reg.

中删除

[Synth 8-3332] 顺序元素 (current_state_reg[0]) 未使用,将从模块 linear_feedback_shift_reg.

中删除

我的模块有什么逻辑错误?

我想你不知道如何在 Verilog 中推断时序逻辑。如果我必须编写此代码,我会按以下方式编写它 -

module linear_feedback_shift_reg( clk, reset, data_out );

// PARAMETERS //

    parameter REGISTER_WIDTH = 2;   // width of initial and current states 
    parameter INIT_STATE = 0;       // initialization state when reset process
    parameter POLYNOMIAL = 3;       // 0x11 -- x^2 + x + 1
    parameter RESET_ACTIVE = 1;     // reset process when reset port is RESET_ACTIVE
    parameter CLK_ACTIVE = 1;       // clk process when clk port is CLK_ACTIVE

    // PORTS //

    input wire clk;
    input wire reset;

    output reg data_out;

    // VARIABLES //

    reg  [REGISTER_WIDTH - 1 : 0] polynomial;
    wire [REGISTER_WIDTH - 1 : 0] current_state;
    reg next_bit;

    reg [REGISTER_WIDTH - 1 : 0] current_state_q;
    reg next_bit_q;

    integer i;

    // BEHAVIORAL

    always @ (posedge clk or posedge reset)
        if(reset == RESET_ACTIVE) begin // reset process
            current_state_q <= INIT_STATE;
            next_bit_q      <= 1'b0;
            data_out        <= 1'b0;
            polynomial      <= POLYNOMIAL;
        end 
        else begin  // clk process
            data_out        <= current_state[0];
            next_bit_q      <= next_bit;
            current_state_q <= current_state;
        end

    always @ (*)
    begin
        next_bit = current_state[REGISTER_WIDTH - 1];
        for( i = 0; i < REGISTER_WIDTH - 1; i = i + 1) begin
            if(polynomial[i] == 1'b1) begin
                next_bit = next_bit ^ current_state[i];
            end
        end
    end

    assign  current_state = {next_bit_q, current_state_q[REGISTER_WIDTH-1:1]};

endmodule