日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

4位加法器的设计代码verilog_HDLBits:在线学习Verilog(六 · Problem 25-29)

發(fā)布時(shí)間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 4位加法器的设计代码verilog_HDLBits:在线学习Verilog(六 · Problem 25-29) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本系列文章將和讀者一起巡禮數(shù)字邏輯在線學(xué)習(xí)網(wǎng)站 HDLBits 的教程與習(xí)題,并附上解答和一些作者個(gè)人的理解,相信無(wú)論是想 7 分鐘精通 Verilog,還是對(duì) Verilog 和數(shù)電知識(shí)查漏補(bǔ)缺的同學(xué),都能從中有所收獲。

附上傳送門(mén):Module fadd - HDLBits

Problem 25: Adder 2(Module fadd)

牛刀小試

在本題中,您將描述一個(gè)具有兩級(jí)層次結(jié)構(gòu)的電路。在top_module中,實(shí)例化兩個(gè)add16模塊(已為您提供),每個(gè)add16中實(shí)例化16個(gè)add1實(shí)例(此模塊需要您編寫(xiě))。所以,您需要描述兩個(gè)模塊:top_module和add1。

與Problem 24: Adder 1(Module add)一樣,提供給您一個(gè)執(zhí)行16bit的加法的模塊。您需要實(shí)例化兩個(gè)16bit加法模塊來(lái)實(shí)現(xiàn)32bit加法器。一個(gè)add16計(jì)算加法結(jié)果的低16位,另一個(gè)計(jì)算結(jié)果的高16位。您的32位加法器同樣不需要處理進(jìn)位輸入(假設(shè)為0)和進(jìn)位輸出(無(wú)需進(jìn)位)信號(hào)。

如下圖所示,將add16模塊連接在一起,給出的add16模塊如下:

module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );

在每個(gè)add16中,實(shí)例化了16個(gè)全加器(add1,未給出,需要您自己寫(xiě)出)去執(zhí)行加法操作。您必須編寫(xiě)具有以下聲明的完整全加器(add1):

module add1 ( input a, input b, input cin, output sum, output cout );

回憶一下,全加器計(jì)算a+b+cin(三個(gè)信號(hào)均為1bit)的結(jié)果(sum)和進(jìn)位(carry-out)。

總之,本題中一共有三個(gè)模塊:

1、top_module:包含兩個(gè)16位加法器的頂級(jí)模塊;

2、add16(已給出):一個(gè)16bit的加法器,由16個(gè)全加器構(gòu)成;

3、add(未給出):1bit全加器

注意:在您提交的代碼中如果缺少add1,您將收到一條如下的錯(cuò)誤提示:

Error (12006): Node instance "user_fadd[0].a1" instantiates undefined entity "add1".

小提示:全加器的邏輯表達(dá)式

解答與分析

module top_module (input [31:0] a,input [31:0] b,output [31:0] sum );//wire carry;add16 a1(a[15:0],b[15:0],1'b0,sum[15:0],carry);add16 a2(a[31:16],b[31:16],carry,sum[31:16],);endmodulemodule add1 ( input a, input b, input cin, output sum, output cout );assign sum = a ^ b ^ cin;assign cout = a&b | a&cin | b&cin; endmodule

本體與上一題實(shí)現(xiàn)的功能是一樣的,就是要多實(shí)現(xiàn)一個(gè)1bit全加器,如果不小心把16bit的全加器實(shí)現(xiàn)的話會(huì)提示模塊聲明多次的錯(cuò)誤:

Error (10228): Verilog HDL error at tb_modules.sv(1): module "add16" cannot be declared more than once File:

Problem 26: Carry-select adder (Module cseladd)

上一個(gè)練習(xí)中(Problem 25: Adder 2(Module fadd))實(shí)現(xiàn)的加法器應(yīng)該叫做行波進(jìn)位加法器(RCA: Ripple-Carry Adder)。這種加法器的缺點(diǎn)是計(jì)算進(jìn)位輸出的延遲是相當(dāng)慢的(最壞的情況下,來(lái)自于進(jìn)位輸入)。并且如果前一級(jí)加法器計(jì)算完成之前,后一級(jí)加法器不能開(kāi)始計(jì)算。這又使得加法器的計(jì)算延遲變大。

牛刀小試

這次來(lái)實(shí)現(xiàn)一個(gè)改進(jìn)型的加法器,如下圖所示。第一級(jí)加法器保持不變,第二級(jí)加法器實(shí)現(xiàn)兩個(gè),一個(gè)假設(shè)進(jìn)位為0,另一個(gè)假設(shè)進(jìn)位為1。然后使用第一級(jí)結(jié)果和2選一選擇器來(lái)選擇哪一個(gè)結(jié)果是正確的。

在本題中,您將獲得與上一練習(xí)相同的模塊add16,它將兩個(gè)16bit數(shù)和進(jìn)位輸入相加,并產(chǎn)生16bit的結(jié)果和進(jìn)位輸出。您必須實(shí)例化其中的三add16來(lái)構(gòu)建進(jìn)位選擇加法器,同時(shí)實(shí)現(xiàn)16bit的2選1選擇器來(lái)選擇結(jié)果。

將模塊如下圖所示連在一起。提供的模塊add16如下:

module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );

解答與分析

module top_module(input [31:0] a,input [31:0] b,output [31:0] sum );wire carry;wire [31:16] sum0;wire [31:16] sum1;add16 al(a[15:0],b[15:0],1'b0,sum[15:0],carry);add16 ah0(a[31:16],b[31:16],1'b0,sum0[31:16],);add16 ah1(a[31:16],b[31:16],1'b1,sum1[31:16],);assign sum[31:16] = carry?sum1:sum0;endmodule

如果學(xué)過(guò)數(shù)字集成電路的進(jìn)位鏈的話應(yīng)該知道這是選擇進(jìn)位加法器(CSA: Carry-Select Adder),相對(duì)于上一題的行波進(jìn)位(也叫逐級(jí)進(jìn)位,逐位進(jìn)位)加法器延遲小一半左右,但是比增多了50%的邏輯資源。

Problem 27: Adder–subtractor (Module addsub)

加減法器可以由加法器來(lái)構(gòu)建,可以對(duì)其中一個(gè)數(shù)取相反數(shù)(對(duì)輸入數(shù)據(jù)取反,然后加1)。最終結(jié)果是一個(gè)可以執(zhí)行以下兩個(gè)操作的電路:

和 。如果您想要更詳細(xì)地了解該電路的工作原理,請(qǐng)參閱維基百科。

牛刀小試

如下圖所示構(gòu)建加減法器,您需要實(shí)例化兩次下面給出的16bit加法器模塊:

module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );

當(dāng)sub為1時(shí),使用32位的異或門(mén)對(duì)B進(jìn)行取反。(這也可以被視為b[31:0]與sub復(fù)制32次相異或,請(qǐng)參閱復(fù)制運(yùn)算符Problem 17: Replication operator(Vector4))。同時(shí)sub信號(hào)連接到加法器的進(jìn)位。

小提示:異或門(mén)也可以看作是可編程的非門(mén),其中一個(gè)輸入控制是否應(yīng)該反轉(zhuǎn)另一個(gè)。 以下兩個(gè)電路都是異或門(mén):

解答與分析

module top_module(input [31:0] a,input [31:0] b,input sub,output [31:0] result );wire [31:0] b_n;wire carry;assign b_n = b^{32{sub}};add16 a0(a[15:0],b_n[15:0],sub,result[15:0],carry);add16 a1(a[31:16],b_n[31:16],carry,result[31:16],);endmodule

學(xué)過(guò)數(shù)字邏輯電路的應(yīng)該知道的小常識(shí),減去一個(gè)數(shù)等于加上這個(gè)數(shù)的補(bǔ)碼(就是題中的按位取反再加1)。

到這里關(guān)于模塊層次的學(xué)習(xí)就結(jié)束了,下一題開(kāi)始,我們進(jìn)位過(guò)程塊的學(xué)習(xí)。

Problem 28: Always blocks(combinational) (Alwaysblock1)

我們知道數(shù)字電路是由導(dǎo)線連接的邏輯門(mén)組成,因此任何電路都可以表示為module和assign語(yǔ)句的某種組合。但是,有時(shí)候這不是描述電路最簡(jiǎn)便的方法。過(guò)程塊(比如always塊)提供了一種用于替代assign語(yǔ)句描述電路的方法。

有兩種always塊是可以綜合出電路硬件的:

綜合邏輯:always @(*) 時(shí)序邏輯:always @(posedge clk)

組合always塊相當(dāng)于assign語(yǔ)句,因此組合電路存在兩種表達(dá)方法。具體使用哪個(gè)主要取決于使用哪個(gè)更方便。過(guò)程塊內(nèi)的代碼與外部的assign代碼不同。過(guò)程塊中可以使用更豐富的語(yǔ)句(比如if-then,case),但不能包含連續(xù)賦值*。但也引入了一些非直觀的錯(cuò)誤。(*過(guò)程連續(xù)賦值確實(shí)可以存在,但與連續(xù)賦值有些不同,并且不可綜合)

例如,assign和組合always塊描述相同的電路。兩者均創(chuàng)造出了相同的組合邏輯電路。只要任何輸入(右側(cè))改變值,兩者都將重新計(jì)算輸出。

assign out1 = a & b | c ^ d; always @(*) out2 = a & b | c ^ d;

對(duì)于組合always塊,敏感變量列表總是使用(*)。如果把所有的輸入都列出來(lái)也是可以的,但容易出錯(cuò)的(可能少列出了一個(gè)),并且在硬件綜合時(shí)會(huì)忽略您少列了一個(gè),仍按原電路綜合。 但仿真器將會(huì)按少列一個(gè)來(lái)仿真,這導(dǎo)致了仿真與硬件不匹配。(在SystemVerilog中,使用always_comb)

牛刀小試

使用assign語(yǔ)句和組合always塊來(lái)構(gòu)建與門(mén)。(因?yàn)橘x值語(yǔ)句和組合always相同,仿真器檢測(cè)不出來(lái)你使用了那種方法,所以沒(méi)有辦法強(qiáng)制你使用這兩種方法,但是你會(huì)這里練習(xí)的,對(duì)吧?......)(譯者注:作者還是很調(diào)皮的)

解答與分析

// synthesis verilog_input_version verilog_2001 module top_module(input a, input b,output wire out_assign,output reg out_alwaysblock );assign out_assign = a & b;always@(*)out_alwaysblock = a & b;endmodule

好像沒(méi)什么分析的,照著上面的講解抄就行。

Problem 29: Always blocks(clocked) (Alwaysblock2)

對(duì)于硬件綜合來(lái)說(shuō),存在兩種always塊:

組合邏輯:always @(*) 時(shí)序邏輯:always @(posedge clk)

時(shí)序always塊也會(huì)像組合always塊一樣生成一系列的組合電路,但同時(shí)在組合邏輯的輸出生成了一組觸發(fā)器(或寄存器)。該輸出在下一個(gè)時(shí)鐘上升沿(posedge clk)后可見(jiàn),而不是之前的立即可見(jiàn)。

阻塞性賦值和非阻塞性賦值

在Verilog中有以下三種賦值方法:

連續(xù)賦值(assign x=y;):不能在過(guò)程塊內(nèi)使用; 過(guò)程阻塞性賦值(x=y;):只能在過(guò)程塊中使用; 過(guò)程費(fèi)阻塞性復(fù)制(x<=y):只能在過(guò)程塊內(nèi)使用。

在組合always塊中,使用阻塞性賦值。在時(shí)序always塊中,使用非阻塞性賦值。具體為什么對(duì)設(shè)計(jì)硬件用處不大,還需要理解Verilog模擬器如何跟蹤事件(譯者注:的確是這樣,記住組合用阻塞性,時(shí)序用非阻塞性就可以了)。不遵循此規(guī)則會(huì)導(dǎo)致極難發(fā)現(xiàn)非確定性錯(cuò)誤,并且在仿真和綜合出來(lái)的硬件之間存在差異。

牛刀小試

使用assign語(yǔ)句,組合always塊和時(shí)序always塊這三種方式來(lái)構(gòu)建異或門(mén)。 請(qǐng)注意,時(shí)鐘always塊生成了與另外兩個(gè)不同的電路,多了一個(gè)觸發(fā)器,因此輸出會(huì)有一定的延遲。

解答與分析

module top_module(input clk,input a,input b,output wire out_assign,output reg out_always_comb,output reg out_always_ff );assign out_assign = a ^ b;always@(*) out_always_comb = a ^ b;always@(posedge clk) out_always_ff <= a ^ b;endmodule

從仿真的波形圖可以看出,out_always_ff比其他兩個(gè)輸出延遲了一個(gè)時(shí)鐘周期,這就是非阻塞性賦值帶來(lái)的。

PS:本系列課程的題號(hào)是從0開(kāi)始的,與網(wǎng)站1不符,望周知。

總結(jié)

以上是生活随笔為你收集整理的4位加法器的设计代码verilog_HDLBits:在线学习Verilog(六 · Problem 25-29)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。