Verilog 流水線加法器

2021-09-06 07:11:54 字數 2821 閱讀 8012

**:

《數字系統設計與verilog hdl》上面有這麼一段**,用於實現8位4級流水線加法器。

module adder8pip(cout,sum,cin,ina,inb,clk

);input cin,clk;

input [7:0] ina,inb;

output cout;

output [7:0] sum;

reg cout,tempcin;

reg [7:0] sum,tempa,tempb;

reg firstco,secondco,thirdco; //前**加法的進製輸出

reg [1:0] firstsum,thirdina,thirdinb;

reg [3:0] secondsum,secondina,secondinb;

reg [5:0] thirdsum,firstina,firstinb;

always @ (posedge clk)

begin

tempcin=cin;tempa=ina;tempb=inb;//輸入資料快取

endalways @ (posedge clk)

begin

=tempa[1:0]+tempb[1:0]+tempcin;//第一級低2位相加

firstina=tempa[7:2];firstinb=tempb[7:2];//未參加計算的資料快取

endalways @ (posedge clk)

begin

=;//第二級2位相加,並與前一級結果合併

secondina=firstina[5:2];secondinb=firstinb[5:2];//未參加計算的資料快取

endalways @ (posedge clk)

begin

=;//第**2位相加,並與前一級結果合併

thirdina=secondina[3:2];thirdinb=secondinb[3:2];//未參加計算的資料快取

endalways @ (posedge clk)

begin

=;//第四級最高2位相加,並與前一級結果合併

endendmodule

綜合之後發現如下警告:

ff/latch (without init value) has a constant value of 0 in block . this ff/latch will be trimmed during the optimization process.

再看rtl電路圖,發現cout果然被接地了。

在網上找原因,原來是因為在後面**的加法運算中,比如第二級:

=;」」就已經限定等號右邊為4位,由於等號左邊為5位,這造成secondco

沒用,綜合的時候會把secondco綜合掉。

因此對於有符號數的加法,將上述**改為:

=++firstco,firstsum};(未驗證)

即擴充套件符號位,每一級的加法運算都要擴,對於第一級加法也要擴符號位。

下面是無符號數流水線加法器的完整**:

module adder8pip(cout,sum,cin,ina,inb,clk

);input cin,clk;

input [7:0] ina,inb;

output cout;

output [7:0] sum;

reg cout,tempcin;

reg [7:0] sum,tempa,tempb;

reg firstco,secondco,thirdco; //前**加法的進製輸出

reg [1:0] firstsum,thirdina,thirdinb;

reg [3:0] secondsum,secondina,secondinb;

reg [5:0] thirdsum,firstina,firstinb;

always @ (posedge clk)

begin

tempcin=cin;tempa=ina;tempb=inb;//輸入資料快取

endalways @ (posedge clk)

begin

=tempa[1:0]+tempb[1:0]+tempcin;//第一級低2位相加,由於沒有{}限位,因此不需要擴充套件位

firstina=tempa[7:2];firstinb=tempb[7:2];//未參加計算的資料快取

endalways @ (posedge clk)

begin

=++firstco,firstsum};//第二級2位相加,並與前一級結果合併

secondina=firstina[5:2];secondinb=firstinb[5:2];//未參加計算的資料快取

endalways @ (posedge clk)

begin

=++secondco,secondsum};//第**2位相加,並與前一級結果合併

thirdina=secondina[3:2];thirdinb=secondinb[3:2];//未參加計算的資料快取

endalways @ (posedge clk)

begin

=++thirdco,thirdsum};//第四級最高2位相加,並與前一級結果合併

endendmodule

該**用ise綜合沒有報錯,但是發現rtl電路仍然不符合要求,想不通,懷疑難道綜合器有問題。於是裝上synplify,再綜合,還真沒問題了,而且介面很好看。

然後再用modelsim做前**,結果還是不對啊。。。為嘛,為嘛啊。。。

好吧,做map後**,結果正確了。。。這是為啥啊?

verilog學習記(加法器)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!程式語言,光看書其實作用不大的,關鍵還需要自己進行實踐。看書的時候,你覺得自己明白了 弄懂了,等到用modelsim實踐的時候還是會出現這樣那樣的問題。因此,還是希望自己能夠不斷地訓練和練習,這樣可以達到熟能生巧的程度。就今天的加法器來說,其實內容...

Verilog 加法器和減法器 5

前面二進位制加法運算,我們並沒有提運算元是有符號數,還是無符號數。其實前面的二進位制加法對於有符號數和無符號數都成立。比如前面的8位二進位制加法運算,第一張圖我們選radix是unsigned,表示無符號加法,第二張圖我們選radix是decimal,表示有符號數,從圖中可知結果都是正確的。對於有符...

序列加法器 並行加法器 超前進製加法器

1.序列加法器 序列加法器即加法器執行位序列行操作,利用多個時鐘週期完成一次加法運算,即輸入運算元和輸出結果方式為隨時鐘序列輸入 輸出。位並行加法器速度高,但是占用資源多。在許多實際應用中並不需要這樣高的速度,而是希望減少硬體資源佔用率,這時就可以使用位序列加法器。在序列加法器中,只有乙個全加器,資...