Verilog中的加法器(半加器,全加器,串行、超前进位加法器)
加法器為半加器和全加器:
半加器:不考慮低位向高位的進(jìn)位。2輸入,2輸出。
全加器:考慮低位向高位的進(jìn)位。3輸入(多了進(jìn)位輸入C),2輸出。
?
Verilog代碼如下:
module half_add(input A,B, //兩輸入,無進(jìn)位輸入output sum,cout //加法結(jié)果和進(jìn)位輸出 ); assign sum=A^B; assign coot=A&B; endmodule圖中的co表達(dá)式錯(cuò)誤,應(yīng)為co=(A+B)ci +A·B
?Verilog代碼如下:
module full_add(input A,B,cin //三輸入,有進(jìn)位輸入output sum,cout ); assign sum=A^B^cin; assign co=(A&B)|(A&cin)|(B&cin); endmodule用全加器實(shí)現(xiàn)半加器:只需要把全加器的進(jìn)位端CI進(jìn)位輸入端屏蔽即可。
?用半加器實(shí)現(xiàn)全加器:用兩個(gè)半加器如下圖。
Verilog代碼如下:
module half_add(input A,B,output sum,cout ); assign sum=A^B; assign cout=A&B; endmodule //先編寫一個(gè)半加器module full_add( input A,B,cinoutput sum,cout ); //通過例化兩個(gè)半加器組成一個(gè)全加器 wire w1,w2,w3;half_add add1(.A (A),.B (B),.sum (w1),.cout(w2) );half_add add2(.A (cin),.B (w1),.sum (sum),.cout(w3) );assign cout=w2|w3;endmodule多位加法器的進(jìn)位原理:
1.串行進(jìn)位加法器
?從上面的原理圖可以看出,串行進(jìn)位加法器就是將上一片的進(jìn)位輸出與下一片的進(jìn)位輸入相連,用4片1bit全加器串行相接即可實(shí)現(xiàn)4bit全加器。
直接描述的Verilog代碼會(huì)產(chǎn)生串行進(jìn)位加法器:
//4位全加器,有低位向本位進(jìn)位(即有輸入進(jìn)位) module four_bits_full_add(input [3:0]a,b,input cin,output cout,output [3:0]sum );assign {cout,sum} = a + b + cin; endmodule但是這種結(jié)構(gòu)的缺點(diǎn)是,必須要等到上一片的結(jié)果算出來之后下一片才能進(jìn)行工作,當(dāng)級(jí)數(shù)很高的時(shí)候計(jì)算的時(shí)間將是每一片時(shí)間的n倍,會(huì)出現(xiàn)組合邏輯延時(shí)過長(zhǎng)的問題。此時(shí)另一種進(jìn)位方法——超前進(jìn)位加法器就可以解決這一延時(shí)過高的問題。
2.超前進(jìn)位加法器
?超前進(jìn)位加法器的原理是不等后級(jí)把進(jìn)位算完再傳過來,我們直接通過輸入的數(shù)據(jù)把這個(gè)進(jìn)位直接算出來發(fā)給每一級(jí)。
從上面的全加器講解中我們知道,輸出進(jìn)位co=(A+B)cin+A·B。
?Verilog代碼如下:
module four_bits_fast_add(input [3:0]a,b, input cin, output [3:0]sum, output cout );wire [3:0] g,p; //分別對(duì)應(yīng)Gi、Piwire [4:0] c; //對(duì)應(yīng)Ciassign p = a | b; // Pi = Ai·Biassign g = a & b;// Gi = Ai+Biassign c[0] = cin; //C0就是第一片的輸入進(jìn)位assign c[1] = g[0]|(p[0]&c[0]);assign c[2] = g[1]|(p[1]&(g[0]|(p[0]&c[0]) );assign c[3] = g[2]|(p[2]&(g[1]|(p[1]&(g[0]|(p[0]&c[0])))));assign c[4] = g[3]|(p[3]&(g[2]|(p[2]&(g[1]|(p[1]&(g[0]|(p[0]&c[0])))))));assign sum =a ^b^ c[3:0]; assign cout = c[4]; //C4就是最后一片的輸出進(jìn)位 endmodule總結(jié)
以上是生活随笔為你收集整理的Verilog中的加法器(半加器,全加器,串行、超前进位加法器)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 组合电路Verilog的几种描述方式
- 下一篇: STM32的I/O口的八种工作模式