0

我有一个基本的计数器示例,计数器为 6 位宽。

reg[5:0] currcounterval_reg;
always @(posedge clk_g0)
    currcounterval_reg <= currcounterval_reg+ 1'b1; 

我的约束时钟在 Virtex 7 芯片上以 83 Mhz 912ns 周期运行。计数器没有复位,输出连接到板引脚。当我运行电路时,我看到信号切换,如附件(硬件运行)o/p 所示。在随附的屏幕截图中,如果您查看计数器,在 7(七)之后,我应该得到“8”......但它首先切换到“12”,因为第 2 位比其他位晚归零。我在下游有一个异或门,我比较两个计数器的 o/p。如何避免陷入这个问题?

无论我为约束做什么,它都不会消失。请帮助我采取一些策略来消除切换。

如果您有更多问题,请随时问我。

你可以在这里找到我的波形 http://i.imgur.com/btEMiFD.png?1

谢谢。

4

2 回答 2

2

您需要使 XOR 输出同步。XOR 输出应进入 FF 的 D 输入,该输入时钟在使计数器递增的同一上升沿上计时。将 FF 的 Q 输出带到 FPGA 引脚而不是 XOR 输出。

您不应该尝试匹配两个计数器的组合逻辑延迟和路由延迟。从两个计数器到 XOR 门的延迟路径几乎肯定会不同,因此快速 XOR(如在 Virtex 7 上)会产生故障。在良好的同步设计中这并不重要,因为您只关心组合逻辑输出在下一个时钟沿之前是否有效。

于 2013-10-05T12:53:10.313 回答
2

我猜这是一个不恰当的约束问题。但是尝试显式地连接一个同步计数器来解决这个问题。

    reg[5:0] counter;
    always @(posedge clk_g0)
    begin
        counter[0] <= ~counter[0] ;
        counter[1] <= (counter[0]    ) ? ~counter[1] : counter[1];
        counter[2] <= (&counter[1:0] ) ? ~counter[2] : counter[2];
        counter[3] <= (&counter[2:0] ) ? ~counter[3] : counter[3];
        counter[4] <= (&counter[3:0] ) ? ~counter[4] : counter[4];
        counter[5] <= (&counter[4:0] ) ? ~counter[5] : counter[5];
    end
于 2013-10-05T03:34:47.387 回答