Verilog中的加法器(半加器,全加器,串行、超前进位加法器)
生活随笔
收集整理的这篇文章主要介绍了
Verilog中的加法器(半加器,全加器,串行、超前进位加法器)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
加法器为半加器和全加器:
半加器:不考虑低位向高位的进位。2输入,2输出。
全加器:考虑低位向高位的进位。3输入(多了进位输入C),2输出。
Verilog代码如下:
module half_add(input A,B, //两输入,无进位输入output sum,cout //加法结果和进位输出 ); assign sum=A^B; assign coot=A&B; endmodule图中的co表达式错误,应为co=(A+B)ci +A·B
Verilog代码如下:
module full_add(input A,B,cin //三输入,有进位输入output sum,cout ); assign sum=A^B^cin; assign co=(A&B)|(A&cin)|(B&cin); endmodule用全加器实现半加器:只需要把全加器的进位端CI进位输入端屏蔽即可。
用半加器实现全加器:用两个半加器如下图。
Verilog代码如下:
module half_add(input A,B,output sum,cout ); assign sum=A^B; assign cout=A&B; endmodule //先编写一个半加器module full_add( input A,B,cinoutput sum,cout ); //通过例化两个半加器组成一个全加器 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多位加法器的进位原理:
1.串行进位加法器
从上面的原理图可以看出,串行进位加法器就是将上一片的进位输出与下一片的进位输入相连,用4片1bit全加器串行相接即可实现4bit全加器。
直接描述的Verilog代码会产生串行进位加法器:
//4位全加器,有低位向本位进位(即有输入进位) 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但是这种结构的缺点是,必须要等到上一片的结果算出来之后下一片才能进行工作,当级数很高的时候计算的时间将是每一片时间的n倍,会出现组合逻辑延时过长的问题。此时另一种进位方法——超前进位加法器就可以解决这一延时过高的问题。
2.超前进位加法器
超前进位加法器的原理是不等后级把进位算完再传过来,我们直接通过输入的数据把这个进位直接算出来发给每一级。
从上面的全加器讲解中我们知道,输出进位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; //分别对应Gi、Piwire [4:0] c; //对应Ciassign p = a | b; // Pi = Ai·Biassign g = a & b;// Gi = Ai+Biassign c[0] = cin; //C0就是第一片的输入进位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就是最后一片的输出进位 endmodule总结
以上是生活随笔为你收集整理的Verilog中的加法器(半加器,全加器,串行、超前进位加法器)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 组合电路Verilog的几种描述方式
- 下一篇: STM32的I/O口的八种工作模式