CARRY4(超前快速进位逻辑结构)和多位比较器/加法器实现

先说一段废话

近期萌生了写技术博客的念头,一来是可以记录一些遇到的技术问题,理清思路,也可以记录自己的技术成长;二来是可以将自己的知识分享,以便后人再碰到时能从容不破。希望今后在碰到原创有价值的问题时能坚持这一习惯,也算是督促自己,下面进入正题。

问题的引出

这里有一个问题,一个32位的比较器需要使用多少个LUT。苦思冥想仍然未能得到答案,写程序后查看RTL网表,得到了答案。但是又看到了一个新的结构carry4(超前快速进位逻辑结构),这个结构会用在多位的比较器和多位的加法器上,要理解比较器和加法器的工作原理就需要理解这个超前快速进位逻辑。经过仔细研究,引出了这边文章。

这个结构可以查阅这篇文档:
https://www.xilinx.com/support/documentation/user_guides/ug474_7Series_CLB.pdf

讨论

首先给出答案一个32位的比较器需要使用32个LUT。具体这个超前快速进位逻辑结果起什么作用慢慢进行分析。
通过RTL网表可以看出,综合出来的结构如下图:
图中的小方块是LUT,有32个,稍大的是carry4结构,有4个
图中的小方块是LUT,有32个࿰

  • 7
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
下面是一个16位超前进位加法器的Verilog代码和测试激励。 ```verilog module carry_lookahead_adder( input [15:0] a, input [15:0] b, input cin, output [15:0] sum, output cout ); wire [15:0] g; // 生成器 wire [15:0] p; // 传递器 wire [15:0] c; // 进位 assign g = a & b; assign p = a ^ b; assign c[0] = cin; assign c[1:15] = g[0:14] | (p[0:14] & c[0:14]); assign sum = a + b + cin; assign cout = g[15] | (p[15] & c[14]); endmodule module tb_carry_lookahead_adder; reg [15:0] a; reg [15:0] b; reg cin; wire [15:0] sum; wire cout; carry_lookahead_adder dut( .a(a), .b(b), .cin(cin), .sum(sum), .cout(cout) ); initial begin // Test case 1 a = 16'h1234; b = 16'h5678; cin = 0; #10; if (sum !== 16'h68AC || cout !== 1'b0) $error("Test case 1 failed"); // Test case 2 a = 16'h1234; b = 16'h5678; cin = 1; #10; if (sum !== 16'h68AD || cout !== 1'b0) $error("Test case 2 failed"); // Test case 3 a = 16'hFFFF; b = 16'h0001; cin = 1; #10; if (sum !== 16'h0000 || cout !== 1'b1) $error("Test case 3 failed"); $display("All test cases passed"); end endmodule ``` 在这里,我们定义了一个名为`carry_lookahead_adder`的模块,它具有输入`a`和`b`,以及一个进位输入`cin`。输出包括一个和输出`sum`和一个进位输出`cout`。 在模块内部,我们使用了三个中间信号`g`,`p`和`c`。`g`代表生成器,`p`代表传递器,`c`代表进位。我们使用`assign`语句将这些中间信号连接在一起。 最后,我们使用`assign`语句将和输出`sum`和进位输出`cout`连接到模块的输出。 在测试激励中,我们定义了三个测试用例,并使用`initial`块来执行这些测试用例。我们通过改变输入信号和等待一段时间来测试模块的输出。如果任何测试用例失败,我们将使用`$error`语句打印出一个错误消息。 请注意,这个超前进位加法器的代码实现是基于生成器-传递器方法的,这种方法在16位或更大的位宽时比较优秀。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值