半加器
创建一个半加器。半加器将两位相加(没有进位)并产生一个两数之和和一个进位。
Module Declaration
module top_module( input a, b, output cout, sum );
答案:
module top_module( input a, b, output cout, sum ); assign {cout, sum}=a+b; endmodule
全加器
创建一个全加器。全加器将三位(包括进位)相加产生一个两数之和和一个进位。
Module Declaration
module top_module( input a, b, cin, output cout, sum );
答案:
module top_module( input a, b, cin, output cout, sum ); assign {cout,sum } = a+b+cin; endmodule
3位二进制加法器
加法器将两个 3 位数字和一个进位输入相加以产生 3 位总和并执行。为了鼓励您实际实例化全加器,还要输出纹波进位加法器中每个全加器的进位。cout[2] 是最后一个全加器的最后进位,也是你经常看到的进位。
Module Declaration
module top_module( input [2:0] a, b, input cin, output [2:0] cout, output [2:0] sum );
答案:
module top_module( input [2:0] a, b, input cin, output [2:0] cout, output [2:0] sum ); full_adder full_adder0( .a(a[0]), .b(b[0]), .cin(cin), .cout(cout[0]), .sum(sum[0]) ); full_adder full_adder1( .a(a[1]), .b(b[1]), .cin(cout[0]), .cout(cout[1]), .sum(sum[1]) ); full_adder full_adder2( .a(a[2]), .b(b[2]), .cin(cout[1]), .cout(cout[2]), .sum(sum[2]) ); endmodule module full_adder( input a, b, cin, output cout, sum ); assign {cout,sum } = a+b+cin; endmodule
加法器
实现以下电路:
Module Declaration
module top_module ( input [3:0] x, input [3:0] y, output [4:0] sum);
答案:
module top_module ( input [3:0] x, input [3:0] y, output [4:0] sum); wire [2:0] cout; FA full_adder0( .a(x[0]), .b(y[0]), .cin(0), .cout(cout[0]), .sum(sum[0]) ); FA full_adder1( .a(x[1]), .b(y[1]), .cin(cout[0]), .cout(cout[1]), .sum(sum[1]) ); FA full_adder2( .a(x[2]), .b(y[2]), .cin(cout[1]), .cout(cout[2]), .sum(sum[2]) ); FA full_adder3( .a(x[3]), .b(y[3]), .cin(cout[2]), .cout(sum[4]), .sum(sum[3]) ); endmodule module FA( input a, b, cin, output cout, sum ); assign {cout,sum } = a+b+cin; endmodule
有符号加法溢出
假设您有两个8位2的补数,a[7:0]和b[7:0]。这些数字加起来就是s[7:0]。还要计算是否发生了(有符号的)溢出。(当两个正数相加产生负结果或两个负数相加产生正结果时,就会发生 有符号溢出。有几种检测溢出的方法:它可以通过比较输入和输出数字的符号来计算,或者从位 n 和 n-1 的进位导出。)
Module Declaration
module top_module ( input [7:0] a, input [7:0] b, output [7:0] s, output overflow );
答案:
module top_module ( input [7:0] a, input [7:0] b, output [7:0] s, output overflow ); wire cout; assign {cout,s} = a+b; assign overflow = cout ^ s[7] && ((a[7]&&b[7])||(!a[7]&&!b[7])); endmodule
100位二进制加法器
创建一个100位二进制加法器。加法器将两个100位的数字加上一个进位,产生一个100位的和和进位。
Module Declaration
module top_module( input [99:0] a, b, input cin, output cout, output [99:0] sum );
答案:
module top_module( input [99:0] a, b, input cin, output cout, output [99:0] sum ); assign {cout,sum} = a+b+cin; endmodule
4位加法器
为您提供了一个名为bcd_fadd的BCD(二进制编码的十进制)一位数加法器,它将两个BCD数字和进位相加,并产生一个和和进位。
module bcd_fadd ( input [3:0] a, input [3:0] b, input cin, output cout, output [3:0] sum );
实例化4个bcd_fadd副本以创建一个4位BCD纹波进位加法器。您的加法器应该将两个4位BCD数字(打包成16位向量)和一个进位相加,以产生一个4位的和并进行运算。
Module Declaration
module top_module( input [15:0] a, b, input cin, output cout, output [15:0] sum );
答案:
module top_module( input [15:0] a, b, input cin, output cout, output [15:0] sum ); wire [3:0] cout_connect; bcd_fadd u0_bcd_fadd( .a (a[3:0]), .b (b[3:0]), .cin (cin), .cout(cout_connect[0]), .sum (sum[3:0]) ); bcd_fadd u1_bcd_fadd( .a (a[7:4]), .b (b[7:4]), .cin (cout_connect[0]), .cout(cout_connect[1]), .sum (sum[7:4]) ); bcd_fadd u2_bcd_fadd( .a (a[11:8]), .b (b[11:8]), .cin (cout_connect[1]), .cout(cout_connect[2]), .sum (sum[11:8]) ); bcd_fadd u3_bcd_fadd( .a (a[15:12]), .b (b[15:12]), .cin (cout_connect[2]), .cout(cout), .sum (sum[15:12]) ); endmodule