0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

最少需要幾個加法器IP才可以實現(xiàn)累加器的功能呢?

sanyue7758 ? 來源:Vuko-wxh ? 2023-08-18 09:38 ? 次閱讀

已知一個加法器IP,其功能是計算兩個數(shù)的和,但這個和延遲兩個周期才會輸出?,F(xiàn)在有一串連續(xù)的數(shù)據(jù)輸入,每個周期都不間斷,試問最少需要例化幾個上述的加法器IP,才可以實現(xiàn)累加的功能。

設(shè)計分析

實現(xiàn)累加器的加法器例化的個數(shù)。按照原文大佬的設(shè)計方法,因為數(shù)據(jù)連續(xù)且加法器的延遲周期是2,使用使用一個實現(xiàn)累加,會有一半的數(shù)據(jù)丟失。那這樣設(shè)計他就將奇數(shù)偶數(shù)的數(shù)據(jù)進(jìn)行了分開做一級累加,然后第二級將奇數(shù)偶數(shù)的累加結(jié)果再累加。這樣做共需消耗3個加法器。

這樣設(shè)計當(dāng)然沒問題,但是這樣設(shè)計是否是最少呢?我先拋出我的思考,我認(rèn)為在允許少量邏輯設(shè)計的情況下,最少需要例化兩個上述的加法器IP可以實現(xiàn)累加。

如果比較極限的情況下,一個都可以,先把一串?dāng)?shù)據(jù)使用寄存器緩存,然后一個一個取出來慢慢算即可,但這樣是不太可取的,首先,數(shù)據(jù)是連續(xù)的并沒有給出數(shù)據(jù)的極限長度,也就是說不論用任何涉及存儲結(jié)構(gòu)進(jìn)行緩存,都沒法確保該次數(shù)據(jù)能完全被存儲。如果題目改成一串連續(xù)數(shù)據(jù)輸入,長度最大為10,那我認(rèn)為用寄存器緩存這樣的設(shè)計是合理的。

設(shè)計架構(gòu)

回到設(shè)計思路:用兩個加法器的結(jié)構(gòu)如圖示。

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

設(shè)計實現(xiàn)

加法器設(shè)計

假設(shè)兩個時鐘周期延時加法器代碼如下,通過例化加法器進(jìn)行構(gòu)建累加器。

//加法器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

累加器設(shè)計

//累加器實現(xiàn)
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

代碼架構(gòu)設(shè)計

打拍:先對數(shù)據(jù)用寄存器緩存一拍,輸入數(shù)據(jù)暫時用in[i]表示,緩存。

第一級加法器輸入選擇valid:因為前級積累一拍的數(shù)據(jù),設(shè)計valid用于指示加法器的輸入數(shù)據(jù)。

第一級加法器信號輸入:根據(jù)valid信號進(jìn)行選擇數(shù)據(jù)輸入。

調(diào)用第一級加法器,同時對輸入valid信號進(jìn)行打兩拍處理,指示有效的輸出數(shù)據(jù)。

第二級加法器信號輸入:根據(jù)valid信號進(jìn)行選擇數(shù)據(jù)輸入。

調(diào)用第二級加法器,同時對輸入valid信號進(jìn)行打兩拍處理,指示有效的輸出數(shù)據(jù)。

輸出結(jié)果和valid信號。

經(jīng)過分析,目前設(shè)計延時是4拍,也即兩級,這里dout和valid使用的是時序邏輯輸出,所以在輸入valid拉低后的第五個時鐘周期輸出正確的結(jié)果。

仿真測試

設(shè)計仿真測試代碼對代碼進(jìn)行測試,這里使用了遞增數(shù)測試代碼可用性,在實際測試時,可通過改變DATA_LEN的大小測試單次遞增累加后的結(jié)果,后續(xù)結(jié)果依次遞增為第一次的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信號拉低后第五拍可得到輸出結(jié)果,功能正常。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5294

    瀏覽量

    119814
  • 存儲器
    +關(guān)注

    關(guān)注

    38

    文章

    7430

    瀏覽量

    163515
  • 仿真器
    +關(guān)注

    關(guān)注

    14

    文章

    1014

    瀏覽量

    83591
  • 加法器
    +關(guān)注

    關(guān)注

    6

    文章

    183

    瀏覽量

    30061
  • 累加器
    +關(guān)注

    關(guān)注

    0

    文章

    50

    瀏覽量

    9436

原文標(biāo)題:仿真測試

文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

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

      運算放大器構(gòu)成加法器 可以分為同相加法器和反相加法器
    發(fā)表于 08-05 17:17 ?3w次閱讀
    運算放大器的同相<b class='flag-5'>加法器</b>和反相<b class='flag-5'>加法器</b>

    IP加法器

    IP加法器
    發(fā)表于 08-14 14:24

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

    什么是加法器?加法器的原理是什么 反相加法器等效原理圖解析
    發(fā)表于 03-11 06:30

    計算機(jī)累加器加法器功能嗎,累加器是什么_累加器的作用及原理介紹 精選資料推薦

    累加器的概念在中央處理中,累加器(accumulator)是一種寄存,用來儲存計算產(chǎn)生的中間結(jié)果。如果沒有像累加器這樣的寄存
    發(fā)表于 08-30 08:57

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

    加法器,加法器是什么意思 加法器 :  加法器是為了實現(xiàn)加法的?! 〖词钱a(chǎn)生數(shù)的和的裝置。加數(shù)
    發(fā)表于 03-08 16:48 ?5484次閱讀

    十進(jìn)制加法器,十進(jìn)制加法器工作原理是什么?

    十進(jìn)制加法器,十進(jìn)制加法器工作原理是什么?   十進(jìn)制加法器可由BCD碼(二-十進(jìn)制碼)來設(shè)計,它可以在二進(jìn)制加法器的基礎(chǔ)上加上適當(dāng)?shù)摹?/div>
    發(fā)表于 04-13 10:58 ?1.4w次閱讀

    FPU加法器的設(shè)計與實現(xiàn)

    浮點運算的核心運算部件是浮點加法器,它是實現(xiàn)浮點指令各種運算的基礎(chǔ),其設(shè)計優(yōu)化對于提高浮點運算的速度和精度相當(dāng)關(guān)鍵。文章從浮點加法器算法和電路實現(xiàn)
    發(fā)表于 07-06 15:05 ?47次下載
    FPU<b class='flag-5'>加法器</b>的設(shè)計與<b class='flag-5'>實現(xiàn)</b>

    同相加法器電路原理與同相加法器計算

    同相加法器輸入阻抗高,輸出阻抗低 反相加法器輸入阻抗低,輸出阻抗高.加法器是一種數(shù)位電路,其可進(jìn)行數(shù)字的加法計算。當(dāng)選用同相加法器時,如A輸
    發(fā)表于 09-13 17:23 ?5.7w次閱讀
    同相<b class='flag-5'>加法器</b>電路原理與同相<b class='flag-5'>加法器</b>計算

    加法器是如何實現(xiàn)

     verilog實現(xiàn)加法器,從底層的門級電路級到行為級,本文對其做出了相應(yīng)的闡述。
    發(fā)表于 02-18 14:53 ?6192次閱讀
    <b class='flag-5'>加法器</b>是如何<b class='flag-5'>實現(xiàn)</b>的

    超前進(jìn)位加法器是如何實現(xiàn)記憶的

    行波進(jìn)位加法器和超前進(jìn)位加法器都是加法器,都是在邏輯電路中用作兩個數(shù)相加的電路。我們再來回顧一下行波進(jìn)位加法器
    發(fā)表于 08-05 16:45 ?1417次閱讀
    超前進(jìn)位<b class='flag-5'>加法器</b>是如何<b class='flag-5'>實現(xiàn)</b>記憶的<b class='flag-5'>呢</b>

    數(shù)字設(shè)計筆試Verilog手撕代碼—累加器

    實現(xiàn)累加器加法器例化的個數(shù)。按照原文大佬的設(shè)計方法,因為數(shù)據(jù)連續(xù)且加法器的延遲周期是2,使用使用一個實現(xiàn)
    的頭像 發(fā)表于 06-02 16:35 ?2749次閱讀
    數(shù)字設(shè)計筆試Verilog手撕代碼—<b class='flag-5'>累加器</b>

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

    有關(guān)加法器的知識,加法器是用來做什么的,故名思義,加法器是為了實現(xiàn)加法的,它是一種產(chǎn)生數(shù)的和的裝置,那么
    的頭像 發(fā)表于 06-09 18:04 ?5011次閱讀

    基于FPGA實現(xiàn)Mem加法器

    前段時間和幾個人閑談,看看在FPGA里面實現(xiàn)一個Mem加法器怎么玩兒
    的頭像 發(fā)表于 10-17 10:22 ?560次閱讀
    基于FPGA<b class='flag-5'>實現(xiàn)</b>Mem<b class='flag-5'>加法器</b>

    加法器的原理是什么 加法器有什么作用

    加法器是數(shù)字電路中的基本組件之一,用于執(zhí)行數(shù)值的加法運算。加法器的基本原理和作用可以從以下幾個方面進(jìn)行詳細(xì)闡述。
    的頭像 發(fā)表于 05-23 15:01 ?2277次閱讀
    <b class='flag-5'>加法器</b>的原理是什么 <b class='flag-5'>加法器</b>有什么作用

    串行加法器和并行加法器的區(qū)別?

    串行加法器和并行加法器是兩種基本的數(shù)字電路設(shè)計,用于執(zhí)行二進(jìn)制數(shù)的加法運算。它們在設(shè)計哲學(xué)、性能特點以及應(yīng)用場景上有著明顯的區(qū)別。
    的頭像 發(fā)表于 05-23 15:06 ?2009次閱讀