HDLBits练习---Arithmetic Circuits

1.Hadd

创建一个半加法器。半加法器添加两个位(不考虑低进位)并产生总和。

module top_module( 
    input a, b,
    output cout, sum );

    assign sum = a ^ b;  //异或
    assign cout = a & b;  //与
    
endmodule

2.Fadd

实现一个全加器。

module top_module( 
    input a, b, cin,
    output cout, sum );

    assign sum = a ^ b ^ cin;
    assign cout = ((a ^ b) & cin) + (a & b);
    
endmodule

3.Adder3

创建3位二进制全加器,加法器将两个3位数字和一个进位数相加,产生3位和并执行。

module top_module( 
    input [2:0] a, b,
    input cin,
    output [2:0] cout,
    output [2:0] sum );

    wire cout1,cout2,cout3;
    full_adder instance1 (.a(a[0]), .b(b[0]), .cin(cin), .cout(cout1), .sum(sum[0]));
    full_adder instance2 (.a(a[1]), .b(b[1]), .cin(cout1), .cout(cout2), .sum(sum[1]));
    full_adder instance3 (.a(a[2]), .b(b[2]), .cin(cout2), .cout(cout3), .sum(sum[2]));
    assign cout = {cout3 , cout2 , cout1};
    assign sum = {sum[2] , sum[1] , sum[0]};
    
endmodule

module full_adder (
    input a,b,cin,
    output cout,sum);
    
    assign sum = a ^ b ^ cin;
    assign cout = ((a ^ b) & cin) + (a & b);
    
endmodule

4.Exams/m2014 q4j

module top_module (
    input [3:0] x,
    input [3:0] y, 
    output [4:0] sum);

    wire cout1,cout2,cout3;
    FA instance1 (.x(x[0]), .y(y[0]), .cin(1'b0), .cout(cout1), .sum(sum[0]));
    FA instance2 (.x(x[1]), .y(y[1]), .cin(cout1), .cout(cout2), .sum(sum[1]));
    FA instance3 (.x(x[2]), .y(y[2]), .cin(cout2), .cout(cout3), .sum(sum[2]));
    FA instance4 (.x(x[3]), .y(y[3]), .cin(cout3), .cout(sum[4]), .sum(sum[3]));
    assign sum = {sum[4] , sum[3] , sum[2] , sum[1] , sum[0]};
    
endmodule

module FA (
    input x,y,cin,
    output cout,sum);
    
    assign sum = x ^ y ^cin;
    assign cout = ((x ^ y) & cin) + (x & y);
    
endmodule

5.Exams/ece241 2014 q1c

假设有两个8位的二进制补码数,a[7:0]和b[7:0],将这些数字相加以生成 s[7:0],判断是否发生(签名的)溢出。

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]);
    //考虑a,b为正数和负数的两种情况
    //负数相减产生正数,判断溢出。
    //正数相加产生负数,判断溢出。
endmodule

6.Adder100

创建100位二进制加法器。加法器将两个100位数字和一个进位相加,以产生100位和并执行。

module top_module( 
    input [99:0] a, b,
    input cin,
    output cout,
    output [99:0] sum );
    
    //assign {cout , sum} = a + b + cin;
    wire [99:0] c;
    assign sum[0] = a[0] ^ b[0] ^ cin;
    assign c[0] = ((a[0] ^ b[0]) & cin) + (a[0] & b[0]);
    always @ (*) begin
       int i;
        for(i=1;i<100;i=i+1) begin
            sum[i] = a[i] ^ b[i] ^ c[i-1];
            c[i] = ((a[i] ^ b[i]) & c[i-1]) + (a[i] & b[i]);
        end
    end
    assign cout = c[99];
    
endmodule

7.Bcdadd4

module top_module ( 
    input [15:0] a, b,
    input cin,
    output cout,
    output [15:0] sum );

    wire [15:0] c;
    bcd_fadd instance1 (a[3:0],b[3:0],cin,c[0],sum[3:0]);
    generate 
        genvar i;
        for(i=1;i<4;i=i+1) begin:bcd_fadd
            bcd_fadd instance2 (a[4*(i+1)-1:4*i],b[4*(i+1)-1:4*i],c[i-1],c[i],sum[4*(i+1)-1:4*i]);
        end
    endgenerate
    assign cout = c[3];
    
endmodule
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值