半加器
module half_adder(
input bit a,
input bit b,
output bit sum,
output bit carry
);
assign sum = a ^ b; // 异或运算
assign carry = a & b; // 与运算
endmodule
全加器
module full_adder(
input bit a,
input bit b,
input bit cin,
output bit sum,
output bit cout
);
assign sum = a ^ b ^ cin; // 异或运算得到sum
assign cout = (a & b) | (cin & (a ^ b)); // 通过与门和或门得到cout
endmodule
使用半加器实现全加器:
module full_adder(
input bit a,
input bit b,
input bit cin,
output bit sum,
output bit cout
);
wire bit temp_carry;
half_adder ha1(a, b, sum, temp_carry); // 使用半加器计算a和b的和,结果存储在sum中
half_adder ha2(sum, cin, sum, cout); // 使用半加器将上一个半加器的sum和进位cin相加,结果存储在sum中,进位存储在cout中
endmodule
a+b考虑有溢出
1.a,b同为正数,s为负数,溢出
2.a,b同为负数,s为正数,溢出
module tp(
input [7:0] a,
input [7:0] b,
output [7:0] s,
output [7:0] overflow
);
assign s=a+b;
assign overflow=((~a[7])&(~b[7])&s[7])|((a[7]&b[7]&(~s[7]));//a[7],b[7]为符号位
endmodule
半减器
module half_subtractor(
input bit a,
input bit b,
output bit diff,
output bit borrow
);
assign diff = a ^ b; // 异或运算得到差值
assign borrow = ~a & b; // 非与运算得到借位
endmodule
全减器
module full_subtractor(
input bit a,
input bit b,
input bit bin,
output bit diff,
output bit bout
);
wire bit borrow_temp;
assign diff = a ^ b ^ bin; // 异或运算得到差值
assign borrow_temp = (~a & b) | (~a & bin) | (b & bin); // 使用与门、或门得到借位的临时结果
assign bout = ~borrow_temp; // 非运算得到最终的借位
endmodule
module full_subtractor(input bit a, input bit b, input bit bin, output bit diff, output bit bout);
wire bit temp_bout;
wire bit temp_diff;
half_subtractor hs1(a, b, temp_diff, temp_bout); // 使用半减器计算a和b的差值和借位
half_subtractor hs2(temp_diff, bin, diff, bout); // 使用半减器计算上一个半减器的差值和进位与借位的差值和借位
endmodule
在这个全减器中,我们使用了两个半减器。第一个半减器(hs1)用于计算a和b的差值和借位,将结果存储在临时变量temp_diff和temp_bout中。第二个半减器(hs2)使用上一个半减器的差值temp_diff作为一个输入,bin作为另一个输入,以计算最终的差值diff和借位bout