半加器,全加器,半减器,全减器

半加器

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值