首页 > 试题广场 >

一个32bit浮点的累加器,A = A + data, A初

[问答题]
一个32bit浮点的累加器,A = A + data A初始化为0 data为串行输入数据流,包含数据使能信号,加法器延迟5个时钟周期。请问如何用verilog语言实现一个累加器。

答题说明:该题为手动判卷,答案只要写对即可,不用严格满足字符比对。
我理解不知道对不对,data为串行数据,先将data储存起来,此时的数据符合IEEE浮点数据格式,再把数据取出来做浮点相加,至于延迟就看中间数据存取操作了
发表于 2019-08-25 21:49:07 回复(0)
随便写的
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

编辑于 2019-08-29 10:28:12 回复(6)
module( clk,rst_n,din,din_valid,dout_valid,dout);
input clk;
input rst_n;
input din;
input din_valid;
output [31:0] dout;
output dout_valid;

reg [3:0]din_valid_r;
reg [4:0] din_temp;
reg [31:0] dout_temp=0;
//延迟五个周期
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        din_valid_r<=4'b0000;
    end
    else begin
        din_valid_r<={din_valid_r[2:0],din_valid};
    end
end

//累加逻辑
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        dout_temp<=0;
    end
    else if(din_valid_r[3])begin
    //没看懂题目要求,不理解串行输入的浮点怎么体现,我就假设为输出要变成浮点类型
    //设了后10位为小数位
        dout_temp<=dout_temp + {{21{1'b0}},din_temp[4],{10{1'b0}}};
    end
    else begin
        dout_temp<=dout_temp;
    end
end
//输出标志
assign dout_valid =din_valid_r[3];
//输出赋值
assign dout = dout_temp;
endmodule
发表于 2020-07-13 21:44:31 回复(0)
module adder(
                        input clk,
                        input rst_n,
                        input ena,
                        input data,
                        output [20:0] out);
reg [31:0] data_r;
always@(posedge clk or negedge rst_n)begin
        if(~rst_n) begin
                    data_r<='d0;
        end
        else if(ena)
                    data_r<={data_r,data};
        else data_r<=data_r;
end
reg [2:0] cnt;
always@(posedge clk or negedge rst_n) begin
        if(~rst_n) begin  
                cnt<='d0;
        end
        else if (cnt=='d4)
                 cnt<='d0;
        else cnt<=cnt+'d1;
end

reg [20:0] A;
always@(posedge clk or negedge rst_n) begin
        if(~rst_n) begin        
                    A<='d0;
        end
        else if(cnt=='d4) A<=A+data_r;
        else A<=A;
end
assign out= A;

endmodule

发表于 2022-07-09 16:25:03 回复(0)
是这样吗?有大佬帮忙看看解答吗?
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


发表于 2021-10-01 20:52:22 回复(0)
module accumulator32bits(
input clk,rst;
input data;
input ena;
output [31:0] A
);
reg [31:0] A_reg;
wire [31:0] A;
reg ena;
reg data;
reg [2:0] cnt;

always@(data) //data enable 
ena<= 1'b1;

always@(posedge clk or negedge rst) begin
if (!rst) begin
 A_reg<= 32'h0000_0000;
ena<=1'b0;
cnt<= 3'b0;
end
else if(ena && cnt==3'b100) begin //cnt =3'b00 five cycles cnt=3'b100
A_reg <= A_reg + data;
cnt<=3'b0;
end
else begin
cnt<=cnt +1'b1;
A_reg<= A_reg + data;
end
end
if(cnt==3'b101) begin
assign A=A_reg;
end
endmodule
编辑于 2021-07-01 15:39:10 回复(1)
随便写的,不明白题目意思,求大神指点
module MULTY_ADD(
input clk,
input rst_n,
input [8:0]data,
output [31:0]A
);
parameter IDLE = 3'b000;
parameter T1 = 3'b001;
parameter T2 = 3'b010;
parameter T3 = 3'b011;
parameter T4 = 3'b100;
reg [31:0]mid;
reg cur_state,nxt_state;
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cur_state <=IDLE;
        nxt_state <=IDLE;
    end
    else begin
        cur_state <= nxt_State;
    end
end

always@(*) begin
    if(data[0] == 1) begin
        case(cur_state)
            IDLE: begin
                    nxt_state <= T1;
            end
            
            T1: begin
                    nxt_state <= T2;
            end
            T2: begin
                    nxt_state <= T3;
            end
            T3: begin
                    nxt_state <= T4;
            end
            
            T4: begin
                    nxt_state <= IDLE;
            end
            default :begin
                 nxt_state <= IDLE;
            end
            
        endcase
    end
end
always@(posedge clk or negedge rst_n) begin
    if(!rst_n ) begin
             mid <= 32'b0;
    end
    if(data[0] == 1) begin
        case(cur_state)
            IDLE: begin
                   mid <= mid + {24'b0,data[8:1]};
            end
            T1: begin
                    mid <= mid + {16'b0,data[8:1],8'b0};
            end
            T2: begin
                    mid <= mid + {8'b0,data[8:1],16'b0};
            end
            T3: begin
                    mid <= mid + {data[8:1],24'b0};
            end
            default:begin
                    mid <= mid;
            end
        endcase
    end
end
assign A = mid;
endmodule

发表于 2020-07-06 16:11:50 回复(0)
若想实现全流水操作,需在加法器前端插入四级流水。加法器的第一次输入需要延迟5个时钟周期输出
编辑于 2018-08-17 08:35:46 回复(0)