Created
May 30, 2018 02:22
-
-
Save jeongukjae/eaf464ca0b11aab07d42d19bd283abc2 to your computer and use it in GitHub Desktop.
4 bit Ripple Carry Adder using Verilog
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module full_adder(in0, in1, cin, out, cout); | |
input in0, in1, cin; | |
output out, cout; | |
assign out = in0 ^ in1 ^ cin; | |
assign cout = ((in0 ^ in1) & cin) | (in0 & in1); | |
endmodule |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module ripple_carry_adder(in0, in1, out, cout); | |
input [3:0] in0; | |
input [3:0] in1; | |
output [3:0] out; | |
output cout; | |
wire c1, c2, c3; | |
full_adder fa0(in0[0], in1[0], 0, out[0], c1); | |
full_adder fa1(in0[1], in1[1], c1, out[1], c2); | |
full_adder fa2(in0[2], in1[2], c2, out[2], c3); | |
full_adder fa3(in0[3], in1[3], c3, out[3], cout); | |
endmodule |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module ripple_carry_adder_tb; | |
reg [3:0] in0; | |
reg [3:0] in1; | |
wire [3:0] out; | |
wire cout; | |
ripple_carry_adder rca(.in0(in0), .in1(in1), .out(out), .cout(cout)); | |
initial begin | |
in0 = 4'b0000; in1 = 4'b0000; #10 | |
in0 = 4'b0000; in1 = 4'b0001; #10 | |
in0 = 4'b0000; in1 = 4'b0010; #10 | |
in0 = 4'b0000; in1 = 4'b0011; #10 | |
in0 = 4'b0000; in1 = 4'b0100; #10 | |
in0 = 4'b0000; in1 = 4'b0101; #10 | |
in0 = 4'b0000; in1 = 4'b0110; #10 | |
in0 = 4'b0000; in1 = 4'b0111; #10 | |
in0 = 4'b0000; in1 = 4'b1000; #10 | |
in0 = 4'b0000; in1 = 4'b1001; #10 | |
in0 = 4'b0000; in1 = 4'b1010; #10 | |
in0 = 4'b0000; in1 = 4'b1011; #10 | |
in0 = 4'b0000; in1 = 4'b1100; #10 | |
in0 = 4'b0000; in1 = 4'b1101; #10 | |
in0 = 4'b0000; in1 = 4'b1110; #10 | |
in0 = 4'b0000; in1 = 4'b1111; #10 | |
in0 = 4'b0001; in1 = 4'b0000; #10 | |
in0 = 4'b0001; in1 = 4'b0001; #10 | |
in0 = 4'b0001; in1 = 4'b0010; #10 | |
in0 = 4'b0001; in1 = 4'b0011; #10 | |
in0 = 4'b0001; in1 = 4'b0100; #10 | |
in0 = 4'b0001; in1 = 4'b0101; #10 | |
in0 = 4'b0001; in1 = 4'b0110; #10 | |
in0 = 4'b0001; in1 = 4'b0111; #10 | |
in0 = 4'b0001; in1 = 4'b1000; #10 | |
in0 = 4'b0001; in1 = 4'b1001; #10 | |
in0 = 4'b0001; in1 = 4'b1010; #10 | |
in0 = 4'b0001; in1 = 4'b1011; #10 | |
in0 = 4'b0001; in1 = 4'b1100; #10 | |
in0 = 4'b0001; in1 = 4'b1101; #10 | |
in0 = 4'b0001; in1 = 4'b1110; #10 | |
in0 = 4'b0001; in1 = 4'b1111; #10 | |
in0 = 4'b0010; in1 = 4'b0000; #10 | |
in0 = 4'b0010; in1 = 4'b0001; #10 | |
in0 = 4'b0010; in1 = 4'b0010; #10 | |
in0 = 4'b0010; in1 = 4'b0011; #10 | |
in0 = 4'b0010; in1 = 4'b0100; #10 | |
in0 = 4'b0010; in1 = 4'b0101; #10 | |
in0 = 4'b0010; in1 = 4'b0110; #10 | |
in0 = 4'b0010; in1 = 4'b0111; #10 | |
in0 = 4'b0010; in1 = 4'b1000; #10 | |
in0 = 4'b0010; in1 = 4'b1001; #10 | |
in0 = 4'b0010; in1 = 4'b1010; #10 | |
in0 = 4'b0010; in1 = 4'b1011; #10 | |
in0 = 4'b0010; in1 = 4'b1100; #10 | |
in0 = 4'b0010; in1 = 4'b1101; #10 | |
in0 = 4'b0010; in1 = 4'b1110; #10 | |
in0 = 4'b0010; in1 = 4'b1111; #10 | |
in0 = 4'b0011; in1 = 4'b0000; #10 | |
in0 = 4'b0011; in1 = 4'b0001; #10 | |
in0 = 4'b0011; in1 = 4'b0010; #10 | |
in0 = 4'b0011; in1 = 4'b0011; #10 | |
in0 = 4'b0011; in1 = 4'b0100; #10 | |
in0 = 4'b0011; in1 = 4'b0101; #10 | |
in0 = 4'b0011; in1 = 4'b0110; #10 | |
in0 = 4'b0011; in1 = 4'b0111; #10 | |
in0 = 4'b0011; in1 = 4'b1000; #10 | |
in0 = 4'b0011; in1 = 4'b1001; #10 | |
in0 = 4'b0011; in1 = 4'b1010; #10 | |
in0 = 4'b0011; in1 = 4'b1011; #10 | |
in0 = 4'b0011; in1 = 4'b1100; #10 | |
in0 = 4'b0011; in1 = 4'b1101; #10 | |
in0 = 4'b0011; in1 = 4'b1110; #10 | |
in0 = 4'b0011; in1 = 4'b1111; #10 | |
in0 = 4'b0100; in1 = 4'b0000; #10 | |
in0 = 4'b0100; in1 = 4'b0001; #10 | |
in0 = 4'b0100; in1 = 4'b0010; #10 | |
in0 = 4'b0100; in1 = 4'b0011; #10 | |
in0 = 4'b0100; in1 = 4'b0100; #10 | |
in0 = 4'b0100; in1 = 4'b0101; #10 | |
in0 = 4'b0100; in1 = 4'b0110; #10 | |
in0 = 4'b0100; in1 = 4'b0111; #10 | |
in0 = 4'b0100; in1 = 4'b1000; #10 | |
in0 = 4'b0100; in1 = 4'b1001; #10 | |
in0 = 4'b0100; in1 = 4'b1010; #10 | |
in0 = 4'b0100; in1 = 4'b1011; #10 | |
in0 = 4'b0100; in1 = 4'b1100; #10 | |
in0 = 4'b0100; in1 = 4'b1101; #10 | |
in0 = 4'b0100; in1 = 4'b1110; #10 | |
in0 = 4'b0100; in1 = 4'b1111; #10 | |
in0 = 4'b0101; in1 = 4'b0000; #10 | |
in0 = 4'b0101; in1 = 4'b0001; #10 | |
in0 = 4'b0101; in1 = 4'b0010; #10 | |
in0 = 4'b0101; in1 = 4'b0011; #10 | |
in0 = 4'b0101; in1 = 4'b0100; #10 | |
in0 = 4'b0101; in1 = 4'b0101; #10 | |
in0 = 4'b0101; in1 = 4'b0110; #10 | |
in0 = 4'b0101; in1 = 4'b0111; #10 | |
in0 = 4'b0101; in1 = 4'b1000; #10 | |
in0 = 4'b0101; in1 = 4'b1001; #10 | |
in0 = 4'b0101; in1 = 4'b1010; #10 | |
in0 = 4'b0101; in1 = 4'b1011; #10 | |
in0 = 4'b0101; in1 = 4'b1100; #10 | |
in0 = 4'b0101; in1 = 4'b1101; #10 | |
in0 = 4'b0101; in1 = 4'b1110; #10 | |
in0 = 4'b0101; in1 = 4'b1111; #10 | |
in0 = 4'b0110; in1 = 4'b0000; #10 | |
in0 = 4'b0110; in1 = 4'b0001; #10 | |
in0 = 4'b0110; in1 = 4'b0010; #10 | |
in0 = 4'b0110; in1 = 4'b0011; #10 | |
in0 = 4'b0110; in1 = 4'b0100; #10 | |
in0 = 4'b0110; in1 = 4'b0101; #10 | |
in0 = 4'b0110; in1 = 4'b0110; #10 | |
in0 = 4'b0110; in1 = 4'b0111; #10 | |
in0 = 4'b0110; in1 = 4'b1000; #10 | |
in0 = 4'b0110; in1 = 4'b1001; #10 | |
in0 = 4'b0110; in1 = 4'b1010; #10 | |
in0 = 4'b0110; in1 = 4'b1011; #10 | |
in0 = 4'b0110; in1 = 4'b1100; #10 | |
in0 = 4'b0110; in1 = 4'b1101; #10 | |
in0 = 4'b0110; in1 = 4'b1110; #10 | |
in0 = 4'b0110; in1 = 4'b1111; #10 | |
in0 = 4'b0111; in1 = 4'b0000; #10 | |
in0 = 4'b0111; in1 = 4'b0001; #10 | |
in0 = 4'b0111; in1 = 4'b0010; #10 | |
in0 = 4'b0111; in1 = 4'b0011; #10 | |
in0 = 4'b0111; in1 = 4'b0100; #10 | |
in0 = 4'b0111; in1 = 4'b0101; #10 | |
in0 = 4'b0111; in1 = 4'b0110; #10 | |
in0 = 4'b0111; in1 = 4'b0111; #10 | |
in0 = 4'b0111; in1 = 4'b1000; #10 | |
in0 = 4'b0111; in1 = 4'b1001; #10 | |
in0 = 4'b0111; in1 = 4'b1010; #10 | |
in0 = 4'b0111; in1 = 4'b1011; #10 | |
in0 = 4'b0111; in1 = 4'b1100; #10 | |
in0 = 4'b0111; in1 = 4'b1101; #10 | |
in0 = 4'b0111; in1 = 4'b1110; #10 | |
in0 = 4'b0111; in1 = 4'b1111; #10 | |
in0 = 4'b1000; in1 = 4'b0000; #10 | |
in0 = 4'b1000; in1 = 4'b0001; #10 | |
in0 = 4'b1000; in1 = 4'b0010; #10 | |
in0 = 4'b1000; in1 = 4'b0011; #10 | |
in0 = 4'b1000; in1 = 4'b0100; #10 | |
in0 = 4'b1000; in1 = 4'b0101; #10 | |
in0 = 4'b1000; in1 = 4'b0110; #10 | |
in0 = 4'b1000; in1 = 4'b0111; #10 | |
in0 = 4'b1000; in1 = 4'b1000; #10 | |
in0 = 4'b1000; in1 = 4'b1001; #10 | |
in0 = 4'b1000; in1 = 4'b1010; #10 | |
in0 = 4'b1000; in1 = 4'b1011; #10 | |
in0 = 4'b1000; in1 = 4'b1100; #10 | |
in0 = 4'b1000; in1 = 4'b1101; #10 | |
in0 = 4'b1000; in1 = 4'b1110; #10 | |
in0 = 4'b1000; in1 = 4'b1111; #10 | |
in0 = 4'b1001; in1 = 4'b0000; #10 | |
in0 = 4'b1001; in1 = 4'b0001; #10 | |
in0 = 4'b1001; in1 = 4'b0010; #10 | |
in0 = 4'b1001; in1 = 4'b0011; #10 | |
in0 = 4'b1001; in1 = 4'b0100; #10 | |
in0 = 4'b1001; in1 = 4'b0101; #10 | |
in0 = 4'b1001; in1 = 4'b0110; #10 | |
in0 = 4'b1001; in1 = 4'b0111; #10 | |
in0 = 4'b1001; in1 = 4'b1000; #10 | |
in0 = 4'b1001; in1 = 4'b1001; #10 | |
in0 = 4'b1001; in1 = 4'b1010; #10 | |
in0 = 4'b1001; in1 = 4'b1011; #10 | |
in0 = 4'b1001; in1 = 4'b1100; #10 | |
in0 = 4'b1001; in1 = 4'b1101; #10 | |
in0 = 4'b1001; in1 = 4'b1110; #10 | |
in0 = 4'b1001; in1 = 4'b1111; #10 | |
in0 = 4'b1010; in1 = 4'b0000; #10 | |
in0 = 4'b1010; in1 = 4'b0001; #10 | |
in0 = 4'b1010; in1 = 4'b0010; #10 | |
in0 = 4'b1010; in1 = 4'b0011; #10 | |
in0 = 4'b1010; in1 = 4'b0100; #10 | |
in0 = 4'b1010; in1 = 4'b0101; #10 | |
in0 = 4'b1010; in1 = 4'b0110; #10 | |
in0 = 4'b1010; in1 = 4'b0111; #10 | |
in0 = 4'b1010; in1 = 4'b1000; #10 | |
in0 = 4'b1010; in1 = 4'b1001; #10 | |
in0 = 4'b1010; in1 = 4'b1010; #10 | |
in0 = 4'b1010; in1 = 4'b1011; #10 | |
in0 = 4'b1010; in1 = 4'b1100; #10 | |
in0 = 4'b1010; in1 = 4'b1101; #10 | |
in0 = 4'b1010; in1 = 4'b1110; #10 | |
in0 = 4'b1010; in1 = 4'b1111; #10 | |
in0 = 4'b1011; in1 = 4'b0000; #10 | |
in0 = 4'b1011; in1 = 4'b0001; #10 | |
in0 = 4'b1011; in1 = 4'b0010; #10 | |
in0 = 4'b1011; in1 = 4'b0011; #10 | |
in0 = 4'b1011; in1 = 4'b0100; #10 | |
in0 = 4'b1011; in1 = 4'b0101; #10 | |
in0 = 4'b1011; in1 = 4'b0110; #10 | |
in0 = 4'b1011; in1 = 4'b0111; #10 | |
in0 = 4'b1011; in1 = 4'b1000; #10 | |
in0 = 4'b1011; in1 = 4'b1001; #10 | |
in0 = 4'b1011; in1 = 4'b1010; #10 | |
in0 = 4'b1011; in1 = 4'b1011; #10 | |
in0 = 4'b1011; in1 = 4'b1100; #10 | |
in0 = 4'b1011; in1 = 4'b1101; #10 | |
in0 = 4'b1011; in1 = 4'b1110; #10 | |
in0 = 4'b1011; in1 = 4'b1111; #10 | |
in0 = 4'b1100; in1 = 4'b0000; #10 | |
in0 = 4'b1100; in1 = 4'b0001; #10 | |
in0 = 4'b1100; in1 = 4'b0010; #10 | |
in0 = 4'b1100; in1 = 4'b0011; #10 | |
in0 = 4'b1100; in1 = 4'b0100; #10 | |
in0 = 4'b1100; in1 = 4'b0101; #10 | |
in0 = 4'b1100; in1 = 4'b0110; #10 | |
in0 = 4'b1100; in1 = 4'b0111; #10 | |
in0 = 4'b1100; in1 = 4'b1000; #10 | |
in0 = 4'b1100; in1 = 4'b1001; #10 | |
in0 = 4'b1100; in1 = 4'b1010; #10 | |
in0 = 4'b1100; in1 = 4'b1011; #10 | |
in0 = 4'b1100; in1 = 4'b1100; #10 | |
in0 = 4'b1100; in1 = 4'b1101; #10 | |
in0 = 4'b1100; in1 = 4'b1110; #10 | |
in0 = 4'b1100; in1 = 4'b1111; #10 | |
in0 = 4'b1101; in1 = 4'b0000; #10 | |
in0 = 4'b1101; in1 = 4'b0001; #10 | |
in0 = 4'b1101; in1 = 4'b0010; #10 | |
in0 = 4'b1101; in1 = 4'b0011; #10 | |
in0 = 4'b1101; in1 = 4'b0100; #10 | |
in0 = 4'b1101; in1 = 4'b0101; #10 | |
in0 = 4'b1101; in1 = 4'b0110; #10 | |
in0 = 4'b1101; in1 = 4'b0111; #10 | |
in0 = 4'b1101; in1 = 4'b1000; #10 | |
in0 = 4'b1101; in1 = 4'b1001; #10 | |
in0 = 4'b1101; in1 = 4'b1010; #10 | |
in0 = 4'b1101; in1 = 4'b1011; #10 | |
in0 = 4'b1101; in1 = 4'b1100; #10 | |
in0 = 4'b1101; in1 = 4'b1101; #10 | |
in0 = 4'b1101; in1 = 4'b1110; #10 | |
in0 = 4'b1101; in1 = 4'b1111; #10 | |
in0 = 4'b1110; in1 = 4'b0000; #10 | |
in0 = 4'b1110; in1 = 4'b0001; #10 | |
in0 = 4'b1110; in1 = 4'b0010; #10 | |
in0 = 4'b1110; in1 = 4'b0011; #10 | |
in0 = 4'b1110; in1 = 4'b0100; #10 | |
in0 = 4'b1110; in1 = 4'b0101; #10 | |
in0 = 4'b1110; in1 = 4'b0110; #10 | |
in0 = 4'b1110; in1 = 4'b0111; #10 | |
in0 = 4'b1110; in1 = 4'b1000; #10 | |
in0 = 4'b1110; in1 = 4'b1001; #10 | |
in0 = 4'b1110; in1 = 4'b1010; #10 | |
in0 = 4'b1110; in1 = 4'b1011; #10 | |
in0 = 4'b1110; in1 = 4'b1100; #10 | |
in0 = 4'b1110; in1 = 4'b1101; #10 | |
in0 = 4'b1110; in1 = 4'b1110; #10 | |
in0 = 4'b1110; in1 = 4'b1111; #10 | |
in0 = 4'b1111; in1 = 4'b0000; #10 | |
in0 = 4'b1111; in1 = 4'b0001; #10 | |
in0 = 4'b1111; in1 = 4'b0010; #10 | |
in0 = 4'b1111; in1 = 4'b0011; #10 | |
in0 = 4'b1111; in1 = 4'b0100; #10 | |
in0 = 4'b1111; in1 = 4'b0101; #10 | |
in0 = 4'b1111; in1 = 4'b0110; #10 | |
in0 = 4'b1111; in1 = 4'b0111; #10 | |
in0 = 4'b1111; in1 = 4'b1000; #10 | |
in0 = 4'b1111; in1 = 4'b1001; #10 | |
in0 = 4'b1111; in1 = 4'b1010; #10 | |
in0 = 4'b1111; in1 = 4'b1011; #10 | |
in0 = 4'b1111; in1 = 4'b1100; #10 | |
in0 = 4'b1111; in1 = 4'b1101; #10 | |
in0 = 4'b1111; in1 = 4'b1110; #10 | |
in0 = 4'b1111; in1 = 4'b1111; | |
end | |
initial begin | |
$dumpfile("ripple-carry-adder.vcd"); | |
$dumpvars(0, ripple_carry_adder_tb); | |
$monitor($time, ": %b + %b = %b, %b", in0, in1, out, cout); | |
end | |
endmodule |
Would be nice to change up the testbench in a more compact way. Nice example nevertheless.
module ripple_carry_adder_tb ();
reg [3:0] in0 = 4'b0, in1 = 4'b0;
wire [3:0] out;
wire cout;
ripple_carry_adder rca(.in0(in0), .in1(in1), .out(out), .cout(cout));
initial repeat(255) #10 {in0,in1} = {in0,in1} + 8'b1;
initial begin
$dumpfile("ripple-carry-adder.vcd");
$dumpvars(0, ripple_carry_adder_tb);
$monitor($time, ": %b + %b = %b, %b", in0, in1, out, cout);
end
endmodule
Apologies for replying 5 years after the code was released, but an uni teacher of mine used this code as an example of a solution and I couldn't help but want to correct it.
Thanks for sharing your code by the way, its always helpful for beginners to see examples like this!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
You can use for loop instead of writing all conditions