使用结构verilog进行前瞻

时间:2015-11-28 16:53:10

标签: verilog

我正在研究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   

1 个答案:

答案 0 :(得分:2)

wire元素必须持续驱动某些内容,无法存储值。此后,使用连续赋值语句为它们分配值。

reg可用于在程序块中创建寄存器和其他顺序元素。因此,它可以存储某些值。

在实际模块声明中,

reg元素可以使用作为输出。但是,reg 不能 连接到模块实例化的输出端口。

因此,reg可以将线路作为assign语句的RHS来驱动。另一方面,电线可以作为程序块的RHS驱动一个寄存器。

有关regwire声明的明确说明,请参阅下图。默认情况下,输入端口为reg,输出端口为wire

Module connection

请记住,wire只能推断出组合逻辑,而reg可以推断出组合逻辑

这里,在展望未来的发电机中,一切都是组合电路。因此,为wiresump变量声明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