module multi_serial #(
parameter M=8,
parameter N=8)(
input clk,
input rst,
input [M-1:0] x,
input [N-1:0] y,
output reg enable,
output reg [M+N-1:0] result
);
reg[1:0] state ,next;
reg [N:0] count;
reg [M+N-1:0] Acc,Tmp;
reg [N-1:0] y_reg;
parameter S0=2'b00;
parameter S1=2'b01;
parameter S2=2'b10;
always@(posedge clk or negedge rst) begin
if(!rst)
state <=S0;else
state <= next;
end
always@(posedge clk) begin
case(state)S0: begin
count =0;
Acc =0;
y_reg = y;
Tmp = x;
next =S1;
end
S1: begin
if(count ==N)
next =S2;else begin
if(y_reg[0]==1'b1)
Acc = Acc + Tmp;else
Acc = Acc;
y_reg = y_reg >>1;
Tmp = Tmp <<1;
count = count +1;
state =S1;
end
end
S2: begin
next =S0;
end
default: next =S0;
endcase
end
always@(posedge clk or negedge rst) begin
if(!rst) begin
enable <=1'b0;
result <=1'b0;
end
elseif(state ==S2) begin
result <= Acc;
enable <=1'b1;
end
else begin
result <=1'b0;
enable <=1'b0;
end
end
endmodule