first commit

This commit is contained in:
Jose Luis Montañes Ojados
2026-02-28 21:59:55 +01:00
commit d094ff3148
21 changed files with 2286 additions and 0 deletions

45
full_adder/full_adder.v Normal file
View File

@@ -0,0 +1,45 @@
/*
Full Adder Declaration
A B Cin | Sum Cout
0 0 0 | 0 0
0 0 1 | 1 0
0 1 0 | 1 0
0 1 1 | 0 1
1 0 0 | 1 0
1 0 1 | 0 1
1 1 0 | 0 1
1 1 1 | 1 1
*/
`include "./half_adder/half_adder.v"
module full_adder_structural (carry_in, a, b, sum, carry_out);
input carry_in, a, b;
output sum, carry_out;
wire add1_sum, add1_carry;
wire add2_carry;
half_adder add1(a, b, add1_sum, add1_carry);
half_adder add2(add1_sum, carry_in, sum, add2_carry);
or final_or(carry_out, add1_carry, add2_carry);
endmodule
module full_adder_dataflow (carry_in, a, b, sum, carry_out);
input carry_in, a, b;
output sum, carry_out;
assign sum = a ^ b ^ carry_in;
assign carry_out = (a & b) | (carry_in & (a ^ b));
endmodule
module full_adder_behavioral (carry_in, a, b, sum, carry_out);
input carry_in, a, b;
output reg sum, carry_out;
always @(*) begin
sum = a ^ b ^ carry_in;
carry_out = (a & b) | (carry_in & (a ^ b));
end
endmodule

69
full_adder/full_adder.vcd Normal file
View File

@@ -0,0 +1,69 @@
$date
Sat Feb 28 20:25:22 2026
$end
$version
Icarus Verilog
$end
$timescale
1s
$end
$scope module full_adder_tb $end
$var wire 1 ! carry_out $end
$var wire 1 " sum $end
$var reg 1 # a $end
$var reg 1 $ b $end
$var reg 1 % carry_in $end
$scope module full_adder $end
$var wire 1 & a $end
$var wire 1 ' b $end
$var wire 1 ( carry_in $end
$var reg 1 ) carry_out $end
$var reg 1 * sum $end
$upscope $end
$upscope $end
$enddefinitions $end
#0
$dumpvars
0*
0)
0(
0'
0&
0%
0$
0#
0"
0!
$end
#1
1*
1"
1%
1(
#2
0*
0"
0%
0(
#3
1*
1"
1#
1&
#4
1)
1!
0*
0"
1%
1(
#5
0%
0(
1$
1'
#6
1*
1"
1%
1(

154
full_adder/full_adder.vvp Normal file
View File

@@ -0,0 +1,154 @@
#! /c/iverilog/bin/vvp
:ivl_version "0.9.7 " "(v0_9_7)";
:vpi_time_precision + 0;
:vpi_module "system";
:vpi_module "v2005_math";
:vpi_module "va_math";
S_01022BC0 .scope module, "full_adder_dataflow" "full_adder_dataflow" 2 29;
.timescale 0 0;
L_000ED8B8 .functor XOR 1, C4<z>, C4<z>, C4<0>, C4<0>;
L_000ED8F0 .functor XOR 1, L_000ED8B8, C4<z>, C4<0>, C4<0>;
L_0105BC40 .functor AND 1, C4<z>, C4<z>, C4<1>, C4<1>;
L_0105BE00 .functor XOR 1, C4<z>, C4<z>, C4<0>, C4<0>;
L_0105BFC0 .functor AND 1, C4<z>, L_0105BE00, C4<1>, C4<1>;
L_0105BC78 .functor OR 1, L_0105BC40, L_0105BFC0, C4<0>, C4<0>;
v000ED828_0 .net *"_s0", 0 0, L_000ED8B8; 1 drivers
v01030E00_0 .net *"_s4", 0 0, L_0105BC40; 1 drivers
v01031278_0 .net *"_s6", 0 0, L_0105BE00; 1 drivers
v01030FB8_0 .net *"_s8", 0 0, L_0105BFC0; 1 drivers
v01030F60_0 .net "a", 0 0, C4<z>; 0 drivers
v01030CF8_0 .net "b", 0 0, C4<z>; 0 drivers
v01030E58_0 .net "carry_in", 0 0, C4<z>; 0 drivers
v010311C8_0 .net "carry_out", 0 0, L_0105BC78; 1 drivers
v01030D50_0 .net "sum", 0 0, L_000ED8F0; 1 drivers
S_01023220 .scope module, "full_adder_structural" "full_adder_structural" 2 16;
.timescale 0 0;
L_0105C2F0 .functor OR 1, L_0105BD90, L_0105C750, C4<0>, C4<0>;
v01031068_0 .net "a", 0 0, C4<z>; 0 drivers
v01031430_0 .net "add1_carry", 0 0, L_0105BD90; 1 drivers
v01031118_0 .net "add1_sum", 0 0, L_0105BCB0; 1 drivers
v01031170_0 .net "add2_carry", 0 0, L_0105C750; 1 drivers
v01030DA8_0 .net "b", 0 0, C4<z>; 0 drivers
v01030F08_0 .net "carry_in", 0 0, C4<z>; 0 drivers
v0105B3D0_0 .net "carry_out", 0 0, L_0105C2F0; 1 drivers
v0105B270_0 .net "sum", 0 0, L_0105BF88; 1 drivers
S_01022AB0 .scope module, "add1" "half_adder" 2 23, 3 5, S_01023220;
.timescale 0 0;
L_0105BCB0 .functor XOR 1, C4<z>, C4<z>, C4<0>, C4<0>;
L_0105BD90 .functor AND 1, C4<z>, C4<z>, C4<1>, C4<1>;
v010312D0_0 .alias "a", 0 0, v01031068_0;
v01030EB0_0 .alias "b", 0 0, v01030DA8_0;
v01031328_0 .alias "carry", 0 0, v01031430_0;
v01031380_0 .alias "sum", 0 0, v01031118_0;
S_01023660 .scope module, "add2" "half_adder" 2 24, 3 5, S_01023220;
.timescale 0 0;
L_0105BF88 .functor XOR 1, L_0105BCB0, C4<z>, C4<0>, C4<0>;
L_0105C750 .functor AND 1, L_0105BCB0, C4<z>, C4<1>, C4<1>;
v01031010_0 .alias "a", 0 0, v01031118_0;
v010313D8_0 .alias "b", 0 0, v01030F08_0;
v01031220_0 .alias "carry", 0 0, v01031170_0;
v010310C0_0 .alias "sum", 0 0, v0105B270_0;
S_010234C8 .scope module, "full_adder_tb" "full_adder_tb" 4 6;
.timescale 0 0;
v0105B588_0 .var "a", 0 0;
v0105B2C8_0 .var "b", 0 0;
v0105B320_0 .var "carry_in", 0 0;
v0105B1C0_0 .net "carry_out", 0 0, v0105B110_0; 1 drivers
v0105B638_0 .net "sum", 0 0, v0105ADA0_0; 1 drivers
S_010229A0 .scope module, "full_adder" "full_adder_behavioral" 4 10, 2 37, S_010234C8;
.timescale 0 0;
v0105B218_0 .net "a", 0 0, v0105B588_0; 1 drivers
v0105B5E0_0 .net "b", 0 0, v0105B2C8_0; 1 drivers
v0105B008_0 .net "carry_in", 0 0, v0105B320_0; 1 drivers
v0105B110_0 .var "carry_out", 0 0;
v0105ADA0_0 .var "sum", 0 0;
E_01023A48 .event edge, v0105B218_0, v0105B5E0_0, v0105B008_0;
S_01022EF0 .scope module, "half_adder_behavioral" "half_adder_behavioral" 3 21;
.timescale 0 0;
v0105AC98_0 .net "a", 0 0, C4<z>; 0 drivers
v0105B060_0 .net "b", 0 0, C4<z>; 0 drivers
v0105ACF0_0 .var "carry", 0 0;
v0105B428_0 .var "sum", 0 0;
E_01023B28 .event edge, v0105B060_0, v0105AC98_0;
S_010232A8 .scope module, "half_adder_dataflow" "half_adder_dataflow" 3 13;
.timescale 0 0;
L_0105C1A0 .functor XOR 1, C4<z>, C4<z>, C4<0>, C4<0>;
L_0105C1D8 .functor AND 1, C4<z>, C4<z>, C4<1>, C4<1>;
v0105B530_0 .net "a", 0 0, C4<z>; 0 drivers
v0105B378_0 .net "b", 0 0, C4<z>; 0 drivers
v0105AC40_0 .net "carry", 0 0, L_0105C1D8; 1 drivers
v0105ADF8_0 .net "sum", 0 0, L_0105C1A0; 1 drivers
.scope S_010229A0;
T_0 ;
%wait E_01023A48;
%load/v 8, v0105B218_0, 1;
%load/v 9, v0105B5E0_0, 1;
%xor 8, 9, 1;
%load/v 9, v0105B008_0, 1;
%xor 8, 9, 1;
%set/v v0105ADA0_0, 8, 1;
%load/v 8, v0105B218_0, 1;
%load/v 9, v0105B5E0_0, 1;
%and 8, 9, 1;
%load/v 9, v0105B008_0, 1;
%load/v 10, v0105B218_0, 1;
%load/v 11, v0105B5E0_0, 1;
%xor 10, 11, 1;
%and 9, 10, 1;
%or 8, 9, 1;
%set/v v0105B110_0, 8, 1;
%jmp T_0;
.thread T_0, $push;
.scope S_010234C8;
T_1 ;
%vpi_call 4 19 "$dumpfile", "./full_adder/full_adder.vcd";
%vpi_call 4 20 "$dumpvars", 1'sb0, S_010234C8;
%set/v v0105B588_0, 0, 1;
%set/v v0105B2C8_0, 0, 1;
%set/v v0105B320_0, 0, 1;
%delay 1, 0;
%set/v v0105B588_0, 0, 1;
%set/v v0105B2C8_0, 0, 1;
%set/v v0105B320_0, 1, 1;
%delay 1, 0;
%set/v v0105B588_0, 0, 1;
%set/v v0105B2C8_0, 0, 1;
%set/v v0105B320_0, 0, 1;
%delay 1, 0;
%set/v v0105B588_0, 1, 1;
%set/v v0105B2C8_0, 0, 1;
%set/v v0105B320_0, 0, 1;
%delay 1, 0;
%set/v v0105B588_0, 1, 1;
%set/v v0105B2C8_0, 0, 1;
%set/v v0105B320_0, 1, 1;
%delay 1, 0;
%set/v v0105B588_0, 1, 1;
%set/v v0105B2C8_0, 1, 1;
%set/v v0105B320_0, 0, 1;
%delay 1, 0;
%set/v v0105B588_0, 1, 1;
%set/v v0105B2C8_0, 1, 1;
%set/v v0105B320_0, 1, 1;
%end;
.thread T_1;
.scope S_01022EF0;
T_2 ;
%wait E_01023B28;
%load/v 8, v0105AC98_0, 1;
%load/v 9, v0105B060_0, 1;
%xor 8, 9, 1;
%set/v v0105B428_0, 8, 1;
%load/v 8, v0105AC98_0, 1;
%load/v 9, v0105B060_0, 1;
%and 8, 9, 1;
%set/v v0105ACF0_0, 8, 1;
%jmp T_2;
.thread T_2, $push;
# The file index is used to find the file name in the following table.
:file_names 5;
"N/A";
"<interactive>";
"././full_adder/full_adder.v";
"././half_adder/half_adder.v";
".\full_adder\full_adder_tb.v";

View File

@@ -0,0 +1,36 @@
/*
Full Adder testbench
*/
`include "./full_adder/full_adder.v"
module full_adder_tb;
reg a, b, carry_in;
wire sum, carry_out;
full_adder_behavioral full_adder(
.carry_in(carry_in),
.a(a),
.b(b),
.sum(sum),
.carry_out(carry_out)
);
initial begin
$dumpfile("./full_adder/full_adder.vcd");
$dumpvars(0, full_adder_tb);
a = 0; b = 0; carry_in = 0;
#1
a = 0; b = 0; carry_in = 1;
#1
a = 0; b = 0; carry_in = 0;
#1
a = 1; b = 0; carry_in = 0;
#1
a = 1; b = 0; carry_in = 1;
#1
a = 1; b = 1; carry_in = 0;
#1
a = 1; b = 1; carry_in = 1;
end
endmodule