Verilog可能的闩锁

时间:2014-03-12 02:32:33

标签: verilog hdl

我是一名VHDL编码器,并且没有用Verilog进行编码。我正在浏览其他人的代码,我遇到了这个:

always@(posedge asix_clk_bufg or negedge pll_asix_locked)
begin
    if (~pll_asix_locked)
        asix_rst <= 0;
    else if (timer[5])  // 355us between asix_clk and asix_rst (min is 200us)
        asix_rst <= 1;
end

我不确定我是否同意上述代码!不是一个可能的锁存场景吗?我看到它正在等待pll锁定然后使系统退出复位,但这是否正确编码?

我不想将顺序和组合代码组合在一起,但是&#34; asix_rst&#34;的价值是什么?当计时器[5] = 0?!?

谢谢, - 鲁迪

2 个答案:

答案 0 :(得分:2)

这是推断具有正边沿时钟(asix_clk_bufg)的异步有效低电平复位(pll_asix_locked)和时钟使能(定时器[5])的触发器的方法。有一个D输入(连接到1)和一个Q输出(asix_rst)。

我假设PLL启动未锁定,因此asix_rsttimer[5] == 1时的第一个时钟边沿为0。然后它将保持高电平直到PLL失锁。复位必须是异步的,因为当PLL失锁时,时钟将停止。

我猜测锁定PLL后,定时器[5]位会在5或6个时钟周期内变为高电平,确保在系统其余部分复位之前有一个稳定的时钟。

如果代替灵敏度列表中timer[5]的时钟,这将是一个锁存器,如下所示:

always@(timer[5] or pll_asix_locked)
begin
    if (~pll_asix_locked)
        asix_rst <= 0;
    else if (timer[5])  // 355us between asix_clk and asix_rst (min is 200us)
        asix_rst <= 1;
end

答案 1 :(得分:0)

仅使用组合始终块生成锁存器。由于灵敏度列表中的信号正在寻找时钟的结果,因此代码正在生成顺序逻辑。顺序逻辑永远不会生成锁存器。

有关更多信息,请参阅how transparent latches are created and how to avoid inferring latches