HDLbits练习记录(八)全程更新

Circuits>Combinational Logic>Airthmetic Circuits

1.Half adder

功能:

加法器,半加器,不计算进位。

收获:

代码:

module top_module( 
    input a, b,
    output cout, sum );
    assign {cout,sum} = a + b;
endmodule

2.Full adder

功能:

全加器,计算进位。

收获:

代码:

module top_module( 
    input a, b, cin,
    output cout, sum );
    assign {cout,sum} = a + b + cin;
endmodule

3.3-bit binary adder

功能:

将三个一位全加器组合成一个三位全加器,并将进位信号全部输出出来。

收获:

代码:

module top_module( 
    input [2:0] a, b,
    input cin,
    output [2:0] cout,
    output [2:0] sum );
    wire [1:0]link;
    assign cout = {cout[2],link};
    full_adder full_adder0(
        .a(a[0]),
        .b(b[0]),
        .cin(cin),
        .cout(link[0]),
        .sum(sum[0])
    );
     full_adder full_adder1(
         .a(a[1]),
         .b(b[1]),
         .cin(link[0]),
         .cout(link[1]),
         .sum(sum[1])
    );
     full_adder full_adder2(
         .a(a[2]),
         .b(b[2]),
         .cin(link[1]),
         .cout(cout[2]),
         .sum(sum[2])
    );
endmodule
module full_adder(input a,input b,input cin,output cout,output sum);
    assign {cout,sum} = a + b + cin;
endmodule

4.Adder

功能:

实现下面的电路。

收获;

代码:

module top_module (
    input [3:0] x,
    input [3:0] y, 
    output [4:0] sum);
    wire [2:0] link;
    full full_inst0(
        .a(x[0]),
        .b(y[0]),
        .cin(1'b0),
        .cout(link[0]),
        .sum(sum[0])
    );
     full full_inst1(
         .a(x[1]),
         .b(y[1]),
         .cin(link[0]),
         .cout(link[1]),
         .sum(sum[1])
    );
     full full_inst2(
         .a(x[2]),
         .b(y[2]),
         .cin(link[1]),
         .cout(link[2]),
         .sum(sum[2])
    );
     full full_inst3(
         .a(x[3]),
         .b(y[3]),
         .cin(link[2]),
         .cout(sum[4]),
         .sum(sum[3])
    );
endmodule
module full(input a,input b,input cin,output cout,output sum);
    assign {cout,sum} = a + b + cin;
endmodule

5.Signed addition overflow

功能:

两个八位二进制补码相加,判断溢出和计算结果。

收获:

补码相加,有两种判断溢出方法。第一种是,对于补码相加,一般分为三种情况,分别是正+负,正+正,负+负,对于正+负的情况是不会发生溢出的,所以不用管这种情况,对于正+正的情况,如果符号位变成了1,即数值最高位产生了进位,那么就产生了溢出,即向上溢出。对于负+负的情况,首先其符号位一定是会产生进位的,但是对于数值最高位,如果没有产生进位,反而视为发生溢出,但并不是向上溢出,而是向下溢出,即太小了,所以才没有产生进位。总的来说,就是,对于这种情况,只要是符号位和数值最高位只有一个发生改变,而另外一个没有变化,则认为其发生了溢出。第二种判断方法则是,将其符号位复制一次,放置到数值最前边,即数最高两位都是符号位,若加法计算之后。最高两位变成了01,则发生了正溢出(正数太大了),若最高两位变成了10,则发生了负溢出(负数太小了)。

代码:

module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output reg overflow
); //
    reg [8:0] q;
    assign s = a + b;
    always@(*)
        begin
            q = {a[7],a}+{b[7],b};
            case(q[8:7])
                2'b01,2'b10:overflow = 1'b1;
                default: overflow = 1'b0;
            endcase
        end
        
    // assign s = ...
    // assign overflow = ...

endmodule

6.100-bit binary adder

功能:

一百位全加器

收获:

代码:

module top_module( 
    input [99:0] a, b,
    input cin,
    output cout,
    output [99:0] sum );
    assign {cout,sum} = a + b + cin;
endmodule

7. 4-digit BCD adder

功能:将四个四位二进制转十进制的模块组合成一个16位二进制转十进制的模块,主要是模块实例化和组合。

收获:

代码:

module top_module( 
    input [15:0] a, b,
    input cin,
    output cout,
    output [15:0] sum );
    wire link[2:0];
    bcd_fadd bcd_fadd_inst0(
        .a(a[3:0]),
        .b(b[3:0]),
        .cin(cin),
        .cout(link[0]),
        .sum(sum[3:0])
    );
    bcd_fadd bcd_fadd_inst1(
        .a(a[7:4]),
        .b(b[7:4]),
        .cin(link[0]),
        .cout(link[1]),
        .sum(sum[7:4])
    );
    bcd_fadd bcd_fadd_inst2(
        .a(a[11:8]),
        .b(b[11:8]),
        .cin(link[1]),
        .cout(link[2]),
        .sum(sum[11:8])
    );
    bcd_fadd bcd_fadd_inst3(
        .a(a[15:12]),
        .b(b[15:12]),
        .cin(link[2]),
        .cout(cout),
        .sum(sum[15:12])
    );
endmodule

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值