1

目标是为具有两个输入 w1 和 w2 以及一个输出 q 的电路编写结构 Verilog 代码。该电路比较 w1 和 w2 的输入序列。如果 w1 和 w2 匹配 4 个连续的时钟脉冲,则 q 应为 1;否则应保持为 0。

例子:

w1 = 0100111010010
w2 = 0000110010010
q  = 0000010000111

我画了一张状态图和一张状态表,得出的结论是我需要为这个电路使用 3 个 D 触发器。然后我为每个 D-FF 的输入编写了 K-maps。但是,当我编写代码时,生成的波形意外地如下所示:

http://i.imgur.com/BwRgP7j.png

这是我的代码:

module PatternMatch2(q, w1, w2, clk, rst);
    output  q;
    input   w1, w2, clk, rst;

    DF DF1(y1, yBar1, Y1, clk, rst),
       DF2(y2, yBar2, Y2, clk, rst),
       DF3(y3, yBar3, Y3, clk, rst);

    and and0(Y1, nI, yBar3, yBar1),
        and1(Y2In1, nI, yBar2, y1),
        and2(Y2In2, nI, y2, yBar1),
        and3(Y3In1, nI, y3),
        and4(Y3In2, nI, y2, y1),
        and5(q, y3, yBar2, yBar1);

            xor xor0(i, w1, w2);        


    or or0(Y2, Y2In1, Y2In2),
       or1(Y3, Y2In1, Y2In3);

    not not0(nI, i);

endmodule


// D - Flip Flop Module
module DF(q, qBar, D, clk, rst);
    input D, clk, rst;
    output q, qBar;

    reg q;

    not n1 (qBar, q);

    always@ (posedge rst or posedge clk)
    begin
    if(rst)
            q = 0;

    else
            q = D;
    end
endmodule

我不确定我的代码有什么问题,因为我的方程式似乎正确。

4

2 回答 2

1

当我编译您的代码时,我收到以下警告消息:

隐式线“Y2In3”没有任何驱动程序

你需要or1适当地驱动你的输入。

于 2013-11-11T22:34:24.240 回答
1

对于此类任务,您只需要 2 个 FF 组织为具有重置功能的饱和计数器:

  1. 创建一个复位信号 rst=XOR(w1,w2) 并连接到 FF 的两个复位输入
  2. 根据以下真值表(饱和的 2 位计数器)将 FF 输入(d0,d1)连接到输出(q0,q1):

    q1 q0 => d1 d0
    0  0  => 0  1
    0  1  => 1  0
    1  0  => 1  1
    1  1  => 1  1
    

    那是:

    d0 = OR(NOT(q0), q1)
    d1 = OR(q0, q1)
    

  3. 您的输出将是: q=AND(q0, q1, NOT(rst))

于 2013-11-11T22:34:50.557 回答