Don';Verilog上线性反馈移位寄存器的t右模

Don';Verilog上线性反馈移位寄存器的t右模,verilog,fpga,Verilog,Fpga,这是我的模块: 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 POLYNOMI

这是我的模块:

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
模块线性反馈移位寄存器(时钟、复位、数据输出);
//参数//
参数寄存器\u宽度=2;//初始状态和当前状态的宽度
参数INIT_STATE=0;//重置进程时的初始化状态
参数多项式=3;//0x11--x^2+x+1
参数重置\u活动=1;//重置端口处于重置\u活动状态时的重置过程
参数CLK_ACTIVE=1;//clk端口处于clk_活动状态时的clk进程
//港口//
输入线时钟;
输入线复位;
输出reg数据;
//变数//
reg[寄存器宽度-1:0]多项式;
reg[寄存器\u宽度-1:0]当前\u状态;
注册下一位;
整数i;
//行为的
总是开始
如果(重置==重置\激活)开始//重置过程
当前_状态=初始_状态;
下一位=1'b0;
数据输出=1'b0;
多项式=多项式;
结束
else开始//时钟进程
如果(clk==clk\U激活)开始
数据输出=当前状态[0];
下一位=当前状态[寄存器宽度-1];
对于(i=0;i>1;
当前\u状态[寄存器\u宽度-1]=下一个\u位;
结束
结束
结束
端模
我正在使用Vivado 2017.1。当我运行合成时,结果是0 LUT,0 FF

警告列表:

[Synth 8-3936]发现未连接的内部寄存器“Polynomic_reg”,并将其从“2”位修剪为“1”位

[Synth 8-327]推断变量“data\u out\u reg”的锁存器

[Synth 8-327]推断变量“当前状态”的锁存器

[Synth 8-327]推断变量“Polymonal_reg”的锁存器

[Synth 8-3332]顺序元件(数据输出寄存器)未使用,将从模块线性反馈移位寄存器中删除

[Synth 8-3332]顺序元件(当前状态寄存器[1])未使用,将从模块线性反馈移位寄存器中删除

[Synth 8-3332]顺序元件(当前状态寄存器[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
模块线性反馈移位寄存器(时钟、复位、数据输出);
//参数//
参数寄存器\u宽度=2;//初始状态和当前状态的宽度
参数INIT_STATE=0;//重置进程时的初始化状态
参数多项式=3;//0x11--x^2+x+1
参数重置\u活动=1;//重置端口处于重置\u活动状态时的重置过程
参数CLK_ACTIVE=1;//clk端口处于clk_活动状态时的clk进程
//港口//
输入线时钟;
输入线复位;
输出reg数据;
//变数//
reg[寄存器宽度-1:0]多项式;
导线[寄存器\u宽度-1:0]当前\u状态;
注册下一位;
reg[寄存器\u宽度-1:0]当前\u状态\u q;
注册下一位;
整数i;
//行为的
始终@(posedge clk或posedge重置)
如果(重置==重置\激活)开始//重置过程

当前状态您计算下一位,但从不使用。啊,是的!谢谢你发现了这个错误。我现在已经更新了代码。非常感谢你的帮助