不要在 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
有我的模块:
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