Dwaipayan
Newbie level 4
I need to add the contents of four registers in an array I have written a code but on synthesizing it creates latches :
`timescale 1ns / 100ps
module regblock0 (sum, Clk, nReset, nReady);
input Clk, nReset, nReady;
output [15:0] sum;
reg [15:0] temp1, temp2;
reg [15:0] sum;
wire Clk;
wire nReset;
wire nReady;
reg [1:0] state;
wire [15:0] data_str0 [0:3];
parameter S0=0,S1=1,S2=2,S3=3;
assign data_str0[0]= 10000;
assign data_str0[1]= 2000;
assign data_str0[2]= 3000;
assign data_str0[3]= 4000;
always @(posedge Clk or negedge nReset)
begin
if (!nReset)
state <= S0;
else
case (state) //checking all the states here
S0: state <= S1;
S1: state <= S2;
S2: state <= S3;
S3: state <= S0;
endcase
end
always @(state)
begin
case(state)
S0 : begin
sum = 0;
temp1 = 0;
temp2 = 0;
end
S1 : temp1 = data_str0[0] + data_str0[1];
S2 : temp2 = temp1 + data_str0[2];
S3 : sum = temp2 + data_str0[3];
endcase
end
endmodule
temp1 and temp2 are the two latches.
which I want to avoid.
I changed the code using 4 input adder :
`timescale 1ns / 100ps
module regblock0 (sum, Clk, nReset);
input Clk, nReset;
output [15:0] sum;
reg [15:0] temp1, temp2;
reg [15:0] sum;
wire Clk;
wire nReset;
reg [1:0] state;
wire [15:0] data_str0 [0:3];
parameter S0=0,S1=1,S2=2,S3=3;
assign data_str0[0]= 10;
assign data_str0[1]= 20;
assign data_str0[2]= 30;
assign data_str0[3]= 40;
always @(posedge Clk or negedge nReset)
begin
if (!nReset)
begin
temp1 <= 0;
temp2 <= 0;
sum <= 0;
end
else
begin
// temp1 <= data_str0[0] + data_str0[1];
// temp2 <= temp1 + data_str0[2];
sum <= data_str0[0] + data_str0[1] + data_str0[2] + data_str0[3];
end
end
endmodule
I am getting the sum in 2 clock cylces rather than 4 but is ist fine to use 4 input adder
can someone suggest me how to add 4 data registers
`timescale 1ns / 100ps
module regblock0 (sum, Clk, nReset, nReady);
input Clk, nReset, nReady;
output [15:0] sum;
reg [15:0] temp1, temp2;
reg [15:0] sum;
wire Clk;
wire nReset;
wire nReady;
reg [1:0] state;
wire [15:0] data_str0 [0:3];
parameter S0=0,S1=1,S2=2,S3=3;
assign data_str0[0]= 10000;
assign data_str0[1]= 2000;
assign data_str0[2]= 3000;
assign data_str0[3]= 4000;
always @(posedge Clk or negedge nReset)
begin
if (!nReset)
state <= S0;
else
case (state) //checking all the states here
S0: state <= S1;
S1: state <= S2;
S2: state <= S3;
S3: state <= S0;
endcase
end
always @(state)
begin
case(state)
S0 : begin
sum = 0;
temp1 = 0;
temp2 = 0;
end
S1 : temp1 = data_str0[0] + data_str0[1];
S2 : temp2 = temp1 + data_str0[2];
S3 : sum = temp2 + data_str0[3];
endcase
end
endmodule
temp1 and temp2 are the two latches.
which I want to avoid.
I changed the code using 4 input adder :
`timescale 1ns / 100ps
module regblock0 (sum, Clk, nReset);
input Clk, nReset;
output [15:0] sum;
reg [15:0] temp1, temp2;
reg [15:0] sum;
wire Clk;
wire nReset;
reg [1:0] state;
wire [15:0] data_str0 [0:3];
parameter S0=0,S1=1,S2=2,S3=3;
assign data_str0[0]= 10;
assign data_str0[1]= 20;
assign data_str0[2]= 30;
assign data_str0[3]= 40;
always @(posedge Clk or negedge nReset)
begin
if (!nReset)
begin
temp1 <= 0;
temp2 <= 0;
sum <= 0;
end
else
begin
// temp1 <= data_str0[0] + data_str0[1];
// temp2 <= temp1 + data_str0[2];
sum <= data_str0[0] + data_str0[1] + data_str0[2] + data_str0[3];
end
end
endmodule
I am getting the sum in 2 clock cylces rather than 4 but is ist fine to use 4 input adder
can someone suggest me how to add 4 data registers