0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

最少需要几个加法器IP才可以实现累加器的功能呢?

sanyue7758 来源:Vuko-wxh 2023-08-18 09:38 次阅读

已知一个加法器IP,其功能是计算两个数的和,但这个和延迟两个周期才会输出。现在有一串连续的数据输入,每个周期都不间断,试问最少需要例化几个上述的加法器IP,才可以实现累加的功能。

设计分析

实现累加器的加法器例化的个数。按照原文大佬的设计方法,因为数据连续且加法器的延迟周期是2,使用使用一个实现累加,会有一半的数据丢失。那这样设计他就将奇数偶数的数据进行了分开做一级累加,然后第二级将奇数偶数的累加结果再累加。这样做共需消耗3个加法器。

这样设计当然没问题,但是这样设计是否是最少呢?我先抛出我的思考,我认为在允许少量逻辑设计的情况下,最少需要例化两个上述的加法器IP可以实现累加。

如果比较极限的情况下,一个都可以,先把一串数据使用寄存器缓存,然后一个一个取出来慢慢算即可,但这样是不太可取的,首先,数据是连续的并没有给出数据的极限长度,也就是说不论用任何涉及存储结构进行缓存,都没法确保该次数据能完全被存储。如果题目改成一串连续数据输入,长度最大为10,那我认为用寄存器缓存这样的设计是合理的。

设计架构

回到设计思路:用两个加法器的结构如图示。

997a1744-3d13-11ee-ac96-dac502259ad0.png

设计实现

加法器设计

假设两个时钟周期延时加法器代码如下,通过例化加法器进行构建累加器。

//加法器IP
moduleadder
#(parameterDATA_WIDTH=8)(
inputclk,
inputrst_n,
input[DATA_WIDTH-1:0]a_in,
input[DATA_WIDTH-1:0]b_in,
outputreg[DATA_WIDTH-1:0]out
);
reg[DATA_WIDTH-1:0]sum;
always@(posedgeclkornegedgerst_n)begin
if(rst_n=='d0)begin
sum<= 'd0;
      out <= 'd0;
    end
    else begin
      sum <= a_in + b_in;
      out <= sum;
    end
  end
endmodule

累加器设计

//累加器实现
moduleadder_for_acc
#(parameterDATA_WIDTH=8)
(
inputclk,
inputrst_n,
input[DATA_WIDTH-1:0]din,
inputdin_valid,
outputregdout_valid,
outputreg[DATA_WIDTH-1:0]dout
);

reg[DATA_WIDTH-1:0]din_r0;

//打一拍
always@(posedgeclkornegedgerst_n)begin
if(rst_n=='d0)begin
din_r0<= 'd0;
    end
    else if(din_valid==1'B1)begin
      din_r0<= din;
    end
    else begin
      din_r0<='d0;
    end
  end

  //adder0_valid信号
  reg adder0_valid;
  always @(posedge clk or negedge rst_n)begin
    if(rst_n == 'd0)begin
      adder0_valid <= 'd0;
    end
    else if(din_valid==1'B1)begin
      adder0_valid<=!adder0_valid;
    end
    else begin
      adder0_valid<='d0;
    end
  end

  wire[DATA_WIDTH-1:0] a_in = (adder0_valid && din_valid)?din:0;
  wire[DATA_WIDTH-1:0] b_in = (adder0_valid)?din_r0:0;
  wire[DATA_WIDTH-1:0] ab_sum;

  adder adder0_dut (
    .clk  (clk   ),
    .rst_n(rst_n ),
    .a_in (a_in  ),
    .b_in (b_in  ),
    .out  (ab_sum)
  );
  //第一级加法器输出有效信号
  reg [1:0]adder0_valid_dly;
  wire ab_sum_valid = adder0_valid_dly[1];
  always @(posedge clk ) begin
      adder0_valid_dly<={adder0_valid_dly[0],adder0_valid};
  end

  wire [DATA_WIDTH-1:0] sum_in;
  wire [DATA_WIDTH-1:0] ab_sum_in = (ab_sum_valid)?ab_sum:0;
  wire [DATA_WIDTH-1:0] accsum_in = (ab_sum_valid)?sum_in:dout;

  adder adder1_dut (
    .clk  (clk      ),
    .rst_n(rst_n    ),
    .a_in (ab_sum_in),
    .b_in (accsum_in),
    .out  (sum_in   )
  );
  
  //第二级加法器输出有效信号
  reg [3:0]din_valid_r0;
  reg [1:0]adder1_valid_dly;
  wire adder1_outvld = adder1_valid_dly[1];
  always @(posedge clk ) begin
    adder1_valid_dly<={adder1_valid_dly[0],ab_sum_valid};
  end
  //输出
  always @(posedge clk ) begin
    din_valid_r0<={din_valid_r0[2:0],(din_valid || adder0_valid)};
  end
  always @(posedge clk or negedge rst_n) begin
    if(rst_n == 'd0)begin
      dout <= 'd0;
      dout_valid <= 'd0;
    end
    else if(adder1_outvld == 1 && (din_valid_r0[3]==1 && din_valid_r0[2]==0))begin
      dout <= sum_in ;
      dout_valid <= 'd1;
    end
    else begin
      dout <= dout ;
      dout_valid <= 'd0;
    end
  end

endmodule

代码架构设计

打拍:先对数据用寄存器缓存一拍,输入数据暂时用in[i]表示,缓存。

第一级加法器输入选择valid:因为前级积累一拍的数据,设计valid用于指示加法器的输入数据。

第一级加法器信号输入:根据valid信号进行选择数据输入。

调用第一级加法器,同时对输入valid信号进行打两拍处理,指示有效的输出数据。

第二级加法器信号输入:根据valid信号进行选择数据输入。

调用第二级加法器,同时对输入valid信号进行打两拍处理,指示有效的输出数据。

输出结果和valid信号。

经过分析,目前设计延时是4拍,也即两级,这里dout和valid使用的是时序逻辑输出,所以在输入valid拉低后的第五个时钟周期输出正确的结果。

仿真测试

设计仿真测试代码对代码进行测试,这里使用了递增数测试代码可用性,在实际测试时,可通过改变DATA_LEN的大小测试单次递增累加后的结果,后续结果依次递增为第一次的N倍。

`timescale1ns/1ps
moduleadder_for_acc_tb;

//Parameters
localparamDATA_WIDTH=8;
localparamDATA_LEN=5;
//Ports
regclk=1;
regrst_n=0;
reg[DATA_WIDTH-1:0]din;
regdin_valid=0;
wiredout_valid;
wire[DATA_WIDTH-1:0]dout;

adder_for_acc
#(
.DATA_WIDTH(
DATA_WIDTH)
)
adder_for_acc_dut(
.clk(clk),
.rst_n(rst_n),
.din(din),
.din_valid(din_valid),
.dout_valid(dout_valid),
.dout(dout)
);
always@(posedgeclkornegedgerst_n)begin
if(rst_n=='d0)begin
din<= 'd0;
      din_valid <= 'd0;
    end
    else if(dout_valid == 1)begin
      din <= 'd0;
      din_valid <= 'd1;
    end
    else if(din == DATA_LEN)begin
      din <= din;
      din_valid <= 'd0;
    end
    else if(din != DATA_LEN)begin
      din <= din + 1;
      din_valid <= 'd1;
    end
    else begin
      din <= din;
      din_valid <= 'd0;
    end
  end

  always #5  clk = ! clk ;
  initial begin
    begin
      #100;
      rst_n = 1;
      #1000;
      $finish;
    end
  end

 
endmodule

仿真截图

99a5d2c6-3d13-11ee-ac96-dac502259ad0.png

仿真分析

在图示仿真可知,累加器功能正常,在din_valid信号拉低后第五拍可得到输出结果,功能正常。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5037

    浏览量

    117765
  • 存储器
    +关注

    关注

    38

    文章

    7151

    浏览量

    162005
  • 仿真器
    +关注

    关注

    14

    文章

    988

    浏览量

    82998
  • 加法器
    +关注

    关注

    6

    文章

    174

    浏览量

    29733
  • 累加器
    +关注

    关注

    0

    文章

    50

    浏览量

    9366

原文标题:仿真测试

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    运算放大器的同相加法器和反相加法器

      运算放大器构成加法器 可以分为同相加法器和反相加法器
    发表于 08-05 17:17 2.3w次阅读
    运算放大器的同相<b class='flag-5'>加法器</b>和反相<b class='flag-5'>加法器</b>

    加法器

    请问下大家,,进位选择加法器和进位跳跃加法器的区别是啥啊?我用Verilog实现16位他们的加法器有什么样的不同啊?还请知道的大神告诉我一下。。
    发表于 10-20 20:23

    在xilinx上遇到累加器加法器输出S结果不确定

    嗨,我做这个累加器加法器:库IEEE;使用IEEE.STD_LOGIC_1164.ALL;使用IEEE.STD_LOGIC_ARITH.ALL
    发表于 01-22 06:20

    IP加法器

    IP加法器
    发表于 08-14 14:24

    什么是加法器加法器的原理是什么 ?

    什么是加法器加法器的原理是什么 反相加法器等效原理图解析
    发表于 03-11 06:30

    计算机累加器加法器功能吗,累加器是什么_累加器的作用及原理介绍 精选资料推荐

    累加器的概念在中央处理中,累加器(accumulator)是一种寄存,用来储存计算产生的中间结果。如果没有像累加器这样的寄存
    发表于 08-30 08:57

    加法器,加法器是什么意思

    加法器,加法器是什么意思 加法器 :  加法器是为了实现加法的。  即是产生数的和的装置。加数
    发表于 03-08 16:48 5160次阅读

    十进制加法器,十进制加法器工作原理是什么?

    十进制加法器,十进制加法器工作原理是什么?   十进制加法器可由BCD码(二-十进制码)来设计,它可以在二进制加法器的基础上加上适当的“
    发表于 04-13 10:58 1.3w次阅读

    FPU加法器的设计与实现

    浮点运算器的核心运算部件是浮点加法器,它是实现浮点指令各种运算的基础,其设计优化对于提高浮点运算的速度和精度相当关键。文章从浮点加法器算法和电路实现的角度给出设计
    发表于 07-06 15:05 47次下载
    FPU<b class='flag-5'>加法器</b>的设计与<b class='flag-5'>实现</b>

    同相加法器电路原理与同相加法器计算

    同相加法器输入阻抗高,输出阻抗低 反相加法器输入阻抗低,输出阻抗高.加法器是一种数位电路,其可进行数字的加法计算。当选用同相加法器时,如A输
    发表于 09-13 17:23 5.6w次阅读
    同相<b class='flag-5'>加法器</b>电路原理与同相<b class='flag-5'>加法器</b>计算

    加法器是如何实现

     verilog实现加法器,从底层的门级电路级到行为级,本文对其做出了相应的阐述。
    发表于 02-18 14:53 5755次阅读
    <b class='flag-5'>加法器</b>是如何<b class='flag-5'>实现</b>的

    数字设计笔试Verilog手撕代码—累加器

    实现累加器加法器例化的个数。按照原文大佬的设计方法,因为数据连续且加法器的延迟周期是2,使用使用一个实现
    的头像 发表于 06-02 16:35 1807次阅读
    数字设计笔试Verilog手撕代码—<b class='flag-5'>累加器</b>

    加法器的原理及采用加法器的原因

    有关加法器的知识,加法器是用来做什么的,故名思义,加法器是为了实现加法的,它是一种产生数的和的装置,那么
    的头像 发表于 06-09 18:04 3870次阅读

    加法器的工作原理和电路解析

    加法器可以是半加法器或全加法器。不同之处在于半加法器仅用于将两个 1 位二进制数相加,因此其总和只能从 0 到 2。为了提高这种性能,开发了
    的头像 发表于 06-29 14:27 7723次阅读
    全<b class='flag-5'>加法器</b>的工作原理和电路解析

    基于FPGA实现Mem加法器

    前段时间和几个人闲谈,看看在FPGA里面实现一个Mem加法器怎么玩儿
    的头像 发表于 10-17 10:22 313次阅读
    基于FPGA<b class='flag-5'>实现</b>Mem<b class='flag-5'>加法器</b>