【问题标题】:carry lookahead using structural verilog使用结构 Verilog 进行前瞻
【发布时间】:2016-03-02 15:06:05
【问题描述】:

我正在研究 4 位进位超前我正在使用结构 Verilog。我很困惑,因为我正在实例化 4 个部分全加器,什么声明为输入,什么声明为线,总和去哪儿了?我知道这对某些人来说很容易,但我花了一些时间试图找出我的错误。我实现 pfa(部分全加器)的方式我有 a,b,carry 作为输入和 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   

【问题讨论】:

    标签: verilog


    【解决方案1】:

    wire 元素必须由某些东西持续驱动,并且不能存储值。此后,它们使用连续赋值语句来赋值。

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

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

    因此,reg 可以作为assign 语句的 RHS 驱动连线。反过来,一根电线可以驱动一个 reg 作为程序块的 RHS。

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

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

    这里,在前瞻进位发生器中,一切都是组合电路。因此,为sumpg 变量声明wire;是可行的。

    对于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
    

    【讨论】:

    • 谢谢,这真的很有帮助,我同意行为建模更好,但我的教授希望在结构上这样做
    • 结构没问题,直到你不会对它感到困惑。您的 sn-p 有我的回答中写的与门实例名称相关的问题。
    猜你喜欢
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    相关资源
    最近更新 更多