100位二进制数的加法rtl级实现-爱代码爱编程
前面写了一个门级实现,需要实例话全加器100次,多少有点繁琐,这里我们使用RTL级实现一下(也就是直接使用加法器),但是这里有一个难点,就是如何简单高效的计算出最高位的进位cout呢?下面我会给出我的做法,但是感觉有待改善。
module top_module(
input [99:0] a, b,
input cin,
output cout,
output [99:0] sum );
wire [99:0] cout_r;
assign sum = a + b + cin;
always @ (*) begin
for (integer i = 0; i < 100; i++) begin
if (i == 0)
cout_r[0] = (a[0]&b[0])|(a[0]&cin)|(b[0]&cin);
else
cout_r[i] = (a[i]&b[i])|(a[i]&cout_r[i-1])|(b[i]&cout_r[i-1]);
end
end
assign cout = cout_r[99];
endmodule
其实整个always语句块都是用来求cout的。但是好像非这样做不可,因为每一位都会产生进位,每一位的进位都会影响最高的进位,这里我感觉没办法了已经,如果有读者想到更好的解决方案欢迎交流。