HDLBits-Circuits学习小结(三)加法器实现(arithmetic circuits)-----个人做题笔记

1、补码加法器(需要判断进位)

        假设有2个8位二进制补码a[7:0]和b[7:0],相加得到s[7:0]。判断是否发生了(有符号的)溢出。

(a[7]、b[7]、s[7]为个字符号位)

(1)、参考

      二进制有符号数运算及溢出判别

判别方法
https://blog.csdn.net/Adidas112233/article/details/108861917?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163488424616780269843171%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163488424616780269843171&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-108861917.pc_search_result_hbase_insert&utm_term=hdlbits+adder3&spm=1018.2226.3001.4187icon-default.png?t=L9C2https://blog.csdn.net/Adidas112233/article/details/108861917?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163488424616780269843171%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163488424616780269843171&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-108861917.pc_search_result_hbase_insert&utm_term=hdlbits+adder3&spm=1018.2226.3001.4187

注解:上面例子都是补码相加,其中例7左边正数补码是其本身,右边负数补码取反加一,进位是两加数每一位运算自身产生的进位。上面都是两个8bit相加,从左至右第一个bit位是符号位,第二个bit位是最高数值位,如果结果超出8bit,则超出的位不会在计算机中存储,因此造成溢出现象。

(2)、补码加法运算溢出判断三种方法:
[方法一]
Xf、Yf分别两个数的符号位,Zf为运算结果符号位。
当Xf =Yf =0(两数同为正),而Zf=1(结果为负)时,正溢出;
当出现Xf =Yf =1(两数同为负),而Zf=0(结果为正),负溢出.

module top_module (              
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); 

    assign s = a + b ;
    always@(*)begin
        if(a[7]^b[7]==1'b0 && a[7]^s[7]==1'b1)
           overflow = 1'b1;
        else 
            overflow =1'b0;
    end
endmodule
/*因为ab为补码,故s为补码,s[7]也为符号位。
*/
module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); 
    assign s = a + b ;
    assign overflow = (a[7]&b[7]&~s[7])|(~a[7]&~b[7]&s[7]);

endmodule


[方法二]
Cs表示符号位的进位,Cp表示最高数值位进位,⊕表示异或。
若 Cs⊕Cp =0 ,无溢出;
若 Cs⊕Cp =1 ,有溢出。

 

module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); //
 
    wire s_1;
    assign {s_1,s} = a + b;
    always @(*) begin
        if (a[7]^b[7])//一正一负必然是不溢出的
            overflow = 0;
        else if (a[7]==0 & b[7]==0 & s[7]==0)//这个容易被忽略。要考虑最高数值位的进位不是s[7]的情况
            overflow = 0;
        else if (s_1^s[7]==0) //同方法二
            overflow = 0;
        else
            overflow = 1;
    end

endmodule

[方法三]
用变形补码进行双符号位运算(正数符为00,负数符号以11)
若运算结果的符号位为"01",则正溢;
若结果双符号为10,则负溢出;
若结果的双符号位为00或11,无溢出。

**************************************************************************************

HDLBits-Circuits学习小结(三)各种姿势的加法器实现(arithmetic circuits)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值