一个32bit浮点的累加器,A = A + data, A初始化为0, data为串行输入数据流,包含数据使能信号,加法器延迟5个时钟周期。请问如何用verilog语言实现一个累加器。
答题说明:该题为手动判卷,答案只要写对即可,不用严格满足字符比对。
module nowcoder(
input clk ;
input rst_n ;
input din ;
input din_vld;
output reg[5:0] dout
);
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
din_ff <=0 ;
din_vld_ff <=0 ;
end
else begin
din_ff <={din_ff[3:0],din} ;
din_vld_ff <={din_vld_ff[3:0],din_vld};
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
dout <= 0;
end
else if(din_vld_ff[4])begin
dout <= dout + din_ff[4];
end
end
endmodule
module Accumulate (
input clk, // Clock
input rst_n,
input wire [31:0] data,
input valid,
output reg [31:0] a
);
wire [31:0] a_r;
reg [4:0] valid_r;
always_ff @(posedge clk&nbs***bsp;negedge rst_n) begin
if(~rst_n) begin
valid_r <= 5'b0;
end
else begin
valid_r <= {valid_r[3:0],valid};
end
end
always_ff @(posedge clk&nbs***bsp;negedge rst_n) begin
if(~rst_n) begin
a <= 0;
end
else if (valid_r[4]) begin
a <= a_r;
end
end
//c = a + b
inst_add add(.clk(clk), .rst_n(rst_n), .a(a), .b(b), .c(a_r));
endmodule : Accumulate