• Verilog 加法器设计


    目录

    加法器

    行波进位加法器

    Verilog 实现

    超前进位加法器

    Verilog 实现

    数据流描述的加法器

    Verilog 实现

    流水线加法器

    Verilog 实现


    加法器

    加法是基本的运算,在数字信号处理和数字通信的各种算法中被广泛应用。由于加法器使用频繁,所以其速度往往影响整个系统的运行速度。如果可实现快速的加法器的设计,则可以提高整个系统的运行速度。

    以下介绍几种常见的加法器设计,提供 Verilog 设计并分析其优缺点。


    行波进位加法器

    这中加法器设计由多个 1 位全加器级联构成,依次从低位向高位传递,并输出最终的结果。

    Verilog 实现

    1. module add_1 (
    2. input [3:0] a,
    3. input [3:0] b,
    4. input cin,
    5. output [3:0] sum,
    6. output cout;
    7. );
    8. add_full add_full_1(
    9. .a(a),
    10. .b(b),
    11. .cin(cin),
    12. .sum(sum),
    13. .cout(cin)
    14. );
    15. add_full add_full_1(
    16. .a(a[0]),
    17. .b(b[0]),
    18. .cin(cin),
    19. .sum(sum[0]),
    20. .cout(cin1)
    21. );
    22. add_full add_full_2(
    23. .a(a[1]),
    24. .b(b[1]),
    25. .cin(cin1),
    26. .sum(sum[1]),
    27. .cout(cin2)
    28. );
    29. add_full add_full_3(
    30. .a(a[2]),
    31. .b(b[2]),
    32. .cin(cin2),
    33. .sum(sum[2]),
    34. .cout(cin3)
    35. );
    36. add_full add_full_4(
    37. .a(a[3]),
    38. .b(b[3]),
    39. .cin(cin3),
    40. .sum(sum[3]),
    41. .cout(cin4)
    42. );
    43. module add_full(
    44. input a,
    45. input b,
    46. input cin,
    47. output reg sum,
    48. output reg cout
    49. );
    50. always @(*) begin
    51. {cout,sum} = a + b + cin;
    52. end
    53. endmodule
    54. endmodule

    行波进位加法器设计优缺点

    • 优点:设计简单,初学者易学
    • 缺点:延时过大,如果加法的位宽过大,就会导致延时增加,n 位是 1 位的 n 倍,性能一般。

    超前进位加法器

    在上一种加法器的设计,最大的缺点就是位宽比较大的计算延时过大,要想提高运行速度就必须解决位宽带来的延时影响,超前进位加法器便可以有效解决以上的弊端。

    对于全加器,一位全加器的本位值和进位输出可表示为:

    sum = a ^ b ^ cin

    cout = (a*b) + (a*cin) + (b*cin) = ab + (a+b)*cin

    可知当 a 和 b 都为 1 时,进位输出 cout 为1,而当其一为 1 时,进位输出 cout 为进位输入 cin。

    这样令 G = a * b,P = a + b,则有 cout = a*b + (a+b)*cin = G + P*cin

    由此就可以得到各个位的进位输出呈如下结果:

    进一步推算:

    sum = A ^ B ^ Cin = (A*B) ^ (A + B) ^ Cin = G ^ P ^ Cin

    Verilog 实现

    1. module add_u(
    2. input [3:0] a,
    3. input [3:0] b,
    4. input cin,
    5. output [3:0] sum,
    6. output cout
    7. );
    8. wire [3:0] G;
    9. wire [3:0] P;
    10. wire [3:0] C;
    11. //第0位
    12. assign G[0] = a[0] & b[0];
    13. assign P[0] = a[0] | b[0];
    14. assign C[0] = cin;
    15. assign sum[0] = G[0] ^ P[0] ^ C[0];
    16. //第1位
    17. assign G[1] = a[1] & b[1];
    18. assign P[1] = a[1] | b[1];
    19. assign C[1] = cin;
    20. assign sum[1] = G[1] ^ P[1] ^ C[1];
    21. //第2位
    22. assign G[2] = a[2] & b[2];
    23. assign P[2] = a[2] | b[2];
    24. assign C[2] = cin;
    25. assign sum[2] = G[2] ^ P[2] ^ C[2];
    26. //第3位
    27. assign G[3] = a[3] & b[3];
    28. assign P[3] = a[3] | b[3];
    29. assign C[3] = cin;
    30. assign sum[3] = G[3] ^ P[3] ^ C[3];
    31. //输出最终进位值
    32. assign cout = C[3];
    33. endmodule

    数据流描述的加法器

    这种方式实现起来就比较简单,直接采用全加器的形式进行描述,让综合工具自动识别形成电路。

    Verilog 实现

    1. module add(
    2. input [3:0] a,
    3. input [3:0] b.
    4. input cin,
    5. output [3:0] sum,
    6. output cout
    7. );
    8. assign {cout,sum} = a + b + cin;
    9. endmodule

    流水线加法器

    在系统工作时为了尽可能的提高系统运行速度,保证数据的快速传输,流水线的设计是一种常见的设计方法。但是,如果在某些复杂逻辑功能的完成需要较长的延时,就会使系统难以运行在高的频率上。这种情况下,可使用流水线技术,即在长延时的逻辑功能块中插入触发器,使复杂的逻辑操作分步完成,减小每一部分的延时,从而使系统的运行频率得以提高。但是流水线的弊端在于增加了寄存器逻辑,进而消耗了更多的芯片内部资源。相当于用资源换速率,在资源允许的前提下,适当加入流水线的操作,可以显著提高系统的运行频率。

    利用流水线的方法设计加法器可以显著提高系统的运行速度,以一个两级流水线的设计方法计算两个 8 位宽的数据相加。

    Verilog 实现

    1. module add(
    2. input clk,
    3. input [7:0] a,
    4. input [7:0] b,
    5. input cin,
    6. output reg [7:0] sum,
    7. output reg cout
    8. );
    9. reg [3:0] a_reg;
    10. reg [3:0] b_reg;
    11. reg [3:0] sum1;
    12. reg cout1;
    13. //计算低四位
    14. always @(posedge clk) begin
    15. {cout1,sum1} = a[3:0] + b[3:0] + cin;
    16. a_reg = a[7:4];
    17. b_reg = b[7:4];
    18. end
    19. //计算高四位
    20. always @(posedge clk) begin
    21. {cout1,sum[7:4]} = a_reg + b_reg + cout1;
    22. sum[3:0] = sum1;
    23. end
    24. endmodule

    将八位宽的数值计算拆分成两个四位数据的同步计算,可以提高计算速度,甚至可以差分成三份计算,这种视情况而定。

  • 相关阅读:
    列表和标签企业报告版的完整报告解决方案
    Linux命令--expect spawn的用法(实现人机交互自动化操作)
    2022-09-14 C++并发编程(二十二)
    分布式网络通信框架(一)——集群和分布式
    SpringMVC(五):获取请求参数
    springboot---任务---整合quartz与task----定时任务(详细)
    go-zero单体服务使用泛型简化注册Handler路由
    VVC系列(三)xCompressCTU、xCompressCU和xCheckModeSplit解析
    idea异常关闭后,端口被占用终极解决方案!
    与 Dave 和 Ruba 一起探讨亚马逊云科技 2023 芯片创新日
  • 原文地址:https://blog.csdn.net/m0_61298445/article/details/126045289