不要在Verilog上使用线性反馈移位寄存器的右侧模块

时间:2017-05-27 12:27:34

标签: verilog fpga

有我的模块:

DateTimeZone->getOffset

我正在使用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中删除。

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

1 个答案:

答案 0 :(得分:0)

我认为您不知道如何在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