简介
加法器是数字系统最基础的计算单元,用来产生两个数的和,加法器是以二进制做运算,负数是用二进制的补码来表示计算的,减法器也是加法器。
8bite并行加法器
并行加法器就是利用多个全加器实现两个操作数各位同时相加,并行加法器中全加器的个数与操作数的位数相同,常用的并行加法器有行波进位加法器,超前进位加法器,进位选择加法器,容易实现,运算速度快,但是资源耗的多
Verilog代码
module parallel_adder(
input [7:0] din_a , //data in a
input [7:0] din_b , //data in b
input cin , //carry in
output wire [ 7:0] sum , //sum
output wire cout // carry out
);
assign {cout , sum } = din_a + din_b +cin ;
endmodule
8 bit超前进位加法器
超前进位加法器是由全加器发展而来,目的提高运算速度,当加法器的级数提高时,高位的进位信号需要从低级逐级传递,为了缩短这个时间,我们可以从低级的输入信号确定一个组合逻辑电路,唯一确定一个高位的进位信号,从而提高运行速度,超前进位加法器也称为快速进位加法器,目的是缩短进位信号的生成时间
从图中可以很好的理解加法器的组成,但是等下一级将进位计算完成传递上来,每一位都这样计算,需要时间很长。所以我们可以想可不可以不等后级把进位算完再传过来,我们直接通过输入的数据把这个进位直接算出来发给每一级不就好了。我们看看怎么实现这样的想法.
简单的一级加法器的进位信号的计算方式:
4级的加法器进位信息如下:
module Carry_Look_ahead_adder (
input [7:0] din_a , // data in a
input [7:0] din_b , // data in b
input cin , // carry in
output wire cout , // carry out
output wire [7:0] sum // summation of a ,b
);
wire [7:0] G ;
wire [7:0] P ;
wire [7:0] C ;
assign G[0] = din_a[0] & din_b[0] ; //bit 0
assign P[0] = din_a[0] | din_b[0] ;
assign C[0] = cin ;
assign sum[0] = G[0] ^ P[0] ^ C[0] ;
assign G[1] = din_a[1] & din_b[1] ; //bit 1
assign P[1] = din_a[1] | din_b[1] ;
assign C[1] = G[0] | (P[0] & cin) ;
assign sum[1] = G[1] ^ P[1] ^ C[1] ;
assign G[2] = din_a[2] & din_b[2] ; //bit 2
assign P[2] = din_a[2] | din_b[2] ;
assign C[2] = G[1] | (P[1] & C[1]) ;
assign sum[2] = G[2] ^ P[2] ^ C[2] ;
assign G[3] = din_a[3] & din_b[3] ; //bit 3
assign P[3] = din_a[3] | din_b[3] ;
assign C[3] = G[2] | (P[2] & C[2]) ;
assign sum[3] = G[3] ^ P[3] ^ C[3] ;
assign G[4] = din_a[4] & din_b[4] ; //bit 4
assign P[4] = din_a[4] | din_b[4] ;
assign C[4] = G[3] | (P[3] & C[3]) ;
assign sum[4] = G[4] ^ P[4] ^ C[4] ;
assign G[5] = din_a[5] & din_b[5] ; //bit 5
assign P[5] = din_a[5] | din_b[5] ;
assign C[5] = G[4] | (P[4] & C[4]) ;
assign sum[5] = G[5] ^ P[5] ^ C[5] ;
assign G[6] = din_a[6] & din_b[6] ; //bit 6
assign P[6] = din_a[6] | din_b[6] ;
assign C[6] = G[5] | (P[5] & C[5]) ;
assign sum[6] = G[6] ^ P[6] ^ C[6] ;
assign G[7] = din_a[7] & din_b[7] ; //bit 7
assign P[7] = din_a[7] | din_b[7] ;
assign C[7] = G[6] | (P[6] & C[6]) ;
assign sum[7] = G[7] ^ P[7] ^ C[7] ;
assign cout = G[7] | (P[7] & C[7]) ;
endmodule
8bit流水线加法器
流水线设计可以调高效率
Verilog代码
module Pipeline_adder (
input [7:0] din_a , // data in a
input [7:0] din_b , // data in b
input cin , // Carry in
input clk , // Clock
output reg [7:0] sum , // Sum
output reg cout // Carry out
);
reg [7:0] a_t ;
reg [7:0] b_t ;
//carry in & out
reg ci_t ;
reg p1co ;
reg p2co ;
reg p3co ;
reg [5:0] p1a ;
reg [5:0] p1b ;
reg [1:0] p1s ;
reg [3:0] p2a ;
reg [3:0] p2b ;
reg [3:0] p2s ;
reg [1:0] p3a ;
reg [1:0] p3b ;
reg [5:0] p3s ;
always@(posedge clk) begin
a_t <= din_a ;
b_t <= din_b ;
ci_t <= cin ;
end
always@(posedge clk ) begin
{p1co,p1s} <= a_t[1:0] + b_t[1:0] + ci_t ;
p1a <= a_t[7:2] ;
p1b <= b_t[7:2] ;
end
always@(posedge clk ) begin
{p2co,p2s} <= p1a[1:0] + p1b[1:0] + p1co + p1s ;
p2a <= p1a[5:2] ;
p2b <= p1b[5:2] ;
end
always@(posedge clk ) begin
{p3co,p3s} <= p2a[1:0] + p2b[1:0] + p2co + p2s ;
p3a <= p1a[3:2] ;
p3b <= p1b[3:2] ;
end
always@(posedge clk ) begin
{cout,sum} <= p3a[1:0] + p3b[1:0] + p3co + p3s ;
end
endmodule
8bit级联加法器
级联加法器的结构简单,N位级联加法器的延时是一位全加器的N倍,延时主要是由于进位信号级联造成的,避免在高新能要求设计中使用。
// -----------------------------------------------------------------------------
module Cascade_adder(
input [7:0] a , //data in a
input [7:0] b , //data in b
input cin , //carry in
output wire cout , //carry out
output wire [7:0] sum //sum
);
//signal
wire cin1 ;
wire cin2 ;
wire cin3 ;
wire cin4 ;
wire cin5 ;
wire cin6 ;
wire cin7 ;
// inst cascade desc
full_add1 f0(
.a (a[0] ),
.b (b[0] ),
.cin (cin ),
.cout (cin1 ),
.sum (sum[0] )
);
full_add1 f1(
.a (a[1] ),
.b (b[1] ),
.cin (cin1 ),
.cout (cin2 ),
.sum (sum[1] )
);
full_add1 f2(
.a (a[2] ),
.b (b[2] ),
.cin (cin2 ),
.cout (cin3 ),
.sum (sum[2] )
);
full_add1 f3(
.a (a[3] ),
.b (b[3] ),
.cin (cin3 ),
.cout (cin4 ),
.sum (sum[3] )
);
full_add1 f4(
.a (a[4] ),
.b (b[4] ),
.cin (cin4 ),
.cout (cin5 ),
.sum (sum[4] )
);
full_add1 f5(
.a (a[5] ),
.b (b[5] ),
.cin (cin5 ),
.cout (cin6 ),
.sum (sum[5] )
);
full_add1 f6(
.a (a[6] ),
.b (b[6] ),
.cin (cin6 ),
.cout (cin7 ),
.sum (sum[6] )
);
full_add1 f7(
.a (a[7] ),
.b (b[7] ),
.cin (cin7 ),
.cout (cout ),
.sum (sum[7] )
);
endmodule
8bit的全加器
// -----------------------------------------------------------------------------
module full_add1 (
input a , // data in a
input b , // data in b
input cin , // carry in
output sum , // sum
output cout // carry out
);
//signal
wire s1 ;
wire m1 ;
wire m2 ;
wire m3 ;
and (m1,a,b ),
(m2,b,cin ),
(m3,a,cin );
xor (s1,a,b ),
(sum,s1,cin );
or (cout,m1,m2,m3);
endmodule
总结: