赞
踩
接下来几篇博客,我将介绍常见的几种加法器设计,包括超前进位、Kogge-Stone、brent-kung、carry-skip、Conditional-Sum等加法器的原理及Verilog实现。
本文将介绍行波进位加法器、超前进位加法器的原理及Verilog实现。
从下方原理图即可看出,行波进位加法器由一系列全加器级联而成,这种加法器面积小,由于每一比特的进位输入必须等待前一比特完成进位输出的计算,所以这种加法器的速度慢。
(1)完成单比特全加器的模块
- module full_adder(
- input a,
- input b,
- input c_in,
- output sum,
- output c_out
- );
-
- assign {c_out,sum} = a + b + c_in;
-
- endmodule
(2)全加器级联
- module RCA(
- input [3:0] a,
- input [3:0] b,
- input c_in,
- output [3:0] sum,
- output c_out
- );
-
- wire sum1,sum2,sum3,sum4;
- wire c_out1,c_out2,c_out3;
-
- assign sum = {sum4,sum3,sum2,sum1};
-
- full_adder f0(
- .a(a[0]),
- .b(b[0]),
- .c_in(c_in),
- .sum(sum1),
- .c_out(c_out1)
- );
-
- full_adder f1(
- .a(a[1]),
- .b(b[1]),
- .c_in(c_out1),
- .sum(sum2),
- .c_out(c_out2)
- );
-
- full_adder f2(
- .a(a[2]),
- .b(b[2]),
- .c_in(c_out2),
- .sum(sum3),
- .c_out(c_out3)
- );
-
- full_adder f3(
- .a(a[3]),
- .b(b[3]),
- .c_in(c_out3),
- .sum(sum4),
- .c_out(c_out)
- );
-
- endmodule
我们可以按A、B异或结果和A·B结果分成3组(表中用不同颜色进行区分),不难发现,第一组没有进位,第三组必有进位,第二组中Ci为1则有进位。因此可以通过这种特性提前得到进位。
定义:
根据真值表的特点可以推出:
因此,CLA的计算流程如下:
1) 对面向输入的第一层,并行预计算gi和pi
2) 计算进位ci
3) 根据pi和ci计算si
超前进位加法器优化改进行波进位器的关键路径,通过采用并行计算进位的方法,解决了行波进位加法器的进位依赖问题。然而对于大位宽的超前进位加法器,进位逻辑计算单元面积耗费大。
(1)pg单元设计
- module pg_cell(
- input a,
- input b,
- output g,
- output p
- );
-
- assign g = a & b;
- assign p = a ^ b;
-
- endmodule
(2)CLA实现
- module LCA #(width=4) (
- input [width-1:0] op1,
- input [width-1:0] op2,
- input cin,
- output [width-1:0] sum1,
- output [width-1:0] sum2,
- output cout,
- output cout2
- );
- //CLA
- wire [width-1:0] g;
- wire [width-1:0] p;
- wire [width:0] c;
- //gp generator
- genvar i;
- for( i=0; i<width; i=i+1) begin
- pg_cell pg_cell_u(
- .a( op1[i]),
- .b( op2[i]),
- .g( g[i] ),
- .p( p[i] )
- );
- end
- //carry generator
- assign c[0] = cin;
- assign c[1] = g[0] + ( c[0] & p[0] );
- assign c[2] = g[1] + ( (g[0] + ( c[0] & p[0]) ) & p[1] );
- assign c[3] = g[2] + ( (g[1] + ( (g[0] + (c[0] & p[0]) ) & p[1])) & p[2] );
- assign c[4] = g[3] + ( (g[2] + ( (g[1] + ( (g[0] + (c[0] & p[0]) ) & p[1])) & p[2] )) & p[3]);
- assign cout = c[width];
-
- genvar k;
- for( k=0; k<width; k=k+1) begin
- assign sum1[k] = p[k] ^ c[k];
- end
-
- endmodule
求学路上,你我共勉(๑•̀ㅂ•́)و✧
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。