我是一名 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 锁定,然后使系统退出复位状态,但是这个编码是否正确?
我不喜欢将顺序代码和组合代码组合在一起,但是当 timer[5] = 0 时“asix_rst”的值是多少?!?
谢谢, --鲁迪
最佳答案
这是推断具有正边沿时钟 (asix_clk_bufg)、异步低电平有效复位 (pll_asix_locked) 和时钟使能 (timer[5]) 的触发器的方法。有一个 D 输入(连接到 1)和一个 Q 输出(asix_rst)。
我假设 PLL 开始时未锁定,因此 asix_rst
为 0,直到第一个时钟边沿 timer[5] == 1
。然后它将保持高电平直到 PLL 失锁。复位必须是异步的,因为当 PLL 失锁时时钟将停止。
我猜测 timer[5] 位在 PLL 锁定后 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
关于Verilog 可能的锁存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22340864/