From 312549aba91a10cdc7a7f0294084ce170c28bc5d Mon Sep 17 00:00:00 2001 From: Jonah Spear Date: Sun, 17 Sep 2017 10:31:27 -0400 Subject: [PATCH 01/13] add .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f47cb20 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.out From 4c6c210572724a50e6822de48e11ca79321f5344 Mon Sep 17 00:00:00 2001 From: Jonah Spear Date: Sun, 17 Sep 2017 10:31:49 -0400 Subject: [PATCH 02/13] add multiplexer tests --- multiplexer.t.v | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/multiplexer.t.v b/multiplexer.t.v index fd475c4..c0ae25f 100644 --- a/multiplexer.t.v +++ b/multiplexer.t.v @@ -3,5 +3,30 @@ `include "multiplexer.v" module testMultiplexer (); - // Your test code here + wire out; + reg addr0, addr1; + reg in0, in1, in2, in3; + + behavioralMultiplexer multiplexer (out,addr0,addr1,in0,in1,in2,in3); + + initial begin + // test when all wires are 0 + $display("A0 A1 | I0 I1 I2 I3 | Out | Expected Behaviour"); + addr0=0;addr1=0;in0=0;in1=0;in2=0;in3=0; #1000 + $display("%b %b | %b %b %b %b | %b | I0 Only (low)", addr0, addr1, in0, in1, in2, in3, out); + addr0=0;addr1=0;in0=1;in1=0;in2=0;in3=0; #1000 + $display("%b %b | %b %b %b %b | %b | I0 Only (high)", addr0, addr1, in0, in1, in2, in3, out); + addr0=1;addr1=0;in0=0;in1=0;in2=0;in3=0; #1000 + $display("%b %b | %b %b %b %b | %b | I1 Only (low)", addr0, addr1, in0, in1, in2, in3, out); + addr0=1;addr1=0;in0=0;in1=1;in2=0;in3=0; #1000 + $display("%b %b | %b %b %b %b | %b | I1 Only (high)", addr0, addr1, in0, in1, in2, in3, out); + addr0=0;addr1=1;in0=0;in1=0;in2=0;in3=0; #1000 + $display("%b %b | %b %b %b %b | %b | I2 Only (low)", addr0, addr1, in0, in1, in2, in3, out); + addr0=0;addr1=1;in0=0;in1=0;in2=1;in3=0; #1000 + $display("%b %b | %b %b %b %b | %b | I2 Only (high)", addr0, addr1, in0, in1, in2, in3, out); + addr0=1;addr1=1;in0=0;in1=0;in2=0;in3=0; #1000 + $display("%b %b | %b %b %b %b | %b | I3 Only (low)", addr0, addr1, in0, in1, in2, in3, out); + addr0=1;addr1=1;in0=0;in1=0;in2=0;in3=1; #1000 + $display("%b %b | %b %b %b %b | %b | I3 Only (high)", addr0, addr1, in0, in1, in2, in3, out); + end endmodule From 2ab1870a1d2c070a90019f6e668cefc7be74759d Mon Sep 17 00:00:00 2001 From: Jonah Spear Date: Sun, 17 Sep 2017 11:03:11 -0400 Subject: [PATCH 03/13] make adder tests --- adder.t.v | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/adder.t.v b/adder.t.v index 76109ed..76d58c2 100644 --- a/adder.t.v +++ b/adder.t.v @@ -9,6 +9,23 @@ module testFullAdder(); behavioralFullAdder adder (sum, carryout, a, b, carryin); initial begin - // Your test code here - end + // test when all wires are 0 + $display("A B Cin | Cout Sum "); + a=0;b=0;carryin=0; #1000 + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); + a=1;b=0;carryin=0; #1000 + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); + a=0;b=1;carryin=0; #1000 + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); + a=1;b=1;carryin=0; #1000 + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); + a=0;b=0;carryin=1; #1000 + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); + a=1;b=0;carryin=1; #1000 + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); + a=0;b=1;carryin=1; #1000 + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); + a=1;b=1;carryin=1; #1000 + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); + end endmodule From 8634c902833f9af2e1690b3c9710f4501a3a10e2 Mon Sep 17 00:00:00 2001 From: Jonah Spear Date: Sun, 17 Sep 2017 12:44:03 -0400 Subject: [PATCH 04/13] first pass of get_disp_str, currently just copies input --- adder.t.v | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/adder.t.v b/adder.t.v index 76d58c2..fc00026 100644 --- a/adder.t.v +++ b/adder.t.v @@ -8,7 +8,41 @@ module testFullAdder(); behavioralFullAdder adder (sum, carryout, a, b, carryin); + // Returns a string of max length 264 + function [263*8:0] get_disp_str; + // Takes the header of a boolean logic table + input [263*8:0] header_str; + reg [263*8:0] temp_out; // While building the output, keep string in here + integer i; + reg [7:0] char; + integer word_length; + begin + word_length = 0; + for(i=262; i>=0; i=i-1) begin // not i=i++ + char = header_str[8*i +: 8]; + if (char != "") begin + if (char == " " || char == "|") begin + // Copy word to output + while (word_length > 0) begin + temp_out = {temp_out, header_str[8*(i+word_length) +: 8]}; + word_length = word_length - 1; + end + temp_out = {temp_out, char}; + end + else if (char != "") begin + word_length = word_length + 1; + end + end + end + get_disp_str = temp_out; + end + endfunction + + reg [263*8:0] w_Result; + initial begin + assign w_Result = get_disp_str("A B Cin | Cout Sum "); + $display("%0s", w_Result); // test when all wires are 0 $display("A B Cin | Cout Sum "); a=0;b=0;carryin=0; #1000 From 5a9dce6660570dfb36ca8399ae37edc2bf295dd7 Mon Sep 17 00:00:00 2001 From: Jonah Spear Date: Sun, 17 Sep 2017 13:13:51 -0400 Subject: [PATCH 05/13] got dynamic format string building working --- adder.t.v | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/adder.t.v b/adder.t.v index fc00026..19e53c6 100644 --- a/adder.t.v +++ b/adder.t.v @@ -16,22 +16,37 @@ module testFullAdder(); integer i; reg [7:0] char; integer word_length; + integer n_spaces; begin word_length = 0; for(i=262; i>=0; i=i-1) begin // not i=i++ char = header_str[8*i +: 8]; - if (char != "") begin - if (char == " " || char == "|") begin - // Copy word to output - while (word_length > 0) begin - temp_out = {temp_out, header_str[8*(i+word_length) +: 8]}; - word_length = word_length - 1; + if (char == " " || char == "|") begin + // last word is over, copy right amount of spaces and %b over + if (word_length > 0) + if (word_length % 2 == 1) begin + n_spaces = word_length / 2; + repeat (n_spaces) + temp_out = {temp_out, " "}; + temp_out = {temp_out, "%b"}; + repeat (n_spaces) + temp_out = {temp_out, " "}; end - temp_out = {temp_out, char}; - end - else if (char != "") begin - word_length = word_length + 1; - end + else begin + n_spaces = word_length / 2 - 1; + repeat (n_spaces) + temp_out = {temp_out, " "}; + temp_out = {temp_out, "%b"}; + repeat (n_spaces) + temp_out = {temp_out, " "}; + temp_out = {temp_out, " "}; + end + word_length = 0; + temp_out ={temp_out, char}; + end + else if (char != "") begin + word_length = word_length + 1; + $display("word length: %d", word_length); end end get_disp_str = temp_out; @@ -42,11 +57,11 @@ module testFullAdder(); initial begin assign w_Result = get_disp_str("A B Cin | Cout Sum "); - $display("%0s", w_Result); + $display("format string: %0s \n", w_Result); // test when all wires are 0 $display("A B Cin | Cout Sum "); a=0;b=0;carryin=0; #1000 - $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); + $display(w_Result, a, b, carryin, carryout, sum); a=1;b=0;carryin=0; #1000 $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); a=0;b=1;carryin=0; #1000 From 69b93e56c6f37a12d15f1b155c63f8a55ac4fd87 Mon Sep 17 00:00:00 2001 From: Jonah Spear Date: Sun, 17 Sep 2017 18:31:43 -0400 Subject: [PATCH 06/13] create adder testbench --- adder.t.v | 77 ++++++++----------------------------------------------- 1 file changed, 10 insertions(+), 67 deletions(-) diff --git a/adder.t.v b/adder.t.v index 19e53c6..4267732 100644 --- a/adder.t.v +++ b/adder.t.v @@ -8,73 +8,16 @@ module testFullAdder(); behavioralFullAdder adder (sum, carryout, a, b, carryin); - // Returns a string of max length 264 - function [263*8:0] get_disp_str; - // Takes the header of a boolean logic table - input [263*8:0] header_str; - reg [263*8:0] temp_out; // While building the output, keep string in here - integer i; - reg [7:0] char; - integer word_length; - integer n_spaces; - begin - word_length = 0; - for(i=262; i>=0; i=i-1) begin // not i=i++ - char = header_str[8*i +: 8]; - if (char == " " || char == "|") begin - // last word is over, copy right amount of spaces and %b over - if (word_length > 0) - if (word_length % 2 == 1) begin - n_spaces = word_length / 2; - repeat (n_spaces) - temp_out = {temp_out, " "}; - temp_out = {temp_out, "%b"}; - repeat (n_spaces) - temp_out = {temp_out, " "}; - end - else begin - n_spaces = word_length / 2 - 1; - repeat (n_spaces) - temp_out = {temp_out, " "}; - temp_out = {temp_out, "%b"}; - repeat (n_spaces) - temp_out = {temp_out, " "}; - temp_out = {temp_out, " "}; - end - word_length = 0; - temp_out ={temp_out, char}; - end - else if (char != "") begin - word_length = word_length + 1; - $display("word length: %d", word_length); - end - end - get_disp_str = temp_out; - end - endfunction - - reg [263*8:0] w_Result; - initial begin - assign w_Result = get_disp_str("A B Cin | Cout Sum "); - $display("format string: %0s \n", w_Result); - // test when all wires are 0 $display("A B Cin | Cout Sum "); - a=0;b=0;carryin=0; #1000 - $display(w_Result, a, b, carryin, carryout, sum); - a=1;b=0;carryin=0; #1000 - $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); - a=0;b=1;carryin=0; #1000 - $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); - a=1;b=1;carryin=0; #1000 - $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); - a=0;b=0;carryin=1; #1000 - $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); - a=1;b=0;carryin=1; #1000 - $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); - a=0;b=1;carryin=1; #1000 - $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); - a=1;b=1;carryin=1; #1000 - $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); - end + $monitor("%b %b %b | %b %b", a, b, carryin, carryout, sum); + a=0;b=0;carryin=0; #1000; + a=1;b=0;carryin=0; #1000; + a=0;b=1;carryin=0; #1000; + a=1;b=1;carryin=0; #1000; + a=0;b=0;carryin=1; #1000; + a=1;b=0;carryin=1; #1000; + a=0;b=1;carryin=1; #1000; + a=1;b=1;carryin=1; #1000; + end endmodule From b51c64e2b5cc246a90aff1682ec66d1ee9403500 Mon Sep 17 00:00:00 2001 From: Jonah Spear Date: Sun, 17 Sep 2017 19:04:51 -0400 Subject: [PATCH 07/13] made structural decoder --- decoder.t.v | 2 +- decoder.v | 33 +++++++++++++++++++-------------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/decoder.t.v b/decoder.t.v index e0e925f..185cc30 100644 --- a/decoder.t.v +++ b/decoder.t.v @@ -7,7 +7,7 @@ module testDecoder (); reg enable; wire out0,out1,out2,out3; - behavioralDecoder decoder (out0,out1,out2,out3,addr0,addr1,enable); + structuralDecoder decoder (out0,out1,out2,out3,addr0,addr1,enable); //structuralDecoder decoder (out0,out1,out2,out3,addr0,addr1,enable); // Swap after testing initial begin diff --git a/decoder.v b/decoder.v index 17836e0..0b97261 100644 --- a/decoder.v +++ b/decoder.v @@ -1,22 +1,27 @@ // Decoder circuit -module behavioralDecoder -( - output out0, out1, out2, out3, - input address0, address1, - input enable -); - // Uses concatenation and shift operators - assign {out3,out2,out1,out0}=enable<<{address1,address0}; -endmodule - +// define gates with delays +`define AND and #50 +`define OR or #50 +`define NOT not #50 module structuralDecoder ( - output out0, out1, out2, out3, - input address0, address1, + output o0, o1, o2, o3, + input a0, a1, input enable ); - // Your decoder code here -endmodule + wire _a0, _a1; + wire p0, p1, p2, p3, p4; + `NOT(_a0, a0); + `NOT(_a1, a1); + `AND(p0, _a0, _a1); + `AND(p1, a0, _a1); + `AND(p2, _a0, a1); + `AND(p3, a0, a1); + `AND(o0, p0, enable); + `AND(o1, p1, enable); + `AND(o2, p2, enable); + `AND(o3, p3, enable); +endmodule From 30eafcef3da745f0ad22d143507c8c730766f743 Mon Sep 17 00:00:00 2001 From: Jonah Spear Date: Sun, 17 Sep 2017 19:18:28 -0400 Subject: [PATCH 08/13] implement adder --- adder.t.v | 11 +++++++++-- adder.v | 34 +++++++++++++++++++--------------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/adder.t.v b/adder.t.v index 4267732..6e5d9a4 100644 --- a/adder.t.v +++ b/adder.t.v @@ -6,18 +6,25 @@ module testFullAdder(); reg a, b, carryin; wire sum, carryout; - behavioralFullAdder adder (sum, carryout, a, b, carryin); + structuralFullAdder adder (sum, carryout, a, b, carryin); initial begin $display("A B Cin | Cout Sum "); - $monitor("%b %b %b | %b %b", a, b, carryin, carryout, sum); a=0;b=0;carryin=0; #1000; + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); a=1;b=0;carryin=0; #1000; + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); a=0;b=1;carryin=0; #1000; + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); a=1;b=1;carryin=0; #1000; + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); a=0;b=0;carryin=1; #1000; + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); a=1;b=0;carryin=1; #1000; + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); a=0;b=1;carryin=1; #1000; + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); a=1;b=1;carryin=1; #1000; + $display("%b %b %b | %b %b", a, b, carryin, carryout, sum); end endmodule diff --git a/adder.v b/adder.v index d21f7e4..557d4c8 100644 --- a/adder.v +++ b/adder.v @@ -1,24 +1,28 @@ // Adder circuit -module behavioralFullAdder -( - output sum, - output carryout, - input a, - input b, - input carryin -); - // Uses concatenation operator and built-in '+' - assign {carryout, sum}=a+b+carryin; -endmodule +// define gates with delays +`define XOR xor #50 +`define AND and #50 +`define OR or #50 +`define NOT not #50 module structuralFullAdder ( - output sum, + output sum, output carryout, - input a, - input b, + input a, + input b, input carryin ); - // Your adder code here + wire aandb, aorb; + wire s, _carryin; + wire outputIfCarryin, outputIf_Carryin; + `XOR(s, a, b); + `XOR(sum, s, carryin); + `AND(aandb, a, b); + `OR(aorb, a, b); + `NOT(_carryin, carryin); + `AND(outputIfCarryin, aandb, _carryin); + `AND(outputIf_Carryin, aorb, carryin); + `OR(carryout, outputIfCarryin, outputIf_Carryin); endmodule From 8fc51f64a706a89a6089003816bf548d05723889 Mon Sep 17 00:00:00 2001 From: Jonah Spear Date: Sun, 17 Sep 2017 20:14:26 -0400 Subject: [PATCH 09/13] created structural multiplexer --- decoder.v | 2 +- multiplexer.t.v | 2 +- multiplexer.v | 31 +++++++++++++++++-------------- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/decoder.v b/decoder.v index 0b97261..93283d1 100644 --- a/decoder.v +++ b/decoder.v @@ -12,7 +12,7 @@ module structuralDecoder input enable ); wire _a0, _a1; - wire p0, p1, p2, p3, p4; + wire p0, p1, p2, p3; `NOT(_a0, a0); `NOT(_a1, a1); `AND(p0, _a0, _a1); diff --git a/multiplexer.t.v b/multiplexer.t.v index c0ae25f..72c6404 100644 --- a/multiplexer.t.v +++ b/multiplexer.t.v @@ -7,7 +7,7 @@ module testMultiplexer (); reg addr0, addr1; reg in0, in1, in2, in3; - behavioralMultiplexer multiplexer (out,addr0,addr1,in0,in1,in2,in3); + structuralMultiplexer multiplexer (out,addr0,addr1,in0,in1,in2,in3); initial begin // test when all wires are 0 diff --git a/multiplexer.v b/multiplexer.v index b05820f..319ed08 100644 --- a/multiplexer.v +++ b/multiplexer.v @@ -1,24 +1,27 @@ // Multiplexer circuit -module behavioralMultiplexer -( - output out, - input address0, address1, - input in0, in1, in2, in3 -); - // Join single-bit inputs into a bus, use address as index - wire[3:0] inputs = {in3, in2, in1, in0}; - wire[1:0] address = {address1, address0}; - assign out = inputs[address]; -endmodule +`include "decoder.v" +// define gates with delays +`define AND and #50 +`define OR or #50 +`define NOT not #50 module structuralMultiplexer ( output out, - input address0, address1, + input a0, a1, input in0, in1, in2, in3 ); - // Your multiplexer code here + wire b0, b1, b2, b3; + wire m0, m1, m2, m3; + wire n0, n1; + structuralDecoder decoder(b0, b1, b2, b3, a0, a1, 1); + `AND(m0, b0, in0); + `AND(m1, b1, in1); + `AND(m2, b2, in2); + `AND(m3, b3, in3); + `OR(n0, m0, m1); + `OR(n1, m2, m3); + `OR(out, n0, n1); endmodule - From 91891bd4a1f627bf808489d065800af1916fbdc2 Mon Sep 17 00:00:00 2001 From: Jonah Spear Date: Sun, 17 Sep 2017 21:05:51 -0400 Subject: [PATCH 10/13] move code to seperate directory --- adder.t.v => src/adder.t.v | 0 adder.v => src/adder.v | 0 decoder.t.v => src/decoder.t.v | 0 decoder.v => src/decoder.v | 0 src/multiplexer.t.v | 32 ++++++++++++++++++++++++++++++ multiplexer.v => src/multiplexer.v | 0 6 files changed, 32 insertions(+) rename adder.t.v => src/adder.t.v (100%) rename adder.v => src/adder.v (100%) rename decoder.t.v => src/decoder.t.v (100%) rename decoder.v => src/decoder.v (100%) create mode 100644 src/multiplexer.t.v rename multiplexer.v => src/multiplexer.v (100%) diff --git a/adder.t.v b/src/adder.t.v similarity index 100% rename from adder.t.v rename to src/adder.t.v diff --git a/adder.v b/src/adder.v similarity index 100% rename from adder.v rename to src/adder.v diff --git a/decoder.t.v b/src/decoder.t.v similarity index 100% rename from decoder.t.v rename to src/decoder.t.v diff --git a/decoder.v b/src/decoder.v similarity index 100% rename from decoder.v rename to src/decoder.v diff --git a/src/multiplexer.t.v b/src/multiplexer.t.v new file mode 100644 index 0000000..8102acc --- /dev/null +++ b/src/multiplexer.t.v @@ -0,0 +1,32 @@ +// Multiplexer testbench +`timescale 1 ns / 1 ps +`include "multiplexer.v" + +module testMultiplexer (); + wire out; + reg addr0, addr1; + reg in0, in1, in2, in3; + + structuralMultiplexer multiplexer (out,addr0,addr1,in0,in1,in2,in3); + $dumpfile() + initial begin + // test when all wires are 0 + $display("A0 A1 | I0 I1 I2 I3 | Out | Expected Behaviour"); + addr0=0;addr1=0;in0=0;in1=0;in2=0;in3=0; #1000 + $display("%b %b | %b %b %b %b | %b | I0 Only (low)", addr0, addr1, in0, in1, in2, in3, out); + addr0=0;addr1=0;in0=1;in1=0;in2=0;in3=0; #1000 + $display("%b %b | %b %b %b %b | %b | I0 Only (high)", addr0, addr1, in0, in1, in2, in3, out); + addr0=1;addr1=0;in0=0;in1=0;in2=0;in3=0; #1000 + $display("%b %b | %b %b %b %b | %b | I1 Only (low)", addr0, addr1, in0, in1, in2, in3, out); + addr0=1;addr1=0;in0=0;in1=1;in2=0;in3=0; #1000 + $display("%b %b | %b %b %b %b | %b | I1 Only (high)", addr0, addr1, in0, in1, in2, in3, out); + addr0=0;addr1=1;in0=0;in1=0;in2=0;in3=0; #1000 + $display("%b %b | %b %b %b %b | %b | I2 Only (low)", addr0, addr1, in0, in1, in2, in3, out); + addr0=0;addr1=1;in0=0;in1=0;in2=1;in3=0; #1000 + $display("%b %b | %b %b %b %b | %b | I2 Only (high)", addr0, addr1, in0, in1, in2, in3, out); + addr0=1;addr1=1;in0=0;in1=0;in2=0;in3=0; #1000 + $display("%b %b | %b %b %b %b | %b | I3 Only (low)", addr0, addr1, in0, in1, in2, in3, out); + addr0=1;addr1=1;in0=0;in1=0;in2=0;in3=1; #1000 + $display("%b %b | %b %b %b %b | %b | I3 Only (high)", addr0, addr1, in0, in1, in2, in3, out); + end +endmodule diff --git a/multiplexer.v b/src/multiplexer.v similarity index 100% rename from multiplexer.v rename to src/multiplexer.v From bde2a89fdf1f05a8eab64c6b2115e5a39ba14616 Mon Sep 17 00:00:00 2001 From: Jonah Spear Date: Sun, 17 Sep 2017 21:56:48 -0400 Subject: [PATCH 11/13] add resource files --- resources/adder.vcd | 125 +++++++++++++++++++++++ resources/adder_table.png | Bin 0 -> 5472 bytes resources/adder_test.png | Bin 0 -> 9322 bytes resources/decoder.vcd | 146 +++++++++++++++++++++++++++ resources/decoder_table.png | Bin 0 -> 21520 bytes resources/decoder_test.png | Bin 0 -> 12945 bytes resources/mux.vcd | 194 ++++++++++++++++++++++++++++++++++++ resources/mux_table.png | Bin 0 -> 32576 bytes resources/mux_test.png | Bin 0 -> 11613 bytes src/adder.t.v | 3 + src/decoder.t.v | 39 ++++---- src/multiplexer.t.v | 5 +- 12 files changed, 491 insertions(+), 21 deletions(-) create mode 100644 resources/adder.vcd create mode 100644 resources/adder_table.png create mode 100644 resources/adder_test.png create mode 100644 resources/decoder.vcd create mode 100644 resources/decoder_table.png create mode 100644 resources/decoder_test.png create mode 100644 resources/mux.vcd create mode 100644 resources/mux_table.png create mode 100644 resources/mux_test.png diff --git a/resources/adder.vcd b/resources/adder.vcd new file mode 100644 index 0000000..35c3592 --- /dev/null +++ b/resources/adder.vcd @@ -0,0 +1,125 @@ +$date + Sun Sep 17 21:41:41 2017 +$end +$version + Icarus Verilog +$end +$timescale + 1ps +$end +$scope module testFullAdder $end +$var wire 1 ! carryout $end +$var wire 1 " sum $end +$var reg 1 # a $end +$var reg 1 $ b $end +$var reg 1 % carryin $end +$scope module adder $end +$var wire 1 & _carryin $end +$var wire 1 ' a $end +$var wire 1 ( aandb $end +$var wire 1 ) aorb $end +$var wire 1 * b $end +$var wire 1 + carryin $end +$var wire 1 ! carryout $end +$var wire 1 , outputIfCarryin $end +$var wire 1 - outputIf_Carryin $end +$var wire 1 . s $end +$var wire 1 " sum $end +$upscope $end +$upscope $end +$enddefinitions $end +#0 +$dumpvars +z. +z- +x, +0+ +0* +z) +z( +0' +z& +0% +0$ +0# +x" +x! +$end +#50000 +0- +0) +0( +0. +1& +#100000 +0" +0, +#150000 +0! +#1000000 +1# +1' +#1050000 +1. +1) +#1100000 +1" +#2000000 +1$ +1* +0# +0' +#3000000 +1# +1' +#3050000 +0. +1( +#3100000 +0" +1, +#3150000 +1! +#4000000 +1% +1+ +0$ +0* +0# +0' +#4050000 +1" +0& +1- +0( +0) +#4100000 +0, +0- +#4150000 +0! +#5000000 +1# +1' +#5050000 +1. +1) +#5100000 +0" +1- +#5150000 +1! +#6000000 +1$ +1* +0# +0' +#7000000 +1# +1' +#7050000 +0. +1( +#7100000 +1" +#8000000 diff --git a/resources/adder_table.png b/resources/adder_table.png new file mode 100644 index 0000000000000000000000000000000000000000..5ded78c5e1e5a141cd957a74fa54e21386503e43 GIT binary patch literal 5472 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 Kku8um^8PQI(Y*oy literal 0 HcmV?d00001 diff --git a/resources/adder_test.png b/resources/adder_test.png new file mode 100644 index 0000000000000000000000000000000000000000..826a0de849ead84a80761284f52317533e85e7e9 GIT binary patch literal 9322 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 U71@_ai}d^nsbj2NtmzQ_D-L7BMgRZ+ literal 0 HcmV?d00001 diff --git a/resources/decoder_test.png b/resources/decoder_test.png new file mode 100644 index 0000000000000000000000000000000000000000..367c14e0e8e34d81af6f9ae78483d71abe4b3be1 GIT binary patch literal 12945 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 p3 $end +$upscope $end +$upscope $end +$upscope $end +$enddefinitions $end +#0 +$dumpvars +z> +z= +z< +x; +1: +z9 +z8 +x7 +x6 +z5 +z4 +z3 +z2 +01 +00 +0/ +0. +x- +x, +x+ +x* +0) +0( +0' +0& +0% +0$ +0# +0" +x! +$end +#50000 +0> +0= +0< +05 +04 +03 +02 +18 +19 +#100000 +0- +0, +0+ +07 +06 +1; +#150000 +0! +1* +#1000000 +1$ +1. +#1050000 +12 +#1100000 +16 +#1150000 +1! +#2000000 +0$ +0. +1" +1( +#2050000 +02 +08 +1< +#2100000 +06 +0; +1+ +#2150000 +0! +0* +#3000000 +1% +1/ +#3050000 +13 +#3100000 +16 +#3150000 +1! +#4000000 +0% +0/ +1# +1) +0" +0( +#4050000 +03 +09 +18 +0< +#4100000 +06 +1= +0+ +#4150000 +0! +1, +#5000000 +1& +10 +#5050000 +14 +#5100000 +17 +#5150000 +1! +#6000000 +0& +00 +1" +1( +#6050000 +04 +08 +1> +#6100000 +07 +0= +1- +#6150000 +0! +0, +#7000000 +1' +11 +#7050000 +15 +#7100000 +17 +#7150000 +1! +#8000000 diff --git a/resources/mux_table.png b/resources/mux_table.png new file mode 100644 index 0000000000000000000000000000000000000000..2c0ae5f33d1dcfe0a4f62523fa111cb8348429f9 GIT binary patch literal 32576 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
iOn>E=WZ9`UpC%J+-|}sF z^Hry5;Z8rFL&Kx>cGwW5tXG!YK2^-!!knbD_O0IPD@Y>A8;8yY5BITxMd{1ESM>5d z-RSJQ`!78^*WyCms}=Bg`3u7>VloF?{>OV_RLd2?=s1 z$m^?hjmJvNs0c8)BgWg=xN-B^@8{28g(|6{1= z(W?Qmfq>f8j47<_413kb%5(Msqn1tA;OZ^sW^yY*%i z2juCFYiftaBy2uq?pq8dRrw8icDa60smE_+=Lp;`n3q7g*QBHr5MoYfpv_?5vCf<} zS_MJ;`GQU#dt&_yK@K;L$_~GVZ~bxs0L0i1wlDS+`#Y6-3yvddP37hEWgD=Hu~wB~ zvkB}R<=toloWBgoJe+ZM?hi6n3RG*X-H6+`o*o%i&*53umyABbn;v(o&Iq&yz>1h24hqlc4VdQsTgm2mi)p^Tu#<3l_TYR-nY+JQsmaCok=my#2{H9sSHe z;|>eN6AA?n6tIz78N5!!k@c4PYVsz?;tpHdaqR?dsPt5mChj5k)Pr17zkW>}?0#By zMT)1o-6CptLF&xioPB`mbI?AgGr(}%S)LcNl%3}-(4bjcAWQ-SM*zaCWE|h1M;kXU z2my63$b6+;2iDs(it zzR^xeo1XF0DkRhwz%d+ZVromy8dZ@)fUUrcpKPV!#z{O0lP7HG!pvat(34O=yqi(Mg3fN zboS{1ba6z5D^p&ariI2Du;*GelIAzNX$LFn5o-giH5} zumT85KOP9`*c(b6qC7d-)k0S8Eq^tr{4eD508x6F?l53-(HcK;gL>eN+IC+-z+^1& zRfqQ_2r4$hrmCs-ZbL-*G6gt~ZLh`Xd^*wU-6;(DHVUy+41~8eV(I<&)PSmA(1}mh zM#knC>2r(|hK;K@R!>_nAsp6#+7pyIYw3|yO}?4qWFux5x$8fKuBCQYk4)g_m)uxF zUXv_RGcfxG1DYW<5+iLKSl=)+wRz9#vjkb@Rse6d>{t)CN!cSeWkG3(X7Mn{ufwGX zM>IxfV`Ap%5pc~RbUq2?rlgEcM}aq(funIxB{c|`K%72tyC%&skNIUru>F(3pe&+f z*{c}-NJ=KUV#vz?;+s1L489n7^S{TS$A=b z{ycMgA9};4#Y$XvJi^1&-kv|)$t!&%9KphFl=+YX+-z{{rM98rnUvwAHzFlVEYZDQ53_jf{RmXq+ETp?HQ%7UNV(!IjZdn%FN~VagUyL-rRpR zZub~9O6Zgo!WuB})wif4XzTM#_JftoHbPnVI`5u{l>q-@eZAxeG zm^Wnq+vUd-Ki9=e%1;O1Tof>GDu2?{7pgs5i;1F;MPfVghl*|bNr77zjG+6?{V0!PsN1C5Yt*R zneB1ED$+ko^ssOmadOi{&l}p$n*6OfDIx-{?m!7u3qY?4iF>SeY)~$BT4FvG)chfi z_pKi zu0Rn)xKfW99xG+{!Q$avQ7yB2n@;^BOx^ZCXvFS+Rg6;XS!~W;c0vTmeCx0B*k3 z5|u!QcPi^r_y1zeh%CV)n^PD&_+_We$+DcFwgTEKH5&QUwhkvCH4=Xy{L_PCy6Q@| z&hD_8qqY=4+0P;DsagKv&SkRjtX?)y*wQjTB*MH8s z2SjOMMO_Ck@wOVRWoRH;{fGdN~ z0DXvDWkKL!5+{5MeW_P)aLzj=Vr4Sgw!DJqlNC-1-WA6nEN#~x+Zi#h;<9EuY80jCTUw4GbG@=trb*yn$zp3hu$c0~g7LRf87$z#zxEddtJ|v$2VS{8IR)A=La4 zpJ=|%H;+%p*wfEUAdAg!aG9B7hZE9GpB6A|;bmrxZOH6~a7;o;i9QdsZ`E+L@Oa;8B9nUTK*8526b1%fo;XyCu(tH;Q@iP* zv^C+t9oAlPE>|pB%`2KIC{KxLtza$i)Z(<);JW6+bej@6yr15v5tW=+2YDRCBd?3! ze(_pI-*@_BR>$IVs{pkDz~&A)n3LyeaG~|nXmDOp(|k8&@5+(d)l{#!acY{FC~D~S zAO3yYCa*IpH7WB+doNb9)Rgkb>^8Jp#rDxl(ej9sOVSF?Owg)@4C^JK=d9p*1s8K_ zo=X{1bt1LY>Q%)Bhm^yg&i+6pOM02J*QR+;--n7XY6I$I_grre*a4_Ta_%m((*-mo zN!PljOl@HcmUDZUIHUP})6y!kINs||pWe}vtd??tq=b~LbnMHxTer4_KGce|+5xI&qP6r*&Gx&Yo&SUv)Fm4_eqv9qz=Xy_-)eai^&dZ@mjV0CHB_ z+sZ*Rr4%uKg;BITuqwD6Qh9TKXDtMXF)iCWf4h?JcI1d5q5U@rYgY`r;gG}C+( zY}_0{iYeZ9HN6YCw&NeWAAUBuf{OJ*8)@ z!5P=YT1JbfceIGl+JP8qU-)pN@Qd}#E<2q?+`|Q#B?bQOBFqyL+zcaOQZ&Le|1xCy zWvL^c6qI4g)vHot_=3e6?GKKzDsP&fS}H!I0w8hrEj8-d)j{cLvg6) z7n0oukBd<*ox6?wVStO7xbBpHAaOEj>9JK=!A_5k?9mqHE&ut1jRPTKvDlF0F6U zKMTA=k=Pg`zgr|4r0kE85ou<7J$xb}A|}cG7XHH&-%P_lj{f+-m;3MTpI`a?EttOw z$jAYLAt^fkCEb(@$IS6cB;S?!zLIq*V|u#G(! z=-rX`gEzt;6lT>Ol2dW>S{|{eTZOs3D&l!obzmo^u|Nq6aN)ipmOfO--H1BvN^#bq zn)Y!x|3z8%yj<|4P`822=U2Vv(XTxg_3p&)52woTnmdt(6dWc)C^{bo#7lQJtP0 z#*oEw>wz@ISnYV6Z!i~xsbIW#7LB5Nl`q;672*?7P}3-8VZkmOGSAddA8}JaV}#~n zQX*Q?%r_*dRQZWop5f7UMPUgQWNo32I*W6B(|+~aQ#jn1hurdt*glI!j0dLFjN~y( zFW|wV3!;?O503Lr$8Ru>4K8{&a>N{%WweL$u2~(9q~XlfjPjSs?}91qVvft$l4z>36I|G9(`&e zJPkplWsOsbNkt0*`78K#`T2pr$=m zXj>~!X3XIpj;N9B$+ol<{Ho!BI%bLI_0a_}oa^gO)-w{KHZY;Y0vt{Q(b4<)n4iTE zu-;S4D<#$+OpV~rrz!w7;(XjM;ye?akp3&+=MMeRn8zipCcFDj9;d)xIykivM6-|p zl*LtVY+IlGs`;BdVdC38R9`nfu5a*P8EU#3V~(8(AGvS@cP?L}>)jsyJ0A6;$^wO7 z)nEHh)uhox04TN*8j@=$&<7#1@*E0o1d?)u^En5D&7WD@AG>_d7u}XdD&`Q@z?>}7 z>(5+UpC3?ym)Oju@_7#39@O=e`*u2C{Wjm7ZTfMv6LD9>1X7|`Sj<4U=Z1sYqj|ZY za092{2JGrXUq5w&chIKhXv!hk7W9c@Q{~x~Mb-W}0D!A-UM(YVlwYQTzf&Y=tPmU` zx_?#S@=`g0w+Xz*16Hw`?k2S2!kNT4oN5uD(#BU>C=lsPGMgL2`Z86oqY1`bO2L&~ zWyt2l3VEC3aZMZmKxy{Ga$w&pD0BXe?$(L(@ z^TyEnHc=q$5C~V{288pJyyAH1q!W;muQ;TvW_dH$O>oLW4KcGedvLcC#q*uO170^5 z|BbN3`6DXJMDr%KJvfpa2Z*q<`Se&79O<+Y2*p)2aIXqRU)EI@q2&HraC2VxC{zjy zu1)f`H3%HB-jnPL!^Qve8!##-%Sxp)wtw)>{UrCd&56L4R=F?;>$Qls0IftkiOf+Dj9%)}w-;njh@QS?}GtyfACNeu*~BXsp5= zUoUYSbz$SMjZ`-5anOb7$$W_fp(~8`vYXrgyu=)K=o(Al=W%3lmX$`zAx(6X*a~GS z87VvM2K)Sn`dykp~p;am-8zs|LoDr z1(!Xtx%3L8+Ln)*sQUn2MpqAijbW94FR!1=85WDlN$c&@;x@e^S3Y0af78f}v5TQj3vfH2m`B@{soy*nI!sbA173Hl=mA)8Bj!g)m98&`5P1aV<~;M?BUY zl{xQ3PGkVNKz;)=YiMQF@7aBV&>lvM457husw+r2iE+Xd)){dqdmXCVI}}xK%GH*! zM>5n!L7If?1AlCGV&^?(#w`9nj|?Ffdt1iIP(&=iBt$)|9xU+Ifw2k_fPhS_s! zB`hwpl#JBKpC`0KMsc0Y9!9YsQ7enwdv%;O9wPJ?txn5DYV%4~EERobMjYrhxX5DO zsM|rrjO4|Sr&yx2*6Nguum)pL;=XxMnN!)e`$~fm2oi-{k@k`jXB0X<0~CXIBB|WL z^>4Gq+csu_J+EF2oFGs)%Pn3yUdsqXVQzt6-cvb-~( zY|h#<{t$6@OF;YVV_eKk@DQP_$*#Rnh1Q-K2so?^PKbaHJM7?q1#9(En_s|;ZOZ{2 z0c$~c>8+JJv~KC23-2G1FDQerx7R(jJi3u@akq-o&Jeyl>bp&@6L&JpkIDPQs74D$dx3gwd){{guhU*Aw6FHwJLN zOXzIXW)2j(7P|qYQwUE>;qy|&tzIVWYhUeH_q9cw>s=Lh9fQ&MlljdPhK0cmZqD^A z8osf+z8>bT0)b}N&xu1^91N`ru7UCNl>s5C(=TTYWn!1Lziw1HA3Aij(PXvWA*Z6A zg0&zbrSxpP+@)shi+u!@_ot8xLu)77#_xHaO!4-$*4bGqVQ&mfp#^gM9GHIGarTC^ zBD!BsyGpalC9<=;SXf*=pU z<5(Imu^k)Q*qA=v-hJd57O}J-LKSQww)$O7)-zRqKr0|5B((JeEalNiL4JmvnnB5! z-9Fkc@?UKN;Gf-pVaC6};@>nO4FiRv^D6ePEE|NmDZJq79r#UoN8Fek==Fu`d6^B_ zv|IVv7kYZ+-9C2sJ6;`*XauDtYW3GAC?iu!ExW_F2qqK5Hv6C-iA=8-It_3f)NHA@W10Xtp8fhN|ME>IzqI^SK}jil_1n(5{o#fS){}= zzO&ZRHCgj4|>DsW%|fEUvmi0yc=Hq>ZQGnLi|w?(SHZ{gXoVqj)3EAX|>G$ zxU1`WG(BwQ27y_qr~8{)V*64ZQS%r1g+xGAj8rxlfeu+u$0$oF%L{w;u#hlXjJZo8 z#$1DgdckgaJz}&yyot{iAiKVfdAcUdhq(^E&6$|uT{OA^7y(dVB_ph8kL1~qQj#Bw zHO#*G2KWPFi<-+_?#e5`Z<(Ea$F20Ze=~=3^y>f&gD>rUp1@a*W5y%_$YJ7f9}%mpfx5oP@s*u(yK2c24Bq1Hef1r+`o`96P zBn+k@!z!PLWFEM}SyMg1_rb|}F^)8q2u^nfEFJM76Wev{PG#J+!Q~vUQ5SR{cYUcD zk=p?*P4)eC@kcgYyW=0Q)@E|GZfAxq+Z`h}z$vCpu$Qe0<`{vdRR?n?qStbS6v{lD z?b1N66M479Bj9Z|-)h2q`yy5zrW1-sO}>uE$eEyAgIx39Po^>P6ldtu;{3ggU>Ozr zMfL>po`wTx(_x8>=GRZGS$|KQ7y>^(zS%P9^H)7SlY0A6-gnfuTX%V3QpA%J=~DBO zPW%wj_tXq-BYD9zUomBFzi3Vbo zFKp(9lO>eQDq5~j|2G2pFgykQ9}rOg579r?ml1K;lt^&EB-IEYF4bZ2>DhnL&*J7h zJfP{n=x2L06P>0(wF#KB!)dCOSZo;9p6bGNN{Uc@-bZ0qMA@D`I$f)*eJBn&_m)^5 zUOOu5{XI_j50SRWOi#@>>TwJW`}lg1ivfqw^g8A~sF)EGESX+7vJtgmPb&3FT<&Sg z%of8&VH;9s*W2{+t!h*xheeo+6w8#`(RH{=->^8^Lf1=1Cjk{jGEuT7M0RN3G%19%nmv6`0Qc$C?c z^U~{ZQi1`|ha&S5XAzhN!Jh&oGu1ao$9at=$3UH?%?4s&lD7F)`LIeUpdCWjxS@a` z%3TD<40B6Nij2MqnCGNz()gwir9K2!pX zfIKujRg-W@{=Y>?lyfSJ*f>mDO!(+aWNCXeruff4bIZzug-58sVqpf$WDP9Ab4Qk@SIIRWZ#eIFb;^fXak*oLu;aqh2)xwAzKteR*d#UJ1FIxvQ@%HXY6W`(&o` z4@UTY;ZNViE$JH|LkDo=RxG8ld-(5v3uFG|0>~5ZNp>wPhl&gPr-;=5`Ld{Cf9P5Z zA-2Y&j{22evC9gGxgMJT+K56iS>(>m=U`30yERn_OsFFd8o(zqT78IYXO5rbm#O@w zZ;qYU2A-2t0FgRe*GfwJdEw)FC3khVi}$7b`8xXjsLA;gBt4cRu*_(%wg$H- zmvjba<{1H-0f((Uw6i^I2yLDpVJH3O|3UB}Eis<|KL?QO`gI6Vzp&s9MQMjUiHN&m z!gc!3G**EqHF1P&NYssT&0X8Ag^3+OOf$?(^T9$df_G7abS04pz2h z<>`O9M^VN8$9%TqDT_6-T*KuekKm3b(~So1QM~84y8O9YW#KsKia^uc@_ZB0P-GH| zi6^31h?V@9fr8CF>!RwPpd*UhnodI}jb(53c}K^9*P}4X=JW0!?&0#v!Aa3BKY1$? zcaMTL$1Tvmq3Do3-h5PN=?2DBaW1b?tYcji(wB;d#U zMaN4;mXObT;;);+tFe&{bhpe0g7w}-Q^K5IjTiGHUw3amWYi(~0G&+1)^&6PyUsm$ zSCe9P1(bi+?iejTSQ(Q{RywaJ!OBDNAt3yrp00nW+Gxv)kIHVXD@D~i5dBZQ5q*PD zDwd`@atQqgE$CwS|FX^k2|}-*+q3P?8h(J}A(kG{@JY6TQ{|t)Z0c$VrFU6A!Xkf1 z{+@o^TS;Yv@yY}wqA;*qGq))(VF*vYC`on}M}Cu;)?2)+ieOB;dtG(cU78DU$>aQ8 z^mj8>%!ShFD=y)tn5+^)txqjtszAA-&Nu9HFtuzrIzK=*B$cz7*dJ7D^t`>4NY`qi zBzt65+%6#fd_h-tV@wGja+YQV#mtd6m_v&@-W*AzGtU&SL7AC!PrlGJCQ>!2wYmB} z#^p^x5#kc}FVlLOM2N58ah_0;^lPwiMdhN_)(6j#l=r1HFd1ScMiq{ci8jZLKG>R8 zW*HGC)$`5ACNrHj|9car_>Nk)vAjmt5 z<6`4_etf3Z$HqU7mG5J7Og0*i7wASSLRlrSh>HcF zq!v2MgHRj1X{J3#U9V+9xeIN^TU>hilg4tSr4bLy5Uq#>{MPjbk7OTJcpc~H*8V3j zDH*XV=wY&^(PSmtnRQLGaXEseAff^7jE=Ui+LqM2Ib;i)+8(|HUOsV02uj6O00ROR zxR5&^Yy3eCG2Hp3@dlhyFhJ%;q?r?4cy7>Ct>)2r6m95#P))$k-8`FZFgm0tuSzlOwpQV`!0=I3#un6{GT*L>yqdcK9Sdg6|j z5~waHNw1LGE?~U_&6d-hj#$#+{ir$x#4&g{W{5S!=R99otFk-q@4lYOiJ8BpA8;M4 zGjKxT`OdZ4c!a`n6jT2dpuLYpG@_0kazvDg_#c9Vv@utxDljbSAKHlBI7I4tDOGuH zSw%cpfR(u3PP#`#2eHi1{Ls=LLFp~yG> zv0xGqXLS4Hj9mf0LR*ZVJgp%@B0R1ol_qWtm$S{?5iM`?%~<5Eu~HJ1fOkS}^71=b z&lrdXkYsYdxx@Y++)?0O690D%8fGWlBZoC}0R>MQG=xKK%fV%}Z&vE!ClSiiX{a`~ z#J1Vs|JQ=a!bb`UrQ_uqU`R2PTjuiDwPy0>x~&*`5%{CROc9Z@3?|@MSRD6i>=d2u zHNK-WesqS&!qavUNV9FS^>>+;JUAl1fxtGNbj0kxtB$=zrGFWg2RviCQDh!|s~Pgr zS$GpLmK%woDNHWr7RW&yl{+{>iC6OQrPt}Qg)!n@ z)+9VrhX7C-eToJ%7!jkiIjLIA0$5}DINkbtw`S_&wD#vazwOX&aW&T9T-gy9@CFqP zYK;L?;LV@LKZVrl_AVwTZqBi4{Ut-jW<`{auEpj4mP*QSAKM}mfq;|91bAn>#{X%? zedFU3NK@#c8b}ah>`C~02wPD8(nyrCR%Bi3f9qqeFpx0sVXE4C%iwPu8A(!)yVWZx z%K?OpVd8Qog3MeOpd8Gj05w+qzQi($Zh z@c(T${c*Jmjq*cxf1#?o_Rf+D*I_vpu}Fx&@JSVC^ORq(Q^gl(I@ER}iC_Zq3fedc zSEtk?{TSQMtY1J)g17k^-ype~dq|9*)6Xwgumr4qFG;|@2E6>GrR4QVT`QedDN3V!Bh`Q@q}x<2qE&RFshaJ0e;+S9B%ARuQV>Cf^9czS>%X<)*D5iodr>2*@549doe2TDmeX^_|i{Fcw% zq-#~}i^kZiQ*(;@AN|L;T*Ge)6US-qX(ysARf4Iz2-%f0mq(#wjeKPveZ z%<@VWp3FANe=CRJDFzlaB~5Dh%p~FZ8Bh%b1F~v{<<*5=f`>akU{b&@ZaAg+^P#to zB<9`-hghu(57F~PYn-i{fUojCr1@(#{VUStklaN5A*<51(D)1B)Ri>%oB$QSc~pR( zSf7bdemQA&O;zT5d3GtsJjAS~sr7r9_0zwrVx6lUUKAJtjlT9I+D^OBS7AJ()Ix@m<0$8x{| z(o8pstp+WdKJ%;GvIeZ2LO0GPzv2Hw5ekoYu~Wzl||b zG^FT9ax11B?J*7t>)-1xS)2!SOY%qkY<|EXDs9mJxccRoCRM?U(pY6 z#kBn%HRqwY-co@YI=TF$v~{euJ1aML_j7i;!0)e^Lhp8w`){)qZG#nue~4X8u0oS#M^v6gQ6CD ze2&aYtOl7U+k_XE)WjY_p6W2eTlO=drhxKUVctQD^^&-+qo+~x>{6r{pwk(c zrp_)1uhl2dIx4(?z?c@6o9I4EzRFdC9S zj7cNXAZ0rwmhNK-bLX7O3=!Ws`z3Ft2suf)T?RxwrgV52jBoFUq;))1#>uX-3nduK z6@c2lPuF>kTMnF3KVI-ixrJofKP!#+{UJk46bkVZ+|T4ml6nadE-jhUUVUcYksv!1 z_tFdhEoAtyj)H&!{4?VpkWSkj;rMH_Ebu?O|2ppxD2AOnf`gL{pJ%k4NGZG`CdM1+S+t!z{ znqNen`c+77AD#ENlZd@A2*o)ax1>y>lGY_lw|gly$$Tq&JSout;@BQnTfo1aRTdvN zJiNT??$fZ_EYAOhmQh!Io0ot)yp=fF{6#K81K~PUZR9k@E)tCenr&yXTE_txGc@km z&Sev5zosf}Sb>%MADdzQZgQA7G+_T%iio$JB~_zGz<@CKF;J@_F%)3G{8(PYYr!Vr z9mQIGbtKkSqqA)imvEKDEZJxu48OyOV<1W7tp>2g)eL=1wC9h41@zn zT^!n62w9Mve4dWE>9xM!dDTYEJW$j;iRXSld6IkqLhkz;d_*mMa4Yto6uhZW&URHD zM^z3E_lh2;5Q7qQNbT(L^GR&<;eQ~8NmF4{-Brw6ZBZ5eUhQ{~wskYQ&YqaJX{Gs# z0axXa*q0?Z#g+jRAI_o5-oek`wyf?4%AZ*wu3rT}ZJEFK1X(LcNn{x0c|Ji>`dGgT z{Z~6R1G=?#C4NSO-$0zf(c_N=8z#EkK!%U33?^$ih_0Re^nA4wV; zKPzQW4jcSkU=+H>2O*Wt+rtcQ>ru1NsU*Gp5(`nhX)dt?eC!YoV`F_(YlRIO4kSM42$`ZXS zRM_A>xQzgO(sE3HUx^yd0G5w7Ao4COZ>L-G6bN(VfV~a!`gU?igk^W z6M)Ct{Yfjn{0_4fRn`+vidflWFLzAbQIWjrRI99QI2IZI4avawa)|bFJH9lbgQ%4m z{u0V|MqxG_ngA_6bF;mq*T^it3px_f&-Ch5 zO$mA$5(b4#72MS8{&}#<#4tFU%7c%rdKHe6#hiuxEermLwd^N%)9enU^EC*pKSi{E zzxiMgTBmcNSVf>l0oY*JCda+(S#hIDX@rXHS|)j^Liq-aN|Fxcbh5!+Gzo(}{;Gme zq<-9}z~T#K^KTs`TCh?ixh3z$`+jbT%hONCZp|)VG{~iafgWyf3K4-hx2~f^6i{%D;%wvJabMXoz{Uiw%#I4`f z(pE_Q%78NNy6H6tm#aTmZ{qOcydb=&bnhCXan6D(_?vH0lD-`Pl8Y>TB#W?0jq0Ji z^l7%Qgj9;@wZA$TXpbcJiI?9zU_me+6LGbDRaNcs6GG=?FflJsoTr=sJgz3N+dIxUL&eZX zXngk@$Jgou#iyR%GKzme#95Xe1hl~|6$I5vnVco0{6G>{4hPr z7%OI1e;jUs0KG9o3;ZKNuCmg`3JE9yhj}|mcS6P`#3QRb@^<(5@I!Xf(eVNqQ~`T) zM#y=Z#KQ%q!#Qy{rp3k&ai(7o^K#y*(Ui{&sx%GumoZ<19$&2i@LMlF@A^k(PfgBS zz?Eiz`k3I$5$m}4DF){F+h1~|@F}ga-8f+fiw{_%_f)yLh2Y&mQejzJ(vQ&_h+~$# z+|mcNQDAa40c55K($tjI_<};Pr6jNfTfR#z@L1xVsan}(tznZx*L@Dt!u`_t=^wNx~)G;AqY zuP%BAZL~Qq(MknZVZ*U)xM1}H>lG0+gPirbD*k#WpJs^hDwdhkW0o0KOP&F@0EF#g z>Vuf)s7=c-y=eQMDcNV?4ns<3^LjW%R@WNhEk-|IJHKh4mE44TzIVfw3?obvBVt2E z)LnKJH_CHc+5>>ykh48r)y1q@G*su<7(8`4j{UZ02PLY-vxBpbc~K|vtzSk+qUhF(XnlIY}>YN+es&RtM@(|2m9P}-*f9rtzYtG z%{f<9&HppTc&7d|Ig>#j%piWm_My`Dy9$k`L?`ZILk{)rR%vsI)aMJ}rRgaZ1RM$7 zSd_YObVwLXoP)TH{DeuNQoZ3}hCnQ}A5)5-fE&mc-o^@I*W0GYX9W)z$rY_avg<1% z<87KoEoO}xtUd6G6$==ij}l^U!zUevItkypiwV)JutMByC~Q`aZ0IhaAw3KV$WGQo zyM{=TsEPviZSB?fCIZ15r|9BC1Q6EjGBySq=}XsBvrS9HXkg)|N(vW*jcRiEx++*= z>OFUMHrR1w7~^j=yf?~%p3UFs1O^LX+)`TUj}gALJ4JF@68#`#)HyWwVnF6U#B)3w z>*qk5eXr0q;%38+b|iN)*c7^0hAV;)O}LE})zf5AOo!~%<(8q)i1ls=kIek(5xr}< zZF~D(YLaD$SQ?fAJ5~=D?gNOA4ZrN__n1t2dKxO2^J5ovta)M`$h)WM6K-i3ySZu$ zGxE(f#0;xUNKtJAA6SX?1l_hM_(D=h>V&lP07!H<-cp%nl?Z{b^A&rh*2;j3S6!HM zuIn$Lpc^(~5J28MxTvr@6UgSSa|zL@Y&)#ODy++rlOzcTnD?0I;8-a4mDACk*BA`W zyAD|F>zusTAZ0^jtzk3wra@kZ26O2Hc`cQ|#r*zr+@Y*wMT8HZZI7l+nGq<7ZmvBA z_TnE&6&CeR*(Fr=bE0jXKfw>1ogyQNs>6HlriP4ihq)zw`QnP+5Uktp zzDt@h69a|`O7#}AF2t)-a=U|8JbS*7Pn$5CSRoRkS+4W~p+%Rix zyDKt*f`&N}+HjEvVFClj1eiGAKV5bF@)w{^Tzp!5)A&=&91<(!uk8&%}}sVgh?F_3b|AfB(_b-;UUB79JbLERCOYh zpk!H0WBM|#Y{N0#hYR;OC)A0V;!A^lh$j?`&f#EE+96B4$f=@x%V;3s7mK66s3*B8 zLMMn)6^wWxxK<>bqo0w|IE3zY75l3EHKqb8a0z^K8Zdla$mN<7DjL_aR>kkL6rx+VIaxiFyR7GUly zlfRRbHp+`9ki}aU1?gpY@UPt`kd~R}y9Fu5w-`pfMkM8q)<`>^VS)-uECBCUvwZeX zsxwnBbtvbo%>8K8dt81gPy)M}=Z~aW)T^5~+7(MQ!ptZwKjp2~ZGSgu!8E-%8B9g$ zor_w?ks!6bW3S%?4KW(3VE#IY;4TVNX{W?=8^4T?4Lec1F#1bgMX<_w5n<1D-X?G6 z#{i=sI+ZU27`Yy$*__~XO6#{(uj0<{JeHbh#a?Z3H~U+p&xMg^5b2LH>XLvg7t39z z(v0%{^%aeh)Cr0te!8|+R;L}KGmzXOOvtJ@e;fZHCWB&>1V2Zw^vr29lix>c?oMh%rg&uRz0mqdTWdgTYg4-e@6mMvW~@F{4E^ zk&e6fm}KW(g+_+b;4v*apm?1AC+lyVr|BHR=T*{fTMRH@ud(}bn)(ix&6wmK_UHs* zV6&rd4@4Z2xw0d{F}1#^6Sjxw%UkO^#wXhO`gmG|nGGLtTdPr~r(weoBQi`nbLiwj*-V@{NyNlD)rU4KO^w!~>DPKhqBB0ZQxZ07RU zzJ2(TZVI&^bA@N_`JpUXY-Zh=?~5jU$x2oD2Rp1!e2IvAyDmxjupfV4yDpe}UOuxM zUO^ngB3(~6>v20H zXR;LSI0(P4W0rHSg#NJyhef*r{5`Zf=t`+@yfkxuRRvE(*!c>x<|o$lk-&;i`A0o1 zjW0I165mbPVX|LPDJ_Ljx}JU3e6~3W!|jt4HUK|(xoo1Nlvq&Jd>%FY^Z>I`8C@dm z=rFzFuwN_pWX9@M1@D6(0yVvI*|=e-jr&Z$isPC*!h*zOKzP>+XvwvA-P_+!R{I52 zqAh4+NP?rYjn8)(~)gy3RHqtKK%IPgiO0s^l+M4rl(v=YD zDf#GN(hqKr1en~NfZ#$gMH!9`Zsfa1sIhCxAv!?n5p=TQl6Zh)rP+vT?LY4gLjy)@ z1xs}#p%xJ{UNTG%H`(kd)020+*E@$d&52e7~g_7!9iBi+NfQNjTw z)~jA*<||4<{WKV4$&)gG_T!VY4ioKO{EYYRRQ-W1BR*vr7YV}x8S5)HcdOgk@T^PN z3M5He1QEjbRvT#pLN+oaB?oGSRXykN1P=&09w)u|2f|B}ZfD9#*t{pTDvH387m63g z^v8Jeg7AY}G~@S1!q67f++78Sk%XLCc0e6O40<}Gsx!_~*Zi{{FJhZ)!%^j%l zL5@4zF1ctQ{w?F+i*#%JX$^%0rbe|F?@mjgN_QVJU}Sd`DfmDGXG1>c$wkPMgYyVU4h1>>Mk ziKqIxjTrc@&hhEo@iA4gsTB7R${0ILK3RrN8^MT~N@D}DJs=EYf6~()b{$C#EI&~n z7@$NhFCD+ePUnP^EGQXYU_z&Vt?0)3qN&5t=7B-sL(bBqN8>_ucAjK^TQlJcFIVB{ zr-Jf%t&>aJ#6TJIYfl;?l%7K)8d;wB5zX-`L28 zJd0hMERLgV5lK2A#KCcLLcg1Y5{cg$Y5F8iz1clU@x^>k{F(@tN5aWtf7OWoH$s{M z=|*h;D$_g)S?*Z&%cuQDQ=I~SKW{4W@qpw?k%m-t}@YQI&oBUQV z?M0Q)R5@2JI%a; z#AlrOsyYR?1#SES5tizoAlJD#Ev{GWK#M9HNV$0!$Ez$RIf2C(*vQK-mD?qw#pm*D zoPdm3lRmc9d?2pKaSvABtCiQXD9AH|iC^HNGqyN7C|aymjX>@}n}w(OrH~H9^u7Pr ziVt1xX&Y5ja}%z@jRs23$hOB*D$SH=O|~p6wAjlZN&wLsZ4Fc@(NvsW);;+32^{tE zumG#J4fmc;@s{o}RCab`CKa0u?B2PJul6V>+xop!DXdGT#&Vw!;THxbpSX~amdX{T z>N(!?OJP$vrNBr1&Sj!VEa<^_DF%OmW$2zk(LHj|QWfPB8?5LY-bH5Mi!~tq6)zF&j|6M$%2f{l-~UaQ|`yo851J{MvI>6&e=1maAj$B#un z7$fAgQ~>sy)*BBzyiCHqcXdvf3H z%Sb`4sB9=8P|w_{k9$`A-Vciy-D0M?C5koX$J-k3-Iv;|RX#q%_^~@?Il5SE-TgE7 zK0PAC>_~pug`4Zoe)S&x{pT6kHk4RZ`Lwz@0RVIm7bKi5WrH9mxSra&XiM*(t-HKg z`9}szSAOC9d&na2@p0P_g17$3BhGBL2arsh$6_LqSXZgLC8-t#2Qgv|3dx)4EC&q@ z5oz&I>FbG|6y?W&7GDs_oQ9u8`MA%8^(~VkWaA{}+NNV2LSnn!@PK~OO``3W!dy+Z zT|gn6P}{0_t1F#9l?*#09n2|nfliBch{VC5Col!gp={4Ddt%)^>{?|J35jtnDv_)K zG3pnp1oGB~`{U{tD*H)-0w7?&5Fw7dYiK}V3q^sbuP28o2X{~53ozg7OW>!?q%WwS z+WX#I&ET>2KbqVY>Z5ng@U9pEe_-bz1?XWdkH-mv1IoQup$e4ai4nKY=O(GCPeV?; zd`6-hgQsfB^%J5pYokDt=;Fs-oodUUCbcd&!(i2=zYvq&8qn7lAXvYkBj1x+xqAr} z@G^0B-er{bl;^}h&9w;^Xbr#xoQp>418pls)p4W`9GbF`Q`=n*h?LbV5LcS#`Yo}< z2p%3%O2HK9t$S58Yx~ffkYE5FdJ^LcKeH2fKs}ISLsk6U_YHaa^)Xy)zwxElS8SYg zON_gY1pDbAk1dFJVgdM_)7*l_fb5w5fwq+)<+^6ECAd%e`jJS?G16XCfD%PW8#|r! zZK6ruZehK@$n^HU!fq*~1ieN0>xg)J6jN3j% zCkO2y&AphTCv%_Rd8vQX4GqnOz;`@l$fXJEc%~eQiL_}LzYHom1dZ)H_CVgL(p$22?V)MdFJ$eZwpxbKY)4rOB7j<}51mt1* zMsZF8-IYuL+F{ zT%A&41xZ`gjldy7$-wT$0P=G60pr*}cMHPe@W%O}>I_zPMlb29>bTrVElMMQIg<+L zC^!TF#9j1yY9FG(SLKh6*BUD4rOcX2IJN88S)`Z900OhA+Cu*%2w<>w?cr#qs9KG9((z0z25{lhL9{TH5*thrI zGwge|`%cdbm&q5>3smhSk$g!t>)JTUJbPx)PXL(xY7H2oF45G|*87G8kC#h}U3BE#tK+trtHr z4W&FOw?nMe_~$K7Cu9s}B5ix4x5U<@u5T6_%z+2*ZYv_>`&0xTDQ5N+Cyp(lC=WkK zrTfmw3P>)#T*ZT($ zC49LvUKfcz@n!6_6_Z0IOlhdveC>{9?eqS_Uh#DeOTcS1j&wI%?5pZnhPhv+075q- ztYHFK$5&Q;t^8+xsTj0Cpu*6ewg&{VCHJ<62bR1~5IKV=x2@wu4H$rJn$*NknE8PH zZqV#gL_v~uY(~xuhwFF|J;)|MGu2*{A$safjWQ2T(0D}$ZV>7tW%K$Qz~I}sgSjTA zs7dp^P$1iV6+$7+9!Whnisuut1V*$p@g^dcR8Vnv*A@2t{P`}Aq5mMuaoMD9^E%Em zVrgSX!TH(t&Z0Us_G74rQM0rlA;LEE3BhsEY-f~sk$32cfOWj5< zS%YuxPN(wR6%6T%>LG1@5aOwR@V>@aTw3uaKG`cxJ!UdAgXbgC;?JSMa%B zu%D?FraW4(BxJ8bnwY{ps^X}D79Z5a>O${}8iGT#6Jf$$r^b62HgZ*)ERv3mKKr2m zP?-Am-i%bT1ZLvt;PRWscpns}(w(QIW;K?)>5QrM9Xn1^&o`U?KL*1YY0scs=fO_F zZ^rss;EU8a8zSAQQ@h3YO_M#kJ4)JYCX=O-J#furwdM}Wp%PLu1rhYKXA@F{AtNeSoPIL&Uae09+@!h{V0Jfg0*(yn5Ak{2Z<*%2J=|X%K>&9 zSsj!(-5?mCach0;eH7&lEj0kBIeC3aa8Ga>K1M5{Mp&))g=9j8pDl=KetQ;lQ0Jt& z(e6Pi!P2=C33IA|RaQm&1deO757Mp7FAr*F0Mq*ki;hgjS%f_F8b>d=)#sdoN{_91 z>!3gX>s+SCSA?ejM7*lClk+9aQ2>TH?zq|}=;*k$|9kC9qWX6-3ku9@{^OoeAy^Z0 zsnk@k<%j0aPYW`8>4@8RjVW^Kr0^+Oli3Z69Ef#|Osr>=CT!kVA1VQQ5_dTwE3v>ym0aqb`th_dd#;L@3}jTIpX@MrKv_7o-aq@~NQ69j zJCleef=L0y!}hT3-8<~EpJxON77Y@L*GnhMjVFo`u#U*j-w})k5r}g?s<3|F=vS_t z7;5BxMLB=jhv9PGf4dA!D_C7#a)GVM2lX?-RHw0Y`>GyN)Ty2QeOP^9J-p}Y=qXJ9 z30Yct%6GjhuSe2~*iHEC0}(YSpkny94{2ag#1KW$gfy_J2!9ZB<}C@M?I%r1P$MaZ zu+q8COlhntzXByN9V%8{rwPnGFlf#wNMR3%-P0TmMe7Mywr}Uz3@Vo^7%iW?;;sx) z-pkkprSAE&8Znbllv<987T$FF1vukn^}!W_A^~;bf4Fw=85ULJKgQaP*Em%gC>1k0 ztHd9HF-@34Q6;5DX;$?UegCU-st^3U8Awj|ACnPouG*VFvVf_W(aUP}0)Pb$K+*3s5 z995$LQ~Zj%MKts>P_UPaEe8u3A)q&@<(7a1eEl&fyE6A262wXH7YYz( zTq-njA+RHUd~5YRv7y)`$$}6wdQK@q6@{&|bK=^rM6lD6{~txM&9jvt%;>KCjB>n| zQ+6)TH>5DV!~EOG%OLZ%pQ4yBl!!yIq|eYmOASj)`M!;VdWs*}!m(8K8xQM<%6MIA zk)NBCdz&{osdpR%7o&$($fJ-@W;SVqx}z&Px$y~Tt2VZ>%lP zBLv7u9j6uvpa2Gw+^00!HD?#hQ12?8g1YbF?eFzCsnNgq(FdjJ zqR~I*BsIa|U2H3AMR41SzNO`wR7+w@W_8kWB%O5&t0yT+4&fP=`c$(N1|kOW(t;D! zXuu_^z@+jlDL406n2Wi__X~B=?nX+BwAv4e|EFmEB4x#hWV>CTOg1teaMK2rntY99mwnIe>f_ooC62lK=#ZutZWLAo2Tu zm%#qG`b7)_j5X*36v)ppa~0m8LSrwa$>;HMKLSEUssdM=8t~8GL1Vld#=+nmouzj! z3Y@obV(6f-P4-gOUxHh3YV-^I#%h9YprsJcIXW}e+i8_~XAp0OvP{euv4tMJf!&>I zU!o3OHmK`C!4OQh#Xsd0RCBPVhI_nqp7}rw>9$g&XX^O;1=U%(|5~TcFT|4XEYfdF zv09SJJVR9!I!Wnf3R*eI@Zq9r60lHf%p?QF2iS5+S|S)-KA}+2TZRZn<-Kz< z{F6>3VB|PWF1r69i}mALt4nWU+(W4`(R3AD0%@HMVkj!EAl@|n6P~%zL(*~PLV!Y4ejsjDFm=dhuu>EO&zM4GZ|Z#P%;Tg&D#OmYJgUn?*YhhwYo7 zM!tN(+a`g3@OU5zS8AA_=9%)Z-YQsD`Lrapod-0w!+IGZg1gz60cWz*-48xwW27rk zSvxJg2vc|gi)BZVONXD8R2hw9rRi6;1LyU4d|$JE$M#e5YgNz(v`VW*qq&w{`qrX* zzMWG}K~fYv+uaY~uz#W~dpf}KWJ{yzsZ>)ZubpU|ysAMfg4$jWDZgBo=5nJ5FADqH zOI?g4|E;oQ4&G~-pS1#Y5UB)|?06(Pj8=(I(VAp;{uX`>gE58?p1q+9(c11DMpSGV zqu~-anJ}2}4}w=x;Qt_ac^OG>$TU#Sq(6lEdUNkS#-gZb{GbjL#YyY?lC!CJl{GDX zxu_muHhS|WO#=zIe?IBWgbS7^Q92UIIT)d$Xf8M}&VlL#`f;!9Yo6Z(0;pbtc4Qj+fEqm!1(x2A>($;d& zpWvK}s796Veg37Gict01rNwp*8Plu<w z*06`=gy=DBgz& ziEl2sOCA4>^cC?u827uE&!*mg^8yhe`4xYd;ED9%0{9M#ON@7nwQco9n2U8aV7%)# zSNJ$e`oQdajxZu$Vg?jIrw{E=v(V-3;h`r39$MU|rL7hKV(cpm{ zSf1#rFG2ku>R<5Qo%#U$VdFW@>8Ekz#9+8lUwmeD8FiE{k}2+7JWpL9ME&jg1r$A- zjf={&T5wakyMJjDC_bwmvZuJl=w{V3Gjxg z?ivQ=-^jYuA*DD`21l_G^872`pUp|3dp_MNMw4mTdZilAp;cBLFk@%ufkNg@z3hAz zKJ65a3L>AqG&_paTvm7}kw9_Zyne^poaEbTKL2kTm>)_Duuk+~$D)K7%0o}N&UT+m z4bEyeb8oyi8OI_|B035R>nZ~bN#W5A?i+-*R z=%7YV3B!YqH)&Hst<fd1|eE1@08qX?KVZ($gC2F84`LB0|Mrm~-BF zjDY+C;5ln>Euydlwn9wqqHG(n+}j(8cuGGA5 z!4vh-*MmfCt5v?fbJHsBC~1Qs`)eDu55=*}%^!l2`F9v;Mp&C!RSq=;1>?99C*WuZ zXHbD^zw+@YgXpwLTC13t8Mo%FR29EKHaZ-ZXv9Nluwq)GMp%ISJ$?mQ9l(~&3w1MV zS##-r6k~21jBjj=Wn8#OO5>SQ_iFlhXJh*XSyWgJ+G0o-9|(h0bv@9B@3~g=DV{|8 zU@&Lbk^w*3yKuMiz`|fhDHuqY01wDlq?`BovGwFgOi#g-QcTJ0prmc2k{i1qbMq{! zbb?mlGr)#34^w4=oIlp2!`JB@_Aka=Q;V;LaM!aAA@~dSoG33j4H3tNF zp}oA`O%Kk9;_W3&u})2|uf9Mi7?#{ZGF?@QkpU$P(kMjCYlQwOUiV>pu@Zwm%&aW?iAa`#{yJu49 zPnqkd+V!a1{+8Z1SXAzgLTH~4lD^XB@9?n{X?K-!Be%2W6{V%t0{#VbefpsT)L-96 zR*Trqjr{$5xr|N3Ro}glJvv}JXa2S*`h(51$m-OM@Y#Q*j)IrZB6TqP#y*}TaJurG zdqIPiSEadZC$q_#oZR$`d> zSS{G+WagkJK*6?iuJHy)3Fz*)Vqm{_&Z_jy<_l7;|M*1rsB-dnM81lxUSoof3I#1rcqz3sP`96R(B>XLoiHOnSWt0hG(GV{2ljDW)n353 z0Y&ba%gs8!3M+Q37;_EKB}$b4L5|xnDJw`%3rX9N{HER>#)&@JgmSqqif~y0Qc^2_ z+CW=~4-$<#xZ}K=+oq+fH61LPIu)6Fb*yT_6L7wRHSu_`mpBl__>13{X>2Yo>2P*X zY-BZd=(y9bkZ%)o^?c|A2+3#^kC%Ib2cj^S3GJRz&kZ#c_7fMkI1d?C3ODx)#J8oZ zvuc8O!sjw6m-IAwtpgNyTwG60w$bRCE?~ai-dna?#_e5|ux;6WY#9k&jjmI@&OQOb zdwI;Yr==~y z><1{`ORziS?S?8tEUb+*-h1`C1VZnJ1$uS%BDi{8qKhex5;tFw=g<_N=@hVI*|0q^kQxQg}zy9)tGM<;-EBc3^cF3~Hwq@Bd!NV$K4%3Gd7Z z?b0>gTtf4+dS7=Ab6a27#F}8Lw#Pv&!L|`JCn-dd40FuKZOG40~^q0KqMsU5}g@YeXexA}s?MxW+iYTQc>Bj2Hs&csaOA3LW}L_YWyJKE-8{d*)cPQhBhDT{`Pw3NfcfsYvUE;?C!k3~7|Ze{T2jm3bz+wXJOrA*xz z{85%WtY9YJAL-x}{mE{~qCN$m&H-MU7nEA{yqos`_o7aW5v^}3iL)!%7}NQAI^EZK09o3nu*22w?9vJ`o!1Cepy z%%|>v6o22)?nwhqPa)o?;uQ92`Q>#X!*~>w3$St|<9oK314bw8%l_o}QK;=%mIJ&_ z8bon~2Bh_i;J}8GSxtv9Yt0pUq9Sc|Sw- z{>hQ(!W7)0O&_U$gKoW))<8&=Ws>5;mhX?)94@oC8c~a*e-5$s{L7;EEZU}fusc?I ztwWSCK15dR;(URgZ?fSQ{c9d$u+yxZRGfT&a5>$)AFZA?KTvAD^{kAawS)n#Ae0@$ zXQQw$JIfiMV7Hh62W-#mX!CYa^xuT6ey(8%Vli+Hm+KGR`D!};@wnEEn0a&XIP_Zd z)R(bf33GVB61rvor|bm?U0I(0L+C2ukIIoX)S|GWp=hBnzA%eJK{sve?6T-iISpMEv*yytSyL=^H!jA-)W|>UB?NU&Y zFm^Mwf1SNL%cBj2Q3EudNE@Id6LHuXItcwodL(^%R`Hwtc{Q^imyLVRWk%PT7~3gOrABH zW&u$LW=ma@6QVktoD0Xuj8%|Jf)6;WZw+u@S}{qHaky`M3&)Z?JYfNG4DBkPiDau< zGgUywoVbGp_f#lL*G)_YS}vq#sKUq6)Mr2lVa@Ao!`JB*$7{i5skJoip2tj;C$X>d zcB>A2ATJSp;QkG<(|O~sU4iU;5Hf((wnq8?hodGEtbgwZyeB9B{$Hw7&wrs#QTJ~+ zTqk4u4i2ZZHC_jspJlDXkJz8s*Q*!gm4ZJzbBGZF%M9yHE)NZqyCQwWgdj%!OL?l> z56rtm<1a#49iPdS{~Cze`TzGo^v`*%r=rF00`$ac34)_BY*X~=PK@6 zZG>kf^q1h);&)zla{uv4hAzAaa-<`)^Gmi#Uf>_&T0#c@Xchb)<64MFFySemGU7A^b!TdU%1 To}vYP2Y87HN(z+mY5V*?6Xh&C literal 0 HcmV?d00001 diff --git a/resources/mux_test.png b/resources/mux_test.png new file mode 100644 index 0000000000000000000000000000000000000000..8589c428ae6eeb3d29e280536026a19514069cd8 GIT binary patch literal 11613 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 Date: Sun, 17 Sep 2017 21:58:15 -0400 Subject: [PATCH 12/13] removed random multiplexer file --- multiplexer.t.v | 32 -------------------------------- 1 file changed, 32 deletions(-) delete mode 100644 multiplexer.t.v diff --git a/multiplexer.t.v b/multiplexer.t.v deleted file mode 100644 index 72c6404..0000000 --- a/multiplexer.t.v +++ /dev/null @@ -1,32 +0,0 @@ -// Multiplexer testbench -`timescale 1 ns / 1 ps -`include "multiplexer.v" - -module testMultiplexer (); - wire out; - reg addr0, addr1; - reg in0, in1, in2, in3; - - structuralMultiplexer multiplexer (out,addr0,addr1,in0,in1,in2,in3); - - initial begin - // test when all wires are 0 - $display("A0 A1 | I0 I1 I2 I3 | Out | Expected Behaviour"); - addr0=0;addr1=0;in0=0;in1=0;in2=0;in3=0; #1000 - $display("%b %b | %b %b %b %b | %b | I0 Only (low)", addr0, addr1, in0, in1, in2, in3, out); - addr0=0;addr1=0;in0=1;in1=0;in2=0;in3=0; #1000 - $display("%b %b | %b %b %b %b | %b | I0 Only (high)", addr0, addr1, in0, in1, in2, in3, out); - addr0=1;addr1=0;in0=0;in1=0;in2=0;in3=0; #1000 - $display("%b %b | %b %b %b %b | %b | I1 Only (low)", addr0, addr1, in0, in1, in2, in3, out); - addr0=1;addr1=0;in0=0;in1=1;in2=0;in3=0; #1000 - $display("%b %b | %b %b %b %b | %b | I1 Only (high)", addr0, addr1, in0, in1, in2, in3, out); - addr0=0;addr1=1;in0=0;in1=0;in2=0;in3=0; #1000 - $display("%b %b | %b %b %b %b | %b | I2 Only (low)", addr0, addr1, in0, in1, in2, in3, out); - addr0=0;addr1=1;in0=0;in1=0;in2=1;in3=0; #1000 - $display("%b %b | %b %b %b %b | %b | I2 Only (high)", addr0, addr1, in0, in1, in2, in3, out); - addr0=1;addr1=1;in0=0;in1=0;in2=0;in3=0; #1000 - $display("%b %b | %b %b %b %b | %b | I3 Only (low)", addr0, addr1, in0, in1, in2, in3, out); - addr0=1;addr1=1;in0=0;in1=0;in2=0;in3=1; #1000 - $display("%b %b | %b %b %b %b | %b | I3 Only (high)", addr0, addr1, in0, in1, in2, in3, out); - end -endmodule From c9aac29b29ae174e4741750ec32e6784df23b6ee Mon Sep 17 00:00:00 2001 From: Jonah Spear Date: Sun, 17 Sep 2017 22:11:50 -0400 Subject: [PATCH 13/13] Update README.md --- README.md | 86 +++++++------------------------------------------------ 1 file changed, 11 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index b650dc1..11adbac 100644 --- a/README.md +++ b/README.md @@ -1,84 +1,20 @@ # HW 0b010: Verilog Building Blocks -Due: September 23rd +Jonah Spear -This homework prepares some of the gate level primitives you will use in the design of your processor. You will reuse these modules in several future designs. Therefore, the structure and test will be in separate modules. +The purpose of the homework was to build several digital circucit building-blocks in verilog. All of the code was tested using icarus verilog. -This homework is to be done individually. +## Multiplexer -## The Devices +![Multiplexer Truth Table](/resources/mux_table.png?raw=true) +![Multiplexer Signal Trace](/resources/mux_test.png?raw=true) -This homework is based on the following three devices: +## Decoder -1. 2-bit decoder with enable (2+1 inputs, 4 outputs) -1. 4:1 (four input multiplexer) -1. 1-bit full adder +![Decoder Truth Table](/resources/decoder_table.png?raw=true) +![Decoder Signal Trace](/resources/decoder_test.png?raw=true) -For each of these three devices, you will do the following: - -1. Write a test bench to test the functionality of the device. -1. Test your test bench against my version of the device. -1. Write your own version of the device. -1. Test your device against your test bench. - -## The Test Benches -For each device, first write a test bench that verifies the appropriate behavior of your device. We have already completed this for you for the 2 bit decoder as an example, so you will only have to write the other two. - -The test bench should: - -1. Instantiate a copy of the device it is testing (Device Under Test = DUT) -1. Show what the truth table should be -1. Show what the truth table is - -## The Behavioral Devices -We've provided versions of each of the three devices in a language subset called "Behavioral Verilog". Use these versions to test your test benches. Connect the test bench to the device definition provided and verify that your test bench passes with the given behavioral device. - -## The Structural Devices -Create the three devices in Structural Verilog, using only the gate primitives we have already gone over: -```verilog -NOT AND NAND OR NOR XOR -``` - -Do not use behavioral constructs such as `assign` or `case`. - -Give all of your gates a delay of 50 units of time. - -## The Write Up -Create a PDF or Markdown file demonstrating your circuits working correctly. It should contain pictures of your test bench results and your waveforms that clearly show the gate propagation delays. - -## Submission -Please submit: - -1. Your 3 Verilog files -2. Your writeup as a PDF or Markdown file -3. The scripts you used to run the tests - -Push the work to your repo, then submit a pull request to the course repo (CompArchFA17/HW2) for us to respond to with feedback. - -## Hints / Tricks - -### Gate delays -In order to model some sort of delay for our gates, simply put these statements at the top of your Verilog source: - -```verilog -// define gates with delays -`define AND and #50 -`define OR or #50 -`define NOT not #50 -``` - -Then, when you go to instantiate an AND, for instance, instead of using just `and`, use `` `AND``. That is, back-tick followed by the define you specified. Think of the back-tick as a macro definition. - -That means that the gate, `` `AND``, has a delay of 50 units. Then, in your simulation, you should wait between transitions of the input long enough to allow the signals to propagate to the output of your circuit. - -### Signal Declaration -You need to declare all your inputs and outputs and all the intermediate signals you use in your designs. Thus, if you have the statement: -```verilog -and myandgate(out, in1, in2) -``` - -You need to have previously declared `out`, `in1`, and `in2`, to be some sort of physical entity (`wire`, `reg`). - -### Tutorials -There are some Verilog resources listed on the [course website](http://sites.google.com/site/ca17fall/resources/verilog) +## Adder +![Adder Truth Table](/resources/adder_table.png?raw=true) +![Adder Signal Trace](/resources/adder_test.png?raw=true)