HDLBits答案(8)_Verilog半加器、全加器和行波进位加法器原理与设计
半加器、全加器和行波進(jìn)位加法器原理與設(shè)計(jì)
HDLBits鏈接
半加器
定義:
半加器用于計(jì)算2個(gè)單比特二進(jìn)制數(shù)a與b的和,輸出結(jié)果sum(s)和進(jìn)位carry(c)。在多比特?cái)?shù)的計(jì)算中,進(jìn)位c將作為下一相鄰比特的加法運(yùn)算中。其真值表如下所示。
題目描述:實(shí)現(xiàn)一個(gè)半加器。半加器將兩位比特相加(不帶進(jìn)位)并產(chǎn)生一個(gè)1bit結(jié)果和一個(gè)進(jìn)位。
Solution:
module top_module( input a, b,output cout, sum );assign {cout,sum} = a + b; endmodule全加器
定義:
全加器不同于半加器的地方是,全加器帶有進(jìn)位cin。輸入為a,b,cin, 輸出為sum(s)和carry*(cout),均是單比特信號(hào)。s為a,b,cin三個(gè)單比特?cái)?shù)的和,cout為a,b,cin三個(gè)數(shù)超過2后的進(jìn)位。
題目描述:實(shí)現(xiàn)一個(gè)全加器。全加器將兩位比特相加(帶進(jìn)位)并產(chǎn)生一個(gè)1bit結(jié)果和一個(gè)進(jìn)位。
Solution:
module top_module( input a, b, cin,output cout, sum );assign {cout,sum} = a + b + cin; endmodule行波進(jìn)位加法器
定義:N-bit加法器可以根據(jù)1-bit全加器組合而成。每個(gè)全加器的輸出進(jìn)位cout作為下一個(gè)全加器的輸入進(jìn)位cin,這種加法器稱為行波進(jìn)位加法器(Ripple-carry adder,簡稱RCA)。
題目描述:現(xiàn)在我們已經(jīng)知道如何實(shí)現(xiàn)一個(gè)全加器,我們將使用它的3個(gè)實(shí)例來創(chuàng)建一個(gè)3位二進(jìn)制的行波進(jìn)位加法器。
行波進(jìn)位加法器將兩個(gè)3位數(shù)字和一個(gè)進(jìn)位相加以產(chǎn)生一個(gè)3位結(jié)果和一個(gè)進(jìn)位輸出。
Solution:
module top_module( input [2:0] a, b,input cin,output [2:0] cout,output [2:0] sum );assign {cout[0],sum[0]} = a[0] + b[0] +cin;assign {cout[1],sum[1]} = a[1] + b[1] +cout[0];assign {cout[2],sum[2]} = a[2] + b[2] +cout[1]; endmodule鞏固練習(xí)
題目描述1:實(shí)現(xiàn)下圖所示電路,其中“FA”指全加器(Full Adder)。
Solution1:
module top_module (input [3:0] x,input [3:0] y, output [4:0] sum);wire [2:0] cout;assign {cout[0],sum[0]} = x[0] + y[0];assign {cout[1],sum[1]} = x[1] + y[1] + cout[0];assign {cout[2],sum[2]} = x[2] + y[2] + cout[1];assign {sum[4],sum[3]} = x[3] + y[3] + cout[2];endmodule題目描述2:
假設(shè)有兩個(gè)8位數(shù)字的補(bǔ)碼,a[7:0]和b[7:0]。這倆數(shù)字相加產(chǎn)生s[7:0]。模塊中需計(jì)算是否發(fā)生了(有符號(hào)的)溢出。
[David說]:當(dāng)兩個(gè)正數(shù)相加產(chǎn)生一個(gè)負(fù)結(jié)果,或兩個(gè)負(fù)數(shù)相加產(chǎn)生一個(gè)正結(jié)果時(shí),會(huì)發(fā)生符號(hào)溢出現(xiàn)象。有幾種檢測溢出的方法:可以通過比較輸入和輸出數(shù)字的符號(hào)來計(jì)算溢出,或者從n位和n-1位的進(jìn)位來判斷是否溢出。
Solution2:
module top_module (input [7:0] a,input [7:0] b,output [7:0] s,output overflow ); assign s = a + b;assign overflow = (a[7]&b[7]&~s[7]) | ((~a[7])&(~b[7])&s[7]);endmodule題目描述3:創(chuàng)建一個(gè)100位的二進(jìn)制加法器。加法器將兩個(gè)100位的數(shù)和一個(gè)進(jìn)位相加產(chǎn)生一個(gè)100位的結(jié)果和一個(gè)進(jìn)位。
Solution3:
module top_module( input [99:0] a, b,input cin,output cout,output [99:0] sum );assign {cout,sum[99:0]} = a + b + cin;endmodule題目描述4:
已有一個(gè)BCD(二進(jìn)制編碼的十進(jìn)制)數(shù)加法器,名為bcd_fadd,它將兩個(gè)BCD數(shù)字和進(jìn)位信號(hào)相加,生成結(jié)果和進(jìn)位信號(hào)。
module bcd_fadd {input [3:0] a,input [3:0] b,input cin,output cout,output [3:0] sum );實(shí)例化bcd_fadd的4個(gè)副本,以創(chuàng)建一個(gè)4位BCD行波進(jìn)位加法器。
Solution4:
module top_module( input [15:0] a, b,input cin,output cout,output [15:0] sum );wire [2:0] cout_temp;bcd_fadd bcd_1(a[3:0],b[3:0],cin,cout_temp[0],sum[3:0]);bcd_fadd bcd_2(a[7:4],b[7:4],cout_temp[0],cout_temp[1],sum[7:4]);bcd_fadd bcd_3(a[11:8],b[11:8],cout_temp[1],cout_temp[2],sum[11:8]);bcd_fadd bcd_4(a[15:12],b[15:12],cout_temp[2],cout,sum[15:12]);endmodule總結(jié)
- 學(xué)習(xí)了常見加法器的原理與設(shè)計(jì)
- 學(xué)習(xí)了帶進(jìn)位加法器的級聯(lián)操作
總結(jié)
以上是生活随笔為你收集整理的HDLBits答案(8)_Verilog半加器、全加器和行波进位加法器原理与设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 布克奖2023:没有文学,我们如何听到怒
- 下一篇: HDLBits答案(9)_卡诺图与最简S