天天看點

Verilog實作加法器 行波進位(ripple carry)加法器,超前進位加法器

行波進位(ripple carry)加法器,将單個一比特全加器相連接配接,輸出加法和以及進位

首先先寫好單比特全加器的子產品

module full_adder(
		input a,
		input b,
		input c_in,
		output sum,
		output c_out);
		
	assign {c_out,sum} = a + b + c_in;
	
endmodule	
           

在行波進位加法器實作中,将N個全加器相連來實作N位數加法

module ripple_carry_adder(
		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 m0(
		.a(a[0]),
		.b(b[0]),
		.c_in(c_in),
		.sum(sum1),
		.c_out(c_out1));
		
	full_adder m1(
		.a(a[1]),
		.b(b[1]),
		.c_in(c_out1),
		.sum(sum2),
		.c_out(c_out2));
		
	full_adder m2(
		.a(a[2]),
		.b(b[2]),
		.c_in(c_out2),
		.sum(sum3),
		.c_out(c_out3));
		
	full_adder m3(
		.a(a[3]),
		.b(b[3]),
		.c_in(c_out3),
		.sum(sum4),
		.c_out(c_out));
	
endmodule
           

行波進位加法器testbench

module sim_ripple_carry_adder;

    reg [3:0] a;
    reg [3:0] b;
    reg c_in;
    wire [3:0] sum;
    wire c_out;
    
    ripple_carry_adder m (
		.a(a),
		.b(b),
		.c_in(c_in),
		.sum(sum),
		.c_out(c_out));
		
	initial
	   begin
	       a = 4'b1011;
	       b = 4'b1111;
	       c_in = 1'b0;
	   end

endmodule
           

功能仿真結果

Verilog實作加法器 行波進位(ripple carry)加法器,超前進位加法器

RTL結構

Verilog實作加法器 行波進位(ripple carry)加法器,超前進位加法器

超前進位加法器

module carry_lookahead_adder(
			input [3:0] a,
			input [3:0] b,
			input c_in,
			output [3:0] sum,
			output c_out);
			
		wire [3:0] G;
		wire [3:0] P;
		
        assign G = a&b;
        assign P = a^b;
        
		wire [4:0] c;
		assign c[0] = c_in;
		assign c[1] = G[0]|(P[0]&c_in);
		assign c[2] = G[1]|(P[1]&G[0])|(P[1]&P[0]&c_in);
		assign c[3] = G[2]|(P[2]&G[1])|(P[2]&P[1]&G[0])|(P[2]&P[1]&P[0]&c_in);
		assign c[4] = G[3]|(P[3]&G[2])|(P[3]&P[2]&G[1])|(P[3]&P[2]&P[1]&G[0])|(P[3]&P[2]&P[1]&P[0]&c_in);
		
		
		assign sum = a^b^c[3:0];
		assign c_out = c[4];
		
endmodule

           

testbench

`timescale 1ns / 1ps

module sim_carry_lookahead_adder;

        reg [3:0] a;
        reg [3:0] b;
        reg c_in;
        wire [3:0] sum;
        wire c_out;

          carry_lookahead_adder m0(
			.a(a),
			.b(b),
			.c_in(c_in),
			.sum(sum),
			.c_out(c_out));
			
		initial
		  begin
		      a = 4'b1001;
		      b = 4'b1111;
		      c_in = 1'b1;
		  end
endmodule

           
Verilog實作加法器 行波進位(ripple carry)加法器,超前進位加法器