<Verilog实现加法器>进位选择加法器设计———持续更新版

一,内容介绍

加法器是数字电路中的最基础电路之一,也是CPU的核心功能之一。
在这个专栏,我会把所有我知道的数字电路的加法器相关模型都实现一遍并解释其原理。
编程使用的语言为Verilog,代码风格为强迫症系列风格。

加法器系列链接:
半加器及全加器设计.
4位行波加法器设计
超前进位加法器设计
目前:进位选择加法器
koggle-stone加法器设计
brent-kung加法器设计
从加法器到计算单元
加法的进位问题

二,进位选择加法器设计原理

进位选择加法器(CSA): Carry Select Adder.

2.1 选择器原理

首先我们先介绍一个常用数字电路组件:选择器:MUX

verilog中我们经常使用这样的语句:
assign c = sel ? a : b;
实际上这样的电路可以等效为
assign c = (sel & a) | (~sel & b);
根据之前系列文章介绍,我们可以计算出一个选择器 MUX 的逻辑延时为
delay = 0.2 + 0.7 + 0.9 = 1.8ns
/*与或非门延时设定可以查阅加法器系列文章的第二篇:半加器和全加器设计
[半加器和全加器](https://blog.csdn.net/weixin_45536424/article/details/116245926)
*/
2.2 面积速度互换原则

在集成电路设计中,我们经常会遇到这样的设计选择:面积速度的优化。
所谓面积即我

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是三种常见的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位CSA的Verilog代码: ```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 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值