module half_adder (a,b,carry,sum); input a,b; output carry,sum; // La somma è ottenuta con XOR assign sum = a ^ b; // Il riporto è ottenuto con AND assign carry = a & b; endmodule module full_adder (a,b,c,sum,cout); input a,b,c; output sum,cout; wire sum1, carry1, carry2; // Primo half adder half_adder ha1 (.a(a), .b(b), .sum(sum1), .carry(carry1)); // Secondo half adder half_adder ha2 (sum1, c, carry2, sum); // Il riporto finale è la OR dei riporti intermedi assign cout = carry1 | carry2; endmodule module four_bit_adder ( input wire [3:0] a, // Primo operando a 4 bit input wire [3:0] b, // Secondo operando a 4 bit input wire cin, // Riporto in ingresso output wire [3:0] sum, // Somma a 4 bit output wire cout, // Riporto in uscita output wire error // error in signed arith ); wire c0, c1, c2, c3; // Riporti intermedi // Quattro full adder collegati in cascata full_adder fa0 ( .a(a[0]), .b(b[0]), .c(cin), .sum(sum[0]), .cout(c0)); full_adder fa1 ( .a(a[1]), .b(b[1]), .c(c0), .sum(sum[1]), .cout(c1)); full_adder fa2 ( .a(a[2]), .b(b[2]), .c(c1), .sum(sum[2]), .cout(c2)); full_adder fa3 ( .a(a[3]), .b(b[3]), .c(c2), .sum(sum[3]), .cout(c3)); assign cout = c3; assign error = c3 ^ c2; endmodule // Modulo Comparatore Grater than 9 module greater9 (x,cin,cout); input [3:0] x; input cin; output cout; assign cout = (x[3] & (x[2] | x[1])) | cin; endmodule // Modulo per una singola cifra BCD module bcd_adder_digit( input [3:0] a, b, input cin, output [3:0] add, output cout ); // Segali interni wire carry,corr_req; wire [3:0] sum,sumplus6; // Somma binaria a 4 bit four_bit_adder add1(.a(a),.b(b),.cin(cin),.sum(sum),.cout(carry),.error()); four_bit_adder corr1(.a(sum),.b(4'b0110),.cin(1'b0),.sum(sumplus6),.cout(),.error()); greater9 comp(sum,carry,corr_req); // Applicazione correzione BCD assign add = corr_req ? sumplus6 : sum; // Multiplexer assign cout = corr_req; endmodule module bcd_adder_3digits_v0( input [3:0] a0,a1,a2,b0,b1,b2, // 3 cifre BCD (4 bit per cifra) input cin, // Carry in output [3:0] s0,s1,s2, // Somma BCD a 3 cifre output cout // Carry out ); // Segnali intermedi wire c1, c2; // Istanze del modulo bcd_adder_digit bcd_adder_digit digit0(.a(a0), .b(b0), .cin(cin),.add(s0), .cout(c1)); bcd_adder_digit digit1(.a(a1), .b(b1), .cin(c1), .add(s1), .cout(c2)); bcd_adder_digit digit2(.a(a2), .b(b2), .cin(c2), .add(s2), .cout(cout)); endmodule module bcd_adder_3digits( input [11:0] a,b, // 3 cifre BCD (4 bit per cifra) input cin, // Carry in output [11:0] s, // Somma BCD a 3 cifre output cout // Carry out ); // Segnali intermedi wire c1, c2; // Istanze del modulo bcd_adder_digit bcd_adder_digit digit0(.a(a[3:0]), .b(b[3:0]), .cin(cin),.add(s[3:0]), .cout(c1)); bcd_adder_digit digit1(.a(a[7:4]), .b(b[7:4]), .cin(c1), .add(s[7:4]), .cout(c2)); bcd_adder_digit digit2(.a(a[11:8]), .b(b[11:8]), .cin(c2), .add(s[11:8]), .cout(cout)); endmodule