2017-05-27 85 views
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; 
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。

警告列表:

[合成器8-3936]找到未连接的内部寄存器 'polynomial_reg',它是从 '2' 修整以 '1' 个比特。

[合成器8-327]为推断变量 'data_out_reg'

[合成器8-327]推断闩为变量 'current_state_reg'

[合成器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中移除。

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

回答

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 
+0

你计算next_bit但从来没有使用。 – Yahniukov

+0

啊是的!感谢您发现错误。我现在更新了代码。 –

+0

非常感谢您的帮助 – Yahniukov