概述
之前学习了一位半加器与一/四位全加器的相关知识,接着学习超前进位加法器加深认识
八位级联进位加法器
设计文件
采用硬件行为方式描述八位全加器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
module qjq(co,sum,a,b,ci); input[7:0] a,b; input ci; output[7:0] sum; output co; reg[7:0] sum; reg co; reg[7:0] G,P,C; |
仿真结构图
仿真文件
1 2 3 4 5 6 7 8 9 10 11 12 13
|
module qjqsimu; reg [7:0] a,b; reg ci; wire [7:0] sum; wire co; qjq sl(co,sum,a,b,ci); initial begin a=8'b00000000;b=8'b00000000;ci=0; |
仿真波形
说明:首先在设计文件中,由最开始的进位输入ci逐级传递给c,最后传递给co,每位数据都需要传递一次上级数据,代码运算次数多,延时高。
四位超前进位加法器
设计文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
module qjq(sum,c_out,a,b,c_in); input[3:0] a,b; input c_in; output[3:0] sum; output c_out; wire[4:0] g,p,c; assign c[0]=c_in; assign p=a|b; assign g=a&b; 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=p^c[3:0]; assign c_out=c[4]; endmodule
|
仿真结构图
仿真文件
1 2 3 4 5 6 7 8 9 10 11 12 13
|
module qjqsimu; reg [3:0] a,b; reg c_in; wire [3:0] sum; wire c_out; qjq U3(.a(a),.b(b),.c_in(c_in),.sum(sum),.c_out(c_out)); initial begin a=4'b0000;b=4'b0000;c_in=0; end always #10 assign {a,b}={a,b}+1; always #5 assign c_in=~c_in; endmodule
|
仿真波形
说明:设计文件中对每一个进位的运算都进行了合并,总共计算8次,如果按照八位级联加法器的写法,每一位需进行4次运算,加上最后的进位,总共应需要17次计算。显然是提高了效率。
八位超前进位
刚入手八位超前进位加法器的话,写之前就在为进位链的表达式头疼,但是做了一下四位超前进位,可以总结出表达式的规律,进而再写一遍进行验证,与级联加法器的仿真结果完全相同,其设计文件源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
module qjq(co,sum,a,b,ci); input [7:0] a,b; input ci; output [7:0] sum; output co; wire [7:0] G,P,C; |