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