HDLBits(3)_Adder

Exams/m2014 q4j

在这里插入图片描述
看到这个电路,我的想法是用生成块,把进位相连。

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

    wire [3:0]cout;
    assign {cout[0],sum[0]} = x[0]+y[0];
    genvar i;
    generate for(i=1;i<4;i=i+1)
        begin:cot
            assign {cout[i],sum[i]} = x[i]+y[i]+cout[i-1];
        end
    endgenerate
        assign sum[4] = cout[3];
endmodule

然后我发现这个电路可以直接这样写,唉,写Verilog的路还是前路漫漫。

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

反思了一下,我不应该只看每一个部分,而是整体的看这个电路的输入输出。

Exams/ece241 2014 q1c

Assume that you have two 8-bit 2’s complement numbers, a[7:0] and b[7:0]. These numbers are added to produce s[7:0]. Also compute whether a (signed) overflow has occurred.
由于上题的教训,我本来以为也可以直接用整体的方式来写。

module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); 
    assign {overflow,s}=a+b;
endmodule

后来发现自己理解错了题意。这是两个有符号数相加。两个正数相加,如果得负数,则溢出。两个负数相加,如果得正数,则溢出。
在这里插入图片描述

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])?((a[7]!==s[7])?1:0):0;

endmodule

看了看大佬写的,又学到了。
输入a和b是二进制补码,如果a和b是正数,则最高位,即符号位是正的,如果二者相加为负,则为溢出:

overflow = a[7] & b[7] & ~s[7];

如果a和b是负数,则最高位为负,如果二者相加为正,则表示溢出。

overflow = ~a[7] & ~b[7] & 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

引用博主链接:https://blog.csdn.net/Reborn_Lee/article/details/103219777

Adder100

这个题目就是用生成块。(错误示范)后来发现想太多。。。。。

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

    wire [99:0]c_in;
    assign {c_in[0],sum[0]}=a[0]+b[0]+cin;
    genvar i;
    generate for (i=1;i<100;i=i+1)
        begin:fe
            assign {c_in[i],sum[i]} = a[i]+b[i]+c_in[i-1];
        end
    endgenerate
    assign cout = c_in[99];
endmodule

直接加就好

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

    assign {cout,sum} = a+b+cin;
endmodule

Bcdadd4

例化四个bcd_fadd就好了。

module top_module( 
    input [15:0] a, b,
    input cin,
    output cout,
    output [15:0] sum );
    
    wire [3:0] cin_reg;
    bcd_fadd u0(
        .a(a[3:0]),
        .b(b[3:0]),
        .cin(cin),
        .cout(cin_reg[0]),
        .sum(sum)
        );
    genvar i;
        generate for(i=1;i<4;i=i+1)
            begin:fdf
       bcd_fadd (
           .a(a[4*i+:4]),
           .b(b[4*i+:4]),
           .cin(cin_reg[i-1]),
           .cout(cin_reg[i]),
           .sum(sum[4*i+:4])
        );       
            end
        endgenerate
           assign cout = cin_reg[3];
endmodule

写于2021/11/13 0:03

引用:HDLBits 系列(11)All about Adder

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是代码实现: ``` module h_adder(a, b, sum, carry); input a, b; output sum, carry; assign sum = a ^ b; assign carry = a & b; endmodule module f_adder(a, b, cin, sum, cout); input a, b, cin; output sum, cout; wire s1, c1, c2; h_adder ha1(.a(a), .b(b), .sum(s1), .carry(c1)); h_adder ha2(.a(s1), .b(cin), .sum(sum), .carry(c2)); assign cout = c1 | c2; endmodule module f_adder_8(a, b, sum); input [7:0] a, b; output [7:0] sum; wire [7:0] c; f_adder fa0(.a(a[0]), .b(b[0]), .cin(1'b0), .sum(sum[0]), .cout(c[0])); f_adder fa1(.a(a[1]), .b(b[1]), .cin(c[0]), .sum(sum[1]), .cout(c[1])); f_adder fa2(.a(a[2]), .b(b[2]), .cin(c[1]), .sum(sum[2]), .cout(c[2])); f_adder fa3(.a(a[3]), .b(b[3]), .cin(c[2]), .sum(sum[3]), .cout(c[3])); f_adder fa4(.a(a[4]), .b(b[4]), .cin(c[3]), .sum(sum[4]), .cout(c[4])); f_adder fa5(.a(a[5]), .b(b[5]), .cin(c[4]), .sum(sum[5]), .cout(c[5])); f_adder fa6(.a(a[6]), .b(b[6]), .cin(c[5]), .sum(sum[6]), .cout(c[6])); f_adder fa7(.a(a[7]), .b(b[7]), .cin(c[6]), .sum(sum[7]), .cout(c[7])); endmodule ``` 解释一下: 1. `h_adder` 模块实现半加器的功能,输入 `a` 和 `b`,输出 `sum` 和 `carry`。 2. `f_adder` 模块实现一个全加器的功能,输入 `a`、`b` 和 `cin`(进位信号),输出 `sum` 和 `cout`(进位信号)。 3. `f_adder_8` 模块实现一个 8 位全加器的功能,使用 8 个 `f_adder` 模块和 7 个进位信号 `c`。其中,第一个 `f_adder` 模块的 `cin` 输入为 0,其他的 `cin` 输入为上一个 `f_adder` 模块的 `cout` 输出。 这样就完成了层次化设计方法的 8 位加法器 Verilog 实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值