有人可以解释一下 4 位 CLA 加法器的代码序列是如何工作的吗?

问题描述 投票:0回答:1

这是我为实验室作业编写的代码,其中包括使用模块创建 4 位 CLA 加法器:

module lab (A,B,Ci,S,Co,PG,GG);
input [3:0]A,B;
input Ci;
output [3:0]S;
output Co,PG,GG;
wire [3:0] C, P, G;

fulladder fa0(A[0],B[0],C[0],G[0],P[0],S[0]);
fulladder fa1(A[1],B[1],C[1],G[1],P[1],S[1]);
fulladder fa2(A[2],B[2],C[2],G[2],P[2],S[2]);
fulladder fa3(A[3],B[3],C[3],G[3],P[3],S[3]);

CLALogic logic(G,P,Ci,C,Co,PG,GG);

endmodule 


module CLALogic(G,P,Ci,C,Co,PG,GG);
input [3:0]P,G;
input Ci;
output [3:0]C;
output Co,PG,GG;

assign C[0] = Ci;
assign C[1] = G[0] | (P[0] & C[0]);
assign C[2] = G[1] | (P[1] & C[1]);
assign C[3] = G[2] | (P[2] & C[2]);
assign Co = G[3] | (P[3] & C[3]);

assign PG = P[3] & P[2] & P[1] & P[0];
assign GG = G[3] | (P[3] & (G[2] & (P[2] & (G[1] | (P[1] & G[0])))));

endmodule


module fulladder (Ai,Bi,Cin,G,P,Sum);
input Ai,Bi,Cin;
output G,P,Sum;

assign G = Ai & Bi;
assign P = Ai ^ Bi;
assign Sum = P ^ Cin;


endmodule 

它可以正常运行,并在给定输入时输出正确的值,但我对如何准确计算该值有点迷失。我理解 CLA 加法器背后的逻辑,其中进位与总和分开计算,我对代码本身如何正常工作有点困惑。

我想知道的主要部分是总和计算如何考虑初始进位或一般进位,因为总和位是在调用计算 C 值的逻辑模块之前使用线 C 计算的。这不会导致计算总和并忽略前面数字可能发生的任何进位吗?

verilog
1个回答
0
投票

模块代表硬件层次结构,它们不像软件编程语言中的过程那样被“调用”。在您的设计中,所有模块实例化的内容都被扁平化为一组巨大的并发连续分配。 连续赋值的 RHS 上的任何信号变化都会导致表达式求值,如果这导致 LHS 发生变化,则该变化会传播到它所输入的任何赋值。这会影响到所有的作业,直到没有什么可以改变的。

这就是组合硬件逻辑的本质。

© www.soinside.com 2019 - 2024. All rights reserved.