我正在研究4位进位前瞻我正在使用结构verilog。我很困惑,因为我正在实例化4个部分全加器,什么声明为输入,什么是线和总和在哪里?我知道这对一些人来说很容易,但我花了一些时间试图找到我的错误。我实现pfa(部分全加法器)的方法我有a,b,作为输入,p(a * b)g(a xor b)作为输出。这是我感到困惑的地方,携带的是什么?是输入还是电线? 以下是我的代码,谢谢!
module pfa(a,b,c,sum,p,g); //A one PFA. I need 16 of them5
//wire w;
//reg a,b,c;
//wire sum,p,g;
input a,b,c;
output sum,p,g;
xor (w,a,b); //repeated P. May need it may not.
and (g,a,b); //Gi
xor (p,a,b); //Pi
xor (sum,w,c); //sum
endmodule
//input output
module fourBitPFA(A,B,Cin,P,G,Carry);
input [3:0] A,B;
input Cin;
output [3:0] S;
output Cout;
wire [3:0] P,G,carry;
wire p0,g0;
wire b1,b2,b3;
wire w,w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12;
wire c1,c2,c3,c4;
pfa PFA0(A[0],B[0],Cin,P[0],G[0],Carry[0]),
PFA1(A[1],B[1],C[1],P[1],G[1],C[1]),
PFA2(A[2],B[2],S[2],P[2],G[2],C[2]),
PFA3(A[3],B[3],S[3],P[3],G[3],C[3]);
//propagate
and (p0,P[3],P[2],P[1],P[0]);
//GENERATE
and (w,P[3],G[2]);
and (w1,P[3],P[2],G[1]);
and (w2,P[3],P[2],P[1],G[0]);
or (w,w1,w2);
//CLA
and (w3,P[0],Cin);
or (c1,G[0],w3);
and (w4,P[1],G[0]);
and (w5,P[1],P[0],Cin);
or (c2,G[1],w4,w5);
and (w6,P[2],G[1]);
and (w7,P[2],P[1],G[0]);
and (w8,P[2],P[1],P[0],Cin);
or (c3,G[2],w6,w7,w8);
and (w9,P[3],G[2]);
and (w10,P[3],P[2],G[1]);
and (w11,P[3],P[2],P[1],G[0]);
and (w12,P[3],P[2],P[1],P[0],Cin);
or(c4,w9,w10,w11,w12);
endmodule
答案 0 :(得分:2)
wire
元素必须持续驱动某些内容,无法存储值。此后,使用连续赋值语句为它们分配值。
reg
可用于在程序块中创建寄存器和其他顺序元素。因此,它可以存储某些值。
reg
元素可以使用作为输出。但是,reg 不能 连接到模块实例化的输出端口。
因此,reg可以将线路作为assign
语句的RHS来驱动。另一方面,电线可以作为程序块的RHS驱动一个寄存器。
有关reg
或wire
声明的明确说明,请参阅下图。默认情况下,输入端口为reg
,输出端口为wire
。
请记住,wire
只能推断出组合逻辑,而reg
可以推断出组合逻辑 。
这里,在展望未来的发电机中,一切都是组合电路。因此,为wire
,sum
和p
变量声明g
;是可行的。
对于carry
,当以二进制形式添加两个单个位数时,如果两者都是1
,则加法会产生两位数。因此,MSB被视为carry
。
旁注:在这种情况下,从编码的角度来看,使用行为建模可能是有利的。
此外,启动门需要门名称。因此,请使用xor x1(sum,w,c);
,其中x1
是门实例名称。这适用于所有门实例。
多次启动单个模块需要每个实例名称的模块名称。如下:
pfa PFA0(A[0],B[0],Cin,P[0],G[0],Carry[0]);
pfa PFA1(A[1],B[1],C[1],P[1],G[1],C[1]);
// and so on