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