<RTL设计的艺术> CSA(进位保留加法器)的应用实例讲解

本文通过一个64bit加法器设计的问题,阐述了在1GHz时钟频率下,原有电路由于串行加法器导致时序无法满足要求。通过对CSA(进位保留加法器)的原理介绍和应用,展示了如何改进电路,减少计算延迟,消除违约路径,从而优化时序。总结中指出,面对类似情况,使用CSA是一种有效的时序优化手段。
摘要由CSDN通过智能技术生成

目录

1、问题背景

2、存在问题的电路

 3、利用CSA改进的电路

 4、总结


1、问题背景

        在某次电路设计时我需要实现这样的功能:

        assign out = (sel ==0) ? c +d : a+ b +d;

        因为上述的操作数a/b/c/d都是64bit位宽数据,电路设计时存在串行的两个64bit加法器,最终导致时序无法满足需求(1GHz时钟),经过分析后利用CSA解决了这个问题。        

        CSA(carry save adder)的原理是在多个数据相加时可以将进位保留下来,只做一次进位传递(具体的CSA细节不在此赘述)。

2、存在问题的电路

存在问题的RTL代码如下:

上述代码对应的电路对应下面的图,关键路径用红线画了出来:

可以看到红线穿过了2个64bit加法器,导致延迟过大(无法在

  • 13
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是三种常见的Verilog进位加法器的选择方法: 1.前进进位加法器(Carry Lookahead Adder,CLA):前进进位加法器是一种高速的加法器,它通过预先计算进位来减少了进位延迟。在Verilog中,可以使用generate语句来实现前进进位加法器。例如,下面是一个4位CLA的Verilog代码: ```verilog module cla_adder( input [3:0] a, input [3:0] b, output [3:0] sum, output carry ); genvar i; generate for (i = 0; i < 4; i = i + 1) begin : cla assign sum[i] = a[i] ^ b[i] ^ carry; assign carry = (a[i] & b[i]) | (a[i] & carry) | (b[i] & carry); end endgenerate endmodule ``` 2.超前进位加法器(Carry Select Adder,CSA):超前进位加法器是一种折衷方案,它通过将加法器分成多个块来平衡速度和规模。在Verilog中,可以使用generate语句来实现超前进位加法器。例如,下面是一个4位CSAVerilog代码: ```verilog module csa_adder( input [3:0] a, input [3:0] b, output [3:0] sum, output carry ); wire [1:0] c; wire [1:0] p; wire [1:0] g; assign p[0] = a[0] ^ b[0]; assign g[0] = a[0] & b[0]; assign p[1] = a[1] ^ b[1] ^ g[0]; assign g[1] = (a[1] & b[1]) | (g[0] & (a[1] ^ b[1])); assign c[0] = g[0] | (p[0] & c[0]); assign c[1] = g[1] | (p[1] & c[0]); assign carry = c[1]; assign sum[0] = a[0] ^ b[0] ^ c[0]; assign sum[1] = a[1] ^ b[1] ^ c[0]; assign sum[2] = a[2] ^ b[2] ^ c[1]; assign sum[3] = a[3] ^ b[3] ^ c[1]; endmodule ``` 3.等波纹进位加法器(Ripple Carry Adder,RCA):等波纹进位加法器是一种简单的加法器,它的进位延迟随着加法器位数的增加而增加。在Verilog中,可以使用简单的assign语句来实现等波纹进位加法器。例如,下面是一个4位RCA的Verilog代码: ```verilog module rca_adder( input [3:0] a, input [3:0] b, output [3:0] sum, output carry ); wire [3:0] c; assign sum = a + b; assign c = {1'b0, sum[3:1]}; assign carry = c[3]; endmodule ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积小流哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值