一个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