從今天開始新的一章-Circuits,包括基本邏輯電路、時(shí)序電路、組合電路等。
今天更新整個(gè)算術(shù)電路-加法器一小節(jié)題目,包括半加器,全加器等各種加法器。
半加器和全加器的區(qū)別
半加器
半加器是由一個(gè)異或門和一個(gè)與門連接而成的組合邏輯電路。半加器電路有兩個(gè)輸入:A 和 B,它們將兩個(gè)輸入數(shù)字相加并產(chǎn)生一個(gè)進(jìn)位和一個(gè)和。
異或門的輸出是兩個(gè)數(shù)的和,而與門的輸出是進(jìn)位。進(jìn)位加法不會(huì)轉(zhuǎn)發(fā),因?yàn)闆]有邏輯門來處理它。因此,這被稱為半加器電路。
邏輯表達(dá)式:
Sum=AXORB Carry=AANDB
真值表:
全加器
全加器是由兩個(gè)異或門、兩個(gè)與門和一個(gè)或門組成的電路。全加器是將三個(gè)輸入相加并產(chǎn)生兩個(gè)輸出的加法器,前兩個(gè)輸入是 A 和 B,第三個(gè)輸入是進(jìn)位C-IN 的輸入。輸出進(jìn)位指定為 C-OUT,正常輸出指定為 S,即 SUM。
異或門得到的方程是二進(jìn)制數(shù)字的和。而AND門得到的輸出是加法得到的進(jìn)位。
真值表:
邏輯表達(dá)式:
SUM=(AXORB)XORCin=(A⊕B)⊕Cin CARRY-OUT=AANDBORCin(AXORB)=A.B+Cin(A⊕B)
半加器和全加器的區(qū)別:
姓名 | 參數(shù) | 半加器 | 全加器 |
---|---|---|---|
1 | 描述 | 半加法器是一個(gè)組合邏輯電路,將兩個(gè) 1 位數(shù)字相加。半加器產(chǎn)生兩個(gè)輸入的和。 | 全加器是一種組合邏輯電路,它對(duì)三個(gè)一位二進(jìn)制數(shù)執(zhí)行加法運(yùn)算。全加器產(chǎn)生三個(gè)輸入和進(jìn)位值的總和。 |
2 | 上一次進(jìn)位 | 不使用前一個(gè)進(jìn)位。 | 使用前一個(gè)進(jìn)位。 |
3 | 輸入 | 在半加器中,有兩個(gè)輸入位(A,B)。 | 在全加器中,有三個(gè)輸入位(A、B、C-in)。 |
4 | 輸出 | 輸出是兩位和 和Carry 。 | 輸出是 2 位的和和 3 位輸入的Carry。 |
5 | 用作 | 半加器電路不能以與全加器電路相同的方式使用。 | 可以使用全加器電路代替半加器電路。 |
6 | 特征 | 它簡(jiǎn)單易行 | 全加器的設(shè)計(jì)并不像半加器那么簡(jiǎn)單。 |
7 | 邏輯表達(dá)式 | 半加器的邏輯表達(dá)式為: S=a⊕b ; C=a*b。 | 全加器的邏輯表達(dá)式為:S=a⊕b⊕Cin;Cout=(ab)+(Cin(a⊕b))。 |
8 | 邏輯門 | 由一個(gè)異或門和一個(gè)與門組成。 | 由兩個(gè)異或門、兩個(gè) AND 門和一個(gè) OR 門組成。 |
9 | 應(yīng)用 | 用于計(jì)算器,計(jì)算機(jī),數(shù)字測(cè)量設(shè)備等。 | 用于多位加法,數(shù)字處理器等。 |
下面開始我們的題目,對(duì)于加法器有個(gè)更深刻的認(rèn)識(shí)~
Problem 65-Hadd
題目說明
創(chuàng)建一個(gè)半加法器。半加器將兩位相加(沒有進(jìn)位)并產(chǎn)生和和進(jìn)位(sum and carry-out)。
模塊端口聲明
moduletop_module( inputa,b, outputcout,sum);
題目解析
根據(jù)半加器的邏輯表達(dá)式處理即可。
moduletop_module( inputlogica,b, outputlogiccout,sum ); assigncout=a&b; assignsum=a^b; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無參考波形。
這一題就結(jié)束了。
Problem 66-Fadd
題目說明
創(chuàng)建一個(gè)全加器。全加器將三位相加(包括進(jìn)位)并產(chǎn)生和和進(jìn)位。
模塊端口聲明
moduletop_module( inputa,b,cin, outputcout,sum);
題目解析
根據(jù)全加器的邏輯表達(dá)式處理即可。
簡(jiǎn)單解答
moduletop_module( inputlogica,b,cin, outputlogiccout,sum); assignsum=a^b^cin; assigncout=a&b|cin&(a^b); endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 67-Adder3
題目說明
現(xiàn)在已經(jīng)知道如何構(gòu)建一個(gè)全加器,例化 3 個(gè)實(shí)例來創(chuàng)建一個(gè) 3 位二進(jìn)制波紋進(jìn)位加法器(ripple-carry adder)。加法器將兩個(gè) 3 位數(shù)字和一個(gè)進(jìn)位相加產(chǎn)生一個(gè) 3 位和和進(jìn)位。為了鼓勵(lì)例化全加器,還要輸出紋波進(jìn)位加法器中每個(gè)全加器的進(jìn)位。cout[2] 是最后一個(gè)全加器的最終進(jìn)位,也是通常看到的進(jìn)位。
模塊端口聲明
moduletop_module( input[2:0]a,b, inputcin, output[2:0]cout, output[2:0]sum);
題目解析
例化正常的全加器,然后處理好進(jìn)位關(guān)系即可,這種波紋進(jìn)位加法器的特點(diǎn)需要理解,最后注意我們要把上一題寫的全加器附在后面。
moduletop_module( inputlogic[2:0]a,b, inputlogiccin, outputlogic[2:0]cout, outputlogic[2:0]sum ); full_adderf_adder_u1(.a(a[0]), .b(b[0]), .cin(cin), .cout(cout[0]), .sum(sum[0]) ); full_adderf_adder_u2(.a(a[1]), .b(b[1]), .cin(cout[0]), .cout(cout[1]), .sum(sum[1]) ); full_adderf_adder_u3(.a(a[2]), .b(b[2]), .cin(cout[1]), .cout(cout[2]), .sum(sum[2]) ); endmodule modulefull_adder(inputlogica, inputlogicb, inputlogiccin, outputlogiccout, outputlogicsum ); assignsum=a^b^cin; assigncout=a&b|cin&(a^b); endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 68-Exams/m2014 q4j
題目說明
實(shí)現(xiàn)下面電路:
FA代表全加器。
模塊端口聲明
moduletop_module( input[3:0]x, input[3:0]y, output[4:0]sum);
題目解析
這一題和上一題類似,看懂圖片即可,將X[0]+Y[0]結(jié)果作為SUM[0],進(jìn)位輸入到下一級(jí),以此類推。
moduletop_module( inputlogic[3:0]x, inputlogic[3:0]y, outputlogic[4:0]sum ); wirelogic[3:0]cout; full_adderf_adder_u1(.a(x[0]), .b(y[0]), .cin(1'd0), .cout(cout[0]), .sum(sum[0]) ); full_adderf_adder_u2(.a(x[1]), .b(y[1]), .cin(cout[0]), .cout(cout[1]), .sum(sum[1]) ); full_adderf_adder_u3(.a(x[2]), .b(y[2]), .cin(cout[1]), .cout(cout[2]), .sum(sum[2]) ); full_adderf_adder_u4(.a(x[3]), .b(y[3]), .cin(cout[2]), .cout(cout[3]), .sum(sum[3]) ); assignsum[4]=cout[3]; endmodule modulefull_adder(inputa,inputb,inputcin,outputcout,outputsum); assignsum=a^b^cin; assigncout=a&b|cin&(a^b); endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無波形。
這一題就結(jié)束了。
Problem 69-Exams/ece241 2014 q1c
題目說明
假設(shè)有兩個(gè) 2 進(jìn)制 8bit 有符號(hào)數(shù)-a[7:0] 和 b[7:0]。這些數(shù)字相加產(chǎn)生 s[7:0]。還要計(jì)算是否發(fā)生了(有符號(hào)的)溢出。
模塊端口聲明
moduletop_module( input[7:0]a, input[7:0]b, output[7:0]s, outputoverflow );
題目解析
當(dāng)兩個(gè)正數(shù)相加產(chǎn)生負(fù)結(jié)果或兩個(gè)負(fù)數(shù)相加產(chǎn)生正結(jié)果時(shí),會(huì)發(fā)生有符號(hào)溢出。有幾種檢測(cè)溢出的方法:可以通過比較輸入和輸出數(shù)的符號(hào)來計(jì)算,或者從位 n 和 n-1 的進(jìn)位推導(dǎo)出。簡(jiǎn)單說就是一是正正相加,產(chǎn)生正溢出;另一種情況是負(fù)負(fù)相減,產(chǎn)生負(fù)溢出。所以在代碼中需要分別考慮這兩種情況,將這兩種情況取或判斷溢出。
moduletop_module( inputlogic[7:0]a, inputlogic[7:0]b, outputlogic[7:0]s, outputlogicoverflow ); assigns=a+b; assignoverflow=a[7]&b[7]&~s[7]|~a[7]&~b[7]&s[7]; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 70-Adder100
題目說明
題目要求我們創(chuàng)建一個(gè)100bit的二進(jìn)制的加法器,該電路共包含兩個(gè)100bit的輸入和一個(gè)cin, 輸出產(chǎn)生sum和cout。
模塊端口聲明
moduletop_module( input[99:0]a,b, inputcin, outputcout, output[99:0]sum);
題目解析
沒什么難度,就是位數(shù)多一點(diǎn),其他沒區(qū)別。
moduletop_module( inputlogic[99:0]a,b, inputlogiccin, outputlogiccout, outputlogic[99:0]sum ); assign{cout,sum}=a+b+cin; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無波形。
這一題就結(jié)束了。
Problem 71-Bcdadd4
題目說明
題目給我們提供了一個(gè)BCD加法器名字為bcd_fadd, 輸入為兩個(gè)4bitBCD碼,一個(gè)cin,產(chǎn)生輸出為sum和cout。
modulebcd_fadd{ input[3:0]a, input[3:0]b, inputcin, outputcout, output[3:0]sum);
且題目也說明需要我們例化4次bcd_fadd來得到一個(gè)16-bit的BCD加法器(共16bit), 同樣產(chǎn)生sum和cout。
模塊端口聲明
moduletop_module( input[15:0]a,b, inputcin, outputcout, output[15:0]sum);
題目解析
這個(gè)題目難度不大,主要考察例化語法,但是我們需要看下BCD加法器結(jié)構(gòu)。
moduletop_module( inputlogic[15:0]a,b, inputlogiccin, outputlogiccout, outputlogic[15:0]sum); wirelogic[2:0]cout_temp; bcd_faddu1_bcd_fadd( .a(a[3:0]), .b(b[3:0]), .cin(cin), .cout(cout_temp[0]), .sum(sum[3:0]) ); bcd_faddu2_bcd_fadd( .a(a[7:4]), .b(b[7:4]), .cin(cout_temp[0]), .cout(cout_temp[1]), .sum(sum[7:4]) ); bcd_faddu3_bcd_fadd( .a(a[11:8]), .b(b[11:8]), .cin(cout_temp[1]), .cout(cout_temp[2]), .sum(sum[11:8]) ); bcd_faddu4_bcd_fadd( .a(a[15:12]), .b(b[15:12]), .cin(cout_temp[2]), .cout(cout), .sum(sum[15:12]) ); endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
總結(jié)
今天的幾道題就結(jié)束了,整體比較簡(jiǎn)單,沒有復(fù)雜的代碼,沒有復(fù)雜的設(shè)計(jì)思路,主要在于加法器的設(shè)計(jì)。
最后我這邊做題的代碼也是個(gè)人理解使用,有錯(cuò)誤歡迎大家批評(píng)指正,祝大家學(xué)習(xí)愉快~
審核編輯:劉清
-
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110190 -
HDL
+關(guān)注
關(guān)注
8文章
327瀏覽量
47416 -
加法器
+關(guān)注
關(guān)注
6文章
183瀏覽量
30164
原文標(biāo)題:HDLBits: 在線學(xué)習(xí) SystemVerilog(十二)-Problem 65-71(加法器)
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論