来自4位Carry Look Ahead(CLA)的16位加法器 - 来自Block Generate和Propagate的Cout

时间:2016-10-05 09:37:33

标签: verilog xilinx-ise carryflag

我是Verilog的新手。这是我到目前为止所做的和4位CLA的工作原理。但是,16位(使用4位CLA的实例)却没有。问题肯定在于从块传播(whereArgs)和块生成(Cout_itermed)设置BP(中间进位)值。我创建了一个模块BG来处理这个问题。

在Xilinx ISE中,输出波形显示为此(未显示波形):

Xilinx ISE

carries

当我运行4位CLA的测试平台时,波形确实显示(并且正确)。任何人都可以解释module CLA_4bit( output [3:0] S, output Cout, PG, GG, input [3:0] A, B, input Cin ); wire [3:0] G,P,C; assign G = A & B; //Generate assign P = A ^ B; //Propagate assign C[0] = Cin; assign C[1] = G[0] | (P[0] & C[0]); assign C[2] = G[1] | (P[1] & G[0]) | (P[1] & P[0] & C[0]); assign C[3] = G[2] | (P[2] & G[1]) | (P[2] & P[1] & G[0]) | (P[2] & P[1] & P[0] & C[0]); assign Cout = G[3] | (P[3] & G[2]) | (P[3] & P[2] & G[1]) | (P[3] & P[2] & P[1] & G[0]) |(P[3] & P[2] & P[1] & P[0] & C[0]); assign S = P ^ C; assign PG = P[3] & P[2] & P[1] & P[0]; // block generate assign GG = G[3] | (P[3] & G[2]) | (P[3] & P[2] & G[1]) | (P[3] & P[2] & P[1] & G[0]); // block propagate endmodule module CLA_16bit( output reg [15:0] S, output reg Cout, input [15:0] A, B, input Cin ); reg [3:0] BP, BG; reg [3:0] Cout_itermed; carries my_carries(BP, GP, Cin, Cout_itermed, Cout); CLA_4bit cla0(S[3:0], Cout_itermed[0], BP[0], BG[0], A[3:0], B[3:0], Cin); CLA_4bit cla1(S[7:4], Cout_itermed[1], BP[1], BG[1], A[7:4], B[7:4], Cout_itermed[0]); CLA_4bit cla2(S[11:8], Cout_itermed[2], BP[2], BG[2], A[11:8], B[11:8], Cout_itermed[1]); CLA_4bit cla3(S[15:12], Cout_itermed[3], BP[3], BG[3], A[15:12], B[15:12], Cout_itermed[2]); Cout = Cout_itermed[3]; endmodule module carries ( input [3:0] BP, input [3:0] BG, input Cin, output reg [3:0] Cout_itermed, output reg Cout ); assign Cout_itermed[0] = BG[0] | (BP[0] & Cin); assign Cout_itermed[1] = BG[1] | (BP[1] & Cout_itermed[0]); assign Cout_itermed[2] = BG[2] | (BP[2] & Cout_itermed[1]); assign Cout = Cout_itermed[3]; endmodule carries模块中的问题所在吗?

1 个答案:

答案 0 :(得分:1)

map有两个驱动程序 - 第一个是Cout_itermed的{​​{1}}输出,第二个是Cout模块的CLA_4bit输出。

这同样适用于Cout_itermed中的carries(尽管它的两个驱动程序最终是同一个信号,CoutCLA_16bit和{{1} }})。

请记住,在Verilog中,您描述的是物理电路,并且您不应该有两个连接到同一线路的源(驱动器) - 这就是我们如何发生短路!

以下内容基于https://en.wikipedia.org/wiki/Lookahead_carry_unit#16-bit_adder。 您要做的是定义从Cout_itermed[3]中的CLA_16bit端口删除carries(您可以将端口挂起)。您应该移动逻辑以确定Cout_itermed[x]模块Cout(即CLA_16bit)。